[Bug 325307] infinite loop in SECU_FindCrlIssuer. r=julien

git-svn-id: svn://10.0.0.236/trunk@188734 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
alexei.volkov.bugs%sun.com
2006-02-02 02:45:02 +00:00
parent 911acb7ee4
commit f2211c150e

View File

@@ -3614,10 +3614,8 @@ CERTCertificate *
SECU_FindCrlIssuer(CERTCertDBHandle *dbhandle, SECItem* subject,
CERTAuthKeyID* authorityKeyID, PRTime validTime)
{
CERTCertListNode *node;
CERTCertificate * issuerCert = NULL, *cert = NULL;
CERTCertificate *issuerCert = NULL;
CERTCertList *certList = NULL;
SECStatus rv = SECFailure;
if (!subject) {
PORT_SetError(SEC_ERROR_INVALID_ARGS);
@@ -3627,32 +3625,24 @@ SECU_FindCrlIssuer(CERTCertDBHandle *dbhandle, SECItem* subject,
certList =
CERT_CreateSubjectCertList(NULL, dbhandle, subject,
validTime, PR_TRUE);
if (!certList) {
goto loser;
}
node = CERT_LIST_HEAD(certList);
/* XXX and authoritykeyid in the future */
while ( ! CERT_LIST_END(node, certList) ) {
cert = node->cert;
if (CERT_CheckCertUsage(cert, KU_CRL_SIGN) != SECSuccess ||
!cert->trust) {
continue;
}
/* select the first (newest) user cert */
if (CERT_IsUserCert(cert)) {
rv = SECSuccess;
goto success;
}
}
success:
if (rv == SECSuccess) {
issuerCert = CERT_DupCertificate(cert);
}
loser:
if (certList) {
CERTCertListNode *node = CERT_LIST_HEAD(certList);
/* XXX and authoritykeyid in the future */
while ( ! CERT_LIST_END(node, certList) ) {
CERTCertificate *cert = node->cert;
/* check cert CERTCertTrust data is allocated, check cert
usage extension, check that cert has pkey in db. Select
the first (newest) user cert */
if (cert->trust &&
CERT_CheckCertUsage(cert, KU_CRL_SIGN) == SECSuccess &&
CERT_IsUserCert(cert)) {
issuerCert = CERT_DupCertificate(cert);
break;
}
node = CERT_LIST_NEXT(node);
}
CERT_DestroyCertList(certList);
}
return(issuerCert);