ipv6: Fix regression caused by efe4208 in udp_v6_mcast_next()
authorSven Wegener <sven.wegener@stealer.net>
Thu, 29 May 2014 20:27:05 +0000 (20:27 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 4 Jun 2014 22:42:01 +0000 (15:42 -0700)
Commit efe4208 ("ipv6: make lookups simpler and faster") introduced a
regression in udp_v6_mcast_next(), resulting in multicast packets not
reaching the destination sockets under certain conditions.

The packet's IPv6 addresses are wrongly compared to the IPv6 addresses
from the function's socket argument, which indicates the starting point
for looping, instead of the loop variable. If the addresses from the
first socket do not match the packet's addresses, no socket in the list
will match.

Signed-off-by: Sven Wegener <sven.wegener@stealer.net>
Acked-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv6/udp.c

index 1e586d92260e1e75957060b896a8748e9beaa61a..20b63d2ab70fdf2adcc463b23c4fe42ae2ab4683 100644 (file)
@@ -716,15 +716,15 @@ static struct sock *udp_v6_mcast_next(struct net *net, struct sock *sk,
                                if (inet->inet_dport != rmt_port)
                                        continue;
                        }
-                       if (!ipv6_addr_any(&sk->sk_v6_daddr) &&
-                           !ipv6_addr_equal(&sk->sk_v6_daddr, rmt_addr))
+                       if (!ipv6_addr_any(&s->sk_v6_daddr) &&
+                           !ipv6_addr_equal(&s->sk_v6_daddr, rmt_addr))
                                continue;
 
                        if (s->sk_bound_dev_if && s->sk_bound_dev_if != dif)
                                continue;
 
-                       if (!ipv6_addr_any(&sk->sk_v6_rcv_saddr)) {
-                               if (!ipv6_addr_equal(&sk->sk_v6_rcv_saddr, loc_addr))
+                       if (!ipv6_addr_any(&s->sk_v6_rcv_saddr)) {
+                               if (!ipv6_addr_equal(&s->sk_v6_rcv_saddr, loc_addr))
                                        continue;
                        }
                        if (!inet6_mc_check(s, loc_addr, rmt_addr))