public inbox for linux-kselftest@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH bpf-next v4 0/2] bpf: Allow access to const void pointer arguments in tracing programs
@ 2025-04-23 12:13 KaFai Wan
  2025-04-23 12:13 ` [PATCH bpf-next v4 1/2] " KaFai Wan
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: KaFai Wan @ 2025-04-23 12:13 UTC (permalink / raw)
  To: alexei.starovoitov, martin.lau, ast, daniel, andrii, eddyz87,
	song, yonghong.song, john.fastabend, kpsingh, sdf, haoluo, jolsa,
	davem, edumazet, kuba, pabeni, horms, mykolal, shuah, memxor
  Cc: bpf, linux-kernel, netdev, linux-kselftest, leon.hwang, KaFai Wan

If we try to access argument which is pointer to const void, it's an 
UNKNOWN type, verifier will fail to load.

Use is_void_or_int_ptr to check if type is void or int pointer. 
Add a selftest to check it.

---
KaFai Wan (2):
  bpf: Allow access to const void pointer arguments in tracing programs
  selftests/bpf: Add test to access const void pointer argument in
    tracing program

 kernel/bpf/btf.c                                    | 13 +++----------
 net/bpf/test_run.c                                  |  8 +++++++-
 .../selftests/bpf/progs/verifier_btf_ctx_access.c   | 12 ++++++++++++
 3 files changed, 22 insertions(+), 11 deletions(-)

Changelog:
v3->v4: Addressed comments from Alexei Starovoitov
- change SOB to match From email address
- add Acked-by from jirka
Details in here:
https://lore.kernel.org/all/20250417151548.1276279-1-kafai.wan@hotmail.com/

v2->v3: Addressed comments from jirka
- remove duplicate checks for void pointer
Details in here:
https://lore.kernel.org/bpf/20250416161756.1079178-1-kafai.wan@hotmail.com/

v1->v2: Addressed comments from jirka
- use btf_type_is_void to check if type is void
- merge is_void_ptr and is_int_ptr to is_void_or_int_ptr
- fix selftests
Details in here:
https://lore.kernel.org/all/20250412170626.3638516-1-kafai.wan@hotmail.com/

-- 
2.43.0


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH bpf-next v4 1/2] bpf: Allow access to const void pointer arguments in tracing programs
  2025-04-23 12:13 [PATCH bpf-next v4 0/2] bpf: Allow access to const void pointer arguments in tracing programs KaFai Wan
@ 2025-04-23 12:13 ` KaFai Wan
  2025-04-23 18:27   ` Andrii Nakryiko
  2025-04-23 12:13 ` [PATCH bpf-next v4 2/2] selftests/bpf: Add test to access const void pointer argument in tracing program KaFai Wan
  2025-04-23 18:30 ` [PATCH bpf-next v4 0/2] bpf: Allow access to const void pointer arguments in tracing programs patchwork-bot+netdevbpf
  2 siblings, 1 reply; 5+ messages in thread
From: KaFai Wan @ 2025-04-23 12:13 UTC (permalink / raw)
  To: alexei.starovoitov, martin.lau, ast, daniel, andrii, eddyz87,
	song, yonghong.song, john.fastabend, kpsingh, sdf, haoluo, jolsa,
	davem, edumazet, kuba, pabeni, horms, mykolal, shuah, memxor
  Cc: bpf, linux-kernel, netdev, linux-kselftest, leon.hwang, KaFai Wan

Adding support to access arguments with const void pointer arguments
in tracing programs.

Currently we allow tracing programs to access void pointers. If we try to
access argument which is pointer to const void like 2nd argument in kfree,
verifier will fail to load the program with;

0: R1=ctx() R10=fp0
; asm volatile ("r2 = *(u64 *)(r1 + 8); ");
0: (79) r2 = *(u64 *)(r1 +8)
func 'kfree' arg1 type UNKNOWN is not a struct

Changing the is_int_ptr to void and generic integer check and renaming
it to is_void_or_int_ptr.

Cc: Leon Hwang <leon.hwang@linux.dev>
Signed-off-by: KaFai Wan <mannkafai@gmail.com>
Acked-by: Jiri Olsa <jolsa@kernel.org>
---
 kernel/bpf/btf.c | 13 +++----------
 1 file changed, 3 insertions(+), 10 deletions(-)

diff --git a/kernel/bpf/btf.c b/kernel/bpf/btf.c
index 16ba36f34dfa..14cdefc15f0e 100644
--- a/kernel/bpf/btf.c
+++ b/kernel/bpf/btf.c
@@ -6383,12 +6383,12 @@ struct btf *bpf_prog_get_target_btf(const struct bpf_prog *prog)
 		return prog->aux->attach_btf;
 }
 
-static bool is_int_ptr(struct btf *btf, const struct btf_type *t)
+static bool is_void_or_int_ptr(struct btf *btf, const struct btf_type *t)
 {
 	/* skip modifiers */
 	t = btf_type_skip_modifiers(btf, t->type, NULL);
 
-	return btf_type_is_int(t);
+	return btf_type_is_void(t) || btf_type_is_int(t);
 }
 
 static u32 get_ctx_arg_idx(struct btf *btf, const struct btf_type *func_proto,
@@ -6776,14 +6776,7 @@ bool btf_ctx_access(int off, int size, enum bpf_access_type type,
 		}
 	}
 
-	if (t->type == 0)
-		/* This is a pointer to void.
-		 * It is the same as scalar from the verifier safety pov.
-		 * No further pointer walking is allowed.
-		 */
-		return true;
-
-	if (is_int_ptr(btf, t))
+	if (is_void_or_int_ptr(btf, t))
 		return true;
 
 	/* this is a pointer to another type */
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH bpf-next v4 2/2] selftests/bpf: Add test to access const void pointer argument in tracing program
  2025-04-23 12:13 [PATCH bpf-next v4 0/2] bpf: Allow access to const void pointer arguments in tracing programs KaFai Wan
  2025-04-23 12:13 ` [PATCH bpf-next v4 1/2] " KaFai Wan
