1diff -pu a/nss/lib/ssl/ssl3con.c b/nss/lib/ssl/ssl3con.c 2--- a/nss/lib/ssl/ssl3con.c 2014-01-17 19:01:58.104487211 -0800 3+++ b/nss/lib/ssl/ssl3con.c 2014-01-17 19:02:38.965159506 -0800 4@@ -5211,7 +5211,7 @@ ssl3_SendClientHello(sslSocket *ss, PRBo 5 * the lock across the calls to ssl3_CallHelloExtensionSenders. 6 */ 7 if (sid->u.ssl3.lock) { 8- PR_RWLock_Rlock(sid->u.ssl3.lock); 9+ NSSRWLock_LockRead(sid->u.ssl3.lock); 10 } 11 12 if (isTLS || (ss->firstHsDone && ss->peerRequestedProtection)) { 13@@ -5220,7 +5220,7 @@ ssl3_SendClientHello(sslSocket *ss, PRBo 14 15 extLen = ssl3_CallHelloExtensionSenders(ss, PR_FALSE, maxBytes, NULL); 16 if (extLen < 0) { 17- if (sid->u.ssl3.lock) { PR_RWLock_Unlock(sid->u.ssl3.lock); } 18+ if (sid->u.ssl3.lock) { NSSRWLock_UnlockRead(sid->u.ssl3.lock); } 19 return SECFailure; 20 } 21 maxBytes -= extLen; 22@@ -5248,7 +5248,7 @@ ssl3_SendClientHello(sslSocket *ss, PRBo 23 /* how many suites are permitted by policy and user preference? */ 24 num_suites = count_cipher_suites(ss, ss->ssl3.policy, PR_TRUE); 25 if (!num_suites) { 26- if (sid->u.ssl3.lock) { PR_RWLock_Unlock(sid->u.ssl3.lock); } 27+ if (sid->u.ssl3.lock) { NSSRWLock_UnlockRead(sid->u.ssl3.lock); } 28 return SECFailure; /* count_cipher_suites has set error code. */ 29 } 30 31@@ -5293,7 +5293,7 @@ ssl3_SendClientHello(sslSocket *ss, PRBo 32 33 rv = ssl3_AppendHandshakeHeader(ss, client_hello, length); 34 if (rv != SECSuccess) { 35- if (sid->u.ssl3.lock) { PR_RWLock_Unlock(sid->u.ssl3.lock); } 36+ if (sid->u.ssl3.lock) { NSSRWLock_UnlockRead(sid->u.ssl3.lock); } 37 return rv; /* err set by ssl3_AppendHandshake* */ 38 } 39 40@@ -5312,21 +5312,21 @@ ssl3_SendClientHello(sslSocket *ss, PRBo 41 rv = ssl3_AppendHandshakeNumber(ss, ss->clientHelloVersion, 2); 42 } 43 if (rv != SECSuccess) { 44- if (sid->u.ssl3.lock) { PR_RWLock_Unlock(sid->u.ssl3.lock); } 45+ if (sid->u.ssl3.lock) { NSSRWLock_UnlockRead(sid->u.ssl3.lock); } 46 return rv; /* err set by ssl3_AppendHandshake* */ 47 } 48 49 if (!resending) { /* Don't re-generate if we are in DTLS re-sending mode */ 50 rv = ssl3_GetNewRandom(&ss->ssl3.hs.client_random); 51 if (rv != SECSuccess) { 52- if (sid->u.ssl3.lock) { PR_RWLock_Unlock(sid->u.ssl3.lock); } 53+ if (sid->u.ssl3.lock) { NSSRWLock_UnlockRead(sid->u.ssl3.lock); } 54 return rv; /* err set by GetNewRandom. */ 55 } 56 } 57 rv = ssl3_AppendHandshake(ss, &ss->ssl3.hs.client_random, 58 SSL3_RANDOM_LENGTH); 59 if (rv != SECSuccess) { 60- if (sid->u.ssl3.lock) { PR_RWLock_Unlock(sid->u.ssl3.lock); } 61+ if (sid->u.ssl3.lock) { NSSRWLock_UnlockRead(sid->u.ssl3.lock); } 62 return rv; /* err set by ssl3_AppendHandshake* */ 63 } 64 65@@ -5336,7 +5336,7 @@ ssl3_SendClientHello(sslSocket *ss, PRBo 66 else 67 rv = ssl3_AppendHandshakeVariable(ss, NULL, 0, 1); 68 if (rv != SECSuccess) { 69- if (sid->u.ssl3.lock) { PR_RWLock_Unlock(sid->u.ssl3.lock); } 70+ if (sid->u.ssl3.lock) { NSSRWLock_UnlockRead(sid->u.ssl3.lock); } 71 return rv; /* err set by ssl3_AppendHandshake* */ 72 } 73 74@@ -5344,14 +5344,14 @@ ssl3_SendClientHello(sslSocket *ss, PRBo 75 rv = ssl3_AppendHandshakeVariable( 76 ss, ss->ssl3.hs.cookie, ss->ssl3.hs.cookieLen, 1); 77 if (rv != SECSuccess) { 78- if (sid->u.ssl3.lock) { PR_RWLock_Unlock(sid->u.ssl3.lock); } 79+ if (sid->u.ssl3.lock) { NSSRWLock_UnlockRead(sid->u.ssl3.lock); } 80 return rv; /* err set by ssl3_AppendHandshake* */ 81 } 82 } 83 84 rv = ssl3_AppendHandshakeNumber(ss, num_suites*sizeof(ssl3CipherSuite), 2); 85 if (rv != SECSuccess) { 86- if (sid->u.ssl3.lock) { PR_RWLock_Unlock(sid->u.ssl3.lock); } 87+ if (sid->u.ssl3.lock) { NSSRWLock_UnlockRead(sid->u.ssl3.lock); } 88 return rv; /* err set by ssl3_AppendHandshake* */ 89 } 90 91@@ -5360,7 +5360,7 @@ ssl3_SendClientHello(sslSocket *ss, PRBo 92 rv = ssl3_AppendHandshakeNumber(ss, TLS_EMPTY_RENEGOTIATION_INFO_SCSV, 93 sizeof(ssl3CipherSuite)); 94 if (rv != SECSuccess) { 95- if (sid->u.ssl3.lock) { PR_RWLock_Unlock(sid->u.ssl3.lock); } 96+ if (sid->u.ssl3.lock) { NSSRWLock_UnlockRead(sid->u.ssl3.lock); } 97 return rv; /* err set by ssl3_AppendHandshake* */ 98 } 99 actual_count++; 100@@ -5369,7 +5369,7 @@ ssl3_SendClientHello(sslSocket *ss, PRBo 101 rv = ssl3_AppendHandshakeNumber(ss, TLS_FALLBACK_SCSV, 102 sizeof(ssl3CipherSuite)); 103 if (rv != SECSuccess) { 104- if (sid->u.ssl3.lock) { PR_RWLock_Unlock(sid->u.ssl3.lock); } 105+ if (sid->u.ssl3.lock) { NSSRWLock_UnlockRead(sid->u.ssl3.lock); } 106 return rv; /* err set by ssl3_AppendHandshake* */ 107 } 108 actual_count++; 109@@ -5379,7 +5379,7 @@ ssl3_SendClientHello(sslSocket *ss, PRBo 110 if (config_match(suite, ss->ssl3.policy, PR_TRUE, &ss->vrange)) { 111 actual_count++; 112 if (actual_count > num_suites) { 113- if (sid->u.ssl3.lock) { PR_RWLock_Unlock(sid->u.ssl3.lock); } 114+ if (sid->u.ssl3.lock) { NSSRWLock_UnlockRead(sid->u.ssl3.lock); } 115 /* set error card removal/insertion error */ 116 PORT_SetError(SSL_ERROR_TOKEN_INSERTION_REMOVAL); 117 return SECFailure; 118@@ -5387,7 +5387,7 @@ ssl3_SendClientHello(sslSocket *ss, PRBo 119 rv = ssl3_AppendHandshakeNumber(ss, suite->cipher_suite, 120 sizeof(ssl3CipherSuite)); 121 if (rv != SECSuccess) { 122- if (sid->u.ssl3.lock) { PR_RWLock_Unlock(sid->u.ssl3.lock); } 123+ if (sid->u.ssl3.lock) { NSSRWLock_UnlockRead(sid->u.ssl3.lock); } 124 return rv; /* err set by ssl3_AppendHandshake* */ 125 } 126 } 127@@ -5398,14 +5398,14 @@ ssl3_SendClientHello(sslSocket *ss, PRBo 128 * the server.. */ 129 if (actual_count != num_suites) { 130 /* Card removal/insertion error */ 131- if (sid->u.ssl3.lock) { PR_RWLock_Unlock(sid->u.ssl3.lock); } 132+ if (sid->u.ssl3.lock) { NSSRWLock_UnlockRead(sid->u.ssl3.lock); } 133 PORT_SetError(SSL_ERROR_TOKEN_INSERTION_REMOVAL); 134 return SECFailure; 135 } 136 137 rv = ssl3_AppendHandshakeNumber(ss, numCompressionMethods, 1); 138 if (rv != SECSuccess) { 139- if (sid->u.ssl3.lock) { PR_RWLock_Unlock(sid->u.ssl3.lock); } 140+ if (sid->u.ssl3.lock) { NSSRWLock_UnlockRead(sid->u.ssl3.lock); } 141 return rv; /* err set by ssl3_AppendHandshake* */ 142 } 143 for (i = 0; i < compressionMethodsCount; i++) { 144@@ -5413,7 +5413,7 @@ ssl3_SendClientHello(sslSocket *ss, PRBo 145 continue; 146 rv = ssl3_AppendHandshakeNumber(ss, compressions[i], 1); 147 if (rv != SECSuccess) { 148- if (sid->u.ssl3.lock) { PR_RWLock_Unlock(sid->u.ssl3.lock); } 149+ if (sid->u.ssl3.lock) { NSSRWLock_UnlockRead(sid->u.ssl3.lock); } 150 return rv; /* err set by ssl3_AppendHandshake* */ 151 } 152 } 153@@ -5424,20 +5424,20 @@ ssl3_SendClientHello(sslSocket *ss, PRBo 154 155 rv = ssl3_AppendHandshakeNumber(ss, maxBytes, 2); 156 if (rv != SECSuccess) { 157- if (sid->u.ssl3.lock) { PR_RWLock_Unlock(sid->u.ssl3.lock); } 158+ if (sid->u.ssl3.lock) { NSSRWLock_UnlockRead(sid->u.ssl3.lock); } 159 return rv; /* err set by AppendHandshake. */ 160 } 161 162 extLen = ssl3_CallHelloExtensionSenders(ss, PR_TRUE, maxBytes, NULL); 163 if (extLen < 0) { 164- if (sid->u.ssl3.lock) { PR_RWLock_Unlock(sid->u.ssl3.lock); } 165+ if (sid->u.ssl3.lock) { NSSRWLock_UnlockRead(sid->u.ssl3.lock); } 166 return SECFailure; 167 } 168 maxBytes -= extLen; 169 170 extLen = ssl3_AppendPaddingExtension(ss, paddingExtensionLen, maxBytes); 171 if (extLen < 0) { 172- if (sid->u.ssl3.lock) { PR_RWLock_Unlock(sid->u.ssl3.lock); } 173+ if (sid->u.ssl3.lock) { NSSRWLock_UnlockRead(sid->u.ssl3.lock); } 174 return SECFailure; 175 } 176 maxBytes -= extLen; 177@@ -5446,7 +5446,7 @@ ssl3_SendClientHello(sslSocket *ss, PRBo 178 } 179 180 if (sid->u.ssl3.lock) { 181- PR_RWLock_Unlock(sid->u.ssl3.lock); 182+ NSSRWLock_UnlockRead(sid->u.ssl3.lock); 183 } 184 185 if (ss->xtnData.sentSessionTicketInClientHello) { 186diff -pu a/nss/lib/ssl/sslimpl.h b/nss/lib/ssl/sslimpl.h 187--- a/nss/lib/ssl/sslimpl.h 2014-01-17 19:00:52.843413560 -0800 188+++ b/nss/lib/ssl/sslimpl.h 2014-01-17 19:02:38.965159506 -0800 189@@ -730,7 +730,7 @@ struct sslSessionIDStr { 190 * cached. Before then, there is no need to lock anything because 191 * the sid isn't being shared by anything. 192 */ 193- PRRWLock *lock; 194+ NSSRWLock *lock; 195 196 /* The lock must be held while reading or writing these members 197 * because they change while the sid is cached. 198diff -pu a/nss/lib/ssl/sslnonce.c b/nss/lib/ssl/sslnonce.c 199--- a/nss/lib/ssl/sslnonce.c 2014-01-17 19:02:25.844943628 -0800 200+++ b/nss/lib/ssl/sslnonce.c 2014-01-17 19:02:38.965159506 -0800 201@@ -136,7 +136,7 @@ ssl_DestroySID(sslSessionID *sid) 202 } 203 204 if (sid->u.ssl3.lock) { 205- PR_DestroyRWLock(sid->u.ssl3.lock); 206+ NSSRWLock_Destroy(sid->u.ssl3.lock); 207 } 208 } 209 210@@ -308,7 +308,7 @@ CacheSID(sslSessionID *sid) 211 PRINT_BUF(8, (0, "sessionID:", 212 sid->u.ssl3.sessionID, sid->u.ssl3.sessionIDLength)); 213 214- sid->u.ssl3.lock = PR_NewRWLock(PR_RWLOCK_RANK_NONE, NULL); 215+ sid->u.ssl3.lock = NSSRWLock_New(NSS_RWLOCK_RANK_NONE, NULL); 216 if (!sid->u.ssl3.lock) { 217 return; 218 } 219@@ -448,7 +448,7 @@ ssl3_SetSIDSessionTicket(sslSessionID *s 220 * yet, so no locking is needed. 221 */ 222 if (sid->u.ssl3.lock) { 223- PR_RWLock_Wlock(sid->u.ssl3.lock); 224+ NSSRWLock_LockWrite(sid->u.ssl3.lock); 225 226 /* A server might have sent us an empty ticket, which has the 227 * effect of clearing the previously known ticket. 228@@ -467,6 +467,6 @@ ssl3_SetSIDSessionTicket(sslSessionID *s 229 newSessionTicket->ticket.len = 0; 230 231 if (sid->u.ssl3.lock) { 232- PR_RWLock_Unlock(sid->u.ssl3.lock); 233+ NSSRWLock_UnlockWrite(sid->u.ssl3.lock); 234 } 235 } 236