diff options
Diffstat (limited to 'net/ipv6/raw.c')
| -rw-r--r-- | net/ipv6/raw.c | 17 | 
1 files changed, 10 insertions, 7 deletions
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c index e24ff1df0401..1f29996e368a 100644 --- a/net/ipv6/raw.c +++ b/net/ipv6/raw.c @@ -250,6 +250,10 @@ static int rawv6_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len)  	if (addr_len < SIN6_LEN_RFC2133)  		return -EINVAL; + +	if (addr->sin6_family != AF_INET6) +		return -EINVAL; +  	addr_type = ipv6_addr_type(&addr->sin6_addr);  	/* Raw sockets are IPv6 only */ @@ -457,7 +461,7 @@ static int rawv6_recvmsg(struct kiocb *iocb, struct sock *sk,  		  int noblock, int flags, int *addr_len)  {  	struct ipv6_pinfo *np = inet6_sk(sk); -	struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)msg->msg_name; +	DECLARE_SOCKADDR(struct sockaddr_in6 *, sin6, msg->msg_name);  	struct sk_buff *skb;  	size_t copied;  	int err; @@ -466,10 +470,10 @@ static int rawv6_recvmsg(struct kiocb *iocb, struct sock *sk,  		return -EOPNOTSUPP;  	if (flags & MSG_ERRQUEUE) -		return ipv6_recv_error(sk, msg, len); +		return ipv6_recv_error(sk, msg, len, addr_len);  	if (np->rxpmtu && np->rxopt.bits.rxpmtu) -		return ipv6_recv_rxpmtu(sk, msg, len); +		return ipv6_recv_rxpmtu(sk, msg, len, addr_len);  	skb = skb_recv_datagram(sk, flags, noblock, &err);  	if (!skb) @@ -734,7 +738,7 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk,  		   struct msghdr *msg, size_t len)  {  	struct ipv6_txoptions opt_space; -	struct sockaddr_in6 * sin6 = (struct sockaddr_in6 *) msg->msg_name; +	DECLARE_SOCKADDR(struct sockaddr_in6 *, sin6, msg->msg_name);  	struct in6_addr *daddr, *final_p, final;  	struct inet_sock *inet = inet_sk(sk);  	struct ipv6_pinfo *np = inet6_sk(sk); @@ -792,7 +796,6 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk,  				flowlabel = fl6_sock_lookup(sk, fl6.flowlabel);  				if (flowlabel == NULL)  					return -EINVAL; -				daddr = &flowlabel->dst;  			}  		} @@ -865,7 +868,7 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk,  		fl6.flowi6_oif = np->ucast_oif;  	security_sk_classify_flow(sk, flowi6_to_flowi(&fl6)); -	dst = ip6_dst_lookup_flow(sk, &fl6, final_p, true); +	dst = ip6_dst_lookup_flow(sk, &fl6, final_p);  	if (IS_ERR(dst)) {  		err = PTR_ERR(dst);  		goto out; @@ -1210,7 +1213,7 @@ struct proto rawv6_prot = {  	.owner		   = THIS_MODULE,  	.close		   = rawv6_close,  	.destroy	   = raw6_destroy, -	.connect	   = ip6_datagram_connect, +	.connect	   = ip6_datagram_connect_v6_only,  	.disconnect	   = udp_disconnect,  	.ioctl		   = rawv6_ioctl,  	.init		   = rawv6_init_sk,  | 
