]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
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 53d0556fbbf3764826f5abc466d0030a4504df95..f35b80c16cdad4aaa4b3f1546a9c15f2eb27a1d9 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 5b743212292f617d23b8540b3c8244014ec8c1e6..f79c8e53cb3e2d1a5346edcae46855988051dcfe 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 4b0b7b79cdfb79d688303ea683e307af56e601b8..08fae306539c591d89201ec10b9ae7b258eab8a5 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 d0cdd156cd55582a2b47ef7fa395c7bc86bc8f78..7afc2619ab146fd98cb36d61ceb7cf2cb656c614 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 },
        },