| @@ -5148,18 +5148,23 @@ static bool sk_msg_is_valid_access(int off, int size, · 5147 unmodified lines |
| 5148 | 5148 | switch (off) { |
| 5149 | 5149 | case offsetof(struct sk_msg_md, data): |
| 5150 | 5150 | info->reg_type = PTR_TO_PACKET; |
| 5151 | + if (size != sizeof(__u64)) |
| 5152 | + return false; |
| 5151 | 5153 | break; |
| 5152 | 5154 | case offsetof(struct sk_msg_md, data_end): |
| 5153 | 5155 | info->reg_type = PTR_TO_PACKET_END; |
| 5156 | + if (size != sizeof(__u64)) |
| 5157 | + return false; |
| 5154 | 5158 | break; |
| 5159 | + default: |
| 5160 | + if (size != sizeof(__u32)) |
| 5161 | + return false; |
| 5155 | 5162 | } |
| 5156 | 5163 | |
| 5157 | 5164 | if (off < 0 || off >= sizeof(struct sk_msg_md)) |
| 5158 | 5165 | return false; |
| 5159 | 5166 | if (off % size != 0) |
| 5160 | 5167 | return false; |
| 5161 | | − if (size != sizeof(__u64)) |
| 5162 | | − return false; |
| 5163 | 5168 | |
| 5164 | 5169 | return true; |
| 5165 | 5170 | } |
| @@ -5835,7 +5840,8 @@ static u32 sock_ops_convert_ctx_access(enum bpf_access_type type, · 669 unmodified lines |
| 5835 | 5840 | break; |
| 5836 | 5841 | |
| 5837 | 5842 | case offsetof(struct bpf_sock_ops, local_ip4): |
| 5838 | | − BUILD_BUG_ON(FIELD_SIZEOF(struct sock_common, skc_rcv_saddr) != 4); |
| 5843 | + BUILD_BUG_ON(FIELD_SIZEOF(struct sock_common, |
| 5844 | + skc_rcv_saddr) != 4); |
| 5839 | 5845 | |
| 5840 | 5846 | *insn++ = BPF_LDX_MEM(BPF_FIELD_SIZEOF( |
| 5841 | 5847 | struct bpf_sock_ops_kern, sk), |
| @@ -6152,6 +6158,7 @@ static u32 sk_msg_convert_ctx_access(enum bpf_access_type type, · 310 unmodified lines |
| 6152 | 6158 | struct bpf_prog *prog, u32 *target_size) |
| 6153 | 6159 | { |
| 6154 | 6160 | struct bpf_insn *insn = insn_buf; |
| 6161 | + int off; |
| 6155 | 6162 | |
| 6156 | 6163 | switch (si->off) { |
| 6157 | 6164 | case offsetof(struct sk_msg_md, data): |
| @@ -6164,6 +6171,107 @@ static u32 sk_msg_convert_ctx_access(enum bpf_access_type type, · 6 unmodified lines |
| 6164 | 6171 | si->dst_reg, si->src_reg, |
| 6165 | 6172 | offsetof(struct sk_msg_buff, data_end)); |
| 6166 | 6173 | break; |
| 6174 | + case offsetof(struct sk_msg_md, family): |
| 6175 | + BUILD_BUG_ON(FIELD_SIZEOF(struct sock_common, skc_family) != 2); |
| 6176 | + |
| 6177 | + *insn++ = BPF_LDX_MEM(BPF_FIELD_SIZEOF( |
| 6178 | + struct sk_msg_buff, sk), |
| 6179 | + si->dst_reg, si->src_reg, |
| 6180 | + offsetof(struct sk_msg_buff, sk)); |
| 6181 | + *insn++ = BPF_LDX_MEM(BPF_H, si->dst_reg, si->dst_reg, |
| 6182 | + offsetof(struct sock_common, skc_family)); |
| 6183 | + break; |
| 6184 | + |
| 6185 | + case offsetof(struct sk_msg_md, remote_ip4): |
| 6186 | + BUILD_BUG_ON(FIELD_SIZEOF(struct sock_common, skc_daddr) != 4); |
| 6187 | + |
| 6188 | + *insn++ = BPF_LDX_MEM(BPF_FIELD_SIZEOF( |
| 6189 | + struct sk_msg_buff, sk), |
| 6190 | + si->dst_reg, si->src_reg, |
| 6191 | + offsetof(struct sk_msg_buff, sk)); |
| 6192 | + *insn++ = BPF_LDX_MEM(BPF_W, si->dst_reg, si->dst_reg, |
| 6193 | + offsetof(struct sock_common, skc_daddr)); |
| 6194 | + break; |
| 6195 | + |
| 6196 | + case offsetof(struct sk_msg_md, local_ip4): |
| 6197 | + BUILD_BUG_ON(FIELD_SIZEOF(struct sock_common, |
| 6198 | + skc_rcv_saddr) != 4); |
| 6199 | + |
| 6200 | + *insn++ = BPF_LDX_MEM(BPF_FIELD_SIZEOF( |
| 6201 | + struct sk_msg_buff, sk), |
| 6202 | + si->dst_reg, si->src_reg, |
| 6203 | + offsetof(struct sk_msg_buff, sk)); |
| 6204 | + *insn++ = BPF_LDX_MEM(BPF_W, si->dst_reg, si->dst_reg, |
| 6205 | + offsetof(struct sock_common, |
| 6206 | + skc_rcv_saddr)); |
| 6207 | + break; |
| 6208 | + |
| 6209 | + case offsetof(struct sk_msg_md, remote_ip6[0]) ... |
| 6210 | + offsetof(struct sk_msg_md, remote_ip6[3]): |
| 6211 | +#if IS_ENABLED(CONFIG_IPV6) |
| 6212 | + BUILD_BUG_ON(FIELD_SIZEOF(struct sock_common, |
| 6213 | + skc_v6_daddr.s6_addr32[0]) != 4); |
| 6214 | + |
| 6215 | + off = si->off; |
| 6216 | + off -= offsetof(struct sk_msg_md, remote_ip6[0]); |
| 6217 | + *insn++ = BPF_LDX_MEM(BPF_FIELD_SIZEOF( |
| 6218 | + struct sk_msg_buff, sk), |
| 6219 | + si->dst_reg, si->src_reg, |
| 6220 | + offsetof(struct sk_msg_buff, sk)); |
| 6221 | + *insn++ = BPF_LDX_MEM(BPF_W, si->dst_reg, si->dst_reg, |
| 6222 | + offsetof(struct sock_common, |
| 6223 | + skc_v6_daddr.s6_addr32[0]) + |
| 6224 | + off); |
| 6225 | +#else |
| 6226 | + *insn++ = BPF_MOV32_IMM(si->dst_reg, 0); |
| 6227 | +#endif |
| 6228 | + break; |
| 6229 | + |
| 6230 | + case offsetof(struct sk_msg_md, local_ip6[0]) ... |
| 6231 | + offsetof(struct sk_msg_md, local_ip6[3]): |
| 6232 | +#if IS_ENABLED(CONFIG_IPV6) |
| 6233 | + BUILD_BUG_ON(FIELD_SIZEOF(struct sock_common, |
| 6234 | + skc_v6_rcv_saddr.s6_addr32[0]) != 4); |
| 6235 | + |
| 6236 | + off = si->off; |
| 6237 | + off -= offsetof(struct sk_msg_md, local_ip6[0]); |
| 6238 | + *insn++ = BPF_LDX_MEM(BPF_FIELD_SIZEOF( |
| 6239 | + struct sk_msg_buff, sk), |
| 6240 | + si->dst_reg, si->src_reg, |
| 6241 | + offsetof(struct sk_msg_buff, sk)); |
| 6242 | + *insn++ = BPF_LDX_MEM(BPF_W, si->dst_reg, si->dst_reg, |
| 6243 | + offsetof(struct sock_common, |
| 6244 | + skc_v6_rcv_saddr.s6_addr32[0]) + |
| 6245 | + off); |
| 6246 | +#else |
| 6247 | + *insn++ = BPF_MOV32_IMM(si->dst_reg, 0); |
| 6248 | +#endif |
| 6249 | + break; |
| 6250 | + |
| 6251 | + case offsetof(struct sk_msg_md, remote_port): |
| 6252 | + BUILD_BUG_ON(FIELD_SIZEOF(struct sock_common, skc_dport) != 2); |
| 6253 | + |
| 6254 | + *insn++ = BPF_LDX_MEM(BPF_FIELD_SIZEOF( |
| 6255 | + struct sk_msg_buff, sk), |
| 6256 | + si->dst_reg, si->src_reg, |
| 6257 | + offsetof(struct sk_msg_buff, sk)); |
| 6258 | + *insn++ = BPF_LDX_MEM(BPF_H, si->dst_reg, si->dst_reg, |
| 6259 | + offsetof(struct sock_common, skc_dport)); |
| 6260 | +#ifndef __BIG_ENDIAN_BITFIELD |
| 6261 | + *insn++ = BPF_ALU32_IMM(BPF_LSH, si->dst_reg, 16); |
| 6262 | +#endif |
| 6263 | + break; |
| 6264 | + |
| 6265 | + case offsetof(struct sk_msg_md, local_port): |
| 6266 | + BUILD_BUG_ON(FIELD_SIZEOF(struct sock_common, skc_num) != 2); |
| 6267 | + |
| 6268 | + *insn++ = BPF_LDX_MEM(BPF_FIELD_SIZEOF( |
| 6269 | + struct sk_msg_buff, sk), |
| 6270 | + si->dst_reg, si->src_reg, |
| 6271 | + offsetof(struct sk_msg_buff, sk)); |
| 6272 | + *insn++ = BPF_LDX_MEM(BPF_H, si->dst_reg, si->dst_reg, |
| 6273 | + offsetof(struct sock_common, skc_num)); |
| 6274 | + break; |
| 6167 | 6275 | } |
| 6168 | 6276 | |
| 6169 | 6277 | return insn - insn_buf; |