Patch "ipvlan: ensure network headers are in skb linear part" has been added to the 6.1-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    ipvlan: ensure network headers are in skb linear part

to the 6.1-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     ipvlan-ensure-network-headers-are-in-skb-linear-part.patch
and it can be found in the queue-6.1 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit f7e8fb6cc77cee5f5b699ac13a3bc405f41d41bd
Author: Eric Dumazet <edumazet@xxxxxxxxxx>
Date:   Thu Feb 20 15:53:36 2025 +0000

    ipvlan: ensure network headers are in skb linear part
    
    [ Upstream commit 27843ce6ba3d3122b65066550fe33fb8839f8aef ]
    
    syzbot found that ipvlan_process_v6_outbound() was assuming
    the IPv6 network header isis present in skb->head [1]
    
    Add the needed pskb_network_may_pull() calls for both
    IPv4 and IPv6 handlers.
    
    [1]
    BUG: KMSAN: uninit-value in __ipv6_addr_type+0xa2/0x490 net/ipv6/addrconf_core.c:47
      __ipv6_addr_type+0xa2/0x490 net/ipv6/addrconf_core.c:47
      ipv6_addr_type include/net/ipv6.h:555 [inline]
      ip6_route_output_flags_noref net/ipv6/route.c:2616 [inline]
      ip6_route_output_flags+0x51/0x720 net/ipv6/route.c:2651
      ip6_route_output include/net/ip6_route.h:93 [inline]
      ipvlan_route_v6_outbound+0x24e/0x520 drivers/net/ipvlan/ipvlan_core.c:476
      ipvlan_process_v6_outbound drivers/net/ipvlan/ipvlan_core.c:491 [inline]
      ipvlan_process_outbound drivers/net/ipvlan/ipvlan_core.c:541 [inline]
      ipvlan_xmit_mode_l3 drivers/net/ipvlan/ipvlan_core.c:605 [inline]
      ipvlan_queue_xmit+0xd72/0x1780 drivers/net/ipvlan/ipvlan_core.c:671
      ipvlan_start_xmit+0x5b/0x210 drivers/net/ipvlan/ipvlan_main.c:223
      __netdev_start_xmit include/linux/netdevice.h:5150 [inline]
      netdev_start_xmit include/linux/netdevice.h:5159 [inline]
      xmit_one net/core/dev.c:3735 [inline]
      dev_hard_start_xmit+0x247/0xa20 net/core/dev.c:3751
      sch_direct_xmit+0x399/0xd40 net/sched/sch_generic.c:343
      qdisc_restart net/sched/sch_generic.c:408 [inline]
      __qdisc_run+0x14da/0x35d0 net/sched/sch_generic.c:416
      qdisc_run+0x141/0x4d0 include/net/pkt_sched.h:127
      net_tx_action+0x78b/0x940 net/core/dev.c:5484
      handle_softirqs+0x1a0/0x7c0 kernel/softirq.c:561
      __do_softirq+0x14/0x1a kernel/softirq.c:595
      do_softirq+0x9a/0x100 kernel/softirq.c:462
      __local_bh_enable_ip+0x9f/0xb0 kernel/softirq.c:389
      local_bh_enable include/linux/bottom_half.h:33 [inline]
      rcu_read_unlock_bh include/linux/rcupdate.h:919 [inline]
      __dev_queue_xmit+0x2758/0x57d0 net/core/dev.c:4611
      dev_queue_xmit include/linux/netdevice.h:3311 [inline]
      packet_xmit+0x9c/0x6c0 net/packet/af_packet.c:276
      packet_snd net/packet/af_packet.c:3132 [inline]
      packet_sendmsg+0x93e0/0xa7e0 net/packet/af_packet.c:3164
      sock_sendmsg_nosec net/socket.c:718 [inline]
    
    Fixes: 2ad7bf363841 ("ipvlan: Initial check-in of the IPVLAN driver.")
    Reported-by: syzbot+93ab4a777bafb9d9f960@xxxxxxxxxxxxxxxxxxxxxxxxx
    Closes: https://lore.kernel.org/netdev/67b74f01.050a0220.14d86d.02d8.GAE@xxxxxxxxxx/T/#u
    Signed-off-by: Eric Dumazet <edumazet@xxxxxxxxxx>
    Cc: Mahesh Bandewar <maheshb@xxxxxxxxxx>
    Link: https://patch.msgid.link/20250220155336.61884-1-edumazet@xxxxxxxxxx
    Signed-off-by: Jakub Kicinski <kuba@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/net/ipvlan/ipvlan_core.c b/drivers/net/ipvlan/ipvlan_core.c
index 38eb40cba5aac..eea81a7334052 100644
--- a/drivers/net/ipvlan/ipvlan_core.c
+++ b/drivers/net/ipvlan/ipvlan_core.c
@@ -416,20 +416,25 @@ struct ipvl_addr *ipvlan_addr_lookup(struct ipvl_port *port, void *lyr3h,
 
 static noinline_for_stack int ipvlan_process_v4_outbound(struct sk_buff *skb)
 {
-	const struct iphdr *ip4h = ip_hdr(skb);
 	struct net_device *dev = skb->dev;
 	struct net *net = dev_net(dev);
-	struct rtable *rt;
 	int err, ret = NET_XMIT_DROP;
+	const struct iphdr *ip4h;
+	struct rtable *rt;
 	struct flowi4 fl4 = {
 		.flowi4_oif = dev->ifindex,
-		.flowi4_tos = inet_dscp_to_dsfield(ip4h_dscp(ip4h)),
 		.flowi4_flags = FLOWI_FLAG_ANYSRC,
 		.flowi4_mark = skb->mark,
-		.daddr = ip4h->daddr,
-		.saddr = ip4h->saddr,
 	};
 
+	if (!pskb_network_may_pull(skb, sizeof(struct iphdr)))
+		goto err;
+
+	ip4h = ip_hdr(skb);
+	fl4.daddr = ip4h->daddr;
+	fl4.saddr = ip4h->saddr;
+	fl4.flowi4_tos = inet_dscp_to_dsfield(ip4h_dscp(ip4h));
+
 	rt = ip_route_output_flow(net, &fl4, NULL);
 	if (IS_ERR(rt))
 		goto err;
@@ -488,6 +493,12 @@ static int ipvlan_process_v6_outbound(struct sk_buff *skb)
 	struct net_device *dev = skb->dev;
 	int err, ret = NET_XMIT_DROP;
 
+	if (!pskb_network_may_pull(skb, sizeof(struct ipv6hdr))) {
+		DEV_STATS_INC(dev, tx_errors);
+		kfree_skb(skb);
+		return ret;
+	}
+
 	err = ipvlan_route_v6_outbound(dev, skb);
 	if (unlikely(err)) {
 		DEV_STATS_INC(dev, tx_errors);




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux