• John Fastabend's avatar
    bpf, sockmap: bpf_tcp_ingress needs to subtract bytes from sg.size · 81aabbb9
    John Fastabend authored
    In bpf_tcp_ingress we used apply_bytes to subtract bytes from sg.size
    which is used to track total bytes in a message. But this is not
    correct because apply_bytes is itself modified in the main loop doing
    the mem_charge.
    
    Then at the end of this we have sg.size incorrectly set and out of
    sync with actual sk values. Then we can get a splat if we try to
    cork the data later and again try to redirect the msg to ingress. To
    fix instead of trying to track msg.size do the easy thing and include
    it as part of the sk_msg_xfer logic so that when the msg is moved the
    sg.size is always correct.
    
    To reproduce the below users will need ingress + cork and hit an
    error path that will then try to 'free' the skmsg.
    
    [  173.699981] BUG: KASAN: null-ptr-deref in sk_msg_free_elem+0xdd/0x120
    [  173.699987] Read of size 8 at addr 0000000000000008 by task test_sockmap/5317
    
    [  173.700000] CPU: 2 PID: 5317 Comm: test_sockmap Tainted: G          I       5.7.0-rc1+ #43
    [  173.700005] Hardware name: Dell Inc. Precision 5820 Tower/002KVM, BIOS 1.9.2 01/24/2019
    [  173.700009] Call Trace:
    [  173.700021]  dump_stack+0x8e/0xcb
    [  173.700029]  ? sk_msg_free_elem+0xdd/0x120
    [  173.700034]  ? sk_msg_free_elem+0xdd/0x120
    [  173.700042]  __kasan_report+0x102/0x15f
    [  173.700052]  ? sk_msg_free_elem+0xdd/0x120
    [  173.700060]  kasan_report+0x32/0x50
    [  173.700070]  sk_msg_free_elem+0xdd/0x120
    [  173.700080]  __sk_msg_free+0x87/0x150
    [  173.700094]  tcp_bpf_send_verdict+0x179/0x4f0
    [  173.700109]  tcp_bpf_sendpage+0x3ce/0x5d0
    
    Fixes: 604326b4 ("bpf, sockmap: convert to generic sk_msg interface")
    Signed-off-by: default avatarJohn Fastabend <john.fastabend@gmail.com>
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Reviewed-by: default avatarJakub Sitnicki <jakub@cloudflare.com>
    Acked-by: default avatarMartin KaFai Lau <kafai@fb.com>
    Link: https://lore.kernel.org/bpf/158861290407.14306.5327773422227552482.stgit@john-Precision-5820-Tower
    81aabbb9
tcp_bpf.c 14.3 KB