| OLD | NEW |
| (Empty) |
| 1 diff -pu a/nss/lib/ssl/ssl3con.c b/nss/lib/ssl/ssl3con.c | |
| 2 --- a/nss/lib/ssl/ssl3con.c 2014-01-17 18:10:16.783281701 -0800 | |
| 3 +++ b/nss/lib/ssl/ssl3con.c 2014-01-17 18:11:03.734060469 -0800 | |
| 4 @@ -5678,7 +5678,6 @@ SSL3_ShutdownServerCache(void) | |
| 5 } | |
| 6 | |
| 7 PZ_Unlock(symWrapKeysLock); | |
| 8 - ssl_FreeSessionCacheLocks(); | |
| 9 return SECSuccess; | |
| 10 } | |
| 11 | |
| 12 @@ -5730,7 +5729,7 @@ getWrappingKey( sslSocket * ss, | |
| 13 | |
| 14 pSymWrapKey = &symWrapKeys[symWrapMechIndex].symWrapKey[exchKeyType]; | |
| 15 | |
| 16 - ssl_InitSessionCacheLocks(PR_TRUE); | |
| 17 + ssl_InitSessionCacheLocks(); | |
| 18 | |
| 19 PZ_Lock(symWrapKeysLock); | |
| 20 | |
| 21 diff -pu a/nss/lib/ssl/sslimpl.h b/nss/lib/ssl/sslimpl.h | |
| 22 --- a/nss/lib/ssl/sslimpl.h 2014-01-17 18:10:16.793281867 -0800 | |
| 23 +++ b/nss/lib/ssl/sslimpl.h 2014-01-17 18:11:03.734060469 -0800 | |
| 24 @@ -1913,9 +1913,7 @@ extern SECStatus ssl_InitSymWrapKeysLock | |
| 25 | |
| 26 extern SECStatus ssl_FreeSymWrapKeysLock(void); | |
| 27 | |
| 28 -extern SECStatus ssl_InitSessionCacheLocks(PRBool lazyInit); | |
| 29 - | |
| 30 -extern SECStatus ssl_FreeSessionCacheLocks(void); | |
| 31 +extern SECStatus ssl_InitSessionCacheLocks(void); | |
| 32 | |
| 33 /***************** platform client auth ****************/ | |
| 34 | |
| 35 diff -pu a/nss/lib/ssl/sslnonce.c b/nss/lib/ssl/sslnonce.c | |
| 36 --- a/nss/lib/ssl/sslnonce.c 2014-01-17 17:59:03.242109996 -0800 | |
| 37 +++ b/nss/lib/ssl/sslnonce.c 2014-01-17 18:11:03.754060801 -0800 | |
| 38 @@ -35,91 +35,55 @@ static PZLock * cacheLock = NULL; | |
| 39 #define LOCK_CACHE lock_cache() | |
| 40 #define UNLOCK_CACHE PZ_Unlock(cacheLock) | |
| 41 | |
| 42 -static SECStatus | |
| 43 -ssl_InitClientSessionCacheLock(void) | |
| 44 -{ | |
| 45 - cacheLock = PZ_NewLock(nssILockCache); | |
| 46 - return cacheLock ? SECSuccess : SECFailure; | |
| 47 -} | |
| 48 - | |
| 49 -static SECStatus | |
| 50 -ssl_FreeClientSessionCacheLock(void) | |
| 51 -{ | |
| 52 - if (cacheLock) { | |
| 53 - PZ_DestroyLock(cacheLock); | |
| 54 - cacheLock = NULL; | |
| 55 - return SECSuccess; | |
| 56 - } | |
| 57 - PORT_SetError(SEC_ERROR_NOT_INITIALIZED); | |
| 58 - return SECFailure; | |
| 59 -} | |
| 60 - | |
| 61 -static PRBool LocksInitializedEarly = PR_FALSE; | |
| 62 - | |
| 63 -static SECStatus | |
| 64 -FreeSessionCacheLocks() | |
| 65 -{ | |
| 66 - SECStatus rv1, rv2; | |
| 67 - rv1 = ssl_FreeSymWrapKeysLock(); | |
| 68 - rv2 = ssl_FreeClientSessionCacheLock(); | |
| 69 - if ( (SECSuccess == rv1) && (SECSuccess == rv2) ) { | |
| 70 - return SECSuccess; | |
| 71 - } | |
| 72 - return SECFailure; | |
| 73 -} | |
| 74 +static PRCallOnceType lockOnce; | |
| 75 | |
| 76 +/* FreeSessionCacheLocks is a callback from NSS_RegisterShutdown which destroys | |
| 77 + * the session cache locks on shutdown and resets them to their initial | |
| 78 + * state. */ | |
| 79 static SECStatus | |
| 80 -InitSessionCacheLocks(void) | |
| 81 +FreeSessionCacheLocks(void* appData, void* nssData) | |
| 82 { | |
| 83 - SECStatus rv1, rv2; | |
| 84 - PRErrorCode rc; | |
| 85 - rv1 = ssl_InitSymWrapKeysLock(); | |
| 86 - rv2 = ssl_InitClientSessionCacheLock(); | |
| 87 - if ( (SECSuccess == rv1) && (SECSuccess == rv2) ) { | |
| 88 - return SECSuccess; | |
| 89 - } | |
| 90 - rc = PORT_GetError(); | |
| 91 - FreeSessionCacheLocks(); | |
| 92 - PORT_SetError(rc); | |
| 93 - return SECFailure; | |
| 94 -} | |
| 95 + static const PRCallOnceType pristineCallOnce; | |
| 96 + SECStatus rv; | |
| 97 | |
| 98 -/* free the session cache locks if they were initialized early */ | |
| 99 -SECStatus | |
| 100 -ssl_FreeSessionCacheLocks() | |
| 101 -{ | |
| 102 - PORT_Assert(PR_TRUE == LocksInitializedEarly); | |
| 103 - if (!LocksInitializedEarly) { | |
| 104 + if (!cacheLock) { | |
| 105 PORT_SetError(SEC_ERROR_NOT_INITIALIZED); | |
| 106 return SECFailure; | |
| 107 } | |
| 108 - FreeSessionCacheLocks(); | |
| 109 - LocksInitializedEarly = PR_FALSE; | |
| 110 - return SECSuccess; | |
| 111 -} | |
| 112 | |
| 113 -static PRCallOnceType lockOnce; | |
| 114 + PZ_DestroyLock(cacheLock); | |
| 115 + cacheLock = NULL; | |
| 116 | |
| 117 -/* free the session cache locks if they were initialized lazily */ | |
| 118 -static SECStatus ssl_ShutdownLocks(void* appData, void* nssData) | |
| 119 -{ | |
| 120 - PORT_Assert(PR_FALSE == LocksInitializedEarly); | |
| 121 - if (LocksInitializedEarly) { | |
| 122 - PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); | |
| 123 - return SECFailure; | |
| 124 + rv = ssl_FreeSymWrapKeysLock(); | |
| 125 + if (rv != SECSuccess) { | |
| 126 + return rv; | |
| 127 } | |
| 128 - FreeSessionCacheLocks(); | |
| 129 - memset(&lockOnce, 0, sizeof(lockOnce)); | |
| 130 + | |
| 131 + lockOnce = pristineCallOnce; | |
| 132 return SECSuccess; | |
| 133 } | |
| 134 | |
| 135 -static PRStatus initSessionCacheLocksLazily(void) | |
| 136 +/* InitSessionCacheLocks is called, protected by lockOnce, to create the | |
| 137 + * session cache locks. */ | |
| 138 +static PRStatus | |
| 139 +InitSessionCacheLocks(void) | |
| 140 { | |
| 141 - SECStatus rv = InitSessionCacheLocks(); | |
| 142 - if (SECSuccess != rv) { | |
| 143 + SECStatus rv; | |
| 144 + | |
| 145 + cacheLock = PZ_NewLock(nssILockCache); | |
| 146 + if (cacheLock == NULL) { | |
| 147 return PR_FAILURE; | |
| 148 } | |
| 149 - rv = NSS_RegisterShutdown(ssl_ShutdownLocks, NULL); | |
| 150 + rv = ssl_InitSymWrapKeysLock(); | |
| 151 + if (rv != SECSuccess) { | |
| 152 + PRErrorCode error = PORT_GetError(); | |
| 153 + PZ_DestroyLock(cacheLock); | |
| 154 + cacheLock = NULL; | |
| 155 + PORT_SetError(error); | |
| 156 + return PR_FAILURE; | |
| 157 + } | |
| 158 + | |
| 159 + rv = NSS_RegisterShutdown(FreeSessionCacheLocks, NULL); | |
| 160 PORT_Assert(SECSuccess == rv); | |
| 161 if (SECSuccess != rv) { | |
| 162 return PR_FAILURE; | |
| 163 @@ -127,34 +91,18 @@ static PRStatus initSessionCacheLocksLaz | |
| 164 return PR_SUCCESS; | |
| 165 } | |
| 166 | |
| 167 -/* lazyInit means that the call is not happening during a 1-time | |
| 168 - * initialization function, but rather during dynamic, lazy initialization | |
| 169 - */ | |
| 170 SECStatus | |
| 171 -ssl_InitSessionCacheLocks(PRBool lazyInit) | |
| 172 +ssl_InitSessionCacheLocks(void) | |
| 173 { | |
| 174 - if (LocksInitializedEarly) { | |
| 175 - return SECSuccess; | |
| 176 - } | |
| 177 - | |
| 178 - if (lazyInit) { | |
| 179 - return (PR_SUCCESS == | |
| 180 - PR_CallOnce(&lockOnce, initSessionCacheLocksLazily)) ? | |
| 181 - SECSuccess : SECFailure; | |
| 182 - } | |
| 183 - | |
| 184 - if (SECSuccess == InitSessionCacheLocks()) { | |
| 185 - LocksInitializedEarly = PR_TRUE; | |
| 186 - return SECSuccess; | |
| 187 - } | |
| 188 - | |
| 189 - return SECFailure; | |
| 190 + return (PR_SUCCESS == | |
| 191 + PR_CallOnce(&lockOnce, InitSessionCacheLocks)) ? | |
| 192 + SECSuccess : SECFailure; | |
| 193 } | |
| 194 | |
| 195 -static void | |
| 196 +static void | |
| 197 lock_cache(void) | |
| 198 { | |
| 199 - ssl_InitSessionCacheLocks(PR_TRUE); | |
| 200 + ssl_InitSessionCacheLocks(); | |
| 201 PZ_Lock(cacheLock); | |
| 202 } | |
| 203 | |
| 204 diff -pu a/nss/lib/ssl/sslsnce.c b/nss/lib/ssl/sslsnce.c | |
| 205 --- a/nss/lib/ssl/sslsnce.c 2014-01-17 17:49:26.072517368 -0800 | |
| 206 +++ b/nss/lib/ssl/sslsnce.c 2014-01-17 18:11:03.774061133 -0800 | |
| 207 @@ -1353,7 +1353,7 @@ SSL_ConfigServerSessionIDCache( int | |
| 208 PRUint32 ssl3_timeout, | |
| 209 const char * directory) | |
| 210 { | |
| 211 - ssl_InitSessionCacheLocks(PR_FALSE); | |
| 212 + ssl_InitSessionCacheLocks(); | |
| 213 return SSL_ConfigServerSessionIDCacheInstance(&globalCache, | |
| 214 maxCacheEntries, ssl2_timeout, ssl3_timeout, directory, PR_FALSE
); | |
| 215 } | |
| 216 @@ -1467,7 +1467,7 @@ SSL_ConfigServerSessionIDCacheWithOpt( | |
| 217 PRBool enableMPCache) | |
| 218 { | |
| 219 if (!enableMPCache) { | |
| 220 - ssl_InitSessionCacheLocks(PR_FALSE); | |
| 221 + ssl_InitSessionCacheLocks(); | |
| 222 return ssl_ConfigServerSessionIDCacheInstanceWithOpt(&globalCache, | |
| 223 ssl2_timeout, ssl3_timeout, directory, PR_FALSE, | |
| 224 maxCacheEntries, maxCertCacheEntries, maxSrvNameCacheEntries); | |
| 225 @@ -1512,7 +1512,7 @@ SSL_InheritMPServerSIDCacheInstance(cach | |
| 226 return SECSuccess; /* already done. */ | |
| 227 } | |
| 228 | |
| 229 - ssl_InitSessionCacheLocks(PR_FALSE); | |
| 230 + ssl_InitSessionCacheLocks(); | |
| 231 | |
| 232 ssl_sid_lookup = ServerSessionIDLookup; | |
| 233 ssl_sid_cache = ServerSessionIDCache; | |
| OLD | NEW |