Adding verifier test for accessing union argument in tracing programs. The test program loads 1st argument of bpf_fentry_test11 function which is union and checks that verifier allows that. cd tools/testing/selftests/bpf ./test_progs -t verifier_btf_ctx 501/7 verifier_btf_ctx_access/btf_ctx_access union arg accept:OK 501 verifier_btf_ctx_access:OK Summary: 1/7 PASSED, 0 SKIPPED, 0 FAILED Signed-off-by: Leon Hwang --- net/bpf/test_run.c | 14 +++++++++++++- .../selftests/bpf/progs/verifier_btf_ctx_access.c | 12 ++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/net/bpf/test_run.c b/net/bpf/test_run.c index 4a862d6053861..c65d468fd6012 100644 --- a/net/bpf/test_run.c +++ b/net/bpf/test_run.c @@ -574,6 +574,16 @@ noinline int bpf_fentry_test10(const void *a) return (long)a; } +typedef union { + void *arg0; + int *arg1; +} union_test_t; + +noinline int bpf_fentry_test11(union_test_t t) +{ + return (int)(long)t.arg0; +} + noinline void bpf_fentry_test_sinfo(struct skb_shared_info *sinfo) { } @@ -688,6 +698,7 @@ int bpf_prog_test_run_tracing(struct bpf_prog *prog, struct bpf_fentry_test_t arg = {}; u16 side_effect = 0, ret = 0; int b = 2, err = -EFAULT; + union_test_t utt = {}; u32 retval = 0; if (kattr->test.flags || kattr->test.cpu || kattr->test.batch_size) @@ -705,7 +716,8 @@ int bpf_prog_test_run_tracing(struct bpf_prog *prog, bpf_fentry_test7((struct bpf_fentry_test_t *)0) != 0 || bpf_fentry_test8(&arg) != 0 || bpf_fentry_test9(&retval) != 0 || - bpf_fentry_test10((void *)0) != 0) + bpf_fentry_test10((void *)0) != 0 || + bpf_fentry_test11(utt) != 0) goto out; break; case BPF_MODIFY_RETURN: diff --git a/tools/testing/selftests/bpf/progs/verifier_btf_ctx_access.c b/tools/testing/selftests/bpf/progs/verifier_btf_ctx_access.c index 03942cec07e56..ff379836b5f00 100644 --- a/tools/testing/selftests/bpf/progs/verifier_btf_ctx_access.c +++ b/tools/testing/selftests/bpf/progs/verifier_btf_ctx_access.c @@ -77,4 +77,16 @@ __naked void ctx_access_const_void_pointer_accept(void) " ::: __clobber_all); } +SEC("fentry/bpf_fentry_test11") +__description("btf_ctx_access union arg accept") +__success __retval(0) +__naked void ctx_access_union_arg_accept(void) +{ + asm volatile (" \ + r2 = *(u64 *)(r1 + 0); /* load 1st argument value (union) */\ + r0 = 0; \ + exit; \ +" ::: __clobber_all); +} + char _license[] SEC("license") = "GPL"; -- 2.50.1