]> git.ipfire.org Git - thirdparty/kernel/stable.git/commit
udplite: fix partial checksum initialization
authorAlexey Kodanev <alexey.kodanev@oracle.com>
Thu, 15 Feb 2018 17:18:43 +0000 (20:18 +0300)
committerSasha Levin <alexander.levin@microsoft.com>
Wed, 21 Mar 2018 03:49:49 +0000 (23:49 -0400)
commit3311f45c5fe1e87d4a3e5fa47509fb9e042235eb
tree6682b47b5fad89bc3048cdc6ea40ab3d344f188a
parent4eda9d68b1a946a1e6ab3e644c1f93a3e6e52e4a
udplite: fix partial checksum initialization

[ 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.

Fixes: ed70fcfcee95 ("net: Call skb_checksum_init in IPv4")
Fixes: e4f45b7f40bd ("net: Call skb_checksum_init in IPv6")
Signed-off-by: Alexey Kodanev <alexey.kodanev@oracle.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
include/net/udplite.h
net/ipv4/udp.c
net/ipv6/ip6_checksum.c