Pull bpf fixes from Alexei Starovoitov: - Fix incorrect usage of BPF_TRAMP_F_ORIG_STACK in riscv JIT (Menglong Dong) - Fix reference count leak in bpf_prog_test_run_xdp() (Tetsuo Handa) - Fix metadata size check in bpf_test_run() (Toke Høiland-Jørgensen) - Check that BPF insn array is not allowed as a map for const strings (Deepanshu Kartikey) * tag 'bpf-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf: bpf: Fix reference count leak in bpf_prog_test_run_xdp() bpf: Reject BPF_MAP_TYPE_INSN_ARRAY in check_reg_const_str() selftests/bpf: Update xdp_context_test_run test to check maximum metadata size bpf, test_run: Subtract size of xdp_frame from allowed metadata size riscv, bpf: Fix incorrect usage of BPF_TRAMP_F_ORIG_STACK
Unified · Split
| @@ -1133,10 +1133,6 @@ static int __arch_prepare_bpf_trampoline(struct bpf_tramp_image *im, · 1132 unmodified lines | ||
| 1133 | 1133 | |
| 1134 | 1134 | store_args(nr_arg_slots, args_off, ctx); |
| 1135 | 1135 | |
| 1136 | − /* skip to actual body of traced function */ | |
| 1137 | − if (flags & BPF_TRAMP_F_ORIG_STACK) | |
| 1138 | − orig_call += RV_FENTRY_NINSNS * 4; | |
| 1139 | − | |
| 1140 | 1136 | if (flags & BPF_TRAMP_F_CALL_ORIG) { |
| 1141 | 1137 | emit_imm(RV_REG_A0, ctx->insns ? (const s64)im : RV_MAX_COUNT_IMM, ctx); |
| 1142 | 1138 | ret = emit_call((const u64)__bpf_tramp_enter, true, ctx); |
| @@ -1171,6 +1167,8 @@ static int __arch_prepare_bpf_trampoline(struct bpf_tramp_image *im, · 28 unmodified lines | ||
| 1171 | 1167 | } |
| 1172 | 1168 | |
| 1173 | 1169 | if (flags & BPF_TRAMP_F_CALL_ORIG) { |
| 1170 | + /* skip to actual body of traced function */ | |
| 1171 | + orig_call += RV_FENTRY_NINSNS * 4; | |
| 1174 | 1172 | restore_args(min_t(int, nr_arg_slots, RV_MAX_REG_ARGS), args_off, ctx); |
| 1175 | 1173 | restore_stack_args(nr_arg_slots - RV_MAX_REG_ARGS, args_off, stk_arg_off, ctx); |
| 1176 | 1174 | ret = emit_call((const u64)orig_call, true, ctx); |
| @@ -9609,6 +9609,11 @@ static int check_reg_const_str(struct bpf_verifier_env *env, · 9608 unmodified lines | ||
| 9609 | 9609 | if (reg->type != PTR_TO_MAP_VALUE) |
| 9610 | 9610 | return -EINVAL; |
| 9611 | 9611 | |
| 9612 | + if (map->map_type == BPF_MAP_TYPE_INSN_ARRAY) { | |
| 9613 | + verbose(env, "R%d points to insn_array map which cannot be used as const string\n", regno); | |
| 9614 | + return -EACCES; | |
| 9615 | + } | |
| 9616 | + | |
| 9612 | 9617 | if (!bpf_map_is_rdonly(map)) { |
| 9613 | 9618 | verbose(env, "R%d does not point to a readonly map'\n", regno); |
| 9614 | 9619 | return -EACCES; |
| @@ -1294,8 +1294,6 @@ int bpf_prog_test_run_xdp(struct bpf_prog *prog, const union bpf_attr *kattr, · 1293 unmodified lines | ||
| 1294 | 1294 | batch_size = NAPI_POLL_WEIGHT; |
| 1295 | 1295 | else if (batch_size > TEST_XDP_MAX_BATCH) |
| 1296 | 1296 | return -E2BIG; |
| 1297 | − | |
| 1298 | − headroom += sizeof(struct xdp_page_head); | |
| 1299 | 1297 | } else if (batch_size) { |
| 1300 | 1298 | return -EINVAL; |
| 1301 | 1299 | } |
| @@ -1308,16 +1306,26 @@ int bpf_prog_test_run_xdp(struct bpf_prog *prog, const union bpf_attr *kattr, · 6 unmodified lines | ||
| 1308 | 1306 | /* There can't be user provided data before the meta data */ |
| 1309 | 1307 | if (ctx->data_meta || ctx->data_end > kattr->test.data_size_in || |
| 1310 | 1308 | ctx->data > ctx->data_end || |
| 1311 | − unlikely(xdp_metalen_invalid(ctx->data)) || | |
| 1312 | 1309 | (do_live && (kattr->test.data_out || kattr->test.ctx_out))) |
| 1313 | 1310 | goto free_ctx; |
| 1314 | − /* Meta data is allocated from the headroom */ | |
| 1315 | − headroom -= ctx->data; | |
| 1316 | 1311 | |
| 1317 | 1312 | meta_sz = ctx->data; |
| 1313 | + if (xdp_metalen_invalid(meta_sz) || meta_sz > headroom - sizeof(struct xdp_frame)) | |
| 1314 | + goto free_ctx; | |
| 1315 | + | |
| 1316 | + /* Meta data is allocated from the headroom */ | |
| 1317 | + headroom -= meta_sz; | |
| 1318 | 1318 | linear_sz = ctx->data_end; |
| 1319 | 1319 | } |
| 1320 | 1320 | |
| 1321 | + /* The xdp_page_head structure takes up space in each page, limiting the | |
| 1322 | + * size of the packet data; add the extra size to headroom here to make | |
| 1323 | + * sure it's accounted in the length checks below, but not in the | |
| 1324 | + * metadata size check above. | |
| 1325 | + */ | |
| 1326 | + if (do_live) | |
| 1327 | + headroom += sizeof(struct xdp_page_head); | |
| 1328 | + | |
| 1321 | 1329 | max_linear_sz = PAGE_SIZE - headroom - tailroom; |
| 1322 | 1330 | linear_sz = min_t(u32, linear_sz, max_linear_sz); |
| 1323 | 1331 | |
| @@ -1355,13 +1363,13 @@ int bpf_prog_test_run_xdp(struct bpf_prog *prog, const union bpf_attr *kattr, · 31 unmodified lines | ||
| 1355 | 1363 | |
| 1356 | 1364 | if (sinfo->nr_frags == MAX_SKB_FRAGS) { |
| 1357 | 1365 | ret = -ENOMEM; |
| 1358 | − goto out; | |
| 1366 | + goto out_put_dev; | |
| 1359 | 1367 | } |
| 1360 | 1368 | |
| 1361 | 1369 | page = alloc_page(GFP_KERNEL); |
| 1362 | 1370 | if (!page) { |
| 1363 | 1371 | ret = -ENOMEM; |
| 1364 | − goto out; | |
| 1372 | + goto out_put_dev; | |
| 1365 | 1373 | } |
| 1366 | 1374 | |
| 1367 | 1375 | frag = &sinfo->frags[sinfo->nr_frags++]; |
| @@ -1373,7 +1381,7 @@ int bpf_prog_test_run_xdp(struct bpf_prog *prog, const union bpf_attr *kattr, · 5 unmodified lines | ||
| 1373 | 1381 | if (copy_from_user(page_address(page), data_in + size, |
| 1374 | 1382 | data_len)) { |
| 1375 | 1383 | ret = -EFAULT; |
| 1376 | − goto out; | |
| 1384 | + goto out_put_dev; | |
| 1377 | 1385 | } |
| 1378 | 1386 | sinfo->xdp_frags_size += data_len; |
| 1379 | 1387 | size += data_len; |
| @@ -1388,6 +1396,7 @@ int bpf_prog_test_run_xdp(struct bpf_prog *prog, const union bpf_attr *kattr, · 8 unmodified lines | ||
| 1388 | 1396 | ret = bpf_test_run_xdp_live(prog, &xdp, repeat, batch_size, &duration); |
| 1389 | 1397 | else |
| 1390 | 1398 | ret = bpf_test_run(prog, &xdp, repeat, &retval, &duration, true); |
| 1399 | +out_put_dev: | |
| 1391 | 1400 | /* We convert the xdp_buff back to an xdp_md before checking the return |
| 1392 | 1401 | * code so the reference count of any held netdevice will be decremented |
| 1393 | 1402 | * even if the test run failed. |
| @@ -47,6 +47,7 @@ void test_xdp_context_test_run(void) · 46 unmodified lines | ||
| 47 | 47 | struct test_xdp_context_test_run *skel = NULL; |
| 48 | 48 | char data[sizeof(pkt_v4) + sizeof(__u32)]; |
| 49 | 49 | char bad_ctx[sizeof(struct xdp_md) + 1]; |
| 50 | + char large_data[256]; | |
| 50 | 51 | struct xdp_md ctx_in, ctx_out; |
| 51 | 52 | DECLARE_LIBBPF_OPTS(bpf_test_run_opts, opts, |
| 52 | 53 | .data_in = &data, |
| @@ -94,9 +95,6 @@ void test_xdp_context_test_run(void) · 41 unmodified lines | ||
| 94 | 95 | test_xdp_context_error(prog_fd, opts, 4, sizeof(__u32), sizeof(data), |
| 95 | 96 | 0, 0, 0); |
| 96 | 97 | |
| 97 | − /* Meta data must be 255 bytes or smaller */ | |
| 98 | − test_xdp_context_error(prog_fd, opts, 0, 256, sizeof(data), 0, 0, 0); | |
| 99 | − | |
| 100 | 98 | /* Total size of data must be data_end - data_meta or larger */ |
| 101 | 99 | test_xdp_context_error(prog_fd, opts, 0, sizeof(__u32), |
| 102 | 100 | sizeof(data) + 1, 0, 0, 0); |
| @@ -116,6 +114,16 @@ void test_xdp_context_test_run(void) · 13 unmodified lines | ||
| 116 | 114 | test_xdp_context_error(prog_fd, opts, 0, sizeof(__u32), sizeof(data), |
| 117 | 115 | 0, 0, 1); |
| 118 | 116 | |
| 117 | + /* Meta data must be 216 bytes or smaller (256 - sizeof(struct | |
| 118 | + * xdp_frame)). Test both nearest invalid size and nearest invalid | |
| 119 | + * 4-byte-aligned size, and make sure data_in is large enough that we | |
| 120 | + * actually hit the check on metadata length | |
| 121 | + */ | |
| 122 | + opts.data_in = large_data; | |
| 123 | + opts.data_size_in = sizeof(large_data); | |
| 124 | + test_xdp_context_error(prog_fd, opts, 0, 217, sizeof(large_data), 0, 0, 0); | |
| 125 | + test_xdp_context_error(prog_fd, opts, 0, 220, sizeof(large_data), 0, 0, 0); | |
| 126 | + | |
| 119 | 127 | test_xdp_context_test_run__destroy(skel); |
| 120 | 128 | } |
| 121 | 129 | |