udp: multicast packets need to check namespace

Current UDP multicast delivery is not namespace aware.

Signed-off-by: Eric Dumazet <dada1@cosmosbay.com>
Acked-by: Pavel Emelyanov <xemul@openvz.org>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by Eric Dumazet and committed by David S. Miller 920a4611 d1a203ea

+11 -9
+7 -5
net/ipv4/udp.c
··· 284 284 } 285 285 EXPORT_SYMBOL_GPL(udp4_lib_lookup); 286 286 287 - static inline struct sock *udp_v4_mcast_next(struct sock *sk, 287 + static inline struct sock *udp_v4_mcast_next(struct net *net, struct sock *sk, 288 288 __be16 loc_port, __be32 loc_addr, 289 289 __be16 rmt_port, __be32 rmt_addr, 290 290 int dif) ··· 296 296 sk_for_each_from(s, node) { 297 297 struct inet_sock *inet = inet_sk(s); 298 298 299 - if (s->sk_hash != hnum || 299 + if (!net_eq(sock_net(s), net) || 300 + s->sk_hash != hnum || 300 301 (inet->daddr && inet->daddr != rmt_addr) || 301 302 (inet->dport != rmt_port && inet->dport) || 302 303 (inet->rcv_saddr && inet->rcv_saddr != loc_addr) || ··· 1080 1079 read_lock(&udp_hash_lock); 1081 1080 sk = sk_head(&udptable[udp_hashfn(net, ntohs(uh->dest))]); 1082 1081 dif = skb->dev->ifindex; 1083 - sk = udp_v4_mcast_next(sk, uh->dest, daddr, uh->source, saddr, dif); 1082 + sk = udp_v4_mcast_next(net, sk, uh->dest, daddr, uh->source, saddr, dif); 1084 1083 if (sk) { 1085 1084 struct sock *sknext = NULL; 1086 1085 1087 1086 do { 1088 1087 struct sk_buff *skb1 = skb; 1089 1088 1090 - sknext = udp_v4_mcast_next(sk_next(sk), uh->dest, daddr, 1091 - uh->source, saddr, dif); 1089 + sknext = udp_v4_mcast_next(net, sk_next(sk), uh->dest, 1090 + daddr, uh->source, saddr, 1091 + dif); 1092 1092 if (sknext) 1093 1093 skb1 = skb_clone(skb, GFP_ATOMIC); 1094 1094
+4 -4
net/ipv6/udp.c
··· 328 328 return -1; 329 329 } 330 330 331 - static struct sock *udp_v6_mcast_next(struct sock *sk, 331 + static struct sock *udp_v6_mcast_next(struct net *net, struct sock *sk, 332 332 __be16 loc_port, struct in6_addr *loc_addr, 333 333 __be16 rmt_port, struct in6_addr *rmt_addr, 334 334 int dif) ··· 340 340 sk_for_each_from(s, node) { 341 341 struct inet_sock *inet = inet_sk(s); 342 342 343 - if (sock_net(s) != sock_net(sk)) 343 + if (!net_eq(sock_net(s), net)) 344 344 continue; 345 345 346 346 if (s->sk_hash == num && s->sk_family == PF_INET6) { ··· 383 383 read_lock(&udp_hash_lock); 384 384 sk = sk_head(&udptable[udp_hashfn(net, ntohs(uh->dest))]); 385 385 dif = inet6_iif(skb); 386 - sk = udp_v6_mcast_next(sk, uh->dest, daddr, uh->source, saddr, dif); 386 + sk = udp_v6_mcast_next(net, sk, uh->dest, daddr, uh->source, saddr, dif); 387 387 if (!sk) { 388 388 kfree_skb(skb); 389 389 goto out; 390 390 } 391 391 392 392 sk2 = sk; 393 - while ((sk2 = udp_v6_mcast_next(sk_next(sk2), uh->dest, daddr, 393 + while ((sk2 = udp_v6_mcast_next(net, sk_next(sk2), uh->dest, daddr, 394 394 uh->source, saddr, dif))) { 395 395 struct sk_buff *buff = skb_clone(skb, GFP_ATOMIC); 396 396 if (buff) {