]> granicus.if.org Git - curl/commitdiff
openssl: Fix set up of pkcs12 certificate verification chain
authorErik Johansson <erik@ejohansson.se>
Fri, 9 Oct 2015 19:02:13 +0000 (21:02 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Sun, 11 Oct 2015 21:14:04 +0000 (23:14 +0200)
sk_X509_pop will decrease the size of the stack which means that the loop would
end after having added only half of the certificates.

Also make sure that the X509 certificate is freed in case
SSL_CTX_add_extra_chain_cert fails.

lib/vtls/openssl.c

index 1bb99671d3ecc363b6b4ef4f8baee71cdc3730b9..3bc079e7ebdd5be3fa7ea491f78364dc7337e70c 100644 (file)
@@ -450,7 +450,6 @@ int cert_stuff(struct connectdata *conn,
       PKCS12 *p12;
       EVP_PKEY *pri;
       STACK_OF(X509) *ca = NULL;
-      int i;
 
       f = fopen(cert_file, "rb");
       if(!f) {
@@ -497,8 +496,8 @@ int cert_stuff(struct connectdata *conn,
         goto fail;
       }
       /* Set Certificate Verification chain */
-      if(ca && sk_X509_num(ca)) {
-        for(i = 0; i < sk_X509_num(ca); i++) {
+      if(ca) {
+        while(sk_X509_num(ca)) {
           /*
            * Note that sk_X509_pop() is used below to make sure the cert is
            * removed from the stack properly before getting passed to
@@ -508,6 +507,7 @@ int cert_stuff(struct connectdata *conn,
            */
           X509 *x = sk_X509_pop(ca);
           if(!SSL_CTX_add_extra_chain_cert(ctx, x)) {
+            X509_free(x);
             failf(data, "cannot add certificate to certificate chain");
             goto fail;
           }