xref: /linux/tools/testing/selftests/bpf/verifier/wide_access.c (revision 17cfcb68af3bc7d5e8ae08779b1853310a2949f3)
1 #define BPF_SOCK_ADDR_STORE(field, off, res, err) \
2 { \
3 	"wide store to bpf_sock_addr." #field "[" #off "]", \
4 	.insns = { \
5 	BPF_MOV64_IMM(BPF_REG_0, 1), \
6 	BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, \
7 		    offsetof(struct bpf_sock_addr, field[off])), \
8 	BPF_EXIT_INSN(), \
9 	}, \
10 	.result = res, \
11 	.prog_type = BPF_PROG_TYPE_CGROUP_SOCK_ADDR, \
12 	.expected_attach_type = BPF_CGROUP_UDP6_SENDMSG, \
13 	.errstr = err, \
14 }
15 
16 /* user_ip6[0] is u64 aligned */
17 BPF_SOCK_ADDR_STORE(user_ip6, 0, ACCEPT,
18 		    NULL),
19 BPF_SOCK_ADDR_STORE(user_ip6, 1, REJECT,
20 		    "invalid bpf_context access off=12 size=8"),
21 BPF_SOCK_ADDR_STORE(user_ip6, 2, ACCEPT,
22 		    NULL),
23 BPF_SOCK_ADDR_STORE(user_ip6, 3, REJECT,
24 		    "invalid bpf_context access off=20 size=8"),
25 
26 /* msg_src_ip6[0] is _not_ u64 aligned */
27 BPF_SOCK_ADDR_STORE(msg_src_ip6, 0, REJECT,
28 		    "invalid bpf_context access off=44 size=8"),
29 BPF_SOCK_ADDR_STORE(msg_src_ip6, 1, ACCEPT,
30 		    NULL),
31 BPF_SOCK_ADDR_STORE(msg_src_ip6, 2, REJECT,
32 		    "invalid bpf_context access off=52 size=8"),
33 BPF_SOCK_ADDR_STORE(msg_src_ip6, 3, REJECT,
34 		    "invalid bpf_context access off=56 size=8"),
35 
36 #undef BPF_SOCK_ADDR_STORE
37 
38 #define BPF_SOCK_ADDR_LOAD(field, off, res, err) \
39 { \
40 	"wide load from bpf_sock_addr." #field "[" #off "]", \
41 	.insns = { \
42 	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, \
43 		    offsetof(struct bpf_sock_addr, field[off])), \
44 	BPF_MOV64_IMM(BPF_REG_0, 1), \
45 	BPF_EXIT_INSN(), \
46 	}, \
47 	.result = res, \
48 	.prog_type = BPF_PROG_TYPE_CGROUP_SOCK_ADDR, \
49 	.expected_attach_type = BPF_CGROUP_UDP6_SENDMSG, \
50 	.errstr = err, \
51 }
52 
53 /* user_ip6[0] is u64 aligned */
54 BPF_SOCK_ADDR_LOAD(user_ip6, 0, ACCEPT,
55 		   NULL),
56 BPF_SOCK_ADDR_LOAD(user_ip6, 1, REJECT,
57 		   "invalid bpf_context access off=12 size=8"),
58 BPF_SOCK_ADDR_LOAD(user_ip6, 2, ACCEPT,
59 		   NULL),
60 BPF_SOCK_ADDR_LOAD(user_ip6, 3, REJECT,
61 		   "invalid bpf_context access off=20 size=8"),
62 
63 /* msg_src_ip6[0] is _not_ u64 aligned */
64 BPF_SOCK_ADDR_LOAD(msg_src_ip6, 0, REJECT,
65 		   "invalid bpf_context access off=44 size=8"),
66 BPF_SOCK_ADDR_LOAD(msg_src_ip6, 1, ACCEPT,
67 		   NULL),
68 BPF_SOCK_ADDR_LOAD(msg_src_ip6, 2, REJECT,
69 		   "invalid bpf_context access off=52 size=8"),
70 BPF_SOCK_ADDR_LOAD(msg_src_ip6, 3, REJECT,
71 		   "invalid bpf_context access off=56 size=8"),
72 
73 #undef BPF_SOCK_ADDR_LOAD
74