]> git.saurik.com Git - apple/security.git/blobdiff - libsecurity_cdsa_client/lib/dlclient.cpp
Security-55471.14.4.tar.gz
[apple/security.git] / libsecurity_cdsa_client / lib / dlclient.cpp
index 3f1d466c3328aa8c4e676a6d0299c2f8efafd73f..31510a53255be31380c778d6ee22e5c4a05ae23c 100644 (file)
@@ -23,6 +23,7 @@
 #include <security_cdsa_client/aclclient.h>
 #include <Security/cssmapple.h>
 #include <Security/cssmapplePriv.h>
+#include <Security/SecBase.h>
 
 using namespace CssmClient;
 
@@ -104,19 +105,23 @@ DbImpl::~DbImpl()
 void
 DbImpl::open()
 {
-       if (!mActive)
-       {
-               assert(mDbInfo == nil);
-               mHandle.DLHandle = dl()->handle();
-               check(CSSM_DL_DbOpen(mHandle.DLHandle, mDbName.canonicalName(), dbLocation(),
-                                                               mAccessRequest, mAccessCredentials,
-                                                               mOpenParameters, &mHandle.DBHandle));
-               mActive = true;
-               
-               if (!mAccessCredentials && mDefaultCredentials)
-                       if (const AccessCredentials *creds = mDefaultCredentials->makeCredentials())
-                               CSSM_DL_Authenticate(handle(), mAccessRequest, creds);  // ignore error
+    {
+        StLock<Mutex> _(mActivateMutex);
+        if (!mActive)
+        {
+            assert(mDbInfo == nil);
+            mHandle.DLHandle = dl()->handle();
+            check(CSSM_DL_DbOpen(mHandle.DLHandle, mDbName.canonicalName(), dbLocation(),
+                                    mAccessRequest, mAccessCredentials,
+                                    mOpenParameters, &mHandle.DBHandle));
+
+            mActive = true;
+        }
        }
+
+    if (!mAccessCredentials && mDefaultCredentials)
+        if (const AccessCredentials *creds = mDefaultCredentials->makeCredentials())
+            CSSM_DL_Authenticate(handle(), mAccessRequest, creds);     // ignore error
 }
 
 void
@@ -150,6 +155,7 @@ DbImpl::createWithBlob(CssmData &blob)
 void
 DbImpl::create()
 {
+    StLock<Mutex> _(mActivateMutex);
        if (mActive)
                CssmError::throwMe(CSSMERR_DL_DATASTORE_ALREADY_EXISTS);
 
@@ -176,6 +182,7 @@ DbImpl::create()
 void
 DbImpl::close()
 {
+    StLock<Mutex> _(mActivateMutex);
        if (mActive)
        {
                check(CSSM_DL_DbClose (mHandle));
@@ -198,6 +205,7 @@ DbImpl::activate()
 void
 DbImpl::deactivate()
 {
+    StLock<Mutex> _(mActivateMutex);
        if (mActive)
        {
                mActive = false;
@@ -360,6 +368,18 @@ DbImpl::unlock(const CSSM_DATA &password)
        check(CSSM_DL_PassThrough(handle(), CSSM_APPLECSPDL_DB_UNLOCK, &password, NULL));
 }
 
+void
+DbImpl::stash()
+{
+    check(CSSM_DL_PassThrough(handle(), CSSM_APPLECSPDL_DB_STASH, NULL, NULL));
+}
+
+void
+DbImpl::stashCheck()
+{
+    check(CSSM_DL_PassThrough(handle(), CSSM_APPLECSPDL_DB_STASH_CHECK, NULL, NULL));
+}
+
 void
 DbImpl::getSettings(uint32 &outIdleTimeout, bool &outLockOnSleep)
 {
@@ -430,7 +450,7 @@ void DbImpl::setBatchMode(Boolean mode, Boolean rollback)
        //
        // Now, toggle the autocommit...
        //
-       if ( result == noErr )
+       if ( result == errSecSuccess )
        {
                CSSM_BOOL modeToUse = !mode;
                if (rollback)
@@ -441,7 +461,7 @@ void DbImpl::setBatchMode(Boolean mode, Boolean rollback)
 
                result = CSSM_DL_PassThrough(dldbHandleOfUnderlyingDL,
                                                                         CSSM_APPLEFILEDL_TOGGLE_AUTOCOMMIT,
-                                                                        (void *)(modeToUse),
+                                                                        (void *)((size_t) modeToUse),
                                                                         NULL);
                if (!rollback && modeToUse)
                        result = CSSM_DL_PassThrough(dldbHandleOfUnderlyingDL,
@@ -640,6 +660,8 @@ DbDbCursorImpl::next(DbAttributes *attributes, ::CssmDataContainer *data, DbUniq
                                                                          attributes,
                                                                          data,
                                                                          unique);
+
+        StLock<Mutex> _(mActivateMutex);
                if (result == CSSM_OK)
                        mActive = true;
                else if (data != NULL)
@@ -666,6 +688,7 @@ DbDbCursorImpl::next(DbAttributes *attributes, ::CssmDataContainer *data, DbUniq
        
        if (result == CSSMERR_DL_ENDOFDATA)
        {
+        StLock<Mutex> _(mActivateMutex);
                mActive = false;
                return false;
        }
@@ -686,6 +709,7 @@ DbDbCursorImpl::activate()
 void
 DbDbCursorImpl::deactivate()
 {
+    StLock<Mutex> _(mActivateMutex);
        if (mActive)
        {
                mActive = false;
@@ -836,12 +860,14 @@ DbUniqueRecordImpl::getWithoutEncryption(DbAttributes *attributes,
 void
 DbUniqueRecordImpl::activate()
 {
+    StLock<Mutex> _(mActivateMutex);
        mActive = true;
 }
 
 void
 DbUniqueRecordImpl::deactivate()
 {
+    StLock<Mutex> _(mActivateMutex);
        if (mActive)
        {
                mActive = false;