Commit 099f896f authored by Cong Wang's avatar Cong Wang Committed by Daniel Borkmann
Browse files

udp: Validate checksum in udp_read_sock()



It turns out the skb's in sock receive queue could have bad checksums, as
both ->poll() and ->recvmsg() validate checksums. We have to do the same
for ->read_sock() path too before they are redirected in sockmap.

Fixes: d7f57118 ("udp: Implement ->read_sock() for sockmap")
Reported-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
Signed-off-by: default avatarCong Wang <cong.wang@bytedance.com>
Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
Acked-by: default avatarJohn Fastabend <john.fastabend@gmail.com>
Link: https://lore.kernel.org/bpf/20211115044006.26068-1-xiyou.wangcong@gmail.com
parent 353050be
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -1807,6 +1807,17 @@ int udp_read_sock(struct sock *sk, read_descriptor_t *desc,
		skb = skb_recv_udp(sk, 0, 1, &err);
		if (!skb)
			return err;

		if (udp_lib_checksum_complete(skb)) {
			__UDP_INC_STATS(sock_net(sk), UDP_MIB_CSUMERRORS,
					IS_UDPLITE(sk));
			__UDP_INC_STATS(sock_net(sk), UDP_MIB_INERRORS,
					IS_UDPLITE(sk));
			atomic_inc(&sk->sk_drops);
			kfree_skb(skb);
			continue;
		}

		used = recv_actor(desc, skb, 0, skb->len);
		if (used <= 0) {
			if (!copied)