diff options
Diffstat (limited to 'net/ipv6/udp.c')
| -rw-r--r-- | net/ipv6/udp.c | 10 | 
1 files changed, 5 insertions, 5 deletions
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index 3477c919fcc8..e51fc3eee6db 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c @@ -525,10 +525,8 @@ csum_copy_err:  	}  	unlock_sock_fast(sk, slow); -	if (noblock) -		return -EAGAIN; - -	/* starting over for a new packet */ +	/* starting over for a new packet, but check if we need to yield */ +	cond_resched();  	msg->msg_flags &= ~MSG_TRUNC;  	goto try_again;  } @@ -731,7 +729,9 @@ static bool __udp_v6_is_mcast_sock(struct net *net, struct sock *sk,  	    (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;  |