Patch "ipv4/udp: Verify multicast group is ours in upd_v4_early_demux()" has been added to the 4.0-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
ipv4/udp: Verify multicast group is ours in upd_v4_early_demux()
to the 4.0-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:
ipv4-udp-verify-multicast-group-is-ours-in-upd_v4_early_demux.patch
and it can be found in the queue-4.0 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From foo@baz Sat Jun 13 09:48:35 PDT 2015
From: Shawn Bohrer <[email protected]>
Date: Wed, 3 Jun 2015 16:27:38 -0500
Subject: ipv4/udp: Verify multicast group is ours in upd_v4_early_demux()
From: Shawn Bohrer <[email protected]>
[ Upstream commit 6e540309326188f769e03bb4c6dd8ff6752930c2 ]
421b3885bf6d56391297844f43fb7154a6396e12 "udp: ipv4: Add udp early demux" introduced a regression that allowed sockets bound to INADDR_ANY to receive packets from multicast groups that the socket had not joined. For example a socket that had joined 224.168.2.9 could also receive packets from 225.168.2.9 despite not having joined that group if ip_early_demux is enabled.
Fix this by calling ip_check_mc_rcu() in udp_v4_early_demux() to verify that the multicast packet is indeed ours.
--- net/ipv4/udp.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-)
net/ipv4/udp.c +15 -3
@@ -90,6 +90,7 @@#include <linux/socket.h> #include <linux/sockios.h> #include <linux/igmp.h> +#include <linux/inetdevice.h> #include <linux/in.h> #include <linux/errno.h> #include <linux/timer.h>
@@ -1966,6 +1967,7 @@ void udp_v4_early_demux(struct sk_buff *struct sock *sk;struct dst_entry *dst;int dif = skb->dev->ifindex; +int ours;/* validate the packet */ if (!pskb_may_pull (skb,skb_transport_offset (skb) +sizeof (struct udphdr )))
@@ -1975,14 +1977,24 @@ void udp_v4_early_demux(struct sk_buff * uh =udp_hdr (skb);if (skb->pkt_type ==PACKET_BROADCAST || - skb->pkt_type ==PACKET_MULTICAST ) + skb->pkt_type ==PACKET_MULTICAST ) { +struct in_device *in_dev =__in_dev_get_rcu (skb->dev); + +if (!in_dev) +return ; + + ours =ip_check_mc_rcu (in_dev, iph->daddr, iph->saddr, + iph->protocol); +if (!ours) +return ; sk =__udp4_lib_mcast_demux_lookup (net, uh->dest, iph->daddr, uh->source, iph->saddr, dif); -else if (skb->pkt_type ==PACKET_HOST ) + }else if (skb->pkt_type ==PACKET_HOST ) { sk =__udp4_lib_demux_lookup (net, uh->dest, iph->daddr, uh->source, iph->saddr, dif); -else + }else {return ; + }if (!sk)return ;
Patches currently in stable-queue which might be from [email protected] are
queue-4.0/ipv4-udp-verify-multicast-group-is-ours-in-upd_v4_early_demux.patch