Message ID | 20211115044006.26068-1-xiyou.wangcong@gmail.com (mailing list archive) |
---|---|
State | Accepted |
Commit | 099f896f498a2b26d84f4ddae039b2c542c18b48 |
Delegated to: | BPF |
Headers | show |
Series | [RESEND,bpf] udp: validate checksum in udp_read_sock() | expand |
Hello: This patch was applied to bpf/bpf.git (master) by Daniel Borkmann <daniel@iogearbox.net>: On Sun, 14 Nov 2021 20:40:06 -0800 you wrote: > From: Cong Wang <cong.wang@bytedance.com> > > 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. > > [...] Here is the summary with links: - [RESEND,bpf] udp: validate checksum in udp_read_sock() https://git.kernel.org/bpf/bpf/c/099f896f498a You are awesome, thank you!
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index 319dd7bbfe33..8bcecdd6aeda 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c @@ -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)