| @@ -7029,6 +7029,7 @@ static bool sock_addr_is_valid_access(int off, int size, · 7028 unmodified lines |
| 7029 | 7029 | case bpf_ctx_range(struct bpf_sock_addr, msg_src_ip4): |
| 7030 | 7030 | case bpf_ctx_range_till(struct bpf_sock_addr, msg_src_ip6[0], |
| 7031 | 7031 | msg_src_ip6[3]): |
| 7032 | + case bpf_ctx_range(struct bpf_sock_addr, user_port): |
| 7032 | 7033 | if (type == BPF_READ) { |
| 7033 | 7034 | bpf_ctx_record_field_size(info, size_default); |
| 7034 | 7035 | |
| @@ -7059,10 +7060,6 @@ static bool sock_addr_is_valid_access(int off, int size, · 24 unmodified lines |
| 7059 | 7060 | return false; |
| 7060 | 7061 | } |
| 7061 | 7062 | break; |
| 7062 | | − case bpf_ctx_range(struct bpf_sock_addr, user_port): |
| 7063 | | − if (size != size_default) |
| 7064 | | − return false; |
| 7065 | | − break; |
| 7066 | 7063 | case offsetof(struct bpf_sock_addr, sk): |
| 7067 | 7064 | if (type != BPF_READ) |
| 7068 | 7065 | return false; |
| @@ -7958,8 +7955,8 @@ static u32 sock_addr_convert_ctx_access(enum bpf_access_type type, · 889 unmodified lines |
| 7958 | 7955 | struct bpf_insn *insn_buf, |
| 7959 | 7956 | struct bpf_prog *prog, u32 *target_size) |
| 7960 | 7957 | { |
| 7958 | + int off, port_size = sizeof_field(struct sockaddr_in6, sin6_port); |
| 7961 | 7959 | struct bpf_insn *insn = insn_buf; |
| 7962 | | − int off; |
| 7963 | 7960 | |
| 7964 | 7961 | switch (si->off) { |
| 7965 | 7962 | case offsetof(struct bpf_sock_addr, user_family): |
| @@ -7994,9 +7991,11 @@ static u32 sock_addr_convert_ctx_access(enum bpf_access_type type, · 28 unmodified lines |
| 7994 | 7991 | offsetof(struct sockaddr_in6, sin6_port)); |
| 7995 | 7992 | BUILD_BUG_ON(sizeof_field(struct sockaddr_in, sin_port) != |
| 7996 | 7993 | sizeof_field(struct sockaddr_in6, sin6_port)); |
| 7997 | | − SOCK_ADDR_LOAD_OR_STORE_NESTED_FIELD(struct bpf_sock_addr_kern, |
| 7998 | | − struct sockaddr_in6, uaddr, |
| 7999 | | − sin6_port, tmp_reg); |
| 7994 | + /* Account for sin6_port being smaller than user_port. */ |
| 7995 | + port_size = min(port_size, BPF_LDST_BYTES(si)); |
| 7996 | + SOCK_ADDR_LOAD_OR_STORE_NESTED_FIELD_SIZE_OFF( |
| 7997 | + struct bpf_sock_addr_kern, struct sockaddr_in6, uaddr, |
| 7998 | + sin6_port, bytes_to_bpf_size(port_size), 0, tmp_reg); |
| 8000 | 7999 | break; |
| 8001 | 8000 | |
| 8002 | 8001 | case offsetof(struct bpf_sock_addr, family): |