Patch "udplite: fix partial checksum initialization" has been added to the 4.9-stable tree
Subsystems (4)
This is a note to let you know that I've just added the patch titled
udplite: fix partial checksum initialization
to the 4.9-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:
udplite-fix-partial-checksum-initialization.patch
and it can be found in the queue-4.9 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 Mar 8 06:55:02 PST 2018
From: Alexey Kodanev <[email protected]>
Date: Thu, 15 Feb 2018 20:18:43 +0300
Subject: udplite: fix partial checksum initialization
From: Alexey Kodanev <[email protected]>
[ Upstream commit 15f35d49c93f4fa9875235e7bf3e3783d2dd7a1b ]
Since UDP-Lite is always using checksum, the following path is triggered when calculating pseudo header for it:
udp4_csum_init() or udp6_csum_init()
skb_checksum_init_zero_check()
__skb_checksum_validate_complete()
The problem can appear if skb->len is less than CHECKSUM_BREAK. In this particular case __skb_checksum_validate_complete() also invokes __skb_checksum_complete(skb). If UDP-Lite is using partial checksum that covers only part of a packet, the function will return bad checksum and the packet will be dropped.
It can be fixed if we skip skb_checksum_init_zero_check() and only set the required pseudo header checksum for UDP-Lite with partial checksum before udp4_csum_init()/udp6_csum_init() functions return.
--- include/net/udplite.h | 1 + net/ipv4/udp.c | 5 +++++ net/ipv6/ip6_checksum.c | 5 +++++ 3 files changed, 11 insertions(+)
include/net/udplite.h +1 -0
@@ -62,6 +62,7 @@ static inline int udplite_checksum_init(UDP_SKB_CB (skb)->cscov = cscov;if (skb->ip_summed ==CHECKSUM_COMPLETE ) skb->ip_summed =CHECKSUM_NONE ; + skb->csum_valid =0 ; }return 0 ;
net/ipv4/udp.c +5 -0
@@ -1713,6 +1713,11 @@ static inline int udp4_csum_init(struct err =udplite_checksum_init (skb, uh);if (err)return err; + +if (UDP_SKB_CB (skb)->partial_cov) { + skb->csum =inet_compute_pseudo (skb, proto); +return 0 ; + } }/* Note, we are only interested in != 0 or == 0, thus the
net/ipv6/ip6_checksum.c +5 -0
@@ -72,6 +72,11 @@ int udp6_csum_init(struct sk_buff *skb, err =udplite_checksum_init (skb, uh);if (err)return err; + +if (UDP_SKB_CB (skb)->partial_cov) { + skb->csum =ip6_compute_pseudo (skb, proto); +return 0 ; + } }/* To support RFC 6936 (allow zero checksum in UDP/IPV6 for tunnels)
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/sctp-fix-dst-refcnt-leak-in-sctp_v6_get_dst.patch queue-4.9/udplite-fix-partial-checksum-initialization.patch queue-4.9/sctp-verify-size-of-a-new-chunk-in-_sctp_make_chunk.patch