@ 2025-04-23 12:13 ` KaFai Wan
  2025-04-23 18:30 ` [PATCH bpf-next v4 0/2] bpf: Allow access to const void pointer arguments in tracing programs patchwork-bot+netdevbpf
  2 siblings, 0 replies; 5+ messages in thread
From: KaFai Wan @ 2025-04-23 12:13 UTC (permalink / raw)
  To: alexei.starovoitov, martin.lau, ast, daniel, andrii, eddyz87,
	song, yonghong.song, john.fastabend, kpsingh, sdf, haoluo, jolsa,
	davem, edumazet, kuba, pabeni, horms, mykolal, shuah, memxor
  Cc: bpf, linux-kernel, netdev, linux-kselftest, leon.hwang, KaFai Wan

Adding verifier test for accessing const void pointer argument in
tracing programs.

The test program loads 1st argument of bpf_fentry_test10 function
which is const void pointer and checks that verifier allows that.

Signed-off-by: KaFai Wan <mannkafai@gmail.com>
Acked-by: Jiri Olsa <jolsa@kernel.org>
---
 net/bpf/test_run.c                                   |  8 +++++++-
 .../selftests/bpf/progs/verifier_btf_ctx_access.c    | 12 ++++++++++++
 2 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/net/bpf/test_run.c b/net/bpf/test_run.c
index 7cb192cbd65f..aaf13a7d58ed 100644
--- a/net/bpf/test_run.c
+++ b/net/bpf/test_run.c
@@ -569,6 +569,11 @@ __bpf_kfunc u32 bpf_fentry_test9(u32 *a)
 	return *a;
 }
 
