esp: fix skb leak with espintcp and async crypto

When the TX queue for espintcp is full, esp_output_tail_tcp will
return an error and not free the skb, because with synchronous crypto,
the common xfrm output code will drop the packet for us.

With async crypto (esp_output_done), we need to drop the skb when
esp_output_tail_tcp returns an error.

Fixes: e27cca96cd ("xfrm: add espintcp (RFC 8229)")
Signed-off-by: Sabrina Dubroca <sd@queasysnail.net>
Reviewed-by: Simon Horman <horms@kernel.org>
Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
This commit is contained in:
Sabrina Dubroca
2026-02-24 00:05:14 +01:00
committed by Steffen Klassert
parent 7d2fc41f91
commit 0c0eef8ccd
2 changed files with 12 additions and 6 deletions

View File

@@ -235,10 +235,13 @@ static void esp_output_done(void *data, int err)
xfrm_dev_resume(skb);
} else {
if (!err &&
x->encap && x->encap->encap_type == TCP_ENCAP_ESPINTCP)
esp_output_tail_tcp(x, skb);
else
x->encap && x->encap->encap_type == TCP_ENCAP_ESPINTCP) {
err = esp_output_tail_tcp(x, skb);
if (err != -EINPROGRESS)
kfree_skb(skb);
} else {
xfrm_output_resume(skb_to_full_sk(skb), skb, err);
}
}
}

View File

@@ -271,10 +271,13 @@ static void esp_output_done(void *data, int err)
xfrm_dev_resume(skb);
} else {
if (!err &&
x->encap && x->encap->encap_type == TCP_ENCAP_ESPINTCP)
esp_output_tail_tcp(x, skb);
else
x->encap && x->encap->encap_type == TCP_ENCAP_ESPINTCP) {
err = esp_output_tail_tcp(x, skb);
if (err != -EINPROGRESS)
kfree_skb(skb);
} else {
xfrm_output_resume(skb_to_full_sk(skb), skb, err);
}
}
}