Patch "udp: fix IP_CHECKSUM handling" has been added to the 4.8-stable tree
Subsystems (4)
This is a note to let you know that I've just added the patch titled
udp: fix IP_CHECKSUM handling
to the 4.8-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
udp-fix-ip_checksum-handling.patch
and it can be found in the queue-4.8 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From foo@baz Thu Nov 10 16:43:03 CET 2016
From: Eric Dumazet <[email protected]>
Date: Sun, 23 Oct 2016 18:03:06 -0700
Subject: udp: fix IP_CHECKSUM handling
From: Eric Dumazet <[email protected]>
[ Upstream commit 10df8e6152c6c400a563a673e9956320bfce1871 ]
First bug was added in commit ad6f939ab193 ("ip: Add offset parameter to ip_cmsg_recv") : Tom missed that ipv4 udp messages could be received on AF_INET6 socket. ip_cmsg_recv(msg, skb) should have been replaced by ip_cmsg_recv_offset(msg, skb, sizeof(struct udphdr));
Then commit e6afc8ace6dd ("udp: remove headers from UDP packets before queueing") forgot to adjust the offsets now UDP headers are pulled before skb are put in receive queue.
--- include/net/ip.h | 4 ++-- net/ipv4/ip_sockglue.c | 11 ++++++----- net/ipv4/udp.c | 2 +- net/ipv6/udp.c | 3 ++- 4 files changed, 11 insertions(+), 9 deletions(-)
include/net/ip.h +2 -2
@@ -549,7 +549,7 @@ int ip_options_rcv_srr(struct sk_buff *s*/ void ipv4_pktinfo_prepare (const struct sock *sk,struct sk_buff *skb); -void ip_cmsg_recv_offset (struct msghdr *msg,struct sk_buff *skb,int offset); +void ip_cmsg_recv_offset (struct msghdr *msg,struct sk_buff *skb,int tlen,int offset);int ip_cmsg_send (struct sock *sk,struct msghdr *msg,struct ipcm_cookie *ipc,bool allow_ipv6); int ip_setsockopt(struct sock *sk, int level, int optname, char __user *optval,
@@ -571,7 +571,7 @@ void ip_local_error(struct sock *sk, intstatic inline void ip_cmsg_recv (struct msghdr *msg,struct sk_buff *skb) { -ip_cmsg_recv_offset (msg, skb,0 ); +ip_cmsg_recv_offset (msg, skb,0 ,0 ); }bool icmp_global_allow (void );
net/ipv4/ip_sockglue.c +6 -5
@@ -98,7 +98,7 @@ static void ip_cmsg_recv_retopts(struct }static void ip_cmsg_recv_checksum (struct msghdr *msg,struct sk_buff *skb, -int offset) +int tlen,int offset) {__wsum csum = skb->csum;
@@ -106,8 +106,9 @@ static void ip_cmsg_recv_checksum(structreturn ;if (offset !=0 ) - csum =csum_sub (csum,csum_partial (skb_transport_header (skb), - offset,0 )); + csum =csum_sub (csum, +csum_partial (skb_transport_header (skb) + tlen, + offset,0 ));put_cmsg (msg,SOL_IP ,IP_CHECKSUM ,sizeof (__wsum), &csum); }
@@ -153,7 +154,7 @@ static void ip_cmsg_recv_dstaddr(struct }void ip_cmsg_recv_offset (struct msghdr *msg,struct sk_buff *skb, -int offset) +int tlen,int offset) {struct inet_sock *inet =inet_sk (skb->sk);unsigned int flags = inet->cmsg_flags;
@@ -216,7 +217,7 @@ void ip_cmsg_recv_offset(struct msghdr * }if (flags &IP_CMSG_CHECKSUM ) -ip_cmsg_recv_checksum (msg, skb, offset); +ip_cmsg_recv_checksum (msg, skb, tlen, offset); }EXPORT_SYMBOL (ip_cmsg_recv_offset);
net/ipv4/udp.c +1 -1
@@ -1327,7 +1327,7 @@ try_again: *addr_len =sizeof (*sin); }if (inet->cmsg_flags) -ip_cmsg_recv_offset (msg, skb,sizeof (struct udphdr ) + off); +ip_cmsg_recv_offset (msg, skb,sizeof (struct udphdr ), off); err = copied;if (flags &MSG_TRUNC )
net/ipv6/udp.c +2 -1
@@ -427,7 +427,8 @@ try_again:if (is_udp4) {if (inet->cmsg_flags) -ip_cmsg_recv (msg, skb); +ip_cmsg_recv_offset (msg, skb, +sizeof (struct udphdr ), off); }else {if (np->rxopt.all)ip6_datagram_recv_specific_ctl (sk, msg, skb);
Patches currently in stable-queue which might be from [email protected] are
queue-4.8/ipv4-use-the-right-lock-for-ping_group_range.patch queue-4.8/ipv4-disable-bh-in-set_ping_group_range.patch queue-4.8/udp-fix-ip_checksum-handling.patch queue-4.8/netlink-do-not-enter-direct-reclaim-from-netlink_dump.patch queue-4.8/ipv6-tcp-restore-ip6cb-for-pktoptions-skbs.patch queue-4.8/packet-on-direct_xmit-limit-tso-and-csum-to-supported-devices.patch queue-4.8/net-pktgen-remove-rcu-locking-in-pktgen_change_name.patch