• John Fastabend's avatar
    bpf: sockmap, fix error handling in redirect failures · abaeb096
    John Fastabend authored
    When a redirect failure happens we release the buffers in-flight
    without calling a sk_mem_uncharge(), the uncharge is called before
    dropping the sock lock for the redirecte, however we missed updating
    the ring start index. When no apply actions are in progress this
    is OK because we uncharge the entire buffer before the redirect.
    But, when we have apply logic running its possible that only a
    portion of the buffer is being redirected. In this case we only
    do memory accounting for the buffer slice being redirected and
    expect to be able to loop over the BPF program again and/or if
    a sock is closed uncharge the memory at sock destruct time.
    
    With an invalid start index however the program logic looks at
    the start pointer index, checks the length, and when seeing the
    length is zero (from the initial release and failure to update
    the pointer) aborts without uncharging/releasing the remaining
    memory.
    
    The fix for this is simply to update the start index. To avoid
    fixing this error in two locations we do a small refactor and
    remove one case where it is open-coded. Then fix it in the
    single function.
    Signed-off-by: default avatarJohn Fastabend <john.fastabend@gmail.com>
    Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    abaeb096
sockmap.c 44.4 KB