]> git.baikalelectronics.ru Git - kernel.git/commit
bpf: udp: ipv6: Avoid running reuseport's bpf_prog from __udp6_lib_err
authorMartin KaFai Lau <kafai@fb.com>
Fri, 31 May 2019 22:29:11 +0000 (15:29 -0700)
committerAlexei Starovoitov <ast@kernel.org>
Mon, 3 Jun 2019 20:38:48 +0000 (13:38 -0700)
commit50f44bfc77e4984105f7823d176654355af49bd2
treec595332075bea5ffdc4905627b2e632c9b638fb9
parent1bc2077f16e2c621f04c87c780b22c0e655230da
bpf: udp: ipv6: Avoid running reuseport's bpf_prog from __udp6_lib_err

__udp6_lib_err() may be called when handling icmpv6 message. For example,
the icmpv6 toobig(type=2).  __udp6_lib_lookup() is then called
which may call reuseport_select_sock().  reuseport_select_sock() will
call into a bpf_prog (if there is one).

reuseport_select_sock() is expecting the skb->data pointing to the
transport header (udphdr in this case).  For example, run_bpf_filter()
is pulling the transport header.

However, in the __udp6_lib_err() path, the skb->data is pointing to the
ipv6hdr instead of the udphdr.

One option is to pull and push the ipv6hdr in __udp6_lib_err().
Instead of doing this, this patch follows how the original
commit 7bdde44992ff ("soreuseport: setsockopt SO_ATTACH_REUSEPORT_[CE]BPF")
was done in IPv4, which has passed a NULL skb pointer to
reuseport_select_sock().

Fixes: 7bdde44992ff ("soreuseport: setsockopt SO_ATTACH_REUSEPORT_[CE]BPF")
Cc: Craig Gallek <kraig@google.com>
Signed-off-by: Martin KaFai Lau <kafai@fb.com>
Acked-by: Song Liu <songliubraving@fb.com>
Acked-by: Craig Gallek <kraig@google.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
net/ipv6/udp.c