• Daniel Borkmann's avatar
    bpf: fix pointer offsets in context for 32 bit · b7df9ada
    Daniel Borkmann authored
    Currently, pointer offsets in three BPF context structures are
    broken in two scenarios: i) 32 bit compiled applications running
    on 64 bit kernels, and ii) LLVM compiled BPF programs running
    on 32 bit kernels. The latter is due to BPF target machine being
    strictly 64 bit. So in each of the cases the offsets will mismatch
    in verifier when checking / rewriting context access. Fix this by
    providing a helper macro __bpf_md_ptr() that will enforce padding
    up to 64 bit and proper alignment, and for context access a macro
    bpf_ctx_range_ptr() which will cover full 64 bit member range on
    32 bit archs. For flow_keys, we additionally need to force the
    size check to sizeof(__u64) as with other pointer types.
    
    Fixes: d58e468b ("flow_dissector: implements flow dissector BPF hook")
    Fixes: 4f738adb ("bpf: create tcp_bpf_ulp allowing BPF to monitor socket TX/RX data")
    Fixes: 2dbb9b9e ("bpf: Introduce BPF_PROG_TYPE_SK_REUSEPORT")
    Reported-by: default avatarDavid S. Miller <davem@davemloft.net>
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Acked-by: default avatarDavid S. Miller <davem@davemloft.net>
    Tested-by: default avatarDavid S. Miller <davem@davemloft.net>
    Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    b7df9ada
bpf.h 110 KB