Thread (9 messages) 9 messages, 3 authors, 2024-09-11

Re: [PATCH bpf-next v3 1/5] bpf: Support __nullable argument suffix for tp_btf

From: Martin KaFai Lau <martin.lau@linux.dev>
Date: 2024-09-11 17:30:45
Also in: bpf, linux-trace-kernel

On 9/10/24 8:37 PM, Philo Lu wrote:
quoted hunk ↗ jump to hunk
Pointers passed to tp_btf were trusted to be valid, but some tracepoints
do take NULL pointer as input, such as trace_tcp_send_reset(). Then the
invalid memory access cannot be detected by verifier.

This patch fix it by add a suffix "__nullable" to the unreliable
argument. The suffix is shown in btf, and PTR_MAYBE_NULL will be added
to nullable arguments. Then users must check the pointer before use it.

A problem here is that we use "btf_trace_##call" to search func_proto.
As it is a typedef, argument names as well as the suffix are not
recorded. To solve this, I use bpf_raw_event_map to find
"__bpf_trace##template" from "btf_trace_##call", and then we can see the
suffix.

Suggested-by: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: Philo Lu <lulie@linux.alibaba.com>
---
  kernel/bpf/btf.c      |  9 +++++++++
  kernel/bpf/verifier.c | 36 ++++++++++++++++++++++++++++++++----
  2 files changed, 41 insertions(+), 4 deletions(-)
diff --git a/kernel/bpf/btf.c b/kernel/bpf/btf.c
index 1e29281653c62..d1ea38d08f301 100644
--- a/kernel/bpf/btf.c
+++ b/kernel/bpf/btf.c
@@ -6385,6 +6385,12 @@ static bool prog_args_trusted(const struct bpf_prog *prog)
  	}
  }
  
+static bool prog_arg_maybe_null(const struct bpf_prog *prog, const struct btf *btf,
The "prog" arg is not used, so the following nit...

quoted hunk ↗ jump to hunk
+				const struct btf_param *arg)
+{
+	return btf_param_match_suffix(btf, arg, "__nullable");
+}
+
  int btf_ctx_arg_offset(const struct btf *btf, const struct btf_type *func_proto,
  		       u32 arg_no)
  {
@@ -6554,6 +6560,9 @@ bool btf_ctx_access(int off, int size, enum bpf_access_type type,
  	if (prog_args_trusted(prog))
  		info->reg_type |= PTR_TRUSTED;
  
+	if (prog_arg_maybe_null(prog, btf, &args[arg]))
... I changed it to directly use
btf_param_match_suffix(btf, &args[arg], "__nullable"),

and removed the new prog_arg_maybe_null(). There are already a few 
is_kfunc_arg_{nullable, ...} helpers in verifier.c. Maybe we can consider 
refactoring them (if) there are more use cases like this in the future.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help