Commit 6ea7acf5 authored by Johannes Bauer's avatar Johannes Bauer Committed by Yang Tse
Browse files

OpenSSL: fix PKCS#12 certificate parsing related memory leak

Leak triggered when CURLOPT_SSLCERTTYPE and CURLOPT_SSLKEYTYPE set to P12
and both CURLOPT_SSLCERT and CURLOPT_SSLKEY point to the same PKCS#12 file.
parent a20daf90
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -466,6 +466,7 @@ int cert_stuff(struct connectdata *conn,
        failf(data, SSL_CLIENT_CERT_ERR);
        EVP_PKEY_free(pri);
        X509_free(x509);
        sk_X509_pop_free(ca, X509_free);
        return 0;
      }

@@ -474,6 +475,7 @@ int cert_stuff(struct connectdata *conn,
              cert_file);
        EVP_PKEY_free(pri);
        X509_free(x509);
        sk_X509_pop_free(ca, X509_free);
        return 0;
      }

@@ -482,6 +484,7 @@ int cert_stuff(struct connectdata *conn,
              "does not match certificate in same file", cert_file);
        EVP_PKEY_free(pri);
        X509_free(x509);
        sk_X509_pop_free(ca, X509_free);
        return 0;
      }
      /* Set Certificate Verification chain */
@@ -491,12 +494,14 @@ int cert_stuff(struct connectdata *conn,
            failf(data, "cannot add certificate to certificate chain");
            EVP_PKEY_free(pri);
            X509_free(x509);
            sk_X509_pop_free(ca, X509_free);
            return 0;
          }
          if(!SSL_CTX_add_client_CA(ctx, sk_X509_value(ca, i))) {
            failf(data, "cannot add certificate to client CA list");
            EVP_PKEY_free(pri);
            X509_free(x509);
            sk_X509_pop_free(ca, X509_free);
            return 0;
          }
        }
@@ -504,6 +509,7 @@ int cert_stuff(struct connectdata *conn,

      EVP_PKEY_free(pri);
      X509_free(x509);
      sk_X509_pop_free(ca, X509_free);
      cert_done = 1;
      break;
#else