netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] net: esp: cleanup esp_output_tail_tcp() in case of unsupported ESPINTCP
@ 2024-05-16  8:03 Hagar Hemdan
  2024-05-17 12:22 ` Simon Horman
  0 siblings, 1 reply; 5+ messages in thread
From: Hagar Hemdan @ 2024-05-16  8:03 UTC (permalink / raw)
  Cc: Norbert Manthey, Hagar Hemdan, Steffen Klassert, Herbert Xu,
	David S. Miller, David Ahern, Eric Dumazet, Jakub Kicinski,
	Paolo Abeni, Sabrina Dubroca, netdev, linux-kernel

xmit() functions should consume skb or return error codes in error
paths.
When the configuration "CONFIG_INET_ESPINTCP" is not used, the
implementation of the function "esp_output_tail_tcp" violates this rule.
The function frees the skb and returns the error code.
This change removes the kfree_skb from both functions, for both
esp4 and esp6.

This should not be reachable in the current code, so this change is just
a cleanup.

This bug was discovered and resolved using Coverity Static Analysis
Security Testing (SAST) by Synopsys, Inc.

Fixes: e27cca96cd68 ("xfrm: add espintcp (RFC 8229)")
Signed-off-by: Hagar Hemdan <hagarhem@amazon.com>
---
 net/ipv4/esp4.c | 3 +--
 net/ipv6/esp6.c | 3 +--
 2 files changed, 2 insertions(+), 4 deletions(-)

diff --git a/net/ipv4/esp4.c b/net/ipv4/esp4.c
index d33d12421814..e73de3abe37c 100644
--- a/net/ipv4/esp4.c
+++ b/net/ipv4/esp4.c
@@ -238,8 +238,7 @@ static int esp_output_tail_tcp(struct xfrm_state *x, struct sk_buff *skb)
 #else
 static int esp_output_tail_tcp(struct xfrm_state *x, struct sk_buff *skb)
 {
-	kfree_skb(skb);
-
+	WARN_ON(1);
 	return -EOPNOTSUPP;
 }
 #endif
diff --git a/net/ipv6/esp6.c b/net/ipv6/esp6.c
index 7371886d4f9f..600402e54ccd 100644
--- a/net/ipv6/esp6.c
+++ b/net/ipv6/esp6.c
@@ -255,8 +255,7 @@ static int esp_output_tail_tcp(struct xfrm_state *x, struct sk_buff *skb)
 #else
 static int esp_output_tail_tcp(struct xfrm_state *x, struct sk_buff *skb)
 {
-	kfree_skb(skb);
-
+	WARN_ON(1);
 	return -EOPNOTSUPP;
 }
 #endif
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH] net: esp: cleanup esp_output_tail_tcp() in case of unsupported ESPINTCP
  2024-05-16  8:03 [PATCH] net: esp: cleanup esp_output_tail_tcp() in case of unsupported ESPINTCP Hagar Hemdan
@ 2024-05-17 12:22 ` Simon Horman
  2024-05-17 13:17   ` Hagar Hemdan
  0 siblings, 1 reply; 5+ messages in thread
From: Simon Horman @ 2024-05-17 12:22 UTC (permalink / raw)
  To: Hagar Hemdan
  Cc: Norbert Manthey, Steffen Klassert, Herbert Xu, David S. Miller,
	David Ahern, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
	Sabrina Dubroca, netdev, linux-kernel

On Thu, May 16, 2024 at 08:03:09AM +0000, Hagar Hemdan wrote:
> xmit() functions should consume skb or return error codes in error
> paths.
> When the configuration "CONFIG_INET_ESPINTCP" is not used, the
> implementation of the function "esp_output_tail_tcp" violates this rule.
> The function frees the skb and returns the error code.
> This change removes the kfree_skb from both functions, for both
> esp4 and esp6.
> 
> This should not be reachable in the current code, so this change is just
> a cleanup.
> 
> This bug was discovered and resolved using Coverity Static Analysis
> Security Testing (SAST) by Synopsys, Inc.
> 
> Fixes: e27cca96cd68 ("xfrm: add espintcp (RFC 8229)")
> Signed-off-by: Hagar Hemdan <hagarhem@amazon.com>

Hi Hagar,

If esp_output() may be the x->type->output callback called from esp_output()
then I agree that this seems to be a problem as it looks like a double free
may occur.

However, I believe that your proposed fix introduces will result in skb
being leaked leak in the case of esp_output_done() calling
esp_output_tail_tcp(). Perhaps a solution is for esp_output_done()
to free the skb if esp_output_tail_tcp() fails.

I did not analyse other call-chains, but I think such analysis is needed.

...

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] net: esp: cleanup esp_output_tail_tcp() in case of unsupported ESPINTCP
  2024-05-17 12:22 ` Simon Horman
