diff options
Diffstat (limited to 'net/ipv4/ip_sockglue.c')
| -rw-r--r-- | net/ipv4/ip_sockglue.c | 11 | 
1 files changed, 7 insertions, 4 deletions
| diff --git a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c index fc32fdbeefa6..c0fe5ad996f2 100644 --- a/net/ipv4/ip_sockglue.c +++ b/net/ipv4/ip_sockglue.c @@ -150,15 +150,18 @@ static void ip_cmsg_recv_dstaddr(struct msghdr *msg, struct sk_buff *skb)  {  	struct sockaddr_in sin;  	const struct iphdr *iph = ip_hdr(skb); -	__be16 *ports = (__be16 *)skb_transport_header(skb); +	__be16 *ports; +	int end; -	if (skb_transport_offset(skb) + 4 > (int)skb->len) +	end = skb_transport_offset(skb) + 4; +	if (end > 0 && !pskb_may_pull(skb, end))  		return;  	/* All current transport protocols have the port numbers in the  	 * first four bytes of the transport header and this function is  	 * written with this assumption in mind.  	 */ +	ports = (__be16 *)skb_transport_header(skb);  	sin.sin_family = AF_INET;  	sin.sin_addr.s_addr = iph->daddr; @@ -984,7 +987,7 @@ static int do_ip_setsockopt(struct sock *sk, int level,  			mreq.imr_multiaddr.s_addr = mreqs.imr_multiaddr;  			mreq.imr_address.s_addr = mreqs.imr_interface;  			mreq.imr_ifindex = 0; -			err = ip_mc_join_group(sk, &mreq); +			err = ip_mc_join_group_ssm(sk, &mreq, MCAST_INCLUDE);  			if (err && err != -EADDRINUSE)  				break;  			omode = MCAST_INCLUDE; @@ -1061,7 +1064,7 @@ static int do_ip_setsockopt(struct sock *sk, int level,  			mreq.imr_multiaddr = psin->sin_addr;  			mreq.imr_address.s_addr = 0;  			mreq.imr_ifindex = greqs.gsr_interface; -			err = ip_mc_join_group(sk, &mreq); +			err = ip_mc_join_group_ssm(sk, &mreq, MCAST_INCLUDE);  			if (err && err != -EADDRINUSE)  				break;  			greqs.gsr_interface = mreq.imr_ifindex; |