Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftests/bpf: add more cases for __arg_trusted __arg_nullable args

Add extra layer of global functions to ensure that passing around
(trusted) PTR_TO_BTF_ID_OR_NULL registers works as expected. We also
extend trusted_task_arg_nullable subtest to check three possible valid
argumements: known NULL, known non-NULL, and maybe NULL cases.

Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/r/20240202190529.2374377-3-andrii@kernel.org
Signed-off-by: Alexei Starovoitov <ast@kernel.org>

authored by

Andrii Nakryiko and committed by
Alexei Starovoitov
e2e70535 8f13c340

+29 -3
+29 -3
tools/testing/selftests/bpf/progs/verifier_global_ptr_args.c
··· 19 19 return task->pid + task->tgid; 20 20 } 21 21 22 - SEC("?kprobe") 22 + __weak int subprog_trusted_task_nullable_extra_layer(struct task_struct *task __arg_trusted __arg_nullable) 23 + { 24 + return subprog_trusted_task_nullable(task) + subprog_trusted_task_nullable(NULL); 25 + } 26 + 27 + SEC("?tp_btf/task_newtask") 23 28 __success __log_level(2) 24 29 __msg("Validating subprog_trusted_task_nullable() func#1...") 25 30 __msg(": R1=trusted_ptr_or_null_task_struct(") 26 31 int trusted_task_arg_nullable(void *ctx) 27 32 { 28 - struct task_struct *t = bpf_get_current_task_btf(); 33 + struct task_struct *t1 = bpf_get_current_task_btf(); 34 + struct task_struct *t2 = bpf_task_acquire(t1); 35 + int res = 0; 29 36 30 - return subprog_trusted_task_nullable(t) + subprog_trusted_task_nullable(NULL); 37 + /* known NULL */ 38 + res += subprog_trusted_task_nullable(NULL); 39 + 40 + /* known non-NULL */ 41 + res += subprog_trusted_task_nullable(t1); 42 + res += subprog_trusted_task_nullable_extra_layer(t1); 43 + 44 + /* unknown if NULL or not */ 45 + res += subprog_trusted_task_nullable(t2); 46 + res += subprog_trusted_task_nullable_extra_layer(t2); 47 + 48 + if (t2) { 49 + /* known non-NULL after explicit NULL check, just in case */ 50 + res += subprog_trusted_task_nullable(t2); 51 + res += subprog_trusted_task_nullable_extra_layer(t2); 52 + 53 + bpf_task_release(t2); 54 + } 55 + 56 + return res; 31 57 } 32 58 33 59 __weak int subprog_trusted_task_nonnull(struct task_struct *task __arg_trusted)