Patch "ip: fix IP_CHECKSUM handling" has been added to the 4.4-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
ip: fix IP_CHECKSUM handling
to the 4.4-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:
ip-fix-ip_checksum-handling.patch
and it can be found in the queue-4.4 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 Feb 23 21:13:19 CET 2017
From: Paolo Abeni <[email protected]>
Date: Tue, 21 Feb 2017 09:33:18 +0100
Subject: ip: fix IP_CHECKSUM handling
From: Paolo Abeni <[email protected]>
[ Upstream commit ca4ef4574f1ee5252e2cd365f8f5d5bafd048f32 ]
The skbs processed by ip_cmsg_recv() are not guaranteed to be linear e.g. when sending UDP packets over loopback with MSGMORE.
Using csum_partial() on [potentially] the whole skb len is dangerous; instead be on the safe side and use skb_checksum().
Thanks to syzkaller team to detect the issue and provide the reproducer.
v1 -> v2:
- move the variable declaration in a tighter scope
--- net/ipv4/ip_sockglue.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
net/ipv4/ip_sockglue.c +4 -4
@@ -105,10 +105,10 @@ static void ip_cmsg_recv_checksum(structif (skb->ip_summed !=CHECKSUM_COMPLETE )return ; -if (offset !=0 ) - csum =csum_sub (csum, -csum_partial (skb->data + tlen, - offset,0 )); +if (offset !=0 ) { +int tend_off =skb_transport_offset (skb) + tlen; + csum =csum_sub (csum,skb_checksum (skb, tend_off, offset,0 )); + }put_cmsg (msg,SOL_IP ,IP_CHECKSUM ,sizeof (__wsum), &csum); }
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/ip-fix-ip_checksum-handling.patch