summaryrefslogtreecommitdiff
path: root/security/nss/lib/certdb
diff options
context:
space:
mode:
authornelsonb%netscape.com <devnull@localhost>2004-02-04 08:54:06 +0000
committernelsonb%netscape.com <devnull@localhost>2004-02-04 08:54:06 +0000
commit0ca2db135bb5e80659d72de93300a20611dde021 (patch)
tree873cd1dfdf0ec065cd6a7fcbb4d9618985c50f05 /security/nss/lib/certdb
parent9b409b260ffa485e4f0661126ab9418676e07455 (diff)
downloadnss-hg-0ca2db135bb5e80659d72de93300a20611dde021.tar.gz
Fix numerous bugs in CERT_FindCertByKeyID. Bug 233019. r=jpierre
Diffstat (limited to 'security/nss/lib/certdb')
-rw-r--r--security/nss/lib/certdb/stanpcertdb.c26
1 files changed, 18 insertions, 8 deletions
diff --git a/security/nss/lib/certdb/stanpcertdb.c b/security/nss/lib/certdb/stanpcertdb.c
index a908c0f6d..c1420ad73 100644
--- a/security/nss/lib/certdb/stanpcertdb.c
+++ b/security/nss/lib/certdb/stanpcertdb.c
@@ -412,18 +412,28 @@ CERT_FindCertByName(CERTCertDBHandle *handle, SECItem *name)
CERTCertificate *
CERT_FindCertByKeyID(CERTCertDBHandle *handle, SECItem *name, SECItem *keyID)
{
- CERTCertList *list =
- CERT_CreateSubjectCertList(NULL,handle,name,0,PR_FALSE);
+ CERTCertList *list;
CERTCertificate *cert = NULL;
- CERTCertListNode *node = CERT_LIST_HEAD(list);
+ CERTCertListNode *node, *head;
+ list = CERT_CreateSubjectCertList(NULL,handle,name,0,PR_FALSE);
if (list == NULL) return NULL;
- for (node = CERT_LIST_HEAD(list); node ; node = CERT_LIST_NEXT(node)) {
- if (SECITEM_ItemsAreEqual(&cert->subjectKeyID, keyID) ) {
- cert = CERT_DupCertificate(node->cert);
- break;
- }
+ node = head = CERT_LIST_HEAD(list);
+ if (head) {
+ do {
+ if (node->cert &&
+ SECITEM_ItemsAreEqual(&node->cert->subjectKeyID, keyID) ) {
+ cert = CERT_DupCertificate(node->cert);
+ goto done;
+ }
+ node = CERT_LIST_NEXT(node);
+ } while (node && head != node);
+ }
+ PORT_SetError(SEC_ERROR_UNKNOWN_ISSUER);
+done:
+ if (list) {
+ CERT_DestroyCertList(list);
}
return cert;
}