xref: /OK3568_Linux_fs/kernel/tools/testing/selftests/bpf/verifier/ctx_sk_lookup.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 {
2 	"valid 1,2,4,8-byte reads from bpf_sk_lookup",
3 	.insns = {
4 		/* 1-byte read from family field */
5 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
6 			    offsetof(struct bpf_sk_lookup, family)),
7 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
8 			    offsetof(struct bpf_sk_lookup, family) + 1),
9 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
10 			    offsetof(struct bpf_sk_lookup, family) + 2),
11 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
12 			    offsetof(struct bpf_sk_lookup, family) + 3),
13 		/* 2-byte read from family field */
14 		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
15 			    offsetof(struct bpf_sk_lookup, family)),
16 		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
17 			    offsetof(struct bpf_sk_lookup, family) + 2),
18 		/* 4-byte read from family field */
19 		BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
20 			    offsetof(struct bpf_sk_lookup, family)),
21 
22 		/* 1-byte read from protocol field */
23 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
24 			    offsetof(struct bpf_sk_lookup, protocol)),
25 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
26 			    offsetof(struct bpf_sk_lookup, protocol) + 1),
27 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
28 			    offsetof(struct bpf_sk_lookup, protocol) + 2),
29 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
30 			    offsetof(struct bpf_sk_lookup, protocol) + 3),
31 		/* 2-byte read from protocol field */
32 		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
33 			    offsetof(struct bpf_sk_lookup, protocol)),
34 		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
35 			    offsetof(struct bpf_sk_lookup, protocol) + 2),
36 		/* 4-byte read from protocol field */
37 		BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
38 			    offsetof(struct bpf_sk_lookup, protocol)),
39 
40 		/* 1-byte read from remote_ip4 field */
41 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
42 			    offsetof(struct bpf_sk_lookup, remote_ip4)),
43 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
44 			    offsetof(struct bpf_sk_lookup, remote_ip4) + 1),
45 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
46 			    offsetof(struct bpf_sk_lookup, remote_ip4) + 2),
47 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
48 			    offsetof(struct bpf_sk_lookup, remote_ip4) + 3),
49 		/* 2-byte read from remote_ip4 field */
50 		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
51 			    offsetof(struct bpf_sk_lookup, remote_ip4)),
52 		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
53 			    offsetof(struct bpf_sk_lookup, remote_ip4) + 2),
54 		/* 4-byte read from remote_ip4 field */
55 		BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
56 			    offsetof(struct bpf_sk_lookup, remote_ip4)),
57 
58 		/* 1-byte read from remote_ip6 field */
59 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
60 			    offsetof(struct bpf_sk_lookup, remote_ip6)),
61 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
62 			    offsetof(struct bpf_sk_lookup, remote_ip6) + 1),
63 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
64 			    offsetof(struct bpf_sk_lookup, remote_ip6) + 2),
65 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
66 			    offsetof(struct bpf_sk_lookup, remote_ip6) + 3),
67 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
68 			    offsetof(struct bpf_sk_lookup, remote_ip6) + 4),
69 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
70 			    offsetof(struct bpf_sk_lookup, remote_ip6) + 5),
71 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
72 			    offsetof(struct bpf_sk_lookup, remote_ip6) + 6),
73 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
74 			    offsetof(struct bpf_sk_lookup, remote_ip6) + 7),
75 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
76 			    offsetof(struct bpf_sk_lookup, remote_ip6) + 8),
77 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
78 			    offsetof(struct bpf_sk_lookup, remote_ip6) + 9),
79 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
80 			    offsetof(struct bpf_sk_lookup, remote_ip6) + 10),
81 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
82 			    offsetof(struct bpf_sk_lookup, remote_ip6) + 11),
83 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
84 			    offsetof(struct bpf_sk_lookup, remote_ip6) + 12),
85 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
86 			    offsetof(struct bpf_sk_lookup, remote_ip6) + 13),
87 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
88 			    offsetof(struct bpf_sk_lookup, remote_ip6) + 14),
89 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
90 			    offsetof(struct bpf_sk_lookup, remote_ip6) + 15),
91 		/* 2-byte read from remote_ip6 field */
92 		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
93 			    offsetof(struct bpf_sk_lookup, remote_ip6)),
94 		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
95 			    offsetof(struct bpf_sk_lookup, remote_ip6) + 2),
96 		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
97 			    offsetof(struct bpf_sk_lookup, remote_ip6) + 4),
98 		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
99 			    offsetof(struct bpf_sk_lookup, remote_ip6) + 6),
100 		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
101 			    offsetof(struct bpf_sk_lookup, remote_ip6) + 8),
102 		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
103 			    offsetof(struct bpf_sk_lookup, remote_ip6) + 10),
104 		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
105 			    offsetof(struct bpf_sk_lookup, remote_ip6) + 12),
106 		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
107 			    offsetof(struct bpf_sk_lookup, remote_ip6) + 14),
108 		/* 4-byte read from remote_ip6 field */
109 		BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
110 			    offsetof(struct bpf_sk_lookup, remote_ip6)),
111 		BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
112 			    offsetof(struct bpf_sk_lookup, remote_ip6) + 4),
113 		BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
114 			    offsetof(struct bpf_sk_lookup, remote_ip6) + 8),
115 		BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
116 			    offsetof(struct bpf_sk_lookup, remote_ip6) + 12),
117 
118 		/* 1-byte read from remote_port field */
119 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
120 			    offsetof(struct bpf_sk_lookup, remote_port)),
121 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
122 			    offsetof(struct bpf_sk_lookup, remote_port) + 1),
123 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
124 			    offsetof(struct bpf_sk_lookup, remote_port) + 2),
125 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
126 			    offsetof(struct bpf_sk_lookup, remote_port) + 3),
127 		/* 2-byte read from remote_port field */
128 		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
129 			    offsetof(struct bpf_sk_lookup, remote_port)),
130 		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
131 			    offsetof(struct bpf_sk_lookup, remote_port) + 2),
132 		/* 4-byte read from remote_port field */
133 		BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
134 			    offsetof(struct bpf_sk_lookup, remote_port)),
135 
136 		/* 1-byte read from local_ip4 field */
137 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
138 			    offsetof(struct bpf_sk_lookup, local_ip4)),
139 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
140 			    offsetof(struct bpf_sk_lookup, local_ip4) + 1),
141 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
142 			    offsetof(struct bpf_sk_lookup, local_ip4) + 2),
143 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
144 			    offsetof(struct bpf_sk_lookup, local_ip4) + 3),
145 		/* 2-byte read from local_ip4 field */
146 		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
147 			    offsetof(struct bpf_sk_lookup, local_ip4)),
148 		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
149 			    offsetof(struct bpf_sk_lookup, local_ip4) + 2),
150 		/* 4-byte read from local_ip4 field */
151 		BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
152 			    offsetof(struct bpf_sk_lookup, local_ip4)),
153 
154 		/* 1-byte read from local_ip6 field */
155 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
156 			    offsetof(struct bpf_sk_lookup, local_ip6)),
157 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
158 			    offsetof(struct bpf_sk_lookup, local_ip6) + 1),
159 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
160 			    offsetof(struct bpf_sk_lookup, local_ip6) + 2),
161 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
162 			    offsetof(struct bpf_sk_lookup, local_ip6) + 3),
163 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
164 			    offsetof(struct bpf_sk_lookup, local_ip6) + 4),
165 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
166 			    offsetof(struct bpf_sk_lookup, local_ip6) + 5),
167 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
168 			    offsetof(struct bpf_sk_lookup, local_ip6) + 6),
169 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
170 			    offsetof(struct bpf_sk_lookup, local_ip6) + 7),
171 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
172 			    offsetof(struct bpf_sk_lookup, local_ip6) + 8),
173 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
174 			    offsetof(struct bpf_sk_lookup, local_ip6) + 9),
175 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
176 			    offsetof(struct bpf_sk_lookup, local_ip6) + 10),
177 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
178 			    offsetof(struct bpf_sk_lookup, local_ip6) + 11),
179 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
180 			    offsetof(struct bpf_sk_lookup, local_ip6) + 12),
181 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
182 			    offsetof(struct bpf_sk_lookup, local_ip6) + 13),
183 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
184 			    offsetof(struct bpf_sk_lookup, local_ip6) + 14),
185 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
186 			    offsetof(struct bpf_sk_lookup, local_ip6) + 15),
187 		/* 2-byte read from local_ip6 field */
188 		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
189 			    offsetof(struct bpf_sk_lookup, local_ip6)),
190 		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
191 			    offsetof(struct bpf_sk_lookup, local_ip6) + 2),
192 		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
193 			    offsetof(struct bpf_sk_lookup, local_ip6) + 4),
194 		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
195 			    offsetof(struct bpf_sk_lookup, local_ip6) + 6),
196 		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
197 			    offsetof(struct bpf_sk_lookup, local_ip6) + 8),
198 		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
199 			    offsetof(struct bpf_sk_lookup, local_ip6) + 10),
200 		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
201 			    offsetof(struct bpf_sk_lookup, local_ip6) + 12),
202 		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
203 			    offsetof(struct bpf_sk_lookup, local_ip6) + 14),
204 		/* 4-byte read from local_ip6 field */
205 		BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
206 			    offsetof(struct bpf_sk_lookup, local_ip6)),
207 		BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
208 			    offsetof(struct bpf_sk_lookup, local_ip6) + 4),
209 		BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
210 			    offsetof(struct bpf_sk_lookup, local_ip6) + 8),
211 		BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
212 			    offsetof(struct bpf_sk_lookup, local_ip6) + 12),
213 
214 		/* 1-byte read from local_port field */
215 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
216 			    offsetof(struct bpf_sk_lookup, local_port)),
217 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
218 			    offsetof(struct bpf_sk_lookup, local_port) + 1),
219 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
220 			    offsetof(struct bpf_sk_lookup, local_port) + 2),
221 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
222 			    offsetof(struct bpf_sk_lookup, local_port) + 3),
223 		/* 2-byte read from local_port field */
224 		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
225 			    offsetof(struct bpf_sk_lookup, local_port)),
226 		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
227 			    offsetof(struct bpf_sk_lookup, local_port) + 2),
228 		/* 4-byte read from local_port field */
229 		BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
230 			    offsetof(struct bpf_sk_lookup, local_port)),
231 
232 		/* 8-byte read from sk field */
233 		BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1,
234 			    offsetof(struct bpf_sk_lookup, sk)),
235 
236 		BPF_MOV32_IMM(BPF_REG_0, 0),
237 		BPF_EXIT_INSN(),
238 	},
239 	.result = ACCEPT,
240 	.prog_type = BPF_PROG_TYPE_SK_LOOKUP,
241 	.expected_attach_type = BPF_SK_LOOKUP,
242 	.runs = -1,
243 },
244 /* invalid 8-byte reads from a 4-byte fields in bpf_sk_lookup */
245 {
246 	"invalid 8-byte read from bpf_sk_lookup family field",
247 	.insns = {
248 		BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1,
249 			    offsetof(struct bpf_sk_lookup, family)),
250 		BPF_MOV32_IMM(BPF_REG_0, 0),
251 		BPF_EXIT_INSN(),
252 	},
253 	.errstr = "invalid bpf_context access",
254 	.result = REJECT,
255 	.prog_type = BPF_PROG_TYPE_SK_LOOKUP,
256 	.expected_attach_type = BPF_SK_LOOKUP,
257 },
258 {
259 	"invalid 8-byte read from bpf_sk_lookup protocol field",
260 	.insns = {
261 		BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1,
262 			    offsetof(struct bpf_sk_lookup, protocol)),
263 		BPF_MOV32_IMM(BPF_REG_0, 0),
264 		BPF_EXIT_INSN(),
265 	},
266 	.errstr = "invalid bpf_context access",
267 	.result = REJECT,
268 	.prog_type = BPF_PROG_TYPE_SK_LOOKUP,
269 	.expected_attach_type = BPF_SK_LOOKUP,
270 },
271 {
272 	"invalid 8-byte read from bpf_sk_lookup remote_ip4 field",
273 	.insns = {
274 		BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1,
275 			    offsetof(struct bpf_sk_lookup, remote_ip4)),
276 		BPF_MOV32_IMM(BPF_REG_0, 0),
277 		BPF_EXIT_INSN(),
278 	},
279 	.errstr = "invalid bpf_context access",
280 	.result = REJECT,
281 	.prog_type = BPF_PROG_TYPE_SK_LOOKUP,
282 	.expected_attach_type = BPF_SK_LOOKUP,
283 },
284 {
285 	"invalid 8-byte read from bpf_sk_lookup remote_ip6 field",
286 	.insns = {
287 		BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1,
288 			    offsetof(struct bpf_sk_lookup, remote_ip6)),
289 		BPF_MOV32_IMM(BPF_REG_0, 0),
290 		BPF_EXIT_INSN(),
291 	},
292 	.errstr = "invalid bpf_context access",
293 	.result = REJECT,
294 	.prog_type = BPF_PROG_TYPE_SK_LOOKUP,
295 	.expected_attach_type = BPF_SK_LOOKUP,
296 },
297 {
298 	"invalid 8-byte read from bpf_sk_lookup remote_port field",
299 	.insns = {
300 		BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1,
301 			    offsetof(struct bpf_sk_lookup, remote_port)),
302 		BPF_MOV32_IMM(BPF_REG_0, 0),
303 		BPF_EXIT_INSN(),
304 	},
305 	.errstr = "invalid bpf_context access",
306 	.result = REJECT,
307 	.prog_type = BPF_PROG_TYPE_SK_LOOKUP,
308 	.expected_attach_type = BPF_SK_LOOKUP,
309 },
310 {
311 	"invalid 8-byte read from bpf_sk_lookup local_ip4 field",
312 	.insns = {
313 		BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1,
314 			    offsetof(struct bpf_sk_lookup, local_ip4)),
315 		BPF_MOV32_IMM(BPF_REG_0, 0),
316 		BPF_EXIT_INSN(),
317 	},
318 	.errstr = "invalid bpf_context access",
319 	.result = REJECT,
320 	.prog_type = BPF_PROG_TYPE_SK_LOOKUP,
321 	.expected_attach_type = BPF_SK_LOOKUP,
322 },
323 {
324 	"invalid 8-byte read from bpf_sk_lookup local_ip6 field",
325 	.insns = {
326 		BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1,
327 			    offsetof(struct bpf_sk_lookup, local_ip6)),
328 		BPF_MOV32_IMM(BPF_REG_0, 0),
329 		BPF_EXIT_INSN(),
330 	},
331 	.errstr = "invalid bpf_context access",
332 	.result = REJECT,
333 	.prog_type = BPF_PROG_TYPE_SK_LOOKUP,
334 	.expected_attach_type = BPF_SK_LOOKUP,
335 },
336 {
337 	"invalid 8-byte read from bpf_sk_lookup local_port field",
338 	.insns = {
339 		BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1,
340 			    offsetof(struct bpf_sk_lookup, local_port)),
341 		BPF_MOV32_IMM(BPF_REG_0, 0),
342 		BPF_EXIT_INSN(),
343 	},
344 	.errstr = "invalid bpf_context access",
345 	.result = REJECT,
346 	.prog_type = BPF_PROG_TYPE_SK_LOOKUP,
347 	.expected_attach_type = BPF_SK_LOOKUP,
348 },
349 /* invalid 1,2,4-byte reads from 8-byte fields in bpf_sk_lookup */
350 {
351 	"invalid 4-byte read from bpf_sk_lookup sk field",
352 	.insns = {
353 		BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
354 			    offsetof(struct bpf_sk_lookup, sk)),
355 		BPF_MOV32_IMM(BPF_REG_0, 0),
356 		BPF_EXIT_INSN(),
357 	},
358 	.errstr = "invalid bpf_context access",
359 	.result = REJECT,
360 	.prog_type = BPF_PROG_TYPE_SK_LOOKUP,
361 	.expected_attach_type = BPF_SK_LOOKUP,
362 },
363 {
364 	"invalid 2-byte read from bpf_sk_lookup sk field",
365 	.insns = {
366 		BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
367 			    offsetof(struct bpf_sk_lookup, sk)),
368 		BPF_MOV32_IMM(BPF_REG_0, 0),
369 		BPF_EXIT_INSN(),
370 	},
371 	.errstr = "invalid bpf_context access",
372 	.result = REJECT,
373 	.prog_type = BPF_PROG_TYPE_SK_LOOKUP,
374 	.expected_attach_type = BPF_SK_LOOKUP,
375 },
376 {
377 	"invalid 1-byte read from bpf_sk_lookup sk field",
378 	.insns = {
379 		BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
380 			    offsetof(struct bpf_sk_lookup, sk)),
381 		BPF_MOV32_IMM(BPF_REG_0, 0),
382 		BPF_EXIT_INSN(),
383 	},
384 	.errstr = "invalid bpf_context access",
385 	.result = REJECT,
386 	.prog_type = BPF_PROG_TYPE_SK_LOOKUP,
387 	.expected_attach_type = BPF_SK_LOOKUP,
388 },
389 /* out of bounds and unaligned reads from bpf_sk_lookup */
390 {
391 	"invalid 4-byte read past end of bpf_sk_lookup",
392 	.insns = {
393 		BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
394 			    sizeof(struct bpf_sk_lookup)),
395 		BPF_MOV32_IMM(BPF_REG_0, 0),
396 		BPF_EXIT_INSN(),
397 	},
398 	.errstr = "invalid bpf_context access",
399 	.result = REJECT,
400 	.prog_type = BPF_PROG_TYPE_SK_LOOKUP,
401 	.expected_attach_type = BPF_SK_LOOKUP,
402 },
403 {
404 	"invalid 4-byte unaligned read from bpf_sk_lookup at odd offset",
405 	.insns = {
406 		BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1),
407 		BPF_MOV32_IMM(BPF_REG_0, 0),
408 		BPF_EXIT_INSN(),
409 	},
410 	.errstr = "invalid bpf_context access",
411 	.result = REJECT,
412 	.prog_type = BPF_PROG_TYPE_SK_LOOKUP,
413 	.expected_attach_type = BPF_SK_LOOKUP,
414 },
415 {
416 	"invalid 4-byte unaligned read from bpf_sk_lookup at even offset",
417 	.insns = {
418 		BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 2),
419 		BPF_MOV32_IMM(BPF_REG_0, 0),
420 		BPF_EXIT_INSN(),
421 	},
422 	.errstr = "invalid bpf_context access",
423 	.result = REJECT,
424 	.prog_type = BPF_PROG_TYPE_SK_LOOKUP,
425 	.expected_attach_type = BPF_SK_LOOKUP,
426 },
427 /* in-bound and out-of-bound writes to bpf_sk_lookup */
428 {
429 	"invalid 8-byte write to bpf_sk_lookup",
430 	.insns = {
431 		BPF_MOV64_IMM(BPF_REG_0, 0xcafe4a11U),
432 		BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 0),
433 		BPF_MOV32_IMM(BPF_REG_0, 0),
434 		BPF_EXIT_INSN(),
435 	},
436 	.errstr = "invalid bpf_context access",
437 	.result = REJECT,
438 	.prog_type = BPF_PROG_TYPE_SK_LOOKUP,
439 	.expected_attach_type = BPF_SK_LOOKUP,
440 },
441 {
442 	"invalid 4-byte write to bpf_sk_lookup",
443 	.insns = {
444 		BPF_MOV64_IMM(BPF_REG_0, 0xcafe4a11U),
445 		BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0),
446 		BPF_MOV32_IMM(BPF_REG_0, 0),
447 		BPF_EXIT_INSN(),
448 	},
449 	.errstr = "invalid bpf_context access",
450 	.result = REJECT,
451 	.prog_type = BPF_PROG_TYPE_SK_LOOKUP,
452 	.expected_attach_type = BPF_SK_LOOKUP,
453 },
454 {
455 	"invalid 2-byte write to bpf_sk_lookup",
456 	.insns = {
457 		BPF_MOV64_IMM(BPF_REG_0, 0xcafe4a11U),
458 		BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 0),
459 		BPF_MOV32_IMM(BPF_REG_0, 0),
460 		BPF_EXIT_INSN(),
461 	},
462 	.errstr = "invalid bpf_context access",
463 	.result = REJECT,
464 	.prog_type = BPF_PROG_TYPE_SK_LOOKUP,
465 	.expected_attach_type = BPF_SK_LOOKUP,
466 },
467 {
468 	"invalid 1-byte write to bpf_sk_lookup",
469 	.insns = {
470 		BPF_MOV64_IMM(BPF_REG_0, 0xcafe4a11U),
471 		BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0),
472 		BPF_MOV32_IMM(BPF_REG_0, 0),
473 		BPF_EXIT_INSN(),
474 	},
475 	.errstr = "invalid bpf_context access",
476 	.result = REJECT,
477 	.prog_type = BPF_PROG_TYPE_SK_LOOKUP,
478 	.expected_attach_type = BPF_SK_LOOKUP,
479 },
480 {
481 	"invalid 4-byte write past end of bpf_sk_lookup",
482 	.insns = {
483 		BPF_MOV64_IMM(BPF_REG_0, 0xcafe4a11U),
484 		BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0,
485 			    sizeof(struct bpf_sk_lookup)),
486 		BPF_MOV32_IMM(BPF_REG_0, 0),
487 		BPF_EXIT_INSN(),
488 	},
489 	.errstr = "invalid bpf_context access",
490 	.result = REJECT,
491 	.prog_type = BPF_PROG_TYPE_SK_LOOKUP,
492 	.expected_attach_type = BPF_SK_LOOKUP,
493 },
494