• John Fastabend's avatar
    bpf: sockmap, fix scatterlist update on error path in send with apply · 3cc9a472
    John Fastabend authored
    When the call to do_tcp_sendpage() fails to send the complete block
    requested we either retry if only a partial send was completed or
    abort if we receive a error less than or equal to zero. Before
    returning though we must update the scatterlist length/offset to
    account for any partial send completed.
    
    Before this patch we did this at the end of the retry loop, but
    this was buggy when used while applying a verdict to fewer bytes
    than in the scatterlist. When the scatterlist length was being set
    we forgot to account for the apply logic reducing the size variable.
    So the result was we chopped off some bytes in the scatterlist without
    doing proper cleanup on them. This results in a WARNING when the
    sock is tore down because the bytes have previously been charged to
    the socket but are never uncharged.
    
    The simple fix is to simply do the accounting inside the retry loop
    subtracting from the absolute scatterlist values rather than trying
    to accumulate the totals and subtract at the end.
    Reported-by: default avatarAlexei Starovoitov <ast@kernel.org>
    Signed-off-by: default avatarJohn Fastabend <john.fastabend@gmail.com>
    Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    3cc9a472
sockmap.c 44.3 KB