Commit d4ecfeb1 authored by Stanislav Fomichev's avatar Stanislav Fomichev Committed by Daniel Borkmann

bpf: allow wide aligned loads for bpf_sock_addr user_ip6 and msg_src_ip6

Add explicit check for u64 loads of user_ip6 and msg_src_ip6 and
update the comment.

Cc: Yonghong Song <yhs@fb.com>
Signed-off-by: default avatarStanislav Fomichev <sdf@google.com>
Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
parent b4399546
...@@ -3248,7 +3248,7 @@ struct bpf_sock_addr { ...@@ -3248,7 +3248,7 @@ struct bpf_sock_addr {
__u32 user_ip4; /* Allows 1,2,4-byte read and 4-byte write. __u32 user_ip4; /* Allows 1,2,4-byte read and 4-byte write.
* Stored in network byte order. * Stored in network byte order.
*/ */
__u32 user_ip6[4]; /* Allows 1,2,4-byte read and 4,8-byte write. __u32 user_ip6[4]; /* Allows 1,2,4,8-byte read and 4,8-byte write.
* Stored in network byte order. * Stored in network byte order.
*/ */
__u32 user_port; /* Allows 4-byte read and write. __u32 user_port; /* Allows 4-byte read and write.
...@@ -3260,7 +3260,7 @@ struct bpf_sock_addr { ...@@ -3260,7 +3260,7 @@ struct bpf_sock_addr {
__u32 msg_src_ip4; /* Allows 1,2,4-byte read and 4-byte write. __u32 msg_src_ip4; /* Allows 1,2,4-byte read and 4-byte write.
* Stored in network byte order. * Stored in network byte order.
*/ */
__u32 msg_src_ip6[4]; /* Allows 1,2,4-byte read and 4,8-byte write. __u32 msg_src_ip6[4]; /* Allows 1,2,4,8-byte read and 4,8-byte write.
* Stored in network byte order. * Stored in network byte order.
*/ */
__bpf_md_ptr(struct bpf_sock *, sk); __bpf_md_ptr(struct bpf_sock *, sk);
......
...@@ -6884,9 +6884,19 @@ static bool sock_addr_is_valid_access(int off, int size, ...@@ -6884,9 +6884,19 @@ static bool sock_addr_is_valid_access(int off, int size,
case bpf_ctx_range(struct bpf_sock_addr, msg_src_ip4): case bpf_ctx_range(struct bpf_sock_addr, msg_src_ip4):
case bpf_ctx_range_till(struct bpf_sock_addr, msg_src_ip6[0], case bpf_ctx_range_till(struct bpf_sock_addr, msg_src_ip6[0],
msg_src_ip6[3]): msg_src_ip6[3]):
/* Only narrow read access allowed for now. */
if (type == BPF_READ) { if (type == BPF_READ) {
bpf_ctx_record_field_size(info, size_default); bpf_ctx_record_field_size(info, size_default);
if (bpf_ctx_wide_access_ok(off, size,
struct bpf_sock_addr,
user_ip6))
return true;
if (bpf_ctx_wide_access_ok(off, size,
struct bpf_sock_addr,
msg_src_ip6))
return true;
if (!bpf_ctx_narrow_access_ok(off, size, size_default)) if (!bpf_ctx_narrow_access_ok(off, size, size_default))
return false; return false;
} else { } else {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment