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;
 

Reply via email to