diff options
author | davidben@chromium.org <davidben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-06-25 22:44:48 +0000 |
---|---|---|
committer | davidben@chromium.org <davidben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-06-25 22:44:48 +0000 |
commit | 6913847c616758791214954dc3adc1492bdc688d (patch) | |
tree | 55bd2e7d5ab09a1f5c7d37e270c1c7bcb3392013 /base/nss_util.cc | |
parent | 8c94d63f7a6e071bdc90648d614f1825cea195d0 (diff) | |
download | chromium_src-6913847c616758791214954dc3adc1492bdc688d.zip chromium_src-6913847c616758791214954dc3adc1492bdc688d.tar.gz chromium_src-6913847c616758791214954dc3adc1492bdc688d.tar.bz2 |
Add a unit test to check KeygenHandler's thread-safety
We'll want some semblance of thread-safety when we make keygen asynchronous.
R=wtc,mattm
BUG=148
TEST=unit test
Review URL: http://codereview.chromium.org/2838010
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@50903 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/nss_util.cc')
-rw-r--r-- | base/nss_util.cc | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/base/nss_util.cc b/base/nss_util.cc index 7043b8d..091ca05 100644 --- a/base/nss_util.cc +++ b/base/nss_util.cc @@ -18,6 +18,11 @@ #include "base/singleton.h" #include "base/string_util.h" +#if defined(USE_NSS) +#include "base/lock.h" +#include "base/scoped_ptr.h" +#endif // defined(USE_NSS) + // On some platforms, we use NSS for SSL only -- we don't use NSS for crypto // or certificate verification, and we don't use the NSS certificate and key // databases. @@ -163,11 +168,18 @@ class NSSInitSingleton { // log in. PK11SlotInfo* slot = PK11_GetInternalKeySlot(); if (slot) { + // PK11_InitPin may write to the keyDB, but no other thread can use NSS + // yet, so we don't need to lock. if (PK11_NeedUserInit(slot)) PK11_InitPin(slot, NULL, NULL); PK11_FreeSlot(slot); } + // TODO(davidben): When https://bugzilla.mozilla.org/show_bug.cgi?id=564011 + // is fixed, we will no longer need the lock. We should detect this and not + // initialize a Lock here. + write_lock_.reset(new Lock()); + root_ = InitDefaultRootCerts(); #endif // defined(USE_NSS_FOR_SSL_ONLY) } @@ -219,10 +231,19 @@ class NSSInitSingleton { return PK11_GetInternalKeySlot(); } +#if defined(USE_NSS) + Lock* write_lock() { + return write_lock_.get(); + } +#endif // defined(USE_NSS) + private: PK11SlotInfo* real_db_slot_; // Overrides internal key slot if non-NULL. SECMODModule *root_; bool chromeos_user_logged_in_; +#if defined(USE_NSS) + scoped_ptr<Lock> write_lock_; +#endif // defined(USE_NSS) }; } // namespace @@ -237,6 +258,25 @@ void EnsureNSSInit() { Singleton<NSSInitSingleton>::get(); } +#if defined(USE_NSS) +Lock* GetNSSWriteLock() { + return Singleton<NSSInitSingleton>::get()->write_lock(); +} + +AutoNSSWriteLock::AutoNSSWriteLock() : lock_(GetNSSWriteLock()) { + // May be NULL if the lock is not needed in our version of NSS. + if (lock_) + lock_->Acquire(); +} + +AutoNSSWriteLock::~AutoNSSWriteLock() { + if (lock_) { + lock_->AssertAcquired(); + lock_->Release(); + } +} +#endif // defined(USE_NSS) + #if defined(OS_CHROMEOS) void OpenPersistentNSSDB() { Singleton<NSSInitSingleton>::get()->OpenPersistentNSSDB(); |