@ 2024-05-17 13:17   ` Hagar Hemdan
  2024-05-17 15:57     ` Simon Horman
  0 siblings, 1 reply; 5+ messages in thread
From: Hagar Hemdan @ 2024-05-17 13:17 UTC (permalink / raw)
  To: Simon Horman
  Cc: Norbert Manthey, Steffen Klassert, Herbert Xu, David S. Miller,
	David Ahern, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
	Sabrina Dubroca, netdev, hagarhem

On Fri, May 17, 2024 at 01:22:38PM +0100, Simon Horman wrote:
> On Thu, May 16, 2024 at 08:03:09AM +0000, Hagar Hemdan wrote:
> > xmit() functions should consume skb or return error codes in error
> > paths.
> > When the configuration "CONFIG_INET_ESPINTCP" is not used, the
> > implementation of the function "esp_output_tail_tcp" violates this rule.
> > The function frees the skb and returns the error code.
> > This change removes the kfree_skb from both functions, for both
> > esp4 and esp6.
> > 
> > This should not be reachable in the current code, so this change is just
> > a cleanup.
> > 
> > This bug was discovered and resolved using Coverity Static Analysis
> > Security Testing (SAST) by Synopsys, Inc.
> > 
> > Fixes: e27cca96cd68 ("xfrm: add espintcp (RFC 8229)")
> > Signed-off-by: Hagar Hemdan <hagarhem@amazon.com>
> 
> Hi Hagar,
> 
> If esp_output() may be the x->type->output callback called from esp_output()
> then I agree that this seems to be a problem as it looks like a double free
> may occur.
> 
> However, I believe that your proposed fix introduces will result in skb
> being leaked leak in the case of esp_output_done() calling
> esp_output_tail_tcp(). Perhaps a solution is for esp_output_done()
> to free the skb if esp_output_tail_tcp() fails.
> 
> I did not analyse other call-chains, but I think such analysis is needed.
> 
> ...
Hi Simon,

