diff options
author | nelsonb%netscape.com <devnull@localhost> | 2004-02-04 08:54:06 +0000 |
---|---|---|
committer | nelsonb%netscape.com <devnull@localhost> | 2004-02-04 08:54:06 +0000 |
commit | 0ca2db135bb5e80659d72de93300a20611dde021 (patch) | |
tree | 873cd1dfdf0ec065cd6a7fcbb4d9618985c50f05 /security/nss/lib/certdb | |
parent | 9b409b260ffa485e4f0661126ab9418676e07455 (diff) | |
download | nss-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.c | 26 |
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; } |