Message ID | 1453672883-2708-128-git-send-email-luis.henriques@canonical.com |
---|---|
State | New |
Headers | show |
On Sun, 2016-01-24 at 22:01 +0000, Luis Henriques wrote: > 3.16.7-ckt23 -stable review patch. If anyone has any objections, please let me know. > > ---8<------------------------------------------------------------ > > From: Eric Dumazet <edumazet@google.com> > > commit 197c949e7798fbf28cfadc69d9ca0c2abbf93191 upstream. [...] Please also revert commit fa89ae5548ed282f0ceb4660b3b93e4e2ee875f3 which was the previous attempt to fix this. Ben.
On Mon, Jan 25, 2016 at 01:41:23AM +0000, Ben Hutchings wrote: > On Sun, 2016-01-24 at 22:01 +0000, Luis Henriques wrote: > > 3.16.7-ckt23 -stable review patch. If anyone has any objections, please let me know. > > > > ---8<------------------------------------------------------------ > > > > From: Eric Dumazet <edumazet@google.com> > > > > commit 197c949e7798fbf28cfadc69d9ca0c2abbf93191 upstream. > [...] > > Please also revert commit fa89ae5548ed282f0ceb4660b3b93e4e2ee875f3 > which was the previous attempt to fix this. > Thanks, I'll add that revert to 3.16.7-ckt23 as well. Cheers, -- Luís > Ben. > > -- > Ben Hutchings > Klipstein's 4th Law of Prototyping and Production: > A fail-safe circuit will destroy others.
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index 4b9e4aba11b0..c57fa4c74c94 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c @@ -1272,6 +1272,7 @@ int udp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, int peeked, off = 0; int err; int is_udplite = IS_UDPLITE(sk); + bool checksum_valid = false; bool slow; if (flags & MSG_ERRQUEUE) @@ -1297,11 +1298,12 @@ try_again: */ if (copied < ulen || UDP_SKB_CB(skb)->partial_cov) { - if (udp_lib_checksum_complete(skb)) + checksum_valid = !udp_lib_checksum_complete(skb); + if (!checksum_valid) goto csum_copy_err; } - if (skb_csum_unnecessary(skb)) + if (checksum_valid || skb_csum_unnecessary(skb)) err = skb_copy_datagram_iovec(skb, sizeof(struct udphdr), msg->msg_iov, copied); else { diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index eb38829d8919..e432f8eb3c60 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c @@ -389,6 +389,7 @@ int udpv6_recvmsg(struct kiocb *iocb, struct sock *sk, int peeked, off = 0; int err; int is_udplite = IS_UDPLITE(sk); + bool checksum_valid = false; int is_udp4; bool slow; @@ -420,11 +421,12 @@ try_again: */ if (copied < ulen || UDP_SKB_CB(skb)->partial_cov) { - if (udp_lib_checksum_complete(skb)) + checksum_valid = !udp_lib_checksum_complete(skb); + if (!checksum_valid) goto csum_copy_err; } - if (skb_csum_unnecessary(skb)) + if (checksum_valid || skb_csum_unnecessary(skb)) err = skb_copy_datagram_iovec(skb, sizeof(struct udphdr), msg->msg_iov, copied); else {