• John Fastabend's avatar
    bpf: sockmap, fix double page_put on ENOMEM error in redirect path · 4fcfdfb8
    John Fastabend authored
    In the case where the socket memory boundary is hit the redirect
    path returns an ENOMEM error. However, before checking for this
    condition the redirect scatterlist buffer is setup with a valid
    page and length. This is never unwound so when the buffers are
    released latter in the error path we do a put_page() and clear
    the scatterlist fields. But, because the initial error happens
    before completing the scatterlist buffer we end up with both the
    original buffer and the redirect buffer pointing to the same page
    resulting in duplicate put_page() calls.
    
    To fix this simply move the initial configuration of the redirect
    scatterlist buffer below the sock memory check.
    
    Found this while running TCP_STREAM test with netperf using Cilium.
    
    Fixes: fa246693 ("bpf: sockmap, BPF_F_INGRESS flag for BPF_SK_SKB_STREAM_VERDICT")
    Signed-off-by: default avatarJohn Fastabend <john.fastabend@gmail.com>
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    4fcfdfb8
sockmap.c 44.3 KB