bpf: allow wide (u64) aligned stores for some fields of bpf_sock_addr
authorStanislav Fomichev <sdf@google.com>
Mon, 1 Jul 2019 17:38:39 +0000 (10:38 -0700)
committerDaniel Borkmann <daniel@iogearbox.net>
Mon, 8 Jul 2019 14:22:55 +0000 (16:22 +0200)
commit600c70bad6594cb124c641ed05355ca134650ea4
tree64b117309f808caca760fc11a37284880654eda3
parentd2850ce0bdd772a85043b1f07af99205b96e6e2a
bpf: allow wide (u64) aligned stores for some fields of bpf_sock_addr

Since commit cd17d7770578 ("bpf/tools: sync bpf.h") clang decided
that it can do a single u64 store into user_ip6[2] instead of two
separate u32 ones:

 #  17: (18) r2 = 0x100000000000000
 #  ; ctx->user_ip6[2] = bpf_htonl(DST_REWRITE_IP6_2);
 #  19: (7b) *(u64 *)(r1 +16) = r2
 #  invalid bpf_context access off=16 size=8

>From the compiler point of view it does look like a correct thing
to do, so let's support it on the kernel side.

Credit to Andrii Nakryiko for a proper implementation of
bpf_ctx_wide_store_ok.

Cc: Andrii Nakryiko <andriin@fb.com>
Cc: Yonghong Song <yhs@fb.com>
Fixes: cd17d7770578 ("bpf/tools: sync bpf.h")
Reported-by: kernel test robot <rong.a.chen@intel.com>
Acked-by: Yonghong Song <yhs@fb.com>
Acked-by: Andrii Nakryiko <andriin@fb.com>
Signed-off-by: Stanislav Fomichev <sdf@google.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
include/linux/filter.h
include/uapi/linux/bpf.h
net/core/filter.c