xref: /linux/tools/testing/selftests/bpf/progs/verifier_vfs_accept.c (revision af2d6148d2a159e1a0862bce5a2c88c1618a2b27)
1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright (c) 2024 Google LLC. */
3 
4 #include <vmlinux.h>
5 #include <errno.h>
6 #include <bpf/bpf_helpers.h>
7 #include <bpf/bpf_tracing.h>
8 
9 #include "bpf_misc.h"
10 #include "bpf_experimental.h"
11 
12 static char buf[64];
13 
14 SEC("lsm.s/file_open")
15 __success
16 int BPF_PROG(get_task_exe_file_and_put_kfunc_from_current_sleepable)
17 {
18 	struct file *acquired;
19 
20 	acquired = bpf_get_task_exe_file(bpf_get_current_task_btf());
21 	if (!acquired)
22 		return 0;
23 
24 	bpf_put_file(acquired);
25 	return 0;
26 }
27 
28 SEC("lsm/file_open")
29 __success
30 int BPF_PROG(get_task_exe_file_and_put_kfunc_from_current_non_sleepable, struct file *file)
31 {
32 	struct file *acquired;
33 
34 	acquired = bpf_get_task_exe_file(bpf_get_current_task_btf());
35 	if (!acquired)
36 		return 0;
37 
38 	bpf_put_file(acquired);
39 	return 0;
40 }
41 
42 SEC("lsm.s/task_alloc")
43 __success
44 int BPF_PROG(get_task_exe_file_and_put_kfunc_from_argument,
45 	     struct task_struct *task)
46 {
47 	struct file *acquired;
48 
49 	acquired = bpf_get_task_exe_file(task);
50 	if (!acquired)
51 		return 0;
52 
53 	bpf_put_file(acquired);
54 	return 0;
55 }
56 
57 SEC("lsm.s/inode_getattr")
58 __success
59 int BPF_PROG(path_d_path_from_path_argument, struct path *path)
60 {
61 	int ret;
62 
63 	ret = bpf_path_d_path(path, buf, sizeof(buf));
64 	__sink(ret);
65 	return 0;
66 }
67 
68 SEC("lsm.s/file_open")
69 __success
70 int BPF_PROG(path_d_path_from_file_argument, struct file *file)
71 {
72 	int ret;
73 	struct path *path;
74 
75 	/* The f_path member is a path which is embedded directly within a
76 	 * file. Therefore, a pointer to such embedded members are still
77 	 * recognized by the BPF verifier as being PTR_TRUSTED as it's
78 	 * essentially PTR_TRUSTED w/ a non-zero fixed offset.
79 	 */
80 	path = &file->f_path;
81 	ret = bpf_path_d_path(path, buf, sizeof(buf));
82 	__sink(ret);
83 	return 0;
84 }
85 
86 SEC("lsm.s/inode_rename")
87 __success
88 int BPF_PROG(inode_rename, struct inode *old_dir, struct dentry *old_dentry,
89 	     struct inode *new_dir, struct dentry *new_dentry,
90 	     unsigned int flags)
91 {
92 	struct inode *inode = new_dentry->d_inode;
93 	ino_t ino;
94 
95 	if (!inode)
96 		return 0;
97 	ino = inode->i_ino;
98 	if (ino == 0)
99 		return -EACCES;
100 	return 0;
101 }
102 
103 char _license[] SEC("license") = "GPL";
104