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