diff --git a/kernel/bpf/btf.c b/kernel/bpf/btf.c index 64739308902f7..86883b3c97d20 100644 --- a/kernel/bpf/btf.c +++ b/kernel/bpf/btf.c @@ -6762,7 +6762,7 @@ bool btf_ctx_access(int off, int size, enum bpf_access_type type, /* skip modifiers */ while (btf_type_is_modifier(t)) t = btf_type_by_id(btf, t->type); - if (btf_type_is_small_int(t) || btf_is_any_enum(t) || __btf_type_is_struct(t)) + if (btf_type_is_small_int(t) || btf_is_any_enum(t) || btf_type_is_struct(t)) /* accessing a scalar */ return true; if (!btf_type_is_ptr(t)) { @@ -7334,7 +7334,7 @@ static int __get_type_size(struct btf *btf, u32 btf_id, if (btf_type_is_ptr(t)) /* kernel size of pointer. Not BPF's size of pointer*/ return sizeof(void *); - if (btf_type_is_int(t) || btf_is_any_enum(t) || __btf_type_is_struct(t)) + if (btf_type_is_int(t) || btf_is_any_enum(t) || btf_type_is_struct(t)) return t->size; return -EINVAL; } 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";