xref: /linux/tools/testing/selftests/bpf/progs/raw_tp_null_fail.c (revision 14c5eb685cdefbd32e73d2723071ecbd8effbce9)
1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright (c) 2024 Meta Platforms, Inc. and affiliates. */
3 
4 #include <vmlinux.h>
5 #include <bpf/bpf_tracing.h>
6 #include "bpf_misc.h"
7 
8 char _license[] SEC("license") = "GPL";
9 
10 /* Ensure module parameter has PTR_MAYBE_NULL */
11 SEC("tp_btf/bpf_testmod_test_raw_tp_null_tp")
12 __failure __msg("R1 invalid mem access 'trusted_ptr_or_null_'")
13 int test_raw_tp_null_bpf_testmod_test_raw_tp_null_arg_1(void *ctx) {
14     asm volatile("r1 = *(u64 *)(r1 +0); r1 = *(u64 *)(r1 +0);" ::: __clobber_all);
15     return 0;
16 }
17 
18 /* Check NULL marking */
19 SEC("tp_btf/sched_pi_setprio")
20 __failure __msg("R1 invalid mem access 'trusted_ptr_or_null_'")
21 int test_raw_tp_null_sched_pi_setprio_arg_2(void *ctx) {
22     asm volatile("r1 = *(u64 *)(r1 +8); r1 = *(u64 *)(r1 +0);" ::: __clobber_all);
23     return 0;
24 }
25 
26 /* Plain raw tracepoint arguments remain scalar values. */
27 SEC("raw_tp/signal_generate")
28 __success
29 int test_raw_tp_signal_generate_info_scalar(void *ctx)
30 {
31 	asm volatile("r1 = *(u64 *)(r1 +8); if r1 != 1 goto +0;" ::: __clobber_all);
32 	return 0;
33 }
34 
35 /* tp_btf programs may inspect the sentinel as a scalar value. */
36 SEC("tp_btf/signal_generate")
37 __success
38 int test_tp_btf_signal_generate_info_scalar(void *ctx)
39 {
40 	asm volatile("r1 = *(u64 *)(r1 +8); if r1 != 1 goto +0;" ::: __clobber_all);
41 	return 0;
42 }
43 
44 /* SEND_SIG_PRIV is non-NULL, so a NULL check cannot make info safe. */
45 SEC("tp_btf/signal_generate")
46 __failure __msg("R1 invalid mem access 'scalar'")
47 int test_tp_btf_signal_generate_info_no_deref(void *ctx)
48 {
49 	asm volatile("r1 = *(u64 *)(r1 +8); if r1 == 0 goto +1; "
50 		     "r1 = *(u32 *)(r1 +0);" ::: __clobber_all);
51 	return 0;
52 }
53 
54 SEC("tp_btf/signal_deliver")
55 __failure __msg("R1 invalid mem access 'scalar'")
56 int test_tp_btf_signal_deliver_info_no_deref(void *ctx)
57 {
58 	asm volatile("r1 = *(u64 *)(r1 +8); r1 = *(u32 *)(r1 +0);" ::: __clobber_all);
59 	return 0;
60 }
61 
62 SEC("tp_btf/sched_process_wait")
63 __failure __msg("R1 invalid mem access 'trusted_ptr_or_null_'")
64 int test_raw_tp_null_sched_process_wait_arg_1(void *ctx)
65 {
66 	asm volatile("r1 = *(u64 *)(r1 +0); r1 = *(u32 *)(r1 +0);" ::: __clobber_all);
67 	return 0;
68 }
69 
70 SEC("tp_btf/sched_process_wait")
71 __success
72 int test_raw_tp_null_sched_process_wait_arg_1_checked(void *ctx)
73 {
74 	asm volatile("r1 = *(u64 *)(r1 +0); if r1 == 0 goto +1; "
75 		     "r1 = *(u32 *)(r1 +0);" ::: __clobber_all);
76 	return 0;
77 }
78