Re: [PATCH v2 1/1] xfrm: Use skb_mac_header_was_set() to check for MAC header presence

From: Marcello Sylverster Bauer
Date: Tue Sep 05 2023 - 12:35:03 EST


Hi Paolo,

On 9/5/23 11:59, Paolo Abeni wrote:
On Mon, 2023-09-04 at 12:32 +0200, Marcello Sylvester Bauer wrote:
From: Marcello Sylvester Bauer <sylv@xxxxxxx>

Add skb_mac_header_was_set() in xfrm4_remove_tunnel_encap() and
xfrm6_remove_tunnel_encap() to detect the presence of a MAC header.
This change prevents a kernel page fault on a non-zero mac_len when the
mac_header is not set.

Signed-off-by: Marcello Sylvester Bauer <sylv@xxxxxxx>

Please include a suitable fixes tag.

Please also include in the commit message the stacktrace:

https://lore.kernel.org/netdev/636d3434-d47a-4cd4-b3ba-7f7254317b64@xxxxxxx/

trimming the asm code and lines starting with ' ? '

Sure, will be added to the next version in addition to a cover letter to give additional context to this patch.


I think the real issue could be elsewhere, we should not reach here
with mac_len > 0 && !skb_mac_header_was_set().

Could you please try the following debug patch in your setup, and see
if hints at some other relevant place?

Unfortunately the person with the hardware is OOO for two weeks. But I could ask him to test it when he gets back.

Thanks,
Marcello


Thanks,

Paolo

---
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index 4174c4b82d13..38ca2c7e50ca 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -2793,6 +2793,7 @@ static inline void skb_reset_inner_headers(struct sk_buff *skb)
static inline void skb_reset_mac_len(struct sk_buff *skb)
{
+ WARN_ON_ONCE(!skb_mac_header_was_set(skb));
skb->mac_len = skb->network_header - skb->mac_header;
}