X-Git-Url: https://git.saurik.com/apple/security.git/blobdiff_plain/b1ab9ed8d0e0f1c3b66d7daa8fd5564444c56195..420ff9d9379a8d93f2c90f026a797bdea1eb4517:/libsecurity_cdsa_client/lib/dlclient.cpp diff --git a/libsecurity_cdsa_client/lib/dlclient.cpp b/libsecurity_cdsa_client/lib/dlclient.cpp index 3f1d466c..31510a53 100644 --- a/libsecurity_cdsa_client/lib/dlclient.cpp +++ b/libsecurity_cdsa_client/lib/dlclient.cpp @@ -23,6 +23,7 @@ #include #include #include +#include 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 _(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 _(mActivateMutex); if (mActive) CssmError::throwMe(CSSMERR_DL_DATASTORE_ALREADY_EXISTS); @@ -176,6 +182,7 @@ DbImpl::create() void DbImpl::close() { + StLock _(mActivateMutex); if (mActive) { check(CSSM_DL_DbClose (mHandle)); @@ -198,6 +205,7 @@ DbImpl::activate() void DbImpl::deactivate() { + StLock _(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 _(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 _(mActivateMutex); mActive = false; return false; } @@ -686,6 +709,7 @@ DbDbCursorImpl::activate() void DbDbCursorImpl::deactivate() { + StLock _(mActivateMutex); if (mActive) { mActive = false; @@ -836,12 +860,14 @@ DbUniqueRecordImpl::getWithoutEncryption(DbAttributes *attributes, void DbUniqueRecordImpl::activate() { + StLock _(mActivateMutex); mActive = true; } void DbUniqueRecordImpl::deactivate() { + StLock _(mActivateMutex); if (mActive) { mActive = false;