Index: net/third_party/nss/ssl/sslnonce.c |
diff --git a/net/third_party/nss/ssl/sslnonce.c b/net/third_party/nss/ssl/sslnonce.c |
index 5d8a95407aa09711660be45711464b26769f7207..a6f734948a3448e9af6f0b9eddc5a103593a63ba 100644 |
--- a/net/third_party/nss/ssl/sslnonce.c |
+++ b/net/third_party/nss/ssl/sslnonce.c |
@@ -35,91 +35,55 @@ static PZLock * cacheLock = NULL; |
#define LOCK_CACHE lock_cache() |
#define UNLOCK_CACHE PZ_Unlock(cacheLock) |
+static PRCallOnceType lockOnce; |
+ |
+/* FreeSessionCacheLocks is a callback from NSS_RegisterShutdown which destroys |
+ * the session cache locks on shutdown and resets them to their initial |
+ * state. */ |
static SECStatus |
-ssl_InitClientSessionCacheLock(void) |
+FreeSessionCacheLocks(void* appData, void* nssData) |
{ |
+ static const PRCallOnceType pristineCallOnce; |
+ SECStatus rv; |
+ |
+ if (!cacheLock) { |
+ PORT_SetError(SEC_ERROR_NOT_INITIALIZED); |
+ return SECFailure; |
+ } |
+ |
+ PZ_DestroyLock(cacheLock); |
+ cacheLock = NULL; |
+ |
+ rv = ssl_FreeSymWrapKeysLock(); |
+ if (rv != SECSuccess) { |
+ return rv; |
+ } |
+ |
+ lockOnce = pristineCallOnce; |
+ return SECSuccess; |
+} |
+ |
+/* InitSessionCacheLocks is called, protected by lockOnce, to create the |
+ * session cache locks. */ |
+static PRStatus |
+InitSessionCacheLocks(void) |
+{ |
+ SECStatus rv; |
+ |
cacheLock = PZ_NewLock(nssILockCache); |
- return cacheLock ? SECSuccess : SECFailure; |
-} |
- |
-static SECStatus |
-ssl_FreeClientSessionCacheLock(void) |
-{ |
- if (cacheLock) { |
+ if (cacheLock == NULL) { |
+ return PR_FAILURE; |
+ } |
+ rv = ssl_InitSymWrapKeysLock(); |
+ if (rv != SECSuccess) { |
+ PRErrorCode error = PORT_GetError(); |
PZ_DestroyLock(cacheLock); |
cacheLock = NULL; |
- return SECSuccess; |
- } |
- PORT_SetError(SEC_ERROR_NOT_INITIALIZED); |
- return SECFailure; |
-} |
- |
-static PRBool LocksInitializedEarly = PR_FALSE; |
- |
-static SECStatus |
-FreeSessionCacheLocks() |
-{ |
- SECStatus rv1, rv2; |
- rv1 = ssl_FreeSymWrapKeysLock(); |
- rv2 = ssl_FreeClientSessionCacheLock(); |
- if ( (SECSuccess == rv1) && (SECSuccess == rv2) ) { |
- return SECSuccess; |
- } |
- return SECFailure; |
-} |
- |
-static SECStatus |
-InitSessionCacheLocks(void) |
-{ |
- SECStatus rv1, rv2; |
- PRErrorCode rc; |
- rv1 = ssl_InitSymWrapKeysLock(); |
- rv2 = ssl_InitClientSessionCacheLock(); |
- if ( (SECSuccess == rv1) && (SECSuccess == rv2) ) { |
- return SECSuccess; |
- } |
- rc = PORT_GetError(); |
- FreeSessionCacheLocks(); |
- PORT_SetError(rc); |
- return SECFailure; |
-} |
- |
-/* free the session cache locks if they were initialized early */ |
-SECStatus |
-ssl_FreeSessionCacheLocks() |
-{ |
- PORT_Assert(PR_TRUE == LocksInitializedEarly); |
- if (!LocksInitializedEarly) { |
- PORT_SetError(SEC_ERROR_NOT_INITIALIZED); |
- return SECFailure; |
- } |
- FreeSessionCacheLocks(); |
- LocksInitializedEarly = PR_FALSE; |
- return SECSuccess; |
-} |
- |
-static PRCallOnceType lockOnce; |
- |
-/* free the session cache locks if they were initialized lazily */ |
-static SECStatus ssl_ShutdownLocks(void* appData, void* nssData) |
-{ |
- PORT_Assert(PR_FALSE == LocksInitializedEarly); |
- if (LocksInitializedEarly) { |
- PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); |
- return SECFailure; |
- } |
- FreeSessionCacheLocks(); |
- memset(&lockOnce, 0, sizeof(lockOnce)); |
- return SECSuccess; |
-} |
- |
-static PRStatus initSessionCacheLocksLazily(void) |
-{ |
- SECStatus rv = InitSessionCacheLocks(); |
- if (SECSuccess != rv) { |
+ PORT_SetError(error); |
return PR_FAILURE; |
} |
- rv = NSS_RegisterShutdown(ssl_ShutdownLocks, NULL); |
+ |
+ rv = NSS_RegisterShutdown(FreeSessionCacheLocks, NULL); |
PORT_Assert(SECSuccess == rv); |
if (SECSuccess != rv) { |
return PR_FAILURE; |
@@ -127,34 +91,18 @@ static PRStatus initSessionCacheLocksLazily(void) |
return PR_SUCCESS; |
} |
-/* lazyInit means that the call is not happening during a 1-time |
- * initialization function, but rather during dynamic, lazy initialization |
- */ |
SECStatus |
-ssl_InitSessionCacheLocks(PRBool lazyInit) |
+ssl_InitSessionCacheLocks(void) |
{ |
- if (LocksInitializedEarly) { |
- return SECSuccess; |
- } |
- |
- if (lazyInit) { |
- return (PR_SUCCESS == |
- PR_CallOnce(&lockOnce, initSessionCacheLocksLazily)) ? |
- SECSuccess : SECFailure; |
- } |
- |
- if (SECSuccess == InitSessionCacheLocks()) { |
- LocksInitializedEarly = PR_TRUE; |
- return SECSuccess; |
- } |
- |
- return SECFailure; |
+ return (PR_SUCCESS == |
+ PR_CallOnce(&lockOnce, InitSessionCacheLocks)) ? |
+ SECSuccess : SECFailure; |
} |
-static void |
+static void |
lock_cache(void) |
{ |
- ssl_InitSessionCacheLocks(PR_TRUE); |
+ ssl_InitSessionCacheLocks(); |
PZ_Lock(cacheLock); |
} |