Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftests/bpf: convert dynptr_fail and map_kptr_fail subtests to generic tester

Convert big chunks of dynptr and map_kptr subtests to use generic
verification_tester. They are switched from using manually maintained
tables of test cases, specifying program name and expected error
verifier message, to btf_decl_tag-based annotations directly on
corresponding BPF programs: __failure to specify that BPF program is
expected to fail verification, and __msg() to specify expected log
message.

Acked-by: John Fastabend <john.fastabend@gmail.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Acked-by: Kumar Kartikeya Dwivedi <memxor@gmail.com>
Link: https://lore.kernel.org/r/20221207201648.2990661-2-andrii@kernel.org
Signed-off-by: Alexei Starovoitov <ast@kernel.org>

authored by

Andrii Nakryiko and committed by
Alexei Starovoitov
26c386ec 537c3f66

+64 -155
+3 -77
tools/testing/selftests/bpf/prog_tests/dynptr.c
··· 5 5 #include "dynptr_fail.skel.h" 6 6 #include "dynptr_success.skel.h" 7 7 8 - static size_t log_buf_sz = 1048576; /* 1 MB */ 9 - static char obj_log_buf[1048576]; 10 - 11 8 static struct { 12 9 const char *prog_name; 13 10 const char *expected_err_msg; 14 11 } dynptr_tests[] = { 15 - /* failure cases */ 16 - {"ringbuf_missing_release1", "Unreleased reference id=1"}, 17 - {"ringbuf_missing_release2", "Unreleased reference id=2"}, 18 - {"ringbuf_missing_release_callback", "Unreleased reference id"}, 19 - {"use_after_invalid", "Expected an initialized dynptr as arg #3"}, 20 - {"ringbuf_invalid_api", "type=mem expected=ringbuf_mem"}, 21 - {"add_dynptr_to_map1", "invalid indirect read from stack"}, 22 - {"add_dynptr_to_map2", "invalid indirect read from stack"}, 23 - {"data_slice_out_of_bounds_ringbuf", "value is outside of the allowed memory range"}, 24 - {"data_slice_out_of_bounds_map_value", "value is outside of the allowed memory range"}, 25 - {"data_slice_use_after_release1", "invalid mem access 'scalar'"}, 26 - {"data_slice_use_after_release2", "invalid mem access 'scalar'"}, 27 - {"data_slice_missing_null_check1", "invalid mem access 'mem_or_null'"}, 28 - {"data_slice_missing_null_check2", "invalid mem access 'mem_or_null'"}, 29 - {"invalid_helper1", "invalid indirect read from stack"}, 30 - {"invalid_helper2", "Expected an initialized dynptr as arg #3"}, 31 - {"invalid_write1", "Expected an initialized dynptr as arg #1"}, 32 - {"invalid_write2", "Expected an initialized dynptr as arg #3"}, 33 - {"invalid_write3", "Expected an initialized dynptr as arg #1"}, 34 - {"invalid_write4", "arg 1 is an unacquired reference"}, 35 - {"invalid_read1", "invalid read from stack"}, 36 - {"invalid_read2", "cannot pass in dynptr at an offset"}, 37 - {"invalid_read3", "invalid read from stack"}, 38 - {"invalid_read4", "invalid read from stack"}, 39 - {"invalid_offset", "invalid write to stack"}, 40 - {"global", "type=map_value expected=fp"}, 41 - {"release_twice", "arg 1 is an unacquired reference"}, 42 - {"release_twice_callback", "arg 1 is an unacquired reference"}, 43 - {"dynptr_from_mem_invalid_api", 44 - "Unsupported reg type fp for bpf_dynptr_from_mem data"}, 45 - 46 12 /* success cases */ 47 13 {"test_read_write", NULL}, 48 14 {"test_data_slice", NULL}, 49 15 {"test_ringbuf", NULL}, 50 16 }; 51 - 52 - static void verify_fail(const char *prog_name, const char *expected_err_msg) 53 - { 54 - LIBBPF_OPTS(bpf_object_open_opts, opts); 55 - struct bpf_program *prog; 56 - struct dynptr_fail *skel; 57 - int err; 58 - 59 - opts.kernel_log_buf = obj_log_buf; 60 - opts.kernel_log_size = log_buf_sz; 61 - opts.kernel_log_level = 1; 62 - 63 - skel = dynptr_fail__open_opts(&opts); 64 - if (!ASSERT_OK_PTR(skel, "dynptr_fail__open_opts")) 65 - goto cleanup; 66 - 67 - prog = bpf_object__find_program_by_name(skel->obj, prog_name); 68 - if (!ASSERT_OK_PTR(prog, "bpf_object__find_program_by_name")) 69 - goto cleanup; 70 - 71 - bpf_program__set_autoload(prog, true); 72 - 73 - bpf_map__set_max_entries(skel->maps.ringbuf, getpagesize()); 74 - 75 - err = dynptr_fail__load(skel); 76 - if (!ASSERT_ERR(err, "unexpected load success")) 77 - goto cleanup; 78 - 79 - if (!ASSERT_OK_PTR(strstr(obj_log_buf, expected_err_msg), "expected_err_msg")) { 80 - fprintf(stderr, "Expected err_msg: %s\n", expected_err_msg); 81 - fprintf(stderr, "Verifier output: %s\n", obj_log_buf); 82 - } 83 - 84 - cleanup: 85 - dynptr_fail__destroy(skel); 86 - } 87 17 88 18 static void verify_success(const char *prog_name) 89 19 { ··· 26 96 return; 27 97 28 98 skel->bss->pid = getpid(); 29 - 30 - bpf_map__set_max_entries(skel->maps.ringbuf, getpagesize()); 31 99 32 100 dynptr_success__load(skel); 33 101 if (!ASSERT_OK_PTR(skel, "dynptr_success__load")) ··· 57 129 if (!test__start_subtest(dynptr_tests[i].prog_name)) 58 130 continue; 59 131 60 - if (dynptr_tests[i].expected_err_msg) 61 - verify_fail(dynptr_tests[i].prog_name, 62 - dynptr_tests[i].expected_err_msg); 63 - else 64 - verify_success(dynptr_tests[i].prog_name); 132 + verify_success(dynptr_tests[i].prog_name); 65 133 } 134 + 135 + RUN_TESTS(dynptr_fail); 66 136 }
+2 -78
tools/testing/selftests/bpf/prog_tests/map_kptr.c
··· 5 5 #include "map_kptr.skel.h" 6 6 #include "map_kptr_fail.skel.h" 7 7 8 - static char log_buf[1024 * 1024]; 9 - 10 - struct { 11 - const char *prog_name; 12 - const char *err_msg; 13 - } map_kptr_fail_tests[] = { 14 - { "size_not_bpf_dw", "kptr access size must be BPF_DW" }, 15 - { "non_const_var_off", "kptr access cannot have variable offset" }, 16 - { "non_const_var_off_kptr_xchg", "R1 doesn't have constant offset. kptr has to be" }, 17 - { "misaligned_access_write", "kptr access misaligned expected=8 off=7" }, 18 - { "misaligned_access_read", "kptr access misaligned expected=8 off=1" }, 19 - { "reject_var_off_store", "variable untrusted_ptr_ access var_off=(0x0; 0x1e0)" }, 20 - { "reject_bad_type_match", "invalid kptr access, R1 type=untrusted_ptr_prog_test_ref_kfunc" }, 21 - { "marked_as_untrusted_or_null", "R1 type=untrusted_ptr_or_null_ expected=percpu_ptr_" }, 22 - { "correct_btf_id_check_size", "access beyond struct prog_test_ref_kfunc at off 32 size 4" }, 23 - { "inherit_untrusted_on_walk", "R1 type=untrusted_ptr_ expected=percpu_ptr_" }, 24 - { "reject_kptr_xchg_on_unref", "off=8 kptr isn't referenced kptr" }, 25 - { "reject_kptr_get_no_map_val", "arg#0 expected pointer to map value" }, 26 - { "reject_kptr_get_no_null_map_val", "arg#0 expected pointer to map value" }, 27 - { "reject_kptr_get_no_kptr", "arg#0 no referenced kptr at map value offset=0" }, 28 - { "reject_kptr_get_on_unref", "arg#0 no referenced kptr at map value offset=8" }, 29 - { "reject_kptr_get_bad_type_match", "kernel function bpf_kfunc_call_test_kptr_get args#0" }, 30 - { "mark_ref_as_untrusted_or_null", "R1 type=untrusted_ptr_or_null_ expected=percpu_ptr_" }, 31 - { "reject_untrusted_store_to_ref", "store to referenced kptr disallowed" }, 32 - { "reject_bad_type_xchg", "invalid kptr access, R2 type=ptr_prog_test_ref_kfunc expected=ptr_prog_test_member" }, 33 - { "reject_untrusted_xchg", "R2 type=untrusted_ptr_ expected=ptr_" }, 34 - { "reject_member_of_ref_xchg", "invalid kptr access, R2 type=ptr_prog_test_ref_kfunc" }, 35 - { "reject_indirect_helper_access", "kptr cannot be accessed indirectly by helper" }, 36 - { "reject_indirect_global_func_access", "kptr cannot be accessed indirectly by helper" }, 37 - { "kptr_xchg_ref_state", "Unreleased reference id=5 alloc_insn=" }, 38 - { "kptr_get_ref_state", "Unreleased reference id=3 alloc_insn=" }, 39 - }; 40 - 41 - static void test_map_kptr_fail_prog(const char *prog_name, const char *err_msg) 42 - { 43 - LIBBPF_OPTS(bpf_object_open_opts, opts, .kernel_log_buf = log_buf, 44 - .kernel_log_size = sizeof(log_buf), 45 - .kernel_log_level = 1); 46 - struct map_kptr_fail *skel; 47 - struct bpf_program *prog; 48 - int ret; 49 - 50 - skel = map_kptr_fail__open_opts(&opts); 51 - if (!ASSERT_OK_PTR(skel, "map_kptr_fail__open_opts")) 52 - return; 53 - 54 - prog = bpf_object__find_program_by_name(skel->obj, prog_name); 55 - if (!ASSERT_OK_PTR(prog, "bpf_object__find_program_by_name")) 56 - goto end; 57 - 58 - bpf_program__set_autoload(prog, true); 59 - 60 - ret = map_kptr_fail__load(skel); 61 - if (!ASSERT_ERR(ret, "map_kptr__load must fail")) 62 - goto end; 63 - 64 - if (!ASSERT_OK_PTR(strstr(log_buf, err_msg), "expected error message")) { 65 - fprintf(stderr, "Expected: %s\n", err_msg); 66 - fprintf(stderr, "Verifier: %s\n", log_buf); 67 - } 68 - 69 - end: 70 - map_kptr_fail__destroy(skel); 71 - } 72 - 73 - static void test_map_kptr_fail(void) 74 - { 75 - int i; 76 - 77 - for (i = 0; i < ARRAY_SIZE(map_kptr_fail_tests); i++) { 78 - if (!test__start_subtest(map_kptr_fail_tests[i].prog_name)) 79 - continue; 80 - test_map_kptr_fail_prog(map_kptr_fail_tests[i].prog_name, 81 - map_kptr_fail_tests[i].err_msg); 82 - } 83 - } 84 - 85 8 static void test_map_kptr_success(bool test_run) 86 9 { 87 10 LIBBPF_OPTS(bpf_test_run_opts, opts, ··· 68 145 */ 69 146 test_map_kptr_success(true); 70 147 } 71 - test_map_kptr_fail(); 148 + 149 + RUN_TESTS(map_kptr_fail); 72 150 }
+31
tools/testing/selftests/bpf/progs/dynptr_fail.c
··· 43 43 44 44 struct { 45 45 __uint(type, BPF_MAP_TYPE_RINGBUF); 46 + __uint(max_entries, 4096); 46 47 } ringbuf SEC(".maps"); 47 48 48 49 int err, val; ··· 67 66 * bpf_ringbuf_submit/discard_dynptr call 68 67 */ 69 68 SEC("?raw_tp") 69 + __failure __msg("Unreleased reference id=1") 70 70 int ringbuf_missing_release1(void *ctx) 71 71 { 72 72 struct bpf_dynptr ptr; ··· 80 78 } 81 79 82 80 SEC("?raw_tp") 81 + __failure __msg("Unreleased reference id=2") 83 82 int ringbuf_missing_release2(void *ctx) 84 83 { 85 84 struct bpf_dynptr ptr1, ptr2; ··· 116 113 117 114 /* Any dynptr initialized within a callback must have bpf_dynptr_put called */ 118 115 SEC("?raw_tp") 116 + __failure __msg("Unreleased reference id") 119 117 int ringbuf_missing_release_callback(void *ctx) 120 118 { 121 119 bpf_loop(10, missing_release_callback_fn, NULL, 0); ··· 125 121 126 122 /* Can't call bpf_ringbuf_submit/discard_dynptr on a non-initialized dynptr */ 127 123 SEC("?raw_tp") 124 + __failure __msg("arg 1 is an unacquired reference") 128 125 int ringbuf_release_uninit_dynptr(void *ctx) 129 126 { 130 127 struct bpf_dynptr ptr; ··· 138 133 139 134 /* A dynptr can't be used after it has been invalidated */ 140 135 SEC("?raw_tp") 136 + __failure __msg("Expected an initialized dynptr as arg #3") 141 137 int use_after_invalid(void *ctx) 142 138 { 143 139 struct bpf_dynptr ptr; ··· 158 152 159 153 /* Can't call non-dynptr ringbuf APIs on a dynptr ringbuf sample */ 160 154 SEC("?raw_tp") 155 + __failure __msg("type=mem expected=ringbuf_mem") 161 156 int ringbuf_invalid_api(void *ctx) 162 157 { 163 158 struct bpf_dynptr ptr; ··· 181 174 182 175 /* Can't add a dynptr to a map */ 183 176 SEC("?raw_tp") 177 + __failure __msg("invalid indirect read from stack") 184 178 int add_dynptr_to_map1(void *ctx) 185 179 { 186 180 struct bpf_dynptr ptr; ··· 199 191 200 192 /* Can't add a struct with an embedded dynptr to a map */ 201 193 SEC("?raw_tp") 194 + __failure __msg("invalid indirect read from stack") 202 195 int add_dynptr_to_map2(void *ctx) 203 196 { 204 197 struct test_info x; ··· 217 208 218 209 /* A data slice can't be accessed out of bounds */ 219 210 SEC("?raw_tp") 211 + __failure __msg("value is outside of the allowed memory range") 220 212 int data_slice_out_of_bounds_ringbuf(void *ctx) 221 213 { 222 214 struct bpf_dynptr ptr; ··· 238 228 } 239 229 240 230 SEC("?raw_tp") 231 + __failure __msg("value is outside of the allowed memory range") 241 232 int data_slice_out_of_bounds_map_value(void *ctx) 242 233 { 243 234 __u32 key = 0, map_val; ··· 259 248 260 249 /* A data slice can't be used after it has been released */ 261 250 SEC("?raw_tp") 251 + __failure __msg("invalid mem access 'scalar'") 262 252 int data_slice_use_after_release1(void *ctx) 263 253 { 264 254 struct bpf_dynptr ptr; ··· 291 279 * ptr2 is at fp - 16). 292 280 */ 293 281 SEC("?raw_tp") 282 + __failure __msg("invalid mem access 'scalar'") 294 283 int data_slice_use_after_release2(void *ctx) 295 284 { 296 285 struct bpf_dynptr ptr1, ptr2; ··· 323 310 324 311 /* A data slice must be first checked for NULL */ 325 312 SEC("?raw_tp") 313 + __failure __msg("invalid mem access 'mem_or_null'") 326 314 int data_slice_missing_null_check1(void *ctx) 327 315 { 328 316 struct bpf_dynptr ptr; ··· 344 330 345 331 /* A data slice can't be dereferenced if it wasn't checked for null */ 346 332 SEC("?raw_tp") 333 + __failure __msg("invalid mem access 'mem_or_null'") 347 334 int data_slice_missing_null_check2(void *ctx) 348 335 { 349 336 struct bpf_dynptr ptr; ··· 367 352 * dynptr argument 368 353 */ 369 354 SEC("?raw_tp") 355 + __failure __msg("invalid indirect read from stack") 370 356 int invalid_helper1(void *ctx) 371 357 { 372 358 struct bpf_dynptr ptr; ··· 382 366 383 367 /* A dynptr can't be passed into a helper function at a non-zero offset */ 384 368 SEC("?raw_tp") 369 + __failure __msg("Expected an initialized dynptr as arg #3") 385 370 int invalid_helper2(void *ctx) 386 371 { 387 372 struct bpf_dynptr ptr; ··· 398 381 399 382 /* A bpf_dynptr is invalidated if it's been written into */ 400 383 SEC("?raw_tp") 384 + __failure __msg("Expected an initialized dynptr as arg #1") 401 385 int invalid_write1(void *ctx) 402 386 { 403 387 struct bpf_dynptr ptr; ··· 420 402 * offset 421 403 */ 422 404 SEC("?raw_tp") 405 + __failure __msg("Expected an initialized dynptr as arg #3") 423 406 int invalid_write2(void *ctx) 424 407 { 425 408 struct bpf_dynptr ptr; ··· 444 425 * non-const offset 445 426 */ 446 427 SEC("?raw_tp") 428 + __failure __msg("Expected an initialized dynptr as arg #1") 447 429 int invalid_write3(void *ctx) 448 430 { 449 431 struct bpf_dynptr ptr; ··· 476 456 * be invalidated as a dynptr 477 457 */ 478 458 SEC("?raw_tp") 459 + __failure __msg("arg 1 is an unacquired reference") 479 460 int invalid_write4(void *ctx) 480 461 { 481 462 struct bpf_dynptr ptr; ··· 493 472 494 473 /* A globally-defined bpf_dynptr can't be used (it must reside as a stack frame) */ 495 474 struct bpf_dynptr global_dynptr; 475 + 496 476 SEC("?raw_tp") 477 + __failure __msg("type=map_value expected=fp") 497 478 int global(void *ctx) 498 479 { 499 480 /* this should fail */ ··· 508 485 509 486 /* A direct read should fail */ 510 487 SEC("?raw_tp") 488 + __failure __msg("invalid read from stack") 511 489 int invalid_read1(void *ctx) 512 490 { 513 491 struct bpf_dynptr ptr; ··· 525 501 526 502 /* A direct read at an offset should fail */ 527 503 SEC("?raw_tp") 504 + __failure __msg("cannot pass in dynptr at an offset") 528 505 int invalid_read2(void *ctx) 529 506 { 530 507 struct bpf_dynptr ptr; ··· 541 516 542 517 /* A direct read at an offset into the lower stack slot should fail */ 543 518 SEC("?raw_tp") 519 + __failure __msg("invalid read from stack") 544 520 int invalid_read3(void *ctx) 545 521 { 546 522 struct bpf_dynptr ptr1, ptr2; ··· 568 542 569 543 /* A direct read within a callback function should fail */ 570 544 SEC("?raw_tp") 545 + __failure __msg("invalid read from stack") 571 546 int invalid_read4(void *ctx) 572 547 { 573 548 struct bpf_dynptr ptr; ··· 584 557 585 558 /* Initializing a dynptr on an offset should fail */ 586 559 SEC("?raw_tp") 560 + __failure __msg("invalid write to stack") 587 561 int invalid_offset(void *ctx) 588 562 { 589 563 struct bpf_dynptr ptr; ··· 599 571 600 572 /* Can't release a dynptr twice */ 601 573 SEC("?raw_tp") 574 + __failure __msg("arg 1 is an unacquired reference") 602 575 int release_twice(void *ctx) 603 576 { 604 577 struct bpf_dynptr ptr; ··· 626 597 * within a calback function, fails 627 598 */ 628 599 SEC("?raw_tp") 600 + __failure __msg("arg 1 is an unacquired reference") 629 601 int release_twice_callback(void *ctx) 630 602 { 631 603 struct bpf_dynptr ptr; ··· 642 612 643 613 /* Reject unsupported local mem types for dynptr_from_mem API */ 644 614 SEC("?raw_tp") 615 + __failure __msg("Unsupported reg type fp for bpf_dynptr_from_mem data") 645 616 int dynptr_from_mem_invalid_api(void *ctx) 646 617 { 647 618 struct bpf_dynptr ptr;
+1
tools/testing/selftests/bpf/progs/dynptr_success.c
··· 20 20 21 21 struct { 22 22 __uint(type, BPF_MAP_TYPE_RINGBUF); 23 + __uint(max_entries, 4096); 23 24 } ringbuf SEC(".maps"); 24 25 25 26 struct {
+27
tools/testing/selftests/bpf/progs/map_kptr_fail.c
··· 3 3 #include <bpf/bpf_tracing.h> 4 4 #include <bpf/bpf_helpers.h> 5 5 #include <bpf/bpf_core_read.h> 6 + #include "bpf_misc.h" 6 7 7 8 struct map_value { 8 9 char buf[8]; ··· 24 23 bpf_kfunc_call_test_kptr_get(struct prog_test_ref_kfunc **p, int a, int b) __ksym; 25 24 26 25 SEC("?tc") 26 + __failure __msg("kptr access size must be BPF_DW") 27 27 int size_not_bpf_dw(struct __sk_buff *ctx) 28 28 { 29 29 struct map_value *v; ··· 39 37 } 40 38 41 39 SEC("?tc") 40 + __failure __msg("kptr access cannot have variable offset") 42 41 int non_const_var_off(struct __sk_buff *ctx) 43 42 { 44 43 struct map_value *v; ··· 58 55 } 59 56 60 57 SEC("?tc") 58 + __failure __msg("R1 doesn't have constant offset. kptr has to be") 61 59 int non_const_var_off_kptr_xchg(struct __sk_buff *ctx) 62 60 { 63 61 struct map_value *v; ··· 77 73 } 78 74 79 75 SEC("?tc") 76 + __failure __msg("kptr access misaligned expected=8 off=7") 80 77 int misaligned_access_write(struct __sk_buff *ctx) 81 78 { 82 79 struct map_value *v; ··· 93 88 } 94 89 95 90 SEC("?tc") 91 + __failure __msg("kptr access misaligned expected=8 off=1") 96 92 int misaligned_access_read(struct __sk_buff *ctx) 97 93 { 98 94 struct map_value *v; ··· 107 101 } 108 102 109 103 SEC("?tc") 104 + __failure __msg("variable untrusted_ptr_ access var_off=(0x0; 0x1e0)") 110 105 int reject_var_off_store(struct __sk_buff *ctx) 111 106 { 112 107 struct prog_test_ref_kfunc *unref_ptr; ··· 131 124 } 132 125 133 126 SEC("?tc") 127 + __failure __msg("invalid kptr access, R1 type=untrusted_ptr_prog_test_ref_kfunc") 134 128 int reject_bad_type_match(struct __sk_buff *ctx) 135 129 { 136 130 struct prog_test_ref_kfunc *unref_ptr; ··· 152 144 } 153 145 154 146 SEC("?tc") 147 + __failure __msg("R1 type=untrusted_ptr_or_null_ expected=percpu_ptr_") 155 148 int marked_as_untrusted_or_null(struct __sk_buff *ctx) 156 149 { 157 150 struct map_value *v; ··· 167 158 } 168 159 169 160 SEC("?tc") 161 + __failure __msg("access beyond struct prog_test_ref_kfunc at off 32 size 4") 170 162 int correct_btf_id_check_size(struct __sk_buff *ctx) 171 163 { 172 164 struct prog_test_ref_kfunc *p; ··· 185 175 } 186 176 187 177 SEC("?tc") 178 + __failure __msg("R1 type=untrusted_ptr_ expected=percpu_ptr_") 188 179 int inherit_untrusted_on_walk(struct __sk_buff *ctx) 189 180 { 190 181 struct prog_test_ref_kfunc *unref_ptr; ··· 205 194 } 206 195 207 196 SEC("?tc") 197 + __failure __msg("off=8 kptr isn't referenced kptr") 208 198 int reject_kptr_xchg_on_unref(struct __sk_buff *ctx) 209 199 { 210 200 struct map_value *v; ··· 220 208 } 221 209 222 210 SEC("?tc") 211 + __failure __msg("arg#0 expected pointer to map value") 223 212 int reject_kptr_get_no_map_val(struct __sk_buff *ctx) 224 213 { 225 214 bpf_kfunc_call_test_kptr_get((void *)&ctx, 0, 0); ··· 228 215 } 229 216 230 217 SEC("?tc") 218 + __failure __msg("arg#0 expected pointer to map value") 231 219 int reject_kptr_get_no_null_map_val(struct __sk_buff *ctx) 232 220 { 233 221 bpf_kfunc_call_test_kptr_get(bpf_map_lookup_elem(&array_map, &(int){0}), 0, 0); ··· 236 222 } 237 223 238 224 SEC("?tc") 225 + __failure __msg("arg#0 no referenced kptr at map value offset=0") 239 226 int reject_kptr_get_no_kptr(struct __sk_buff *ctx) 240 227 { 241 228 struct map_value *v; ··· 251 236 } 252 237 253 238 SEC("?tc") 239 + __failure __msg("arg#0 no referenced kptr at map value offset=8") 254 240 int reject_kptr_get_on_unref(struct __sk_buff *ctx) 255 241 { 256 242 struct map_value *v; ··· 266 250 } 267 251 268 252 SEC("?tc") 253 + __failure __msg("kernel function bpf_kfunc_call_test_kptr_get args#0") 269 254 int reject_kptr_get_bad_type_match(struct __sk_buff *ctx) 270 255 { 271 256 struct map_value *v; ··· 281 264 } 282 265 283 266 SEC("?tc") 267 + __failure __msg("R1 type=untrusted_ptr_or_null_ expected=percpu_ptr_") 284 268 int mark_ref_as_untrusted_or_null(struct __sk_buff *ctx) 285 269 { 286 270 struct map_value *v; ··· 296 278 } 297 279 298 280 SEC("?tc") 281 + __failure __msg("store to referenced kptr disallowed") 299 282 int reject_untrusted_store_to_ref(struct __sk_buff *ctx) 300 283 { 301 284 struct prog_test_ref_kfunc *p; ··· 316 297 } 317 298 318 299 SEC("?tc") 300 + __failure __msg("R2 type=untrusted_ptr_ expected=ptr_") 319 301 int reject_untrusted_xchg(struct __sk_buff *ctx) 320 302 { 321 303 struct prog_test_ref_kfunc *p; ··· 335 315 } 336 316 337 317 SEC("?tc") 318 + __failure 319 + __msg("invalid kptr access, R2 type=ptr_prog_test_ref_kfunc expected=ptr_prog_test_member") 338 320 int reject_bad_type_xchg(struct __sk_buff *ctx) 339 321 { 340 322 struct prog_test_ref_kfunc *ref_ptr; ··· 355 333 } 356 334 357 335 SEC("?tc") 336 + __failure __msg("invalid kptr access, R2 type=ptr_prog_test_ref_kfunc") 358 337 int reject_member_of_ref_xchg(struct __sk_buff *ctx) 359 338 { 360 339 struct prog_test_ref_kfunc *ref_ptr; ··· 374 351 } 375 352 376 353 SEC("?syscall") 354 + __failure __msg("kptr cannot be accessed indirectly by helper") 377 355 int reject_indirect_helper_access(struct __sk_buff *ctx) 378 356 { 379 357 struct map_value *v; ··· 395 371 } 396 372 397 373 SEC("?tc") 374 + __failure __msg("kptr cannot be accessed indirectly by helper") 398 375 int reject_indirect_global_func_access(struct __sk_buff *ctx) 399 376 { 400 377 struct map_value *v; ··· 409 384 } 410 385 411 386 SEC("?tc") 387 + __failure __msg("Unreleased reference id=5 alloc_insn=") 412 388 int kptr_xchg_ref_state(struct __sk_buff *ctx) 413 389 { 414 390 struct prog_test_ref_kfunc *p; ··· 428 402 } 429 403 430 404 SEC("?tc") 405 + __failure __msg("Unreleased reference id=3 alloc_insn=") 431 406 int kptr_get_ref_state(struct __sk_buff *ctx) 432 407 { 433 408 struct map_value *v;