diff options
| -rw-r--r-- | net/ipv4/udp.c | 15 | ||||
| -rw-r--r-- | net/ipv6/udp.c | 15 | 
2 files changed, 16 insertions, 14 deletions
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index ab0966df1e2..5a65eeac1d2 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c @@ -1164,7 +1164,7 @@ int udp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,  	struct inet_sock *inet = inet_sk(sk);  	struct sockaddr_in *sin = (struct sockaddr_in *)msg->msg_name;  	struct sk_buff *skb; -	unsigned int ulen; +	unsigned int ulen, copied;  	int peeked;  	int err;  	int is_udplite = IS_UDPLITE(sk); @@ -1186,9 +1186,10 @@ try_again:  		goto out;  	ulen = skb->len - sizeof(struct udphdr); -	if (len > ulen) -		len = ulen; -	else if (len < ulen) +	copied = len; +	if (copied > ulen) +		copied = ulen; +	else if (copied < ulen)  		msg->msg_flags |= MSG_TRUNC;  	/* @@ -1197,14 +1198,14 @@ try_again:  	 * coverage checksum (UDP-Lite), do it before the copy.  	 */ -	if (len < ulen || UDP_SKB_CB(skb)->partial_cov) { +	if (copied < ulen || UDP_SKB_CB(skb)->partial_cov) {  		if (udp_lib_checksum_complete(skb))  			goto csum_copy_err;  	}  	if (skb_csum_unnecessary(skb))  		err = skb_copy_datagram_iovec(skb, sizeof(struct udphdr), -					      msg->msg_iov, len); +					      msg->msg_iov, copied);  	else {  		err = skb_copy_and_csum_datagram_iovec(skb,  						       sizeof(struct udphdr), @@ -1233,7 +1234,7 @@ try_again:  	if (inet->cmsg_flags)  		ip_cmsg_recv(msg, skb); -	err = len; +	err = copied;  	if (flags & MSG_TRUNC)  		err = ulen; diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index 846f4757eb8..8c254191518 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c @@ -340,7 +340,7 @@ int udpv6_recvmsg(struct kiocb *iocb, struct sock *sk,  	struct ipv6_pinfo *np = inet6_sk(sk);  	struct inet_sock *inet = inet_sk(sk);  	struct sk_buff *skb; -	unsigned int ulen; +	unsigned int ulen, copied;  	int peeked;  	int err;  	int is_udplite = IS_UDPLITE(sk); @@ -363,9 +363,10 @@ try_again:  		goto out;  	ulen = skb->len - sizeof(struct udphdr); -	if (len > ulen) -		len = ulen; -	else if (len < ulen) +	copied = len; +	if (copied > ulen) +		copied = ulen; +	else if (copied < ulen)  		msg->msg_flags |= MSG_TRUNC;  	is_udp4 = (skb->protocol == htons(ETH_P_IP)); @@ -376,14 +377,14 @@ try_again:  	 * coverage checksum (UDP-Lite), do it before the copy.  	 */ -	if (len < ulen || UDP_SKB_CB(skb)->partial_cov) { +	if (copied < ulen || UDP_SKB_CB(skb)->partial_cov) {  		if (udp_lib_checksum_complete(skb))  			goto csum_copy_err;  	}  	if (skb_csum_unnecessary(skb))  		err = skb_copy_datagram_iovec(skb, sizeof(struct udphdr), -					      msg->msg_iov,len); +					      msg->msg_iov, copied       );  	else {  		err = skb_copy_and_csum_datagram_iovec(skb, sizeof(struct udphdr), msg->msg_iov);  		if (err == -EINVAL) @@ -432,7 +433,7 @@ try_again:  			datagram_recv_ctl(sk, msg, skb);  	} -	err = len; +	err = copied;  	if (flags & MSG_TRUNC)  		err = ulen;  |