• Martin KaFai Lau's avatar
    bpf: udp: ipv6: Avoid running reuseport's bpf_prog from __udp6_lib_err · 4ac30c4b
    Martin KaFai Lau authored
    __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 538950a1 ("soreuseport: setsockopt SO_ATTACH_REUSEPORT_[CE]BPF")
    was done in IPv4, which has passed a NULL skb pointer to
    reuseport_select_sock().
    
    Fixes: 538950a1
    
     ("soreuseport: setsockopt SO_ATTACH_REUSEPORT_[CE]BPF")
    Cc: Craig Gallek <kraig@google.com>
    Signed-off-by: default avatarMartin KaFai Lau <kafai@fb.com>
    Acked-by: default avatarSong Liu <songliubraving@fb.com>
    Acked-by: default avatarCraig Gallek <kraig@google.com>
    Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    4ac30c4b
udp.c 43.8 KB