|
|
@@ -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>
|
|
|
@@ -1960,6 +1961,7 @@ void udp_v4_early_demux(struct sk_buff *skb)
|
|
|
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)))
|
|
|
@@ -1969,14 +1971,24 @@ void udp_v4_early_demux(struct sk_buff *skb)
|
|
|
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;
|