From e6e9170d6e28038768895e1af18e3aad8093bf4b Mon Sep 17 00:00:00 2001 From: Rich Salz Date: Tue, 27 Mar 2018 16:25:08 -0400 Subject: [PATCH] Allow NULL for some _free routines. Based on the description in https://github.com/openssl/openssl/pull/5757, this re-implements the "allow NULL to be passed" behavior of a number of xxx_free routines. I also fixed up some egregious formatting errors that were nearby. Reviewed-by: Richard Levitte (Merged from https://github.com/openssl/openssl/pull/5761) --- crypto/bio/bss_acpt.c | 2 ++ crypto/bio/bss_conn.c | 2 ++ crypto/bn/bn_blind.c | 2 ++ crypto/bn/bn_ctx.c | 2 ++ crypto/bn/bn_mont.c | 14 ++++++++------ crypto/bn/bn_recp.c | 6 ++++-- crypto/buffer/buffer.c | 2 ++ crypto/comp/comp_lib.c | 2 ++ crypto/err/err.c | 29 +++++++++++++++-------------- crypto/txt_db/txt_db.c | 2 ++ crypto/x509/x509_lu.c | 2 ++ ssl/s3_lib.c | 2 +- ssl/ssl_cert.c | 2 ++ ssl/ssl_lib.c | 2 ++ ssl/ssl_sess.c | 2 ++ 15 files changed, 50 insertions(+), 23 deletions(-) diff --git a/crypto/bio/bss_acpt.c b/crypto/bio/bss_acpt.c index 0171c49607..64cc452891 100644 --- a/crypto/bio/bss_acpt.c +++ b/crypto/bio/bss_acpt.c @@ -101,6 +101,8 @@ static BIO_ACCEPT *BIO_ACCEPT_new(void) static void BIO_ACCEPT_free(BIO_ACCEPT *a) { + if (a == NULL) + return; OPENSSL_free(a->param_addr); OPENSSL_free(a->param_serv); BIO_ADDRINFO_free(a->addr_first); diff --git a/crypto/bio/bss_conn.c b/crypto/bio/bss_conn.c index 0fad02fdd5..cc245ab07c 100644 --- a/crypto/bio/bss_conn.c +++ b/crypto/bio/bss_conn.c @@ -232,6 +232,8 @@ BIO_CONNECT *BIO_CONNECT_new(void) void BIO_CONNECT_free(BIO_CONNECT *a) { + if (a == NULL) + return; OPENSSL_free(a->param_hostname); OPENSSL_free(a->param_service); BIO_ADDRINFO_free(a->addr_first); diff --git a/crypto/bn/bn_blind.c b/crypto/bn/bn_blind.c index 8bd61567e7..985d3ef32b 100644 --- a/crypto/bn/bn_blind.c +++ b/crypto/bn/bn_blind.c @@ -80,6 +80,8 @@ BN_BLINDING *BN_BLINDING_new(const BIGNUM *A, const BIGNUM *Ai, BIGNUM *mod) void BN_BLINDING_free(BN_BLINDING *r) { + if (r == NULL) + return; BN_free(r->A); BN_free(r->Ai); BN_free(r->e); diff --git a/crypto/bn/bn_ctx.c b/crypto/bn/bn_ctx.c index 7202aef326..68c0468743 100644 --- a/crypto/bn/bn_ctx.c +++ b/crypto/bn/bn_ctx.c @@ -156,6 +156,8 @@ BN_CTX *BN_CTX_secure_new(void) void BN_CTX_free(BN_CTX *ctx) { + if (ctx == NULL) + return; #ifdef BN_CTX_DEBUG { BN_POOL_ITEM *pool = ctx->pool.head; diff --git a/crypto/bn/bn_mont.c b/crypto/bn/bn_mont.c index bae7d235bd..c882891d5e 100644 --- a/crypto/bn/bn_mont.c +++ b/crypto/bn/bn_mont.c @@ -208,18 +208,20 @@ BN_MONT_CTX *BN_MONT_CTX_new(void) void BN_MONT_CTX_init(BN_MONT_CTX *ctx) { ctx->ri = 0; - bn_init(&(ctx->RR)); - bn_init(&(ctx->N)); - bn_init(&(ctx->Ni)); + bn_init(&ctx->RR); + bn_init(&ctx->N); + bn_init(&ctx->Ni); ctx->n0[0] = ctx->n0[1] = 0; ctx->flags = 0; } void BN_MONT_CTX_free(BN_MONT_CTX *mont) { - BN_clear_free(&(mont->RR)); - BN_clear_free(&(mont->N)); - BN_clear_free(&(mont->Ni)); + if (mont == NULL) + return; + BN_clear_free(&mont->RR); + BN_clear_free(&mont->N); + BN_clear_free(&mont->Ni); if (mont->flags & BN_FLG_MALLOCED) OPENSSL_free(mont); } diff --git a/crypto/bn/bn_recp.c b/crypto/bn/bn_recp.c index 923a9b33d8..8eb500b61a 100644 --- a/crypto/bn/bn_recp.c +++ b/crypto/bn/bn_recp.c @@ -32,8 +32,10 @@ BN_RECP_CTX *BN_RECP_CTX_new(void) void BN_RECP_CTX_free(BN_RECP_CTX *recp) { - BN_free(&(recp->N)); - BN_free(&(recp->Nr)); + if (recp == NULL) + return; + BN_free(&recp->N); + BN_free(&recp->Nr); if (recp->flags & BN_FLG_MALLOCED) OPENSSL_free(recp); } diff --git a/crypto/buffer/buffer.c b/crypto/buffer/buffer.c index dfa5c23d1d..48618a4435 100644 --- a/crypto/buffer/buffer.c +++ b/crypto/buffer/buffer.c @@ -42,6 +42,8 @@ BUF_MEM *BUF_MEM_new(void) void BUF_MEM_free(BUF_MEM *a) { + if (a == NULL) + return; if (a->data != NULL) { if (a->flags & BUF_MEM_FLAG_SECURE) OPENSSL_secure_clear_free(a->data, a->max); diff --git a/crypto/comp/comp_lib.c b/crypto/comp/comp_lib.c index 5bed1876a8..c199bb352f 100644 --- a/crypto/comp/comp_lib.c +++ b/crypto/comp/comp_lib.c @@ -45,6 +45,8 @@ const char *COMP_get_name(const COMP_METHOD *meth) void COMP_CTX_free(COMP_CTX *ctx) { + if (ctx == NULL) + return; if (ctx->meth->finish != NULL) ctx->meth->finish(ctx); diff --git a/crypto/err/err.c b/crypto/err/err.c index 4ae6178686..4c5f354e5c 100644 --- a/crypto/err/err.c +++ b/crypto/err/err.c @@ -233,29 +233,30 @@ static void build_SYS_str_reasons(void) } #endif -#define err_clear_data(p,i) \ +#define err_clear_data(p, i) \ do { \ - if ((p)->err_data_flags[i] & ERR_TXT_MALLOCED) \ - { \ + if ((p)->err_data_flags[i] & ERR_TXT_MALLOCED) {\ OPENSSL_free((p)->err_data[i]); \ - (p)->err_data[i]=NULL; \ - } \ - (p)->err_data_flags[i]=0; \ - } while(0) + (p)->err_data[i] = NULL; \ + } \ + (p)->err_data_flags[i] = 0; \ + } while (0) -#define err_clear(p,i) \ +#define err_clear(p, i) \ do { \ - (p)->err_flags[i]=0; \ - (p)->err_buffer[i]=0; \ - err_clear_data(p,i); \ - (p)->err_file[i]=NULL; \ - (p)->err_line[i]= -1; \ - } while(0) + err_clear_data(p, i); \ + (p)->err_flags[i] = 0; \ + (p)->err_buffer[i] = 0; \ + (p)->err_file[i] = NULL; \ + (p)->err_line[i] = -1; \ + } while (0) static void ERR_STATE_free(ERR_STATE *s) { int i; + if (s == NULL) + return; for (i = 0; i < ERR_NUM_ERRORS; i++) { err_clear_data(s, i); } diff --git a/crypto/txt_db/txt_db.c b/crypto/txt_db/txt_db.c index a08f346af6..a00560dcbd 100644 --- a/crypto/txt_db/txt_db.c +++ b/crypto/txt_db/txt_db.c @@ -284,6 +284,8 @@ void TXT_DB_free(TXT_DB *db) int i, n; char **p, *max; + if (db == NULL) + return; if (db->index != NULL) { for (i = db->num_fields - 1; i >= 0; i--) lh_OPENSSL_STRING_free(db->index[i]); diff --git a/crypto/x509/x509_lu.c b/crypto/x509/x509_lu.c index d69cedb72f..7b33ebad73 100644 --- a/crypto/x509/x509_lu.c +++ b/crypto/x509/x509_lu.c @@ -178,6 +178,8 @@ void X509_STORE_free(X509_STORE *vfy) STACK_OF(X509_LOOKUP) *sk; X509_LOOKUP *lu; + if (vfy == NULL) + return; CRYPTO_DOWN_REF(&vfy->references, &i, vfy->lock); REF_PRINT_COUNT("X509_STORE", vfy); if (i > 0) diff --git a/ssl/s3_lib.c b/ssl/s3_lib.c index 78a5a3a2e2..619326949c 100644 --- a/ssl/s3_lib.c +++ b/ssl/s3_lib.c @@ -3312,7 +3312,7 @@ int ssl3_new(SSL *s) void ssl3_free(SSL *s) { - if (s->s3 == NULL) + if (s == NULL || s->s3 == NULL) return; ssl3_cleanup_key_block(s); diff --git a/ssl/ssl_cert.c b/ssl/ssl_cert.c index 5a465e3942..b2b342767c 100644 --- a/ssl/ssl_cert.c +++ b/ssl/ssl_cert.c @@ -225,6 +225,8 @@ void ssl_cert_free(CERT *c) { int i; + if (c == NULL) + return; CRYPTO_DOWN_REF(&c->references, &i, c->lock); REF_PRINT_COUNT("CERT", c); if (i > 0) diff --git a/ssl/ssl_lib.c b/ssl/ssl_lib.c index b678fcfbbb..9d4c4d4899 100644 --- a/ssl/ssl_lib.c +++ b/ssl/ssl_lib.c @@ -1125,6 +1125,8 @@ void SSL_free(SSL *s) { int i; + if (s == NULL) + return; CRYPTO_DOWN_REF(&s->references, &i, s->lock); REF_PRINT_COUNT("SSL", s); if (i > 0) diff --git a/ssl/ssl_sess.c b/ssl/ssl_sess.c index 1672cd2a95..f936cb687f 100644 --- a/ssl/ssl_sess.c +++ b/ssl/ssl_sess.c @@ -785,6 +785,8 @@ void SSL_SESSION_free(SSL_SESSION *ss) { int i; + if (ss == NULL) + return; CRYPTO_DOWN_REF(&ss->references, &i, ss->lock); REF_PRINT_COUNT("SSL_SESSION", ss); if (i > 0) -- 2.25.1