Hello, After reading http://www.openbsd.org/papers/bsdcan14-libressl/mgp00015.html , I thought I'd help a bit with cleaning libssl by running this Coccinelle[1] script on src/lib/libssl:
<smpl> @@ identifier x; @@ -if (x) { free(x); } +free(x); </smpl> It removes unnecessary NULL checks that happen before a call to free(), and could probably also be run on some other parts of the OpenBSD code. Could you keep me CCed, since I have not subscribed to this list ? Cyril. [1] http://coccinelle.lip6.fr/
diff -u -p a/src/crypto/stack/stack.c b/src/crypto/stack/stack.c --- a/src/crypto/stack/stack.c +++ b/src/crypto/stack/stack.c @@ -141,8 +141,7 @@ sk_new(int (*c)(const void *, const void return (ret); err: - if (ret) - free(ret); + free(ret); return (NULL); } diff -u -p a/src/crypto/x509v3/v3_conf.c b/src/crypto/x509v3/v3_conf.c --- a/src/crypto/x509v3/v3_conf.c +++ b/src/crypto/x509v3/v3_conf.c @@ -313,8 +313,7 @@ v3_generic_extension(const char *ext, ch err: ASN1_OBJECT_free(obj); M_ASN1_OCTET_STRING_free(oct); - if (ext_der) - free(ext_der); + free(ext_der); return extension; } diff -u -p a/src/crypto/x509v3/v3_utl.c b/src/crypto/x509v3/v3_utl.c --- a/src/crypto/x509v3/v3_utl.c +++ b/src/crypto/x509v3/v3_utl.c @@ -422,7 +422,7 @@ unsigned char *string_to_hex(const char return hexbuf; err: - if(hexbuf) free(hexbuf); + free(hexbuf); X509V3err(X509V3_F_STRING_TO_HEX,ERR_R_MALLOC_FAILURE); return NULL; @@ -623,8 +623,7 @@ ASN1_OCTET_STRING *a2i_IPADDRESS_NC(cons return ret; err: - if (iptmp) - free(iptmp); + free(iptmp); if (ret) ASN1_OCTET_STRING_free(ret); return NULL; diff -u -p a/src/crypto/bn/bn_exp.c b/src/crypto/bn/bn_exp.c --- a/src/crypto/bn/bn_exp.c +++ b/src/crypto/bn/bn_exp.c @@ -840,8 +840,7 @@ err: BN_MONT_CTX_free(mont); if (powerbuf != NULL) { OPENSSL_cleanse(powerbuf, powerbufLen); - if (powerbufFree) - free(powerbufFree); + free(powerbufFree); } BN_CTX_end(ctx); return (ret); diff -u -p a/src/crypto/bn/bn_gf2m.c b/src/crypto/bn/bn_gf2m.c --- a/src/crypto/bn/bn_gf2m.c +++ b/src/crypto/bn/bn_gf2m.c @@ -558,8 +558,7 @@ BN_GF2m_mod_mul(BIGNUM *r, const BIGNUM bn_check_top(r); err: - if (arr) - free(arr); + free(arr); return ret; } @@ -621,8 +620,7 @@ BN_GF2m_mod_sqr(BIGNUM *r, const BIGNUM bn_check_top(r); err: - if (arr) - free(arr); + free(arr); return ret; } @@ -1050,8 +1048,7 @@ BN_GF2m_mod_exp(BIGNUM *r, const BIGNUM bn_check_top(r); err: - if (arr) - free(arr); + free(arr); return ret; } @@ -1113,8 +1110,7 @@ BN_GF2m_mod_sqrt(BIGNUM *r, const BIGNUM bn_check_top(r); err: - if (arr) - free(arr); + free(arr); return ret; } @@ -1249,8 +1245,7 @@ BN_GF2m_mod_solve_quad(BIGNUM *r, const bn_check_top(r); err: - if (arr) - free(arr); + free(arr); return ret; } diff -u -p a/src/crypto/ex_data.c b/src/crypto/ex_data.c --- a/src/crypto/ex_data.c +++ b/src/crypto/ex_data.c @@ -444,8 +444,7 @@ skip: storage[i]->argl, storage[i]->argp); } } - if (storage) - free(storage); + free(storage); return 1; } @@ -489,8 +488,7 @@ skip: storage[i]->argl, storage[i]->argp); CRYPTO_set_ex_data(to, i, ptr); } - if (storage) - free(storage); + free(storage); return 1; } @@ -527,8 +525,7 @@ skip: storage[i]->argl, storage[i]->argp); } } - if (storage) - free(storage); + free(storage); if (ad->sk) { sk_void_free(ad->sk); ad->sk = NULL; diff -u -p a/src/crypto/pem/pvkfmt.c b/src/crypto/pem/pvkfmt.c --- a/src/crypto/pem/pvkfmt.c +++ b/src/crypto/pem/pvkfmt.c @@ -293,8 +293,7 @@ do_b2i_bio(BIO *in, int ispub) ret = b2i_rsa(&p, length, bitlen, ispub); err: - if (buf) - free(buf); + free(buf); return ret; } diff -u -p a/src/crypto/pkcs7/pk7_doit.c b/src/crypto/pkcs7/pk7_doit.c --- a/src/crypto/pkcs7/pk7_doit.c +++ b/src/crypto/pkcs7/pk7_doit.c @@ -190,8 +190,7 @@ static int pkcs7_encode_rinfo(PKCS7_RECI EVP_PKEY_free(pkey); if (pctx) EVP_PKEY_CTX_free(pctx); - if (ek) - free(ek); + free(ek); return ret; } diff -u -p a/src/crypto/asn1/bio_ndef.c b/src/crypto/asn1/bio_ndef.c --- a/src/crypto/asn1/bio_ndef.c +++ b/src/crypto/asn1/bio_ndef.c @@ -146,8 +146,7 @@ BIO_new_NDEF(BIO *out, ASN1_VALUE *val, err: if (asn_bio) BIO_free(asn_bio); - if (ndef_aux) - free(ndef_aux); + free(ndef_aux); return NULL; } diff -u -p a/src/crypto/asn1/asn1_gen.c b/src/crypto/asn1/asn1_gen.c --- a/src/crypto/asn1/asn1_gen.c +++ b/src/crypto/asn1/asn1_gen.c @@ -258,10 +258,8 @@ ASN1_generate_v3(char *str, X509V3_CTX * ret = d2i_ASN1_TYPE(NULL, &cp, len); err: - if (orig_der) - free(orig_der); - if (new_der) - free(new_der); + free(orig_der); + free(new_der); return ret; } diff -u -p a/src/crypto/aes/aes_wrap.c b/src/crypto/aes/aes_wrap.c --- a/src/crypto/aes/aes_wrap.c +++ b/src/crypto/aes/aes_wrap.c @@ -164,10 +164,8 @@ AES_wrap_unwrap_test(const unsigned char ret = 1; err: - if (otmp) - free(otmp); - if (ptmp) - free(ptmp); + free(otmp); + free(ptmp); return ret; } diff -u -p a/src/crypto/dsa/dsa_ameth.c b/src/crypto/dsa/dsa_ameth.c --- a/src/crypto/dsa/dsa_ameth.c +++ b/src/crypto/dsa/dsa_ameth.c @@ -175,8 +175,7 @@ static int dsa_pub_encode(X509_PUBKEY *p return 1; err: - if (penc) - free(penc); + free(penc); if (pval) ASN1_STRING_free(pval); @@ -580,8 +579,7 @@ static int dsa_sig_print(BIO *bp, const goto err; rv = 1; err: - if (m) - free(m); + free(m); DSA_SIG_free(dsa_sig); return rv; } diff -u -p a/src/crypto/dsa/dsa_pmeth.c b/src/crypto/dsa/dsa_pmeth.c --- a/src/crypto/dsa/dsa_pmeth.c +++ b/src/crypto/dsa/dsa_pmeth.c @@ -113,8 +113,7 @@ static int pkey_dsa_copy(EVP_PKEY_CTX *d static void pkey_dsa_cleanup(EVP_PKEY_CTX *ctx) { DSA_PKEY_CTX *dctx = ctx->data; - if (dctx) - free(dctx); + free(dctx); } static int pkey_dsa_sign(EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen, diff -u -p a/src/crypto/cms/cms_env.c b/src/crypto/cms/cms_env.c --- a/src/crypto/cms/cms_env.c +++ b/src/crypto/cms/cms_env.c @@ -354,8 +354,7 @@ static int cms_RecipientInfo_ktri_encryp err: if (pctx) EVP_PKEY_CTX_free(pctx); - if (ek) - free(ek); + free(ek); return ret; } diff -u -p a/src/crypto/cms/cms_sd.c b/src/crypto/cms/cms_sd.c --- a/src/crypto/cms/cms_sd.c +++ b/src/crypto/cms/cms_sd.c @@ -759,8 +759,7 @@ int CMS_SignerInfo_sign(CMS_SignerInfo * return 1; err: - if (abuf) - free(abuf); + free(abuf); EVP_MD_CTX_cleanup(&mctx); return 0; diff -u -p a/src/crypto/cms/cms_ess.c b/src/crypto/cms/cms_ess.c --- a/src/crypto/cms/cms_ess.c +++ b/src/crypto/cms/cms_ess.c @@ -156,8 +156,7 @@ int CMS_add1_ReceiptRequest(CMS_SignerIn if (!r) CMSerr(CMS_F_CMS_ADD1_RECEIPTREQUEST, ERR_R_MALLOC_FAILURE); - if (rrder) - free(rrder); + free(rrder); return r; diff -u -p a/src/crypto/ec/ec_ameth.c b/src/crypto/ec/ec_ameth.c --- a/src/crypto/ec/ec_ameth.c +++ b/src/crypto/ec/ec_ameth.c @@ -128,8 +128,7 @@ err: ASN1_OBJECT_free(pval); else ASN1_STRING_free(pval); - if (penc) - free(penc); + free(penc); return 0; } diff -u -p a/src/crypto/ec/ec_asn1.c b/src/crypto/ec/ec_asn1.c --- a/src/crypto/ec/ec_asn1.c +++ b/src/crypto/ec/ec_asn1.c @@ -507,10 +507,8 @@ ec_asn1_group2curve(const EC_GROUP * gro ok = 1; -err: if (buffer_1) - free(buffer_1); - if (buffer_2) - free(buffer_2); +err: free(buffer_1); + free(buffer_2); if (tmp_1) BN_free(tmp_1); if (tmp_2) @@ -610,8 +608,7 @@ err: if (!ok) { } if (tmp) BN_free(tmp); - if (buffer) - free(buffer); + free(buffer); return (ret); } @@ -1134,8 +1131,7 @@ i2d_ECPrivateKey(EC_KEY * a, unsigned ch } ok = 1; err: - if (buffer) - free(buffer); + free(buffer); if (priv_key) EC_PRIVATEKEY_free(priv_key); return (ok ? ret : 0); diff -u -p a/src/crypto/dh/dh_ameth.c b/src/crypto/dh/dh_ameth.c --- a/src/crypto/dh/dh_ameth.c +++ b/src/crypto/dh/dh_ameth.c @@ -167,8 +167,7 @@ static int dh_pub_encode(X509_PUBKEY *pk return 1; err: - if (penc) - free(penc); + free(penc); if (pval) ASN1_STRING_free(pval); diff -u -p a/src/crypto/dh/dh_pmeth.c b/src/crypto/dh/dh_pmeth.c --- a/src/crypto/dh/dh_pmeth.c +++ b/src/crypto/dh/dh_pmeth.c @@ -110,8 +110,7 @@ static int pkey_dh_copy(EVP_PKEY_CTX *ds static void pkey_dh_cleanup(EVP_PKEY_CTX *ctx) { DH_PKEY_CTX *dctx = ctx->data; - if (dctx) - free(dctx); + free(dctx); } static int pkey_dh_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2) diff -u -p a/src/crypto/ecdh/ech_ossl.c b/src/crypto/ecdh/ech_ossl.c --- a/src/crypto/ecdh/ech_ossl.c +++ b/src/crypto/ecdh/ech_ossl.c @@ -204,6 +204,6 @@ err: if (tmp) EC_POINT_free(tmp); if (ctx) BN_CTX_end(ctx); if (ctx) BN_CTX_free(ctx); - if (buf) free(buf); + free(buf); return(ret); } diff -u -p a/src/crypto/engine/eng_dyn.c b/src/crypto/engine/eng_dyn.c --- a/src/crypto/engine/eng_dyn.c +++ b/src/crypto/engine/eng_dyn.c @@ -222,8 +222,7 @@ static int dynamic_set_data_ctx(ENGINE * CRYPTO_w_unlock(CRYPTO_LOCK_ENGINE); /* If we lost the race to set the context, c is non-NULL and *ctx is the * context of the thread that won. */ - if(c) - free(c); + free(c); return 1; } diff -u -p a/src/crypto/rsa/rsa_pss.c b/src/crypto/rsa/rsa_pss.c --- a/src/crypto/rsa/rsa_pss.c +++ b/src/crypto/rsa/rsa_pss.c @@ -172,8 +172,7 @@ int RSA_verify_PKCS1_PSS_mgf1(RSA *rsa, ret = 1; err: - if (DB) - free(DB); + free(DB); EVP_MD_CTX_cleanup(&ctx); return ret; @@ -284,8 +283,7 @@ int RSA_padding_add_PKCS1_PSS_mgf1(RSA * ret = 1; err: - if (salt) - free(salt); + free(salt); return ret; diff -u -p a/src/crypto/ui/ui_lib.c b/src/crypto/ui/ui_lib.c --- a/src/crypto/ui/ui_lib.c +++ b/src/crypto/ui/ui_lib.c @@ -328,14 +328,10 @@ UI_dup_input_boolean(UI *ui, const char result_buf); err: - if (prompt_copy) - free(prompt_copy); - if (action_desc_copy) - free(action_desc_copy); - if (ok_chars_copy) - free(ok_chars_copy); - if (cancel_chars_copy) - free(cancel_chars_copy); + free(prompt_copy); + free(action_desc_copy); + free(ok_chars_copy); + free(cancel_chars_copy); return -1; } diff -u -p a/src/crypto/store/str_mem.c b/src/crypto/store/str_mem.c --- a/src/crypto/store/str_mem.c +++ b/src/crypto/store/str_mem.c @@ -333,7 +333,7 @@ static int mem_list_end(STORE *s, void * } if (context && context->search_attributes) sk_STORE_ATTR_INFO_free(context->search_attributes); - if (context) free(context); + free(context); return 1; } static int mem_list_endp(STORE *s, void *handle) diff -u -p a/src/apps/pkeyutl.c b/src/apps/pkeyutl.c --- a/src/apps/pkeyutl.c +++ b/src/apps/pkeyutl.c @@ -441,8 +441,7 @@ init_ctx(int *pkeysize, } end: - if (passin) - free(passin); + free(passin); return ctx;