| diff --git a/nss/lib/ssl/ssl3con.c b/nss/lib/ssl/ssl3con.c |
| index 53c29f0..bc54c99 100644 |
| --- a/nss/lib/ssl/ssl3con.c |
| +++ b/nss/lib/ssl/ssl3con.c |
| @@ -5593,7 +5593,6 @@ SSL3_ShutdownServerCache(void) |
| } |
| |
| PZ_Unlock(symWrapKeysLock); |
| - ssl_FreeSessionCacheLocks(); |
| return SECSuccess; |
| } |
| |
| @@ -5645,7 +5644,7 @@ getWrappingKey( sslSocket * ss, |
| |
| pSymWrapKey = &symWrapKeys[symWrapMechIndex].symWrapKey[exchKeyType]; |
| |
| - ssl_InitSessionCacheLocks(PR_TRUE); |
| + ssl_InitSessionCacheLocks(); |
| |
| PZ_Lock(symWrapKeysLock); |
| |
| diff --git a/nss/lib/ssl/sslimpl.h b/nss/lib/ssl/sslimpl.h |
| index e3ae9ce..59140f8 100644 |
| --- a/nss/lib/ssl/sslimpl.h |
| +++ b/nss/lib/ssl/sslimpl.h |
| @@ -1845,9 +1845,7 @@ extern SECStatus ssl_InitSymWrapKeysLock(void); |
| |
| extern SECStatus ssl_FreeSymWrapKeysLock(void); |
| |
| -extern SECStatus ssl_InitSessionCacheLocks(PRBool lazyInit); |
| - |
| -extern SECStatus ssl_FreeSessionCacheLocks(void); |
| +extern SECStatus ssl_InitSessionCacheLocks(void); |
| |
| /***************** platform client auth ****************/ |
| |
| diff --git a/nss/lib/ssl/sslnonce.c b/nss/lib/ssl/sslnonce.c |
| index 5d8a954..a6f7349 100644 |
| --- a/nss/lib/ssl/sslnonce.c |
| +++ b/nss/lib/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); |
| } |
| |
| diff --git a/nss/lib/ssl/sslsnce.c b/nss/lib/ssl/sslsnce.c |
| index b0446ad..34e07b0 100644 |
| --- a/nss/lib/ssl/sslsnce.c |
| +++ b/nss/lib/ssl/sslsnce.c |
| @@ -1353,7 +1353,7 @@ SSL_ConfigServerSessionIDCache( int maxCacheEntries, |
| PRUint32 ssl3_timeout, |
| const char * directory) |
| { |
| - ssl_InitSessionCacheLocks(PR_FALSE); |
| + ssl_InitSessionCacheLocks(); |
| return SSL_ConfigServerSessionIDCacheInstance(&globalCache, |
| maxCacheEntries, ssl2_timeout, ssl3_timeout, directory, PR_FALSE); |
| } |
| @@ -1467,7 +1467,7 @@ SSL_ConfigServerSessionIDCacheWithOpt( |
| PRBool enableMPCache) |
| { |
| if (!enableMPCache) { |
| - ssl_InitSessionCacheLocks(PR_FALSE); |
| + ssl_InitSessionCacheLocks(); |
| return ssl_ConfigServerSessionIDCacheInstanceWithOpt(&globalCache, |
| ssl2_timeout, ssl3_timeout, directory, PR_FALSE, |
| maxCacheEntries, maxCertCacheEntries, maxSrvNameCacheEntries); |
| @@ -1512,7 +1512,7 @@ SSL_InheritMPServerSIDCacheInstance(cacheDesc *cache, const char * envString) |
| return SECSuccess; /* already done. */ |
| } |
| |
| - ssl_InitSessionCacheLocks(PR_FALSE); |
| + ssl_InitSessionCacheLocks(); |
| |
| ssl_sid_lookup = ServerSessionIDLookup; |
| ssl_sid_cache = ServerSessionIDCache; |