bpf: Fix error message on kfunc arg type mismatch
authorMaxim Mikityanskiy <maxtram95@gmail.com>
Mon, 9 Sep 2024 13:39:09 +0000 (16:39 +0300)
committerAndrii Nakryiko <andrii@kernel.org>
Mon, 9 Sep 2024 22:58:17 +0000 (15:58 -0700)
When "arg#%d expected pointer to ctx, but got %s" error is printed, both
template parts actually point to the type of the argument, therefore, it
will also say "but got PTR", regardless of what was the actual register
type.

Fix the message to print the register type in the second part of the
template, change the existing test to adapt to the new format, and add a
new test to test the case when arg is a pointer to context, but reg is a
scalar.

Fixes: 00b85860feb8 ("bpf: Rewrite kfunc argument handling")
Signed-off-by: Maxim Mikityanskiy <maxim@isovalent.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Acked-by: Kumar Kartikeya Dwivedi <memxor@gmail.com>
Link: https://lore.kernel.org/bpf/20240909133909.1315460-1-maxim@isovalent.com
kernel/bpf/verifier.c
tools/testing/selftests/bpf/prog_tests/kfunc_call.c
tools/testing/selftests/bpf/progs/kfunc_call_fail.c
tools/testing/selftests/bpf/verifier/calls.c

index 53d0556..f35b80c 100644 (file)
@@ -12132,7 +12132,8 @@ static int check_kfunc_args(struct bpf_verifier_env *env, struct bpf_kfunc_call_
                switch (kf_arg_type) {
                case KF_ARG_PTR_TO_CTX:
                        if (reg->type != PTR_TO_CTX) {
-                               verbose(env, "arg#%d expected pointer to ctx, but got %s\n", i, btf_type_str(t));
+                               verbose(env, "arg#%d expected pointer to ctx, but got %s\n",
+                                       i, reg_type_str(env, reg->type));
                                return -EINVAL;
                        }
 
index 5b74321..f79c8e5 100644 (file)
@@ -68,6 +68,7 @@ static struct kfunc_test_params kfunc_tests[] = {
        TC_FAIL(kfunc_call_test_get_mem_fail_oob, 0, "min value is outside of the allowed memory range"),
        TC_FAIL(kfunc_call_test_get_mem_fail_not_const, 0, "is not a const"),
        TC_FAIL(kfunc_call_test_mem_acquire_fail, 0, "acquire kernel function does not return PTR_TO_BTF_ID"),
+       TC_FAIL(kfunc_call_test_pointer_arg_type_mismatch, 0, "arg#0 expected pointer to ctx, but got scalar"),
 
        /* success cases */
        TC_TEST(kfunc_call_test1, 12),
index 4b0b7b7..08fae30 100644 (file)
@@ -150,4 +150,11 @@ int kfunc_call_test_mem_acquire_fail(struct __sk_buff *skb)
        return ret;
 }
 
+SEC("?tc")
+int kfunc_call_test_pointer_arg_type_mismatch(struct __sk_buff *skb)
+{
+       bpf_kfunc_call_test_pass_ctx((void *)10);
+       return 0;
+}
+
 char _license[] SEC("license") = "GPL";
index d0cdd15..7afc261 100644 (file)
@@ -76,7 +76,7 @@
        },
        .prog_type = BPF_PROG_TYPE_SCHED_CLS,
        .result = REJECT,
-       .errstr = "arg#0 expected pointer to ctx, but got PTR",
+       .errstr = "arg#0 expected pointer to ctx, but got fp",
        .fixup_kfunc_btf_id = {
                { "bpf_kfunc_call_test_pass_ctx", 2 },
        },