mirror of
https://github.com/torvalds/linux.git
synced 2026-09-22 04:34:03 +02:00
vxlan: unclone skb head before modifying eth header in route_shortcircuit()
When route_shortcircuit() performs L3 short-circuit routing, it modifies
the Ethernet header of the skb in-place:
memcpy(eth_hdr(skb)->h_source, eth_hdr(skb)->h_dest, dev->addr_len);
memcpy(eth_hdr(skb)->h_dest, n->ha, dev->addr_len);
If the incoming skb is cloned (for example by packet sockets, tcpdump, or
dev_queue_xmit), modifying the Ethernet header without uncloning can corrupt
the packet header for other readers holding a reference to the cloned skb.
Ensure the skb header is writable and unshared by calling skb_cow_head(skb, 0)
prior to updating the Ethernet header. If skb_cow_head() fails, abort short-circuiting
and return false to allow standard packet processing fallback.
Fixes: e4f67addf1 ("add DOVE extensions for VXLAN")
Cc: stable@vger.kernel.org
Signed-off-by: Eric Dumazet <edumazet@google.com>
Link: https://patch.msgid.link/20260723144249.759100-3-edumazet@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
1395a676ec
commit
760d36e737
|
|
@ -2163,6 +2163,10 @@ static bool route_shortcircuit(struct net_device *dev, struct sk_buff *skb)
|
|||
|
||||
diff = !ether_addr_equal(eth_hdr(skb)->h_dest, n->ha);
|
||||
if (diff) {
|
||||
if (skb_cow_head(skb, 0)) {
|
||||
neigh_release(n);
|
||||
return false;
|
||||
}
|
||||
memcpy(eth_hdr(skb)->h_source, eth_hdr(skb)->h_dest,
|
||||
dev->addr_len);
|
||||
memcpy(eth_hdr(skb)->h_dest, n->ha, dev->addr_len);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user