1a6541f4dSDavid Vernet // SPDX-License-Identifier: GPL-2.0
2a6541f4dSDavid Vernet /* Copyright (c) 2023 Meta Platforms, Inc. and affiliates. */
3a6541f4dSDavid Vernet 
4a6541f4dSDavid Vernet #include <vmlinux.h>
5a6541f4dSDavid Vernet #include <bpf/bpf_tracing.h>
6a6541f4dSDavid Vernet #include <bpf/bpf_helpers.h>
7a6541f4dSDavid Vernet #include "bpf_misc.h"
8a6541f4dSDavid Vernet 
9a6541f4dSDavid Vernet #include "nested_trust_common.h"
10a6541f4dSDavid Vernet 
11a6541f4dSDavid Vernet char _license[] SEC("license") = "GPL";
12a6541f4dSDavid Vernet 
13*d2284d68SYafang Shao struct {
14*d2284d68SYafang Shao 	__uint(type, BPF_MAP_TYPE_SK_STORAGE);
15*d2284d68SYafang Shao 	__uint(map_flags, BPF_F_NO_PREALLOC);
16*d2284d68SYafang Shao 	__type(key, int);
17*d2284d68SYafang Shao 	__type(value, u64);
18*d2284d68SYafang Shao } sk_storage_map SEC(".maps");
19*d2284d68SYafang Shao 
20a6541f4dSDavid Vernet /* Prototype for all of the program trace events below:
21a6541f4dSDavid Vernet  *
22a6541f4dSDavid Vernet  * TRACE_EVENT(task_newtask,
23a6541f4dSDavid Vernet  *         TP_PROTO(struct task_struct *p, u64 clone_flags)
24a6541f4dSDavid Vernet  */
25a6541f4dSDavid Vernet 
26a6541f4dSDavid Vernet SEC("tp_btf/task_newtask")
276fcd486bSAlexei Starovoitov __failure __msg("R2 must be")
BPF_PROG(test_invalid_nested_user_cpus,struct task_struct * task,u64 clone_flags)28a6541f4dSDavid Vernet int BPF_PROG(test_invalid_nested_user_cpus, struct task_struct *task, u64 clone_flags)
29a6541f4dSDavid Vernet {
30a6541f4dSDavid Vernet 	bpf_cpumask_test_cpu(0, task->user_cpus_ptr);
31a6541f4dSDavid Vernet 	return 0;
32a6541f4dSDavid Vernet }
33a6541f4dSDavid Vernet 
34a6541f4dSDavid Vernet SEC("tp_btf/task_newtask")
35a6541f4dSDavid Vernet __failure __msg("R1 must have zero offset when passed to release func or trusted arg to kfunc")
BPF_PROG(test_invalid_nested_offset,struct task_struct * task,u64 clone_flags)36a6541f4dSDavid Vernet int BPF_PROG(test_invalid_nested_offset, struct task_struct *task, u64 clone_flags)
37a6541f4dSDavid Vernet {
38a6541f4dSDavid Vernet 	bpf_cpumask_first_zero(&task->cpus_mask);
39a6541f4dSDavid Vernet 	return 0;
40a6541f4dSDavid Vernet }
41*d2284d68SYafang Shao 
42*d2284d68SYafang Shao /* Although R2 is of type sk_buff but sock_common is expected, we will hit untrusted ptr first. */
43*d2284d68SYafang Shao SEC("tp_btf/tcp_probe")
44*d2284d68SYafang Shao __failure __msg("R2 type=untrusted_ptr_ expected=ptr_, trusted_ptr_, rcu_ptr_")
BPF_PROG(test_invalid_skb_field,struct sock * sk,struct sk_buff * skb)45*d2284d68SYafang Shao int BPF_PROG(test_invalid_skb_field, struct sock *sk, struct sk_buff *skb)
46*d2284d68SYafang Shao {
47*d2284d68SYafang Shao 	bpf_sk_storage_get(&sk_storage_map, skb->next, 0, 0);
48*d2284d68SYafang Shao 	return 0;
49*d2284d68SYafang Shao }
50