xref: /linux/tools/testing/selftests/bpf/progs/sock_read_xattr.c (revision de03b17ec046d81c4713bc54306579b9024fc513)
1*d717b7e8SChristian Brauner // SPDX-License-Identifier: GPL-2.0
2*d717b7e8SChristian Brauner /* Copyright (c) 2026 Christian Brauner */
3*d717b7e8SChristian Brauner 
4*d717b7e8SChristian Brauner #include <vmlinux.h>
5*d717b7e8SChristian Brauner #include <bpf/bpf_tracing.h>
6*d717b7e8SChristian Brauner #include <bpf/bpf_helpers.h>
7*d717b7e8SChristian Brauner #include <bpf/bpf_core_read.h>
8*d717b7e8SChristian Brauner #include "bpf_experimental.h"
9*d717b7e8SChristian Brauner #include "bpf_misc.h"
10*d717b7e8SChristian Brauner 
11*d717b7e8SChristian Brauner char _license[] SEC("license") = "GPL";
12*d717b7e8SChristian Brauner 
13*d717b7e8SChristian Brauner char value[16];
14*d717b7e8SChristian Brauner int read_ret = -1;
15*d717b7e8SChristian Brauner __u32 monitored_pid = 0;
16*d717b7e8SChristian Brauner 
17*d717b7e8SChristian Brauner static __always_inline void read_xattr(struct socket *sock)
18*d717b7e8SChristian Brauner {
19*d717b7e8SChristian Brauner 	struct bpf_dynptr value_ptr;
20*d717b7e8SChristian Brauner 
21*d717b7e8SChristian Brauner 	bpf_dynptr_from_mem(value, sizeof(value), 0, &value_ptr);
22*d717b7e8SChristian Brauner 	bpf_sock_read_xattr(sock, "user.bpf_test", &value_ptr);
23*d717b7e8SChristian Brauner }
24*d717b7e8SChristian Brauner 
25*d717b7e8SChristian Brauner SEC("lsm.s/socket_connect")
26*d717b7e8SChristian Brauner __success
27*d717b7e8SChristian Brauner int BPF_PROG(trusted_sock_ptr_sleepable, struct socket *sock)
28*d717b7e8SChristian Brauner {
29*d717b7e8SChristian Brauner 	read_xattr(sock);
30*d717b7e8SChristian Brauner 	return 0;
31*d717b7e8SChristian Brauner }
32*d717b7e8SChristian Brauner 
33*d717b7e8SChristian Brauner SEC("lsm/socket_connect")
34*d717b7e8SChristian Brauner __success
35*d717b7e8SChristian Brauner int BPF_PROG(trusted_sock_ptr_non_sleepable, struct socket *sock)
36*d717b7e8SChristian Brauner {
37*d717b7e8SChristian Brauner 	read_xattr(sock);
38*d717b7e8SChristian Brauner 	return 0;
39*d717b7e8SChristian Brauner }
40*d717b7e8SChristian Brauner 
41*d717b7e8SChristian Brauner SEC("lsm.s/socket_connect")
42*d717b7e8SChristian Brauner __success
43*d717b7e8SChristian Brauner int BPF_PROG(read_sock_xattr, struct socket *sock)
44*d717b7e8SChristian Brauner {
45*d717b7e8SChristian Brauner 	struct bpf_dynptr value_ptr;
46*d717b7e8SChristian Brauner 	__u32 pid = bpf_get_current_pid_tgid() >> 32;
47*d717b7e8SChristian Brauner 
48*d717b7e8SChristian Brauner 	if (pid != monitored_pid)
49*d717b7e8SChristian Brauner 		return 0;
50*d717b7e8SChristian Brauner 
51*d717b7e8SChristian Brauner 	bpf_dynptr_from_mem(value, sizeof(value), 0, &value_ptr);
52*d717b7e8SChristian Brauner 	read_ret = bpf_sock_read_xattr(sock, "user.bpf_test", &value_ptr);
53*d717b7e8SChristian Brauner 	return 0;
54*d717b7e8SChristian Brauner }
55