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: d7f571188ecf ("udp: Implement ->read_sock() for sockmap") Reported-by: Daniel Borkmann <daniel@iogearbox.net> Signed-off-by: Cong Wang <cong.wang@bytedance.com> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Acked-by: John Fastabend <john.fastabend@gmail.com> Link: https://lore.kernel.org/bpf/20211115044006.26068-1-xiyou.wangcong@gmail.com
This commit is contained in:
parent
353050be4c
commit
099f896f49
@ -1807,6 +1807,17 @@ int udp_read_sock(struct sock *sk, read_descriptor_t *desc,
|
|||||||
skb = skb_recv_udp(sk, 0, 1, &err);
|
skb = skb_recv_udp(sk, 0, 1, &err);
|
||||||
if (!skb)
|
if (!skb)
|
||||||
return err;
|
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);
|
used = recv_actor(desc, skb, 0, skb->len);
|
||||||
if (used <= 0) {
|
if (used <= 0) {
|
||||||
if (!copied)
|
if (!copied)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user