I see all calls to esp_output_tail_tcp() is surrounded by the condition
"x->encap && x->encap->encap_type == TCP_ENCAP_ESPINTCP" which I see
it is related to enabling of CONFIG_INET_ESPINTCP configuration 
(introduced in this commit e27cca96cd68 ("xfrm: add espintcp (RFC 8229)").

For calling of x->type->output (resolved to esp_output()) in
xfrm_output_one(), I see there is no double free here as esp_output()
calls esp_output_tail() which calls esp_output_tail_tcp() only if 
x->encap->encap_type == TCP_ENCAP_ESPINTCP which points to the first 
implementation of esp_output_tail_tcp(). This first definition 
doesn't free skb.

So my understanding is the 2nd esp_output_tail_tcp() should not be
called and this is why I called WARN_ON() as this func is unreachable.
Removing free(skb) here is just for silencing double free Coverity 
false positive.
Is there something else I miss?

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] net: esp: cleanup esp_output_tail_tcp() in case of unsupported ESPINTCP
  2024-05-17 13:17   ` Hagar Hemdan
@ 2024-05-17 15:57     ` Simon Horman
  2024-05-18 12:55       ` Hagar Hemdan
  0 siblings, 1 reply; 5+ messages in thread
From: Simon Horman @ 2024-05-17 15:57 UTC (permalink / raw)
  To: Hagar Hemdan
  Cc: Norbert Manthey, Steffen Klassert, Herbert Xu, David S. Miller,
	David Ahern, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
	Sabrina Dubroca, netdev, hagarhem

On Fri, May 17, 2024 at 01:17:57PM +0000, Hagar Hemdan wrote:
> On Fri, May 17, 2024 at 01:22:38PM +0100, Simon Horman wrote:
> > On Thu, May 16, 2024 at 08:03:09AM +0000, Hagar Hemdan wrote:
> > > xmit() functions should consume skb or return error codes in error
> > > paths.
> > > When the configuration "CONFIG_INET_ESPINTCP" is not used, the
> > > implementation of the function "esp_output_tail_tcp" violates this rule.
> > > The function frees the skb and returns the error code.
> > > This change removes the kfree_skb from both functions, for both
> > > esp4 and esp6.
> > > 
> > > This should not be reachable in the current code, so this change is just
> > > a cleanup.
> > > 
> > > This bug was discovered and resolved using Coverity Static Analysis
> > > Security Testing (SAST) by Synopsys, Inc.
> > > 
> > > Fixes: e27cca96cd68 ("xfrm: add espintcp (RFC 8229)")
> > > Signed-off-by: Hagar Hemdan <hagarhem@amazon.com>
> > 
> > Hi Hagar,
> > 
> > If esp_output() may be the x->type->output callback called from esp_output()

Hi Hagar,

FTR, I meant to say "If ... called from xfrm_output_one()",
but I don't think that effects the direction of the conversation
at this point.

> > then I agree that this seems to be a problem as it looks like a double free
> > may occur.
> > 
> > However, I believe that your proposed fix introduces will result in skb
> > being leaked leak in the case of esp_output_done() calling
> > esp_output_tail_tcp(). Perhaps a solution is for esp_output_done()
> > to free the skb if esp_output_tail_tcp() fails.
> > 
> > I did not analyse other call-chains, but I think such analysis is needed.
> > 
> > ...
> Hi Simon,
> 
> I see all calls to esp_output_tail_tcp() is surrounded by the condition
> "x->encap && x->encap->encap_type == TCP_ENCAP_ESPINTCP" which I see
> it is related to enabling of CONFIG_INET_ESPINTCP configuration 
> (introduced in this commit e27cca96cd68 ("xfrm: add espintcp (RFC 8229)").
> 
> For calling of x->type->output (resolved to esp_output()) in
> xfrm_output_one(), I see there is no double free here as esp_output()
> calls esp_output_tail() which calls esp_output_tail_tcp() only if 
> x->encap->encap_type == TCP_ENCAP_ESPINTCP which points to the first 
> implementation of esp_output_tail_tcp(). This first definition 
> doesn't free skb.
> 
> So my understanding is the 2nd esp_output_tail_tcp() should not be
> called and this is why I called WARN_ON() as this func is unreachable.
> Removing free(skb) here is just for silencing double free Coverity 
> false positive.
> Is there something else I miss?

Thanks, I missed the important detail that calls to esp_output_tail_tcp()
are guarded by "x->encap && x->encap->encap_type == TCP_ENCAP_ESPINTCP".

Assuming that condition is always false if CONFIG_INET_ESPINTCP is not set,
then I agree with your analysis and I don't see any problems with your
patch.

It might be worth calling out in the commit message that the WARN_ON
is added because esp_output_tail_tcp() should never be called if
CONFIG_INET_ESPINTCP is not set.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] net: esp: cleanup esp_output_tail_tcp() in case of unsupported ESPINTCP
  2024-05-17 15:57     ` Simon Horman
