[Acked] [PATCH Trusty SRU] ipv6: Fix regression caused by efe4208 in udp_v6_mcast_next()

Andy Whitcroft apw at canonical.com
Fri Jun 20 14:50:17 UTC 2014


On Fri, Jun 20, 2014 at 07:53:58AM -0600, Tim Gardner wrote:
> From: Sven Wegener <sven.wegener at stealer.net>
> 
> BugLink: http://bugs.launchpad.net/bugs/1332420
> 
> 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 at stealer.net>
> Acked-by: Eric Dumazet <edumazet at google.com>
> Signed-off-by: David S. Miller <davem at davemloft.net>
> (cherry picked from commit 3bfdc59a6c24608ed23e903f670aaf5f58c7a6f3)
> Signed-off-by: Tim Gardner <tim.gardner at canonical.com>
> ---
>  net/ipv6/udp.c | 8 ++++----
>  1 file changed, 4 insertions(+), 4 deletions(-)
> 
> diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c
> index 411a318..5c31793 100644
> --- a/net/ipv6/udp.c
> +++ b/net/ipv6/udp.c
> @@ -715,15 +715,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))

Ugg, I see Dave eliminated 's' very soon after this was applied, and a
good thing too.  Looks to do what is claimed, and is an upstream
cherry-pick.  

Acked-by: Andy Whitcroft <apw at canonical.com>

-apw




More information about the kernel-team mailing list