FAILED: patch "[PATCH] net: vxlan: prevent NULL deref in vxlan_xmit_one" failed to apply to 6.6-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 6.6-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.6.y
git checkout FETCH_HEAD
git cherry-pick -x 1f73a56f986005f0bc64ed23873930e2ee4f5911
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026093053-earache-hubcap-d19c@gregkh' --subject-prefix 'PATCH 6.6.y' 'HEAD^..'
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 1f73a56f986005f0bc64ed23873930e2ee4f5911 Mon Sep 17 00:00:00 2001
From: Antoine Tenart <[email protected]>
Date: Wed, 26 Nov 2025 11:26:25 +0100
Subject: [PATCH] net: vxlan: prevent NULL deref in vxlan_xmit_one
Neither sock4 nor sock6 pointers are guaranteed to be non-NULL in vxlan_xmit_one, e.g. if the iface is brought down. This can lead to the following NULL dereference:
BUG: kernel NULL pointer dereference, address: 0000000000000010 Oops: Oops: 0000 [#1] SMP NOPTI RIP: 0010:vxlan_xmit_one+0xbb3/0x1580 Call Trace: vxlan_xmit+0x429/0x610 dev_hard_start_xmit+0x55/0xa0 __dev_queue_xmit+0x6d0/0x7f0 ip_finish_output2+0x24b/0x590 ip_output+0x63/0x110
Mentioned commits changed the code path in vxlan_xmit_one and as a side effect the sock4/6 pointer validity checks in vxlan(6)_get_route were lost. Fix this by adding back checks.
Since both commits being fixed were released in the same version (v6.7) and are strongly related, bundle the fixes in a single commit.
drivers/net/vxlan/vxlan_core.c +15 -3
@@ -2349,7 +2349,7 @@ void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,int addr_family;__u8 tos, ttl;int ifindex; -int err; +int err =0 ;u32 flags = vxlan->cfg.flags;bool use_cache;bool udp_sum = false;
@@ -2454,12 +2454,18 @@ void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,rcu_read_lock ();if (addr_family ==AF_INET ) { -struct vxlan_sock *sock4 =rcu_dereference (vxlan->vn4_sock); +struct vxlan_sock *sock4;u16 ipcb_flags =0 ;struct rtable *rt;__be16 df =0 ;__be32 saddr; + sock4 =rcu_dereference (vxlan->vn4_sock); +if (unlikely (!sock4)) { + reason =SKB_DROP_REASON_DEV_READY ; + goto tx_error; + } +if (!ifindex) ifindex = sock4->sock->sk->sk_bound_dev_if;
@@ -2534,10 +2540,16 @@ void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev, ipcb_flags);#if IS_ENABLED (CONFIG_IPV6 ) } else { -struct vxlan_sock *sock6 =rcu_dereference (vxlan->vn6_sock); +struct vxlan_sock *sock6;struct in6_addr saddr;u16 ip6cb_flags =0 ; + sock6 =rcu_dereference (vxlan->vn6_sock); +if (unlikely (!sock6)) { + reason =SKB_DROP_REASON_DEV_READY ; + goto tx_error; + } +if (!ifindex) ifindex = sock6->sock->sk->sk_bound_dev_if;