diff mbox series

net: esp4: Fix double free on esp4 functions

Message ID 20190130213542.17313-1-ramin.blackhat@gmail.com
State Rejected
Delegated to: David Miller
Headers show
Series net: esp4: Fix double free on esp4 functions | expand

Commit Message

Ramin Farajpour Cami Jan. 30, 2019, 9:35 p.m. UTC
key/tmp is being kfree'd twice,once in the "aalg_desc->uinfo.auth.icv_fullbits / 8 != crypto_aead_authsize(aead)" call
to "free_key",twice When "crypto_aead_setauthsize(aead, x->aalg->alg_trunc_len / 8)" fails call to again  "free_key",

Signed-off-by: Ramin Farajpour Cami <ramin.blackhat@gmail.com>
---
 net/ipv4/esp4.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

Comments

David Miller Jan. 30, 2019, 9:53 p.m. UTC | #1
From: Ramin Farajpour Cami <ramin.blackhat@gmail.com>
Date: Wed, 30 Jan 2019 21:35:42 +0000

> key/tmp is being kfree'd twice,once in the "aalg_desc->uinfo.auth.icv_fullbits / 8 != crypto_aead_authsize(aead)" call
> to "free_key",twice When "crypto_aead_setauthsize(aead, x->aalg->alg_trunc_len / 8)" fails call to again  "free_key",
> 
> Signed-off-by: Ramin Farajpour Cami <ramin.blackhat@gmail.com>
> ---
>  net/ipv4/esp4.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/net/ipv4/esp4.c b/net/ipv4/esp4.c
> index 5459f41fc26f..5a66e47641b0 100644
> --- a/net/ipv4/esp4.c
> +++ b/net/ipv4/esp4.c
> @@ -467,6 +467,7 @@ int esp_output_tail(struct xfrm_state *x, struct sk_buff *skb, struct esp_info *
>  
>  error_free:
>  	kfree(tmp);
> +	tmp = NULL;
>  error:
>  	return err;
>  }

This makes no sense at all, the function returns right after the kfree() and
tmp is never referenced again!
Eric Dumazet Jan. 30, 2019, 11:07 p.m. UTC | #2
On 01/30/2019 01:35 PM, Ramin Farajpour Cami wrote:
> key/tmp is being kfree'd twice,once in the "aalg_desc->uinfo.auth.icv_fullbits / 8 != crypto_aead_authsize(aead)" call
> to "free_key",twice When "crypto_aead_setauthsize(aead, x->aalg->alg_trunc_len / 8)" fails call to again  "free_key",
> 
> Signed-off-by: Ramin Farajpour Cami <ramin.blackhat@gmail.com>
> ---
>  net/ipv4/esp4.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/net/ipv4/esp4.c b/net/ipv4/esp4.c
> index 5459f41fc26f..5a66e47641b0 100644
> --- a/net/ipv4/esp4.c
> +++ b/net/ipv4/esp4.c
> @@ -467,6 +467,7 @@ int esp_output_tail(struct xfrm_state *x, struct sk_buff *skb, struct esp_info *
>  
>  error_free:
>  	kfree(tmp);
> +	tmp = NULL;

Clearing tmp right before a "return err;" has no effect at all.

>  error:
>  	return err;
>  }
> @@ -959,7 +960,7 @@ static int esp_init_authenc(struct xfrm_state *x)
>  
>  free_key:
>  	kfree(key);
> -
> +	key = NULL;


Same here, this is essentially dead code.

>  error:
>  	return err;
>  }
>
Steffen Klassert Jan. 31, 2019, 7:27 a.m. UTC | #3
On Thu, Jan 31, 2019 at 06:32:07AM +0000, Ramin Farajpour Cami wrote:
> Hi Eric,
> 
> I going to for avoid double free of resource identifiers we should set
> variables initialized in "tmp/key" to NULL if an error occurred int the
> "esp_init_authenc()" and "esp_output_tail()" attempts to free the memory
> again.my means like this patch c7055fd15ff46d92eb0dd1c16a4fe010d58224c8
> <https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=c7055fd15ff46d92eb0dd1c16a4fe010d58224c8>

There is a big difference between the above-noted patch and
your patch. You really have to understand the code you are
trying to change.
diff mbox series

Patch

diff --git a/net/ipv4/esp4.c b/net/ipv4/esp4.c
index 5459f41fc26f..5a66e47641b0 100644
--- a/net/ipv4/esp4.c
+++ b/net/ipv4/esp4.c
@@ -467,6 +467,7 @@  int esp_output_tail(struct xfrm_state *x, struct sk_buff *skb, struct esp_info *
 
 error_free:
 	kfree(tmp);
+	tmp = NULL;
 error:
 	return err;
 }
@@ -959,7 +960,7 @@  static int esp_init_authenc(struct xfrm_state *x)
 
 free_key:
 	kfree(key);
-
+	key = NULL;
 error:
 	return err;
 }