]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
bareudp: Pull inner IP header on xmit.
authorGuillaume Nault <gnault@redhat.com>
Wed, 11 Sep 2024 09:21:05 +0000 (11:21 +0200)
committerJakub Kicinski <kuba@kernel.org>
Fri, 13 Sep 2024 03:30:15 +0000 (20:30 -0700)
Both bareudp_xmit_skb() and bareudp6_xmit_skb() read their skb's inner
IP header to get its ECN value (with ip_tunnel_ecn_encap()). Therefore
we need to ensure that the inner IP header is part of the skb's linear
data.

Fixes: 571912c69f0e ("net: UDP tunnel encapsulation module for tunnelling different protocols like MPLS, IP, NSH etc.")
Signed-off-by: Guillaume Nault <gnault@redhat.com>
Reviewed-by: Willem de Bruijn <willemb@google.com>
Link: https://patch.msgid.link/267328222f0a11519c6de04c640a4f87a38ea9ed.1726046181.git.gnault@redhat.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/bareudp.c

index b4e820a123caf1e8a157229f233c7107aa021274..e80992b4f9de9a7a3eedade384a2aeb09913d03e 100644 (file)
@@ -317,6 +317,9 @@ static int bareudp_xmit_skb(struct sk_buff *skb, struct net_device *dev,
        __be32 saddr;
        int err;
 
+       if (!skb_vlan_inet_prepare(skb, skb->protocol != htons(ETH_P_TEB)))
+               return -EINVAL;
+
        if (!sock)
                return -ESHUTDOWN;
 
@@ -384,6 +387,9 @@ static int bareudp6_xmit_skb(struct sk_buff *skb, struct net_device *dev,
        __be16 sport;
        int err;
 
+       if (!skb_vlan_inet_prepare(skb, skb->protocol != htons(ETH_P_TEB)))
+               return -EINVAL;
+
        if (!sock)
                return -ESHUTDOWN;