+int noinline bpf_fentry_test10(const void *a)
+{
+	return (long)a;
+}
+
 void noinline bpf_fentry_test_sinfo(struct skb_shared_info *sinfo)
 {
 }
@@ -699,7 +704,8 @@ int bpf_prog_test_run_tracing(struct bpf_prog *prog,
 		    bpf_fentry_test6(16, (void *)17, 18, 19, (void *)20, 21) != 111 ||
 		    bpf_fentry_test7((struct bpf_fentry_test_t *)0) != 0 ||
 		    bpf_fentry_test8(&arg) != 0 ||
-		    bpf_fentry_test9(&retval) != 0)
+		    bpf_fentry_test9(&retval) != 0 ||
+		    bpf_fentry_test10((void *)0) != 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 28b939572cda..03942cec07e5 100644
--- a/tools/testing/selftests/bpf/progs/verifier_btf_ctx_access.c
+++ b/tools/testing/selftests/bpf/progs/verifier_btf_ctx_access.c
@@ -65,4 +65,16 @@ __naked void ctx_access_u32_pointer_reject_8(void)
 "	::: __clobber_all);
 }
 
+SEC("fentry/bpf_fentry_test10")
+__description("btf_ctx_access const void pointer accept")
+__success __retval(0)
+__naked void ctx_access_const_void_pointer_accept(void)
+{
+	asm volatile ("					\
+	r2 = *(u64 *)(r1 + 0);		/* load 1st argument value (const void pointer) */\
+	r0 = 0;						\
+	exit;						\
+"	::: __clobber_all);
+}
+
 char _license[] SEC("license") = "GPL";
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH bpf-next v4 1/2] bpf: Allow access to const void pointer arguments in tracing programs
  2025-04-23 12:13 ` [PATCH bpf-next v4 1/2] " KaFai Wan
@ 2025-04-23 18:27   ` Andrii Nakryiko
  0 siblings, 0 replies; 5+ messages in thread
From: Andrii Nakryiko @ 2025-04-23 18:27 UTC (permalink / raw)
  To: KaFai Wan
  Cc: alexei.starovoitov, martin.lau, ast, daniel, andrii, eddyz87,
	song, yonghong.song, john.fastabend, kpsingh, sdf, haoluo, jolsa,
	davem, edumazet, kuba, pabeni, horms, mykolal, shuah, memxor, bpf,
	linux-kernel, netdev, linux-kselftest, leon.hwang

