• Daniel Borkmann's avatar
    bpf: Fix ringbuf memory type confusion when passing to helpers · a672b2e3
    Daniel Borkmann authored
    The bpf_ringbuf_submit() and bpf_ringbuf_discard() have ARG_PTR_TO_ALLOC_MEM
    in their bpf_func_proto definition as their first argument, and thus both expect
    the result from a prior bpf_ringbuf_reserve() call which has a return type of
    RET_PTR_TO_ALLOC_MEM_OR_NULL.
    
    While the non-NULL memory from bpf_ringbuf_reserve() can be passed to other
    helpers, the two sinks (bpf_ringbuf_submit(), bpf_ringbuf_discard()) right now
    only enforce a register type of PTR_TO_MEM.
    
    This can lead to potential type confusion since it would allow other PTR_TO_MEM
    memory to be passed into the two sinks which did not come from bpf_ringbuf_reserve().
    
    Add a new MEM_ALLOC composable type attribute for PTR_TO_MEM, and enforce that:
    
     - bpf_ringbuf_reserve() returns NULL or PTR_TO_MEM | MEM_ALLOC
     - bpf_ringbuf_submit() and bpf_ringbuf_discard() only take PTR_TO_MEM | MEM_ALLOC
       but not plain PTR_TO_MEM arguments via ARG_PTR_TO_ALLOC_MEM
     - however, other helpers might treat PTR_TO_MEM | MEM_ALLOC as plain PTR_TO_MEM
       to populate the memory area when they use ARG_PTR_TO_{UNINIT_,}MEM in their
       func proto description
    
    Fixes: 457f4436 ("bpf: Implement BPF ring buffer and verifier support for it")
    Reported-by: default avatarAlexei Starovoitov <ast@kernel.org>
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Acked-by: default avatarJohn Fastabend <john.fastabend@gmail.com>
    Acked-by: default avatarAlexei Starovoitov <ast@kernel.org>
    a672b2e3
verifier.c 410 KB