1 diff --git a/nss/lib/ssl/ssl3con.c b/nss/lib/ssl/ssl3con.c
2 index 53c29f0..bc54c99 100644
3 --- a/nss/lib/ssl/ssl3con.c
4 +++ b/nss/lib/ssl/ssl3con.c
5 @@ -5593,7 +5593,6 @@ SSL3_ShutdownServerCache(void)
8 PZ_Unlock(symWrapKeysLock);
9 - ssl_FreeSessionCacheLocks();
13 @@ -5645,7 +5644,7 @@ getWrappingKey( sslSocket * ss,
15 pSymWrapKey = &symWrapKeys[symWrapMechIndex].symWrapKey[exchKeyType];
17 - ssl_InitSessionCacheLocks(PR_TRUE);
18 + ssl_InitSessionCacheLocks();
20 PZ_Lock(symWrapKeysLock);
22 diff --git a/nss/lib/ssl/sslimpl.h b/nss/lib/ssl/sslimpl.h
23 index e3ae9ce..59140f8 100644
24 --- a/nss/lib/ssl/sslimpl.h
25 +++ b/nss/lib/ssl/sslimpl.h
26 @@ -1845,9 +1845,7 @@ extern SECStatus ssl_InitSymWrapKeysLock(void);
28 extern SECStatus ssl_FreeSymWrapKeysLock(void);
30 -extern SECStatus ssl_InitSessionCacheLocks(PRBool lazyInit);
32 -extern SECStatus ssl_FreeSessionCacheLocks(void);
33 +extern SECStatus ssl_InitSessionCacheLocks(void);
35 /***************** platform client auth ****************/
37 diff --git a/nss/lib/ssl/sslnonce.c b/nss/lib/ssl/sslnonce.c
38 index 5d8a954..a6f7349 100644
39 --- a/nss/lib/ssl/sslnonce.c
40 +++ b/nss/lib/ssl/sslnonce.c
41 @@ -35,91 +35,55 @@ static PZLock * cacheLock = NULL;
42 #define LOCK_CACHE lock_cache()
43 #define UNLOCK_CACHE PZ_Unlock(cacheLock)
45 +static PRCallOnceType lockOnce;
47 +/* FreeSessionCacheLocks is a callback from NSS_RegisterShutdown which destroys
48 + * the session cache locks on shutdown and resets them to their initial
51 -ssl_InitClientSessionCacheLock(void)
52 +FreeSessionCacheLocks(void* appData, void* nssData)
54 + static const PRCallOnceType pristineCallOnce;
58 + PORT_SetError(SEC_ERROR_NOT_INITIALIZED);
62 + PZ_DestroyLock(cacheLock);
65 + rv = ssl_FreeSymWrapKeysLock();
66 + if (rv != SECSuccess) {
70 + lockOnce = pristineCallOnce;
74 +/* InitSessionCacheLocks is called, protected by lockOnce, to create the
75 + * session cache locks. */
77 +InitSessionCacheLocks(void)
81 cacheLock = PZ_NewLock(nssILockCache);
82 - return cacheLock ? SECSuccess : SECFailure;
86 -ssl_FreeClientSessionCacheLock(void)
89 + if (cacheLock == NULL) {
92 + rv = ssl_InitSymWrapKeysLock();
93 + if (rv != SECSuccess) {
94 + PRErrorCode error = PORT_GetError();
95 PZ_DestroyLock(cacheLock);
99 - PORT_SetError(SEC_ERROR_NOT_INITIALIZED);
103 -static PRBool LocksInitializedEarly = PR_FALSE;
106 -FreeSessionCacheLocks()
108 - SECStatus rv1, rv2;
109 - rv1 = ssl_FreeSymWrapKeysLock();
110 - rv2 = ssl_FreeClientSessionCacheLock();
111 - if ( (SECSuccess == rv1) && (SECSuccess == rv2) ) {
118 -InitSessionCacheLocks(void)
120 - SECStatus rv1, rv2;
122 - rv1 = ssl_InitSymWrapKeysLock();
123 - rv2 = ssl_InitClientSessionCacheLock();
124 - if ( (SECSuccess == rv1) && (SECSuccess == rv2) ) {
127 - rc = PORT_GetError();
128 - FreeSessionCacheLocks();
133 -/* free the session cache locks if they were initialized early */
135 -ssl_FreeSessionCacheLocks()
137 - PORT_Assert(PR_TRUE == LocksInitializedEarly);
138 - if (!LocksInitializedEarly) {
139 - PORT_SetError(SEC_ERROR_NOT_INITIALIZED);
142 - FreeSessionCacheLocks();
143 - LocksInitializedEarly = PR_FALSE;
147 -static PRCallOnceType lockOnce;
149 -/* free the session cache locks if they were initialized lazily */
150 -static SECStatus ssl_ShutdownLocks(void* appData, void* nssData)
152 - PORT_Assert(PR_FALSE == LocksInitializedEarly);
153 - if (LocksInitializedEarly) {
154 - PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
157 - FreeSessionCacheLocks();
158 - memset(&lockOnce, 0, sizeof(lockOnce));
162 -static PRStatus initSessionCacheLocksLazily(void)
164 - SECStatus rv = InitSessionCacheLocks();
165 - if (SECSuccess != rv) {
166 + PORT_SetError(error);
169 - rv = NSS_RegisterShutdown(ssl_ShutdownLocks, NULL);
171 + rv = NSS_RegisterShutdown(FreeSessionCacheLocks, NULL);
172 PORT_Assert(SECSuccess == rv);
173 if (SECSuccess != rv) {
175 @@ -127,34 +91,18 @@ static PRStatus initSessionCacheLocksLazily(void)
179 -/* lazyInit means that the call is not happening during a 1-time
180 - * initialization function, but rather during dynamic, lazy initialization
183 -ssl_InitSessionCacheLocks(PRBool lazyInit)
184 +ssl_InitSessionCacheLocks(void)
186 - if (LocksInitializedEarly) {
191 - return (PR_SUCCESS ==
192 - PR_CallOnce(&lockOnce, initSessionCacheLocksLazily)) ?
193 - SECSuccess : SECFailure;
196 - if (SECSuccess == InitSessionCacheLocks()) {
197 - LocksInitializedEarly = PR_TRUE;
202 + return (PR_SUCCESS ==
203 + PR_CallOnce(&lockOnce, InitSessionCacheLocks)) ?
204 + SECSuccess : SECFailure;
211 - ssl_InitSessionCacheLocks(PR_TRUE);
212 + ssl_InitSessionCacheLocks();
216 diff --git a/nss/lib/ssl/sslsnce.c b/nss/lib/ssl/sslsnce.c
217 index b0446ad..34e07b0 100644
218 --- a/nss/lib/ssl/sslsnce.c
219 +++ b/nss/lib/ssl/sslsnce.c
220 @@ -1353,7 +1353,7 @@ SSL_ConfigServerSessionIDCache( int maxCacheEntries,
221 PRUint32 ssl3_timeout,
222 const char * directory)
224 - ssl_InitSessionCacheLocks(PR_FALSE);
225 + ssl_InitSessionCacheLocks();
226 return SSL_ConfigServerSessionIDCacheInstance(&globalCache,
227 maxCacheEntries, ssl2_timeout, ssl3_timeout, directory, PR_FALSE);
229 @@ -1467,7 +1467,7 @@ SSL_ConfigServerSessionIDCacheWithOpt(
230 PRBool enableMPCache)
232 if (!enableMPCache) {
233 - ssl_InitSessionCacheLocks(PR_FALSE);
234 + ssl_InitSessionCacheLocks();
235 return ssl_ConfigServerSessionIDCacheInstanceWithOpt(&globalCache,
236 ssl2_timeout, ssl3_timeout, directory, PR_FALSE,
237 maxCacheEntries, maxCertCacheEntries, maxSrvNameCacheEntries);
238 @@ -1512,7 +1512,7 @@ SSL_InheritMPServerSIDCacheInstance(cacheDesc *cache, const char * envString)
239 return SECSuccess; /* already done. */
242 - ssl_InitSessionCacheLocks(PR_FALSE);
243 + ssl_InitSessionCacheLocks();
245 ssl_sid_lookup = ServerSessionIDLookup;
246 ssl_sid_cache = ServerSessionIDCache;