Index: net/third_party/nss/ssl/sslauth.c |
=================================================================== |
--- net/third_party/nss/ssl/sslauth.c (revision 226069) |
+++ net/third_party/nss/ssl/sslauth.c (working copy) |
@@ -28,38 +28,43 @@ |
} |
/* NEED LOCKS IN HERE. */ |
-SECStatus |
-SSL_PeerCertificateChain(PRFileDesc *fd, CERTCertificate **certs, |
- unsigned int *numCerts, unsigned int maxNumCerts) |
+CERTCertList * |
+SSL_PeerCertificateChain(PRFileDesc *fd) |
{ |
sslSocket *ss; |
- ssl3CertNode* cur; |
+ CERTCertList *chain = NULL; |
+ CERTCertificate *cert; |
+ ssl3CertNode *cur; |
ss = ssl_FindSocket(fd); |
if (!ss) { |
SSL_DBG(("%d: SSL[%d]: bad socket in PeerCertificateChain", |
SSL_GETPID(), fd)); |
- return SECFailure; |
+ return NULL; |
} |
- if (!ss->opt.useSecurity) |
- return SECFailure; |
- |
- if (ss->sec.peerCert == NULL) { |
- *numCerts = 0; |
- return SECSuccess; |
+ if (!ss->opt.useSecurity || !ss->sec.peerCert) { |
+ PORT_SetError(SSL_ERROR_NO_CERTIFICATE); |
+ return NULL; |
} |
- |
- *numCerts = 1; /* for the leaf certificate */ |
- if (maxNumCerts > 0) |
- certs[0] = CERT_DupCertificate(ss->sec.peerCert); |
- |
+ chain = CERT_NewCertList(); |
+ if (!chain) { |
+ return NULL; |
+ } |
+ cert = CERT_DupCertificate(ss->sec.peerCert); |
+ if (CERT_AddCertToListTail(chain, cert) != SECSuccess) { |
+ goto loser; |
+ } |
for (cur = ss->ssl3.peerCertChain; cur; cur = cur->next) { |
- if (*numCerts < maxNumCerts) |
- certs[*numCerts] = CERT_DupCertificate(cur->cert); |
- (*numCerts)++; |
+ cert = CERT_DupCertificate(cur->cert); |
+ if (CERT_AddCertToListTail(chain, cert) != SECSuccess) { |
+ goto loser; |
+ } |
} |
+ return chain; |
- return SECSuccess; |
+loser: |
+ CERT_DestroyCertList(chain); |
+ return NULL; |
} |
/* NEED LOCKS IN HERE. */ |