summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrelyea%netscape.com <devnull@localhost>2002-08-29 22:11:06 +0000
committerrelyea%netscape.com <devnull@localhost>2002-08-29 22:11:06 +0000
commitf78bfe47e3740b40bf60929d5c8b3c9c86e513d8 (patch)
tree59fe9a2cd93f39abbf3abe4bb8d9b8084c084a2a
parent1cb05abaf90c98e880bcd264783683acea0ebe61 (diff)
downloadnss-hg-f78bfe47e3740b40bf60929d5c8b3c9c86e513d8.tar.gz
Filter on keyID, then run through the best cert check.
-rw-r--r--security/nss/lib/pki/certificate.c26
1 files changed, 15 insertions, 11 deletions
diff --git a/security/nss/lib/pki/certificate.c b/security/nss/lib/pki/certificate.c
index 4761948f1..0f82b93bf 100644
--- a/security/nss/lib/pki/certificate.c
+++ b/security/nss/lib/pki/certificate.c
@@ -293,7 +293,7 @@ nssCertificate_GetDecoding
return c->decoding;
}
-static NSSCertificate *
+static NSSCertificate **
filter_subject_certs_for_id
(
NSSCertificate **subjectCerts,
@@ -303,16 +303,21 @@ filter_subject_certs_for_id
NSSCertificate **si;
NSSCertificate *rvCert = NULL;
nssDecodedCert *dcp;
+ int nextOpenSlot = 0;
+
/* walk the subject certs */
for (si = subjectCerts; *si; si++) {
dcp = nssCertificate_GetDecoding(*si);
if (dcp->matchIdentifier(dcp, id)) {
/* this cert has the correct identifier */
- rvCert = nssCertificate_AddRef(*si);
- break;
+ subjectCerts[nextOpenSlot++] = *si;
+ } else {
+ NSSCertificate_Destroy(*si);
+ *si = NULL;
}
}
- return rvCert;
+ subjectCerts[nextOpenSlot] = NULL;
+ return subjectCerts;
}
static NSSCertificate *
@@ -363,14 +368,13 @@ find_cert_issuer
issuerID = dc->getIssuerIdentifier(dc);
}
if (issuerID) {
- issuer = filter_subject_certs_for_id(certs, issuerID);
+ certs = filter_subject_certs_for_id(certs, issuerID);
nssItem_Destroy(issuerID);
- } else {
- issuer = nssCertificateArray_FindBestCertificate(certs,
- timeOpt,
- usage,
- policiesOpt);
- }
+ }
+ issuer = nssCertificateArray_FindBestCertificate(certs,
+ timeOpt,
+ usage,
+ policiesOpt);
nssCertificateArray_Destroy(certs);
}
nssArena_Destroy(arena);