bpf: fix pointer offsets in context for 32 bit
authorDaniel Borkmann <daniel@iogearbox.net>
Sat, 1 Dec 2018 00:18:53 +0000 (01:18 +0100)
committerAlexei Starovoitov <ast@kernel.org>
Sat, 1 Dec 2018 01:04:35 +0000 (17:04 -0800)
commitb7df9ada9a7700dbcca1ba53d217c01e3d48179c
treeae0094e40a2e96aa1769113c1cbc6ba1c693fc04
parentc01ac66b38660f2b507ccd0b75d28e3002d56fbb
bpf: fix pointer offsets in context for 32 bit

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: d58e468b1112 ("flow_dissector: implements flow dissector BPF hook")
Fixes: 4f738adba30a ("bpf: create tcp_bpf_ulp allowing BPF to monitor socket TX/RX data")
Fixes: 2dbb9b9e6df6 ("bpf: Introduce BPF_PROG_TYPE_SK_REUSEPORT")
Reported-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: David S. Miller <davem@davemloft.net>
Tested-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
include/linux/filter.h
include/uapi/linux/bpf.h
net/core/filter.c
tools/include/uapi/linux/bpf.h