Thread (5 messages) 5 messages, 2 authors, 2021-01-10

Re: Re: [PATCH] evm: Fix memleak in init_desc

From: <hidden>
Date: 2021-01-10 05:28:25
Also in: linux-security-module, lkml

On Sat, Jan 09, 2021 at 07:33:05PM +0800, Dinghao Liu wrote:
quoted
When kmalloc() fails, tmp_tfm allocated by
crypto_alloc_shash() has not been freed, which
leads to memleak.

Fixes: d46eb3699502b ("evm: crypto hash replaced by shash")
Signed-off-by: Dinghao Liu <redacted>
---
 security/integrity/evm/evm_crypto.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/security/integrity/evm/evm_crypto.c b/security/integrity/evm/evm_crypto.c
index 168c3b78ac47..39fb31a638ac 100644
--- a/security/integrity/evm/evm_crypto.c
+++ b/security/integrity/evm/evm_crypto.c
@@ -73,7 +73,7 @@ static struct shash_desc *init_desc(char type, uint8_t hash_algo)
 {
 	long rc;
 	const char *algo;
-	struct crypto_shash **tfm, *tmp_tfm;
+	struct crypto_shash **tfm, *tmp_tfm = NULL;
 	struct shash_desc *desc;
 
 	if (type == EVM_XATTR_HMAC) {
@@ -118,13 +118,18 @@ static struct shash_desc *init_desc(char type, uint8_t hash_algo)
 alloc:
 	desc = kmalloc(sizeof(*desc) + crypto_shash_descsize(*tfm),
 			GFP_KERNEL);
-	if (!desc)
+	if (!desc) {
+		if (tmp_tfm)
+			crypto_free_shash(tmp_tfm);
 		return ERR_PTR(-ENOMEM);
+	}
 
 	desc->tfm = *tfm;
 
 	rc = crypto_shash_init(desc);
 	if (rc) {
+		if (tmp_tfm)
+			crypto_free_shash(tmp_tfm);
 		kfree(desc);
 		return ERR_PTR(rc);
 	}
There's no need to check for NULL before calling crypto_free_shash().
I find there is a crypto_shash_tfm() in the definition of 
crypto_free_shash(). Will this lead to null pointer dereference
when we use it to free a NULL pointer?

Regards,
Dinghao
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help