Skip to content

Commit

Permalink
openssl: do not use file BIOs if not requested
Browse files Browse the repository at this point in the history
Moves the file handling BIO calls to the branch of the code where they
are actually used.

Closes curl#3339
  • Loading branch information
ngg authored and bagder committed Dec 5, 2018
1 parent 8ad9e59 commit 08efa19
Showing 1 changed file with 13 additions and 15 deletions.
28 changes: 13 additions & 15 deletions lib/vtls/openssl.c
Original file line number Diff line number Diff line change
Expand Up @@ -3321,20 +3321,8 @@ static CURLcode servercert(struct connectdata *conn,
/* we've been asked to gather certificate info! */
(void)get_cert_chain(conn, connssl);

fp = BIO_new(BIO_s_file());
if(fp == NULL) {
failf(data,
"BIO_new return NULL, " OSSL_PACKAGE
" error %s",
ossl_strerror(ERR_get_error(), error_buffer,
sizeof(error_buffer)) );
BIO_free(mem);
return CURLE_OUT_OF_MEMORY;
}

BACKEND->server_cert = SSL_get_peer_certificate(BACKEND->handle);
if(!BACKEND->server_cert) {
BIO_free(fp);
BIO_free(mem);
if(!strict)
return CURLE_OK;
Expand Down Expand Up @@ -3369,7 +3357,6 @@ static CURLcode servercert(struct connectdata *conn,
if(SSL_CONN_CONFIG(verifyhost)) {
result = verifyhost(conn, BACKEND->server_cert);
if(result) {
BIO_free(fp);
X509_free(BACKEND->server_cert);
BACKEND->server_cert = NULL;
return result;
Expand All @@ -3391,6 +3378,18 @@ static CURLcode servercert(struct connectdata *conn,

/* e.g. match issuer name with provided issuer certificate */
if(SSL_SET_OPTION(issuercert)) {
fp = BIO_new(BIO_s_file());
if(fp == NULL) {
failf(data,
"BIO_new return NULL, " OSSL_PACKAGE
" error %s",
ossl_strerror(ERR_get_error(), error_buffer,
sizeof(error_buffer)) );
X509_free(BACKEND->server_cert);
BACKEND->server_cert = NULL;
return CURLE_OUT_OF_MEMORY;
}

if(BIO_read_filename(fp, SSL_SET_OPTION(issuercert)) <= 0) {
if(strict)
failf(data, "SSL: Unable to open issuer cert (%s)",
Expand Down Expand Up @@ -3426,6 +3425,7 @@ static CURLcode servercert(struct connectdata *conn,

infof(data, " SSL certificate issuer check ok (%s)\n",
SSL_SET_OPTION(issuercert));
BIO_free(fp);
X509_free(issuer);
}

Expand Down Expand Up @@ -3454,7 +3454,6 @@ static CURLcode servercert(struct connectdata *conn,
if(SSL_CONN_CONFIG(verifystatus)) {
result = verifystatus(conn, connssl);
if(result) {
BIO_free(fp);
X509_free(BACKEND->server_cert);
BACKEND->server_cert = NULL;
return result;
Expand All @@ -3474,7 +3473,6 @@ static CURLcode servercert(struct connectdata *conn,
failf(data, "SSL: public key does not match pinned public key!");
}

BIO_free(fp);
X509_free(BACKEND->server_cert);
BACKEND->server_cert = NULL;
connssl->connecting_state = ssl_connect_done;
Expand Down

0 comments on commit 08efa19

Please sign in to comment.