summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwtc%netscape.com <devnull@localhost>2003-09-12 19:50:27 +0000
committerwtc%netscape.com <devnull@localhost>2003-09-12 19:50:27 +0000
commitdac74ae013d504acc466cb31f1b0306d7cd485f4 (patch)
tree844f13783f0a53e4f6e99d7a92775446acd685c6
parent1adb60ffbcd9a001e45f326c5a883c4887efbdb0 (diff)
downloadnss-hg-dac74ae013d504acc466cb31f1b0306d7cd485f4.tar.gz
Bugzilla bug 217247: improved the memory leak fix for the appData nicknames
returned by PK11_ListCerts. Instead of allocating them from the heap first and copying to the arena, allocate them from the arena directly. r=jpierre Modified Files: certhigh.c pk11cert.c pki3hack.h pki3hack.c Tag: NSS_3_8_BRANCH
-rw-r--r--security/nss/lib/certhigh/certhigh.c2
-rw-r--r--security/nss/lib/pk11wrap/pk11cert.c5
-rw-r--r--security/nss/lib/pki/pki3hack.c11
-rw-r--r--security/nss/lib/pki/pki3hack.h5
4 files changed, 15 insertions, 8 deletions
diff --git a/security/nss/lib/certhigh/certhigh.c b/security/nss/lib/certhigh/certhigh.c
index 3b818d370..f9911b81c 100644
--- a/security/nss/lib/certhigh/certhigh.c
+++ b/security/nss/lib/certhigh/certhigh.c
@@ -418,7 +418,7 @@ CollectNicknames( NSSCertificate *c, void *data)
* a duplicate
*/
if ( saveit ) {
- nickname = STAN_GetCERTCertificateName(c);
+ nickname = STAN_GetCERTCertificateName(NULL, c);
/* nickname can only be NULL here if we are having memory
* alloc problems */
if (nickname == NULL) {
diff --git a/security/nss/lib/pk11wrap/pk11cert.c b/security/nss/lib/pk11wrap/pk11cert.c
index 08813fd1c..2b0beee64 100644
--- a/security/nss/lib/pk11wrap/pk11cert.c
+++ b/security/nss/lib/pk11wrap/pk11cert.c
@@ -3370,7 +3370,7 @@ pk11ListCertCallback(NSSCertificate *c, void *arg)
if (isUnique) {
CERT_DupCertificate(newCert);
- nickname = STAN_GetCERTCertificateName(c);
+ nickname = STAN_GetCERTCertificateName(certList->arena, c);
/* put slot certs at the end */
if (newCert->slot && !PK11_IsInternal(newCert->slot)) {
@@ -3392,7 +3392,8 @@ pk11ListCertCallback(NSSCertificate *c, void *arg)
/* put the same CERTCertificate in the list for all instances */
CERT_DupCertificate(newCert);
- nickname = STAN_GetCERTCertificateNameForInstance(c, instance);
+ nickname = STAN_GetCERTCertificateNameForInstance(
+ certList->arena, c, instance);
/* put slot certs at the end */
if (slot && !PK11_IsInternal(slot)) {
diff --git a/security/nss/lib/pki/pki3hack.c b/security/nss/lib/pki/pki3hack.c
index 7ee909e07..7c91d5c41 100644
--- a/security/nss/lib/pki/pki3hack.c
+++ b/security/nss/lib/pki/pki3hack.c
@@ -587,6 +587,7 @@ get_cert_instance(NSSCertificate *c)
char *
STAN_GetCERTCertificateNameForInstance (
+ PLArenaPool *arenaOpt,
NSSCertificate *c,
nssCryptokiInstance *instance
)
@@ -615,7 +616,11 @@ STAN_GetCERTCertificateNameForInstance (
}
nicklen = nssUTF8_Size(stanNick, &nssrv);
len = tokenlen + nicklen;
- nickname = PORT_Alloc(len);
+ if (arenaOpt) {
+ nickname = PORT_ArenaAlloc(arenaOpt, len);
+ } else {
+ nickname = PORT_Alloc(len);
+ }
nick = nickname;
if (tokenName) {
memcpy(nick, tokenName, tokenlen-1);
@@ -629,10 +634,10 @@ STAN_GetCERTCertificateNameForInstance (
}
char *
-STAN_GetCERTCertificateName(NSSCertificate *c)
+STAN_GetCERTCertificateName(PLArenaPool *arenaOpt, NSSCertificate *c)
{
nssCryptokiInstance *instance = get_cert_instance(c);
- return STAN_GetCERTCertificateNameForInstance(c, instance);
+ return STAN_GetCERTCertificateNameForInstance(arenaOpt, c, instance);
}
static void
diff --git a/security/nss/lib/pki/pki3hack.h b/security/nss/lib/pki/pki3hack.h
index da49859e8..6e50725d3 100644
--- a/security/nss/lib/pki/pki3hack.h
+++ b/security/nss/lib/pki/pki3hack.h
@@ -111,10 +111,11 @@ nssPKIX509_GetIssuerAndSerialFromDER(NSSDER *der, NSSArena *arena,
NSSDER *issuer, NSSDER *serial);
NSS_EXTERN char *
-STAN_GetCERTCertificateName(NSSCertificate *c);
+STAN_GetCERTCertificateName(PLArenaPool *arenaOpt, NSSCertificate *c);
NSS_EXTERN char *
-STAN_GetCERTCertificateNameForInstance(NSSCertificate *c,
+STAN_GetCERTCertificateNameForInstance(PLArenaPool *arenaOpt,
+ NSSCertificate *c,
nssCryptokiInstance *instance);
/* exposing this */