@ 2024-05-18 12:55       ` Hagar Hemdan
  0 siblings, 0 replies; 5+ messages in thread
From: Hagar Hemdan @ 2024-05-18 12:55 UTC (permalink / raw)
  To: Simon Horman
  Cc: Norbert Manthey, Steffen Klassert, Herbert Xu, David S. Miller,
	David Ahern, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
	Sabrina Dubroca, netdev, hagarhem

On Fri, May 17, 2024 at 04:57:07PM +0100, Simon Horman wrote:
> On Fri, May 17, 2024 at 01:17:57PM +0000, Hagar Hemdan wrote:
> > On Fri, May 17, 2024 at 01:22:38PM +0100, Simon Horman wrote:
> > > On Thu, May 16, 2024 at 08:03:09AM +0000, Hagar Hemdan wrote:
> > > > xmit() functions should consume skb or return error codes in error
> > > > paths.
> > > > When the configuration "CONFIG_INET_ESPINTCP" is not used, the
> > > > implementation of the function "esp_output_tail_tcp" violates this rule.
> > > > The function frees the skb and returns the error code.
> > > > This change removes the kfree_skb from both functions, for both
> > > > esp4 and esp6.
> > > > 
> > > > This should not be reachable in the current code, so this change is just
> > > > a cleanup.
> > > > 
> > > > This bug was discovered and resolved using Coverity Static Analysis
> > > > Security Testing (SAST) by Synopsys, Inc.
> > > > 
> > > > Fixes: e27cca96cd68 ("xfrm: add espintcp (RFC 8229)")
> > > > Signed-off-by: Hagar Hemdan <hagarhem@amazon.com>
> > > 
> > > Hi Hagar,
> > > 
> > > If esp_output() may be the x->type->output callback called from esp_output()
> 
> Hi Hagar,
> 
> FTR, I meant to say "If ... called from xfrm_output_one()",
> but I don't think that effects the direction of the conversation
> at this point.
> 
> > > then I agree that this seems to be a problem as it looks like a double free
> > > may occur.
> > > 
> > > However, I believe that your proposed fix introduces will result in skb
> > > being leaked leak in the case of esp_output_done() calling
> > > esp_output_tail_tcp(). Perhaps a solution is for esp_output_done()
> > > to free the skb if esp_output_tail_tcp() fails.
> > > 
> > > I did not analyse other call-chains, but I think such analysis is needed.
> > > 
> > > ...
> > Hi Simon,
> > 
> > I see all calls to esp_output_tail_tcp() is surrounded by the condition
> > "x->encap && x->encap->encap_type == TCP_ENCAP_ESPINTCP" which I see
> > it is related to enabling of CONFIG_INET_ESPINTCP configuration 
> > (introduced in this commit e27cca96cd68 ("xfrm: add espintcp (RFC 8229)").
> > 
> > For calling of x->type->output (resolved to esp_output()) in
> > xfrm_output_one(), I see there is no double free here as esp_output()
> > calls esp_output_tail() which calls esp_output_tail_tcp() only if 
> > x->encap->encap_type == TCP_ENCAP_ESPINTCP which points to the first 
> > implementation of esp_output_tail_tcp(). This first definition 
> > doesn't free skb.
> > 
> > So my understanding is the 2nd esp_output_tail_tcp() should not be
> > called and this is why I called WARN_ON() as this func is unreachable.
> > Removing free(skb) here is just for silencing double free Coverity 
> > false positive.
> > Is there something else I miss?
> 
> Thanks, I missed the important detail that calls to esp_output_tail_tcp()
> are guarded by "x->encap && x->encap->encap_type == TCP_ENCAP_ESPINTCP".
> 
> Assuming that condition is always false if CONFIG_INET_ESPINTCP is not set,
> then I agree with your analysis and I don't see any problems with your
> patch.
> 
> It might be worth calling out in the commit message that the WARN_ON
> is added because esp_output_tail_tcp() should never be called if
> CONFIG_INET_ESPINTCP is not set.

Hi Simon,

Thanks. yes, I will update the commit msg in rev2.

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2024-05-18 12:55 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-05-16  8:03 [PATCH] net: esp: cleanup esp_output_tail_tcp() in case of unsupported ESPINTCP Hagar Hemdan
2024-05-17 12:22 ` Simon Horman
2024-05-17 13:17   ` Hagar Hemdan
2024-05-17 15:57     ` Simon Horman
2024-05-18 12:55       ` Hagar Hemdan

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).