| From foo@baz Sat Jun 13 09:48:35 PDT 2015 |
| From: Henning Rogge <hrogge@gmail.com> |
| Date: Mon, 18 May 2015 21:08:49 +0200 |
| Subject: net/ipv6/udp: Fix ipv6 multicast socket filter regression |
| |
| From: Henning Rogge <hrogge@gmail.com> |
| |
| [ Upstream commit 33b4b015e1a1ca7a8fdce40af5e71642a8ea355c ] |
| |
| Commit <5cf3d46192fc> ("udp: Simplify__udp*_lib_mcast_deliver") |
| simplified the filter for incoming IPv6 multicast but removed |
| the check of the local socket address and the UDP destination |
| address. |
| |
| This patch restores the filter to prevent sockets bound to a IPv6 |
| multicast IP to receive other UDP traffic link unicast. |
| |
| Signed-off-by: Henning Rogge <hrogge@gmail.com> |
| Fixes: 5cf3d46192fc ("udp: Simplify__udp*_lib_mcast_deliver") |
| Cc: "David S. Miller" <davem@davemloft.net> |
| Acked-by: Eric Dumazet <edumazet@google.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| net/ipv6/udp.c | 4 +++- |
| 1 file changed, 3 insertions(+), 1 deletion(-) |
| |
| --- a/net/ipv6/udp.c |
| +++ b/net/ipv6/udp.c |
| @@ -734,7 +734,9 @@ static bool __udp_v6_is_mcast_sock(struc |
| (inet->inet_dport && inet->inet_dport != rmt_port) || |
| (!ipv6_addr_any(&sk->sk_v6_daddr) && |
| !ipv6_addr_equal(&sk->sk_v6_daddr, rmt_addr)) || |
| - (sk->sk_bound_dev_if && sk->sk_bound_dev_if != dif)) |
| + (sk->sk_bound_dev_if && sk->sk_bound_dev_if != dif) || |
| + (!ipv6_addr_any(&sk->sk_v6_rcv_saddr) && |
| + !ipv6_addr_equal(&sk->sk_v6_rcv_saddr, loc_addr))) |
| return false; |
| if (!inet6_mc_check(sk, loc_addr, rmt_addr)) |
| return false; |