Index: nss/lib/pki/tdcache.c |
diff --git a/nss/lib/pki/tdcache.c b/nss/lib/pki/tdcache.c |
index 0842d8b2c2b73a649cbbe694c2d70ae2f37c3e3f..7842189ca7e6693a4d0de9aaa0795d25471a4fbd 100644 |
--- a/nss/lib/pki/tdcache.c |
+++ b/nss/lib/pki/tdcache.c |
@@ -391,6 +391,7 @@ remove_token_certs(const void *k, void *v, void *a) |
nssPKIObject *object = &c->object; |
struct token_cert_dtor *dtor = a; |
PRUint32 i; |
+ nssPKIObject_AddRef(object); |
nssPKIObject_Lock(object); |
for (i=0; i<object->numInstances; i++) { |
if (object->instances[i]->token == dtor->token) { |
@@ -409,6 +410,7 @@ remove_token_certs(const void *k, void *v, void *a) |
} |
} |
nssPKIObject_Unlock(object); |
+ nssPKIObject_Destroy(object); |
return; |
} |
@@ -435,17 +437,21 @@ nssTrustDomain_RemoveTokenCertsFromCache ( |
dtor.numCerts = 0; |
dtor.arrSize = arrSize; |
PZ_Lock(td->cache->lock); |
- nssHash_Iterate(td->cache->issuerAndSN, remove_token_certs, (void *)&dtor); |
+ nssHash_Iterate(td->cache->issuerAndSN, remove_token_certs, &dtor); |
for (i=0; i<dtor.numCerts; i++) { |
if (dtor.certs[i]->object.numInstances == 0) { |
nssTrustDomain_RemoveCertFromCacheLOCKED(td, dtor.certs[i]); |
dtor.certs[i] = NULL; /* skip this cert in the second for loop */ |
+ } else { |
+ /* make sure it doesn't disappear on us before we finish */ |
+ nssCertificate_AddRef(dtor.certs[i]); |
} |
} |
PZ_Unlock(td->cache->lock); |
for (i=0; i<dtor.numCerts; i++) { |
if (dtor.certs[i]) { |
STAN_ForceCERTCertificateUpdate(dtor.certs[i]); |
+ nssCertificate_Destroy(dtor.certs[i]); |
} |
} |
nss_ZFreeIf(dtor.certs); |
@@ -1046,32 +1052,6 @@ nssTrustDomain_GetCertForIssuerAndSNFromCache ( |
return rvCert; |
} |
-static PRStatus |
-issuer_and_serial_from_encoding ( |
- NSSBER *encoding, |
- NSSDER *issuer, |
- NSSDER *serial |
-) |
-{ |
- SECItem derCert, derIssuer, derSerial; |
- SECStatus secrv; |
- derCert.data = (unsigned char *)encoding->data; |
- derCert.len = encoding->size; |
- secrv = CERT_IssuerNameFromDERCert(&derCert, &derIssuer); |
- if (secrv != SECSuccess) { |
- return PR_FAILURE; |
- } |
- secrv = CERT_SerialNumberFromDERCert(&derCert, &derSerial); |
- if (secrv != SECSuccess) { |
- return PR_FAILURE; |
- } |
- issuer->data = derIssuer.data; |
- issuer->size = derIssuer.len; |
- serial->data = derSerial.data; |
- serial->size = derSerial.len; |
- return PR_SUCCESS; |
-} |
- |
/* |
* Look for a specific cert in the cache |
*/ |
@@ -1084,7 +1064,7 @@ nssTrustDomain_GetCertByDERFromCache ( |
PRStatus nssrv = PR_FAILURE; |
NSSDER issuer, serial; |
NSSCertificate *rvCert; |
- nssrv = issuer_and_serial_from_encoding(der, &issuer, &serial); |
+ nssrv = nssPKIX509_GetIssuerAndSerialFromDER(der, &issuer, &serial); |
if (nssrv != PR_SUCCESS) { |
return NULL; |
} |