On Wed, Apr 23, 2025 at 5:14 AM KaFai Wan <mannkafai@gmail.com> wrote:
>
> Adding support to access arguments with const void pointer arguments
> in tracing programs.
>
> Currently we allow tracing programs to access void pointers. If we try to
> access argument which is pointer to const void like 2nd argument in kfree,
> verifier will fail to load the program with;
>
> 0: R1=ctx() R10=fp0
> ; asm volatile ("r2 = *(u64 *)(r1 + 8); ");
> 0: (79) r2 = *(u64 *)(r1 +8)
> func 'kfree' arg1 type UNKNOWN is not a struct
>
> Changing the is_int_ptr to void and generic integer check and renaming
> it to is_void_or_int_ptr.
>
> Cc: Leon Hwang <leon.hwang@linux.dev>
> Signed-off-by: KaFai Wan <mannkafai@gmail.com>
> Acked-by: Jiri Olsa <jolsa@kernel.org>
> ---
>  kernel/bpf/btf.c | 13 +++----------
>  1 file changed, 3 insertions(+), 10 deletions(-)
>
> diff --git a/kernel/bpf/btf.c b/kernel/bpf/btf.c
> index 16ba36f34dfa..14cdefc15f0e 100644
> --- a/kernel/bpf/btf.c
> +++ b/kernel/bpf/btf.c
> @@ -6383,12 +6383,12 @@ struct btf *bpf_prog_get_target_btf(const struct bpf_prog *prog)
>                 return prog->aux->attach_btf;
>  }
>
> -static bool is_int_ptr(struct btf *btf, const struct btf_type *t)
> +static bool is_void_or_int_ptr(struct btf *btf, const struct btf_type *t)
>  {
>         /* skip modifiers */
>         t = btf_type_skip_modifiers(btf, t->type, NULL);
>
> -       return btf_type_is_int(t);
> +       return btf_type_is_void(t) || btf_type_is_int(t);
>  }
>
>  static u32 get_ctx_arg_idx(struct btf *btf, const struct btf_type *func_proto,
> @@ -6776,14 +6776,7 @@ bool btf_ctx_access(int off, int size, enum bpf_access_type type,
>                 }
>         }
>
> -       if (t->type == 0)
> -               /* This is a pointer to void.
> -                * It is the same as scalar from the verifier safety pov.
> -                * No further pointer walking is allowed.

I preserved this comment (with slight rewording to make sense in a
combined check context). Applied to bpf-next, thanks.

> -                */
> -               return true;
> -
> -       if (is_int_ptr(btf, t))
> +       if (is_void_or_int_ptr(btf, t))
>                 return true;
>
>         /* this is a pointer to another type */
> --
> 2.43.0
>

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH bpf-next v4 0/2] bpf: Allow access to const void pointer arguments in tracing programs
  2025-04-23 12:13 [PATCH bpf-next v4 0/2] bpf: Allow access to const void pointer arguments in tracing programs KaFai Wan
  2025-04-23 12:13 ` [PATCH bpf-next v4 1/2] " KaFai Wan
  2025-04-23 12:13 ` [PATCH bpf-next v4 2/2] selftests/bpf: Add test to access const void pointer argument in tracing program KaFai Wan
@ 2025-04-23 18:30 ` patchwork-bot+netdevbpf
  2 siblings, 0 replies; 5+ messages in thread
From: patchwork-bot+netdevbpf @ 2025-04-23 18:30 UTC (permalink / raw)
  To: KaFai Wan
  Cc: alexei.starovoitov, martin.lau, ast, daniel, andrii, eddyz87,
	song, yonghong.song, john.fastabend, kpsingh, sdf, haoluo, jolsa,
	davem, edumazet, kuba, pabeni, horms, mykolal, shuah, memxor, bpf,
	linux-kernel, netdev, linux-kselftest, leon.hwang

Hello:

This series was applied to bpf/bpf-next.git (master)
by Andrii Nakryiko <andrii@kernel.org>:

On Wed, 23 Apr 2025 20:13:27 +0800 you wrote:
> If we try to access argument which is pointer to const void, it's an
> UNKNOWN type, verifier will fail to load.
> 
> Use is_void_or_int_ptr to check if type is void or int pointer.
> Add a selftest to check it.
> 
> 
> [...]

Here is the summary with links:
  - [bpf-next,v4,1/2] bpf: Allow access to const void pointer arguments in tracing programs
    https://git.kernel.org/bpf/bpf-next/c/1271a40eeafa
  - [bpf-next,v4,2/2] selftests/bpf: Add test to access const void pointer argument in tracing program
    https://git.kernel.org/bpf/bpf-next/c/4c0a42c50021

You are awesome, thank you!
-- 
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html



^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2025-04-23 18:29 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-04-23 12:13 [PATCH bpf-next v4 0/2] bpf: Allow access to const void pointer arguments in tracing programs KaFai Wan
2025-04-23 12:13 ` [PATCH bpf-next v4 1/2] " KaFai Wan
2025-04-23 18:27   ` Andrii Nakryiko
2025-04-23 12:13 ` [PATCH bpf-next v4 2/2] selftests/bpf: Add test to access const void pointer argument in tracing program KaFai Wan
2025-04-23 18:30 ` [PATCH bpf-next v4 0/2] bpf: Allow access to const void pointer arguments in tracing programs patchwork-bot+netdevbpf

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox