15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)diff -pu a/nss/lib/ssl/ssl3con.c b/nss/lib/ssl/ssl3con.c
25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)--- a/nss/lib/ssl/ssl3con.c	2014-01-17 18:10:16.783281701 -0800
35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)+++ b/nss/lib/ssl/ssl3con.c	2014-01-17 18:11:03.734060469 -0800
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)@@ -5678,7 +5678,6 @@ SSL3_ShutdownServerCache(void)
568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)     }
668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 
768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)     PZ_Unlock(symWrapKeysLock);
868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-    ssl_FreeSessionCacheLocks();
968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)     return SECSuccess;
1068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) }
1168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)@@ -5730,7 +5729,7 @@ getWrappingKey( sslSocket *       ss,
1368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 
1468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)     pSymWrapKey = &symWrapKeys[symWrapMechIndex].symWrapKey[exchKeyType];
1568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 
1668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-    ssl_InitSessionCacheLocks(PR_TRUE);
1768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)+    ssl_InitSessionCacheLocks();
1868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 
1968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)     PZ_Lock(symWrapKeysLock);
2068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)diff -pu a/nss/lib/ssl/sslimpl.h b/nss/lib/ssl/sslimpl.h
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)--- a/nss/lib/ssl/sslimpl.h	2014-01-17 18:10:16.793281867 -0800
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)+++ b/nss/lib/ssl/sslimpl.h	2014-01-17 18:11:03.734060469 -0800
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)@@ -1913,9 +1913,7 @@ extern SECStatus ssl_InitSymWrapKeysLock
2568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 
2668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) extern SECStatus ssl_FreeSymWrapKeysLock(void);
2768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 
2868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-extern SECStatus ssl_InitSessionCacheLocks(PRBool lazyInit);
2968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-
3068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-extern SECStatus ssl_FreeSessionCacheLocks(void);
3168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)+extern SECStatus ssl_InitSessionCacheLocks(void);
3268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 
3368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) /***************** platform client auth ****************/
3468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)diff -pu a/nss/lib/ssl/sslnonce.c b/nss/lib/ssl/sslnonce.c
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)--- a/nss/lib/ssl/sslnonce.c	2014-01-17 17:59:03.242109996 -0800
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)+++ b/nss/lib/ssl/sslnonce.c	2014-01-17 18:11:03.754060801 -0800
3868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)@@ -35,91 +35,55 @@ static PZLock *      cacheLock = NULL;
3968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) #define LOCK_CACHE 	lock_cache()
4068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) #define UNLOCK_CACHE	PZ_Unlock(cacheLock)
4168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)-static SECStatus
4368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-ssl_InitClientSessionCacheLock(void)
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)-{
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)-    cacheLock = PZ_NewLock(nssILockCache);
4668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-    return cacheLock ? SECSuccess : SECFailure;
4768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-}
4868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-
4968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-static SECStatus
5068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-ssl_FreeClientSessionCacheLock(void)
5168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-{
5268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-    if (cacheLock) {
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)-        PZ_DestroyLock(cacheLock);
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)-        cacheLock = NULL;
5568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-        return SECSuccess;
5668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-    }
5768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-    PORT_SetError(SEC_ERROR_NOT_INITIALIZED);
5868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-    return SECFailure;
5968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-}
6068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-
6168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-static PRBool LocksInitializedEarly = PR_FALSE;
6268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-
6368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-static SECStatus
6468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-FreeSessionCacheLocks()
6568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-{
6668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-    SECStatus rv1, rv2;
6768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-    rv1 = ssl_FreeSymWrapKeysLock();
6868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-    rv2 = ssl_FreeClientSessionCacheLock();
6968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-    if ( (SECSuccess == rv1) && (SECSuccess == rv2) ) {
7068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-        return SECSuccess;
7168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-    }
7268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-    return SECFailure;
7368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-}
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)+static PRCallOnceType lockOnce;
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)+/* FreeSessionCacheLocks is a callback from NSS_RegisterShutdown which destroys
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)+ * the session cache locks on shutdown and resets them to their initial
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)+ * state. */
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static SECStatus
8068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-InitSessionCacheLocks(void)
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)+FreeSessionCacheLocks(void* appData, void* nssData)
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) {
8368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-    SECStatus rv1, rv2;
8468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-    PRErrorCode rc;
8568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-    rv1 = ssl_InitSymWrapKeysLock();
8668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-    rv2 = ssl_InitClientSessionCacheLock();
8768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-    if ( (SECSuccess == rv1) && (SECSuccess == rv2) ) {
8868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-        return SECSuccess;
8968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-    }
9068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-    rc = PORT_GetError();
9168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-    FreeSessionCacheLocks();
9268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-    PORT_SetError(rc);
9368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-    return SECFailure;
9468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-}
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)+    static const PRCallOnceType pristineCallOnce;
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)+    SECStatus rv;
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 
9868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-/* free the session cache locks if they were initialized early */
9968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-SECStatus
10068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-ssl_FreeSessionCacheLocks()
10168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-{
10268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-    PORT_Assert(PR_TRUE == LocksInitializedEarly);
10368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-    if (!LocksInitializedEarly) {
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)+    if (!cacheLock) {
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         PORT_SetError(SEC_ERROR_NOT_INITIALIZED);
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         return SECFailure;
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)     }
10868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-    FreeSessionCacheLocks();
10968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-    LocksInitializedEarly = PR_FALSE;
11068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-    return SECSuccess;
11168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-}
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 
11368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-static PRCallOnceType lockOnce;
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)+    PZ_DestroyLock(cacheLock);
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)+    cacheLock = NULL;
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 
11768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-/* free the session cache locks if they were initialized lazily */
11868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-static SECStatus ssl_ShutdownLocks(void* appData, void* nssData)
11968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-{
12068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-    PORT_Assert(PR_FALSE == LocksInitializedEarly);
12168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-    if (LocksInitializedEarly) {
12268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-        PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
12368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-        return SECFailure;
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)+    rv = ssl_FreeSymWrapKeysLock();
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)+    if (rv != SECSuccess) {
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)+        return rv;
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)     }
12868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-    FreeSessionCacheLocks();
12968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-    memset(&lockOnce, 0, sizeof(lockOnce));
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)+
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)+    lockOnce = pristineCallOnce;
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)     return SECSuccess;
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 
13568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-static PRStatus initSessionCacheLocksLazily(void)
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)+/* InitSessionCacheLocks is called, protected by lockOnce, to create the
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)+ * session cache locks. */
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)+static PRStatus
1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)+InitSessionCacheLocks(void)
1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) {
14168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-    SECStatus rv = InitSessionCacheLocks();
14268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-    if (SECSuccess != rv) {
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)+    SECStatus rv;
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)+
1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)+    cacheLock = PZ_NewLock(nssILockCache);
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)+    if (cacheLock == NULL) {
14768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)         return PR_FAILURE;
14868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)     }
14968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-    rv = NSS_RegisterShutdown(ssl_ShutdownLocks, NULL);
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)+    rv = ssl_InitSymWrapKeysLock();
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)+    if (rv != SECSuccess) {
1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)+        PRErrorCode error = PORT_GetError();
1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)+        PZ_DestroyLock(cacheLock);
1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)+        cacheLock = NULL;
1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)+        PORT_SetError(error);
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)+        return PR_FAILURE;
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)+    }
15868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)+
15968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)+    rv = NSS_RegisterShutdown(FreeSessionCacheLocks, NULL);
16068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)     PORT_Assert(SECSuccess == rv);
16168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)     if (SECSuccess != rv) {
16268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)         return PR_FAILURE;
1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)@@ -127,34 +91,18 @@ static PRStatus initSessionCacheLocksLaz
16468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)     return PR_SUCCESS;
16568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) }
16668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 
16768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-/* lazyInit means that the call is not happening during a 1-time
16868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)- * initialization function, but rather during dynamic, lazy initialization
16968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)- */
17068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) SECStatus
17168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-ssl_InitSessionCacheLocks(PRBool lazyInit)
17268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)+ssl_InitSessionCacheLocks(void)
17368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) {
17468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-    if (LocksInitializedEarly) {
17568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-        return SECSuccess;
17668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-    }
17768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-
17868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-    if (lazyInit) {
17968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-        return (PR_SUCCESS ==
18068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-                PR_CallOnce(&lockOnce, initSessionCacheLocksLazily)) ?
18168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-               SECSuccess : SECFailure;
18268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-    }
18368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-     
18468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-    if (SECSuccess == InitSessionCacheLocks()) {
18568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-        LocksInitializedEarly = PR_TRUE;
18668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-        return SECSuccess;
18768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-    }
18868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-
18968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-    return SECFailure;
19068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)+    return (PR_SUCCESS ==
19168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)+            PR_CallOnce(&lockOnce, InitSessionCacheLocks)) ?
19268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)+           SECSuccess : SECFailure;
19368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) }
19468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 
19568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-static void 
19668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)+static void
19768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) lock_cache(void)
19868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) {
19968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-    ssl_InitSessionCacheLocks(PR_TRUE);
20068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)+    ssl_InitSessionCacheLocks();
20168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)     PZ_Lock(cacheLock);
20268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) }
20368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 
2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)diff -pu a/nss/lib/ssl/sslsnce.c b/nss/lib/ssl/sslsnce.c
2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)--- a/nss/lib/ssl/sslsnce.c	2014-01-17 17:49:26.072517368 -0800
2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)+++ b/nss/lib/ssl/sslsnce.c	2014-01-17 18:11:03.774061133 -0800
2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)@@ -1353,7 +1353,7 @@ SSL_ConfigServerSessionIDCache(	int
20868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 			       	PRUint32 ssl3_timeout, 
20968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 			  const char *   directory)
21068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) {
21168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-    ssl_InitSessionCacheLocks(PR_FALSE);
21268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)+    ssl_InitSessionCacheLocks();
21368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)     return SSL_ConfigServerSessionIDCacheInstance(&globalCache, 
21468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)     		maxCacheEntries, ssl2_timeout, ssl3_timeout, directory, PR_FALSE);
21568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) }
21668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)@@ -1467,7 +1467,7 @@ SSL_ConfigServerSessionIDCacheWithOpt(
21768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                 PRBool enableMPCache)
21868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) {
21968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)     if (!enableMPCache) {
22068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-        ssl_InitSessionCacheLocks(PR_FALSE);
22168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)+        ssl_InitSessionCacheLocks();
22268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)         return ssl_ConfigServerSessionIDCacheInstanceWithOpt(&globalCache, 
22368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            ssl2_timeout, ssl3_timeout, directory, PR_FALSE,
22468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            maxCacheEntries, maxCertCacheEntries, maxSrvNameCacheEntries);
2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)@@ -1512,7 +1512,7 @@ SSL_InheritMPServerSIDCacheInstance(cach
22668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)     	return SECSuccess;	/* already done. */
22768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)     }
22868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 
22968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)-    ssl_InitSessionCacheLocks(PR_FALSE);
23068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)+    ssl_InitSessionCacheLocks();
23168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 
23268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)     ssl_sid_lookup  = ServerSessionIDLookup;
23368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)     ssl_sid_cache   = ServerSessionIDCache;
234