treewide: remove redundant IS_ERR() before error code check
[linux/fpc-iii.git] / tools / testing / selftests / bpf / verifier / helper_value_access.c
blob7572e403ddb95693c2afe81bc8cfb978557a663f
2 "helper access to map: full range",
3 .insns = {
4 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
5 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
6 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
7 BPF_LD_MAP_FD(BPF_REG_1, 0),
8 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
9 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
10 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
11 BPF_MOV64_IMM(BPF_REG_2, sizeof(struct test_val)),
12 BPF_MOV64_IMM(BPF_REG_3, 0),
13 BPF_EMIT_CALL(BPF_FUNC_probe_read),
14 BPF_EXIT_INSN(),
16 .fixup_map_hash_48b = { 3 },
17 .result = ACCEPT,
18 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
21 "helper access to map: partial range",
22 .insns = {
23 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
24 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
25 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
26 BPF_LD_MAP_FD(BPF_REG_1, 0),
27 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
28 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
29 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
30 BPF_MOV64_IMM(BPF_REG_2, 8),
31 BPF_MOV64_IMM(BPF_REG_3, 0),
32 BPF_EMIT_CALL(BPF_FUNC_probe_read),
33 BPF_EXIT_INSN(),
35 .fixup_map_hash_48b = { 3 },
36 .result = ACCEPT,
37 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
40 "helper access to map: empty range",
41 .insns = {
42 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
43 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
44 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
45 BPF_LD_MAP_FD(BPF_REG_1, 0),
46 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
47 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3),
48 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
49 BPF_MOV64_IMM(BPF_REG_2, 0),
50 BPF_EMIT_CALL(BPF_FUNC_trace_printk),
51 BPF_EXIT_INSN(),
53 .fixup_map_hash_48b = { 3 },
54 .errstr = "invalid access to map value, value_size=48 off=0 size=0",
55 .result = REJECT,
56 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
59 "helper access to map: out-of-bound range",
60 .insns = {
61 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
62 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
63 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
64 BPF_LD_MAP_FD(BPF_REG_1, 0),
65 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
66 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
67 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
68 BPF_MOV64_IMM(BPF_REG_2, sizeof(struct test_val) + 8),
69 BPF_MOV64_IMM(BPF_REG_3, 0),
70 BPF_EMIT_CALL(BPF_FUNC_probe_read),
71 BPF_EXIT_INSN(),
73 .fixup_map_hash_48b = { 3 },
74 .errstr = "invalid access to map value, value_size=48 off=0 size=56",
75 .result = REJECT,
76 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
79 "helper access to map: negative range",
80 .insns = {
81 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
82 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
83 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
84 BPF_LD_MAP_FD(BPF_REG_1, 0),
85 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
86 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
87 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
88 BPF_MOV64_IMM(BPF_REG_2, -8),
89 BPF_MOV64_IMM(BPF_REG_3, 0),
90 BPF_EMIT_CALL(BPF_FUNC_probe_read),
91 BPF_EXIT_INSN(),
93 .fixup_map_hash_48b = { 3 },
94 .errstr = "R2 min value is negative",
95 .result = REJECT,
96 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
99 "helper access to adjusted map (via const imm): full range",
100 .insns = {
101 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
102 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
103 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
104 BPF_LD_MAP_FD(BPF_REG_1, 0),
105 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
106 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
107 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
108 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, offsetof(struct test_val, foo)),
109 BPF_MOV64_IMM(BPF_REG_2,
110 sizeof(struct test_val) - offsetof(struct test_val, foo)),
111 BPF_MOV64_IMM(BPF_REG_3, 0),
112 BPF_EMIT_CALL(BPF_FUNC_probe_read),
113 BPF_EXIT_INSN(),
115 .fixup_map_hash_48b = { 3 },
116 .result = ACCEPT,
117 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
120 "helper access to adjusted map (via const imm): partial range",
121 .insns = {
122 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
123 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
124 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
125 BPF_LD_MAP_FD(BPF_REG_1, 0),
126 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
127 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
128 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
129 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, offsetof(struct test_val, foo)),
130 BPF_MOV64_IMM(BPF_REG_2, 8),
131 BPF_MOV64_IMM(BPF_REG_3, 0),
132 BPF_EMIT_CALL(BPF_FUNC_probe_read),
133 BPF_EXIT_INSN(),
135 .fixup_map_hash_48b = { 3 },
136 .result = ACCEPT,
137 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
140 "helper access to adjusted map (via const imm): empty range",
141 .insns = {
142 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
143 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
144 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
145 BPF_LD_MAP_FD(BPF_REG_1, 0),
146 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
147 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
148 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
149 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, offsetof(struct test_val, foo)),
150 BPF_MOV64_IMM(BPF_REG_2, 0),
151 BPF_EMIT_CALL(BPF_FUNC_trace_printk),
152 BPF_EXIT_INSN(),
154 .fixup_map_hash_48b = { 3 },
155 .errstr = "invalid access to map value, value_size=48 off=4 size=0",
156 .result = REJECT,
157 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
160 "helper access to adjusted map (via const imm): out-of-bound range",
161 .insns = {
162 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
163 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
164 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
165 BPF_LD_MAP_FD(BPF_REG_1, 0),
166 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
167 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
168 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
169 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, offsetof(struct test_val, foo)),
170 BPF_MOV64_IMM(BPF_REG_2,
171 sizeof(struct test_val) - offsetof(struct test_val, foo) + 8),
172 BPF_MOV64_IMM(BPF_REG_3, 0),
173 BPF_EMIT_CALL(BPF_FUNC_probe_read),
174 BPF_EXIT_INSN(),
176 .fixup_map_hash_48b = { 3 },
177 .errstr = "invalid access to map value, value_size=48 off=4 size=52",
178 .result = REJECT,
179 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
182 "helper access to adjusted map (via const imm): negative range (> adjustment)",
183 .insns = {
184 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
185 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
186 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
187 BPF_LD_MAP_FD(BPF_REG_1, 0),
188 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
189 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
190 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
191 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, offsetof(struct test_val, foo)),
192 BPF_MOV64_IMM(BPF_REG_2, -8),
193 BPF_MOV64_IMM(BPF_REG_3, 0),
194 BPF_EMIT_CALL(BPF_FUNC_probe_read),
195 BPF_EXIT_INSN(),
197 .fixup_map_hash_48b = { 3 },
198 .errstr = "R2 min value is negative",
199 .result = REJECT,
200 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
203 "helper access to adjusted map (via const imm): negative range (< adjustment)",
204 .insns = {
205 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
206 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
207 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
208 BPF_LD_MAP_FD(BPF_REG_1, 0),
209 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
210 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
211 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
212 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, offsetof(struct test_val, foo)),
213 BPF_MOV64_IMM(BPF_REG_2, -1),
214 BPF_MOV64_IMM(BPF_REG_3, 0),
215 BPF_EMIT_CALL(BPF_FUNC_probe_read),
216 BPF_EXIT_INSN(),
218 .fixup_map_hash_48b = { 3 },
219 .errstr = "R2 min value is negative",
220 .result = REJECT,
221 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
224 "helper access to adjusted map (via const reg): full range",
225 .insns = {
226 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
227 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
228 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
229 BPF_LD_MAP_FD(BPF_REG_1, 0),
230 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
231 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
232 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
233 BPF_MOV64_IMM(BPF_REG_3, offsetof(struct test_val, foo)),
234 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
235 BPF_MOV64_IMM(BPF_REG_2,
236 sizeof(struct test_val) - offsetof(struct test_val, foo)),
237 BPF_MOV64_IMM(BPF_REG_3, 0),
238 BPF_EMIT_CALL(BPF_FUNC_probe_read),
239 BPF_EXIT_INSN(),
241 .fixup_map_hash_48b = { 3 },
242 .result = ACCEPT,
243 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
246 "helper access to adjusted map (via const reg): partial range",
247 .insns = {
248 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
249 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
250 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
251 BPF_LD_MAP_FD(BPF_REG_1, 0),
252 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
253 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
254 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
255 BPF_MOV64_IMM(BPF_REG_3, offsetof(struct test_val, foo)),
256 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
257 BPF_MOV64_IMM(BPF_REG_2, 8),
258 BPF_MOV64_IMM(BPF_REG_3, 0),
259 BPF_EMIT_CALL(BPF_FUNC_probe_read),
260 BPF_EXIT_INSN(),
262 .fixup_map_hash_48b = { 3 },
263 .result = ACCEPT,
264 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
267 "helper access to adjusted map (via const reg): empty range",
268 .insns = {
269 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
270 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
271 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
272 BPF_LD_MAP_FD(BPF_REG_1, 0),
273 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
274 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
275 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
276 BPF_MOV64_IMM(BPF_REG_3, 0),
277 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
278 BPF_MOV64_IMM(BPF_REG_2, 0),
279 BPF_EMIT_CALL(BPF_FUNC_trace_printk),
280 BPF_EXIT_INSN(),
282 .fixup_map_hash_48b = { 3 },
283 .errstr = "R1 min value is outside of the array range",
284 .result = REJECT,
285 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
288 "helper access to adjusted map (via const reg): out-of-bound range",
289 .insns = {
290 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
291 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
292 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
293 BPF_LD_MAP_FD(BPF_REG_1, 0),
294 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
295 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
296 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
297 BPF_MOV64_IMM(BPF_REG_3, offsetof(struct test_val, foo)),
298 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
299 BPF_MOV64_IMM(BPF_REG_2,
300 sizeof(struct test_val) -
301 offsetof(struct test_val, foo) + 8),
302 BPF_MOV64_IMM(BPF_REG_3, 0),
303 BPF_EMIT_CALL(BPF_FUNC_probe_read),
304 BPF_EXIT_INSN(),
306 .fixup_map_hash_48b = { 3 },
307 .errstr = "invalid access to map value, value_size=48 off=4 size=52",
308 .result = REJECT,
309 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
312 "helper access to adjusted map (via const reg): negative range (> adjustment)",
313 .insns = {
314 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
315 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
316 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
317 BPF_LD_MAP_FD(BPF_REG_1, 0),
318 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
319 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
320 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
321 BPF_MOV64_IMM(BPF_REG_3, offsetof(struct test_val, foo)),
322 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
323 BPF_MOV64_IMM(BPF_REG_2, -8),
324 BPF_MOV64_IMM(BPF_REG_3, 0),
325 BPF_EMIT_CALL(BPF_FUNC_probe_read),
326 BPF_EXIT_INSN(),
328 .fixup_map_hash_48b = { 3 },
329 .errstr = "R2 min value is negative",
330 .result = REJECT,
331 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
334 "helper access to adjusted map (via const reg): negative range (< adjustment)",
335 .insns = {
336 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
337 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
338 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
339 BPF_LD_MAP_FD(BPF_REG_1, 0),
340 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
341 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
342 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
343 BPF_MOV64_IMM(BPF_REG_3, offsetof(struct test_val, foo)),
344 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
345 BPF_MOV64_IMM(BPF_REG_2, -1),
346 BPF_MOV64_IMM(BPF_REG_3, 0),
347 BPF_EMIT_CALL(BPF_FUNC_probe_read),
348 BPF_EXIT_INSN(),
350 .fixup_map_hash_48b = { 3 },
351 .errstr = "R2 min value is negative",
352 .result = REJECT,
353 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
356 "helper access to adjusted map (via variable): full range",
357 .insns = {
358 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
359 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
360 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
361 BPF_LD_MAP_FD(BPF_REG_1, 0),
362 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
363 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7),
364 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
365 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
366 BPF_JMP_IMM(BPF_JGT, BPF_REG_3, offsetof(struct test_val, foo), 4),
367 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
368 BPF_MOV64_IMM(BPF_REG_2,
369 sizeof(struct test_val) - offsetof(struct test_val, foo)),
370 BPF_MOV64_IMM(BPF_REG_3, 0),
371 BPF_EMIT_CALL(BPF_FUNC_probe_read),
372 BPF_EXIT_INSN(),
374 .fixup_map_hash_48b = { 3 },
375 .result = ACCEPT,
376 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
379 "helper access to adjusted map (via variable): partial range",
380 .insns = {
381 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
382 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
383 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
384 BPF_LD_MAP_FD(BPF_REG_1, 0),
385 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
386 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7),
387 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
388 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
389 BPF_JMP_IMM(BPF_JGT, BPF_REG_3, offsetof(struct test_val, foo), 4),
390 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
391 BPF_MOV64_IMM(BPF_REG_2, 8),
392 BPF_MOV64_IMM(BPF_REG_3, 0),
393 BPF_EMIT_CALL(BPF_FUNC_probe_read),
394 BPF_EXIT_INSN(),
396 .fixup_map_hash_48b = { 3 },
397 .result = ACCEPT,
398 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
401 "helper access to adjusted map (via variable): empty range",
402 .insns = {
403 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
404 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
405 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
406 BPF_LD_MAP_FD(BPF_REG_1, 0),
407 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
408 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
409 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
410 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
411 BPF_JMP_IMM(BPF_JGT, BPF_REG_3, offsetof(struct test_val, foo), 3),
412 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
413 BPF_MOV64_IMM(BPF_REG_2, 0),
414 BPF_EMIT_CALL(BPF_FUNC_trace_printk),
415 BPF_EXIT_INSN(),
417 .fixup_map_hash_48b = { 3 },
418 .errstr = "R1 min value is outside of the array range",
419 .result = REJECT,
420 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
423 "helper access to adjusted map (via variable): no max check",
424 .insns = {
425 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
426 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
427 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
428 BPF_LD_MAP_FD(BPF_REG_1, 0),
429 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
430 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
431 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
432 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
433 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
434 BPF_MOV64_IMM(BPF_REG_2, 1),
435 BPF_MOV64_IMM(BPF_REG_3, 0),
436 BPF_EMIT_CALL(BPF_FUNC_probe_read),
437 BPF_EXIT_INSN(),
439 .fixup_map_hash_48b = { 3 },
440 .errstr = "R1 unbounded memory access",
441 .result = REJECT,
442 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
445 "helper access to adjusted map (via variable): wrong max check",
446 .insns = {
447 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
448 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
449 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
450 BPF_LD_MAP_FD(BPF_REG_1, 0),
451 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
452 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7),
453 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
454 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
455 BPF_JMP_IMM(BPF_JGT, BPF_REG_3, offsetof(struct test_val, foo), 4),
456 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
457 BPF_MOV64_IMM(BPF_REG_2,
458 sizeof(struct test_val) -
459 offsetof(struct test_val, foo) + 1),
460 BPF_MOV64_IMM(BPF_REG_3, 0),
461 BPF_EMIT_CALL(BPF_FUNC_probe_read),
462 BPF_EXIT_INSN(),
464 .fixup_map_hash_48b = { 3 },
465 .errstr = "invalid access to map value, value_size=48 off=4 size=45",
466 .result = REJECT,
467 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
470 "helper access to map: bounds check using <, good access",
471 .insns = {
472 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
473 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
474 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
475 BPF_LD_MAP_FD(BPF_REG_1, 0),
476 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
477 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
478 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
479 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
480 BPF_JMP_IMM(BPF_JLT, BPF_REG_3, 32, 2),
481 BPF_MOV64_IMM(BPF_REG_0, 0),
482 BPF_EXIT_INSN(),
483 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
484 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0),
485 BPF_MOV64_IMM(BPF_REG_0, 0),
486 BPF_EXIT_INSN(),
488 .fixup_map_hash_48b = { 3 },
489 .result = ACCEPT,
490 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
493 "helper access to map: bounds check using <, bad access",
494 .insns = {
495 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
496 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
497 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
498 BPF_LD_MAP_FD(BPF_REG_1, 0),
499 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
500 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
501 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
502 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
503 BPF_JMP_IMM(BPF_JLT, BPF_REG_3, 32, 4),
504 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
505 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0),
506 BPF_MOV64_IMM(BPF_REG_0, 0),
507 BPF_EXIT_INSN(),
508 BPF_MOV64_IMM(BPF_REG_0, 0),
509 BPF_EXIT_INSN(),
511 .fixup_map_hash_48b = { 3 },
512 .result = REJECT,
513 .errstr = "R1 unbounded memory access",
514 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
517 "helper access to map: bounds check using <=, good access",
518 .insns = {
519 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
520 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
521 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
522 BPF_LD_MAP_FD(BPF_REG_1, 0),
523 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
524 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
525 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
526 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
527 BPF_JMP_IMM(BPF_JLE, BPF_REG_3, 32, 2),
528 BPF_MOV64_IMM(BPF_REG_0, 0),
529 BPF_EXIT_INSN(),
530 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
531 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0),
532 BPF_MOV64_IMM(BPF_REG_0, 0),
533 BPF_EXIT_INSN(),
535 .fixup_map_hash_48b = { 3 },
536 .result = ACCEPT,
537 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
540 "helper access to map: bounds check using <=, bad access",
541 .insns = {
542 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
543 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
544 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
545 BPF_LD_MAP_FD(BPF_REG_1, 0),
546 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
547 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
548 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
549 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
550 BPF_JMP_IMM(BPF_JLE, BPF_REG_3, 32, 4),
551 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
552 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0),
553 BPF_MOV64_IMM(BPF_REG_0, 0),
554 BPF_EXIT_INSN(),
555 BPF_MOV64_IMM(BPF_REG_0, 0),
556 BPF_EXIT_INSN(),
558 .fixup_map_hash_48b = { 3 },
559 .result = REJECT,
560 .errstr = "R1 unbounded memory access",
561 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
564 "helper access to map: bounds check using s<, good access",
565 .insns = {
566 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
567 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
568 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
569 BPF_LD_MAP_FD(BPF_REG_1, 0),
570 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
571 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
572 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
573 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
574 BPF_JMP_IMM(BPF_JSLT, BPF_REG_3, 32, 2),
575 BPF_MOV64_IMM(BPF_REG_0, 0),
576 BPF_EXIT_INSN(),
577 BPF_JMP_IMM(BPF_JSLT, BPF_REG_3, 0, -3),
578 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
579 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0),
580 BPF_MOV64_IMM(BPF_REG_0, 0),
581 BPF_EXIT_INSN(),
583 .fixup_map_hash_48b = { 3 },
584 .result = ACCEPT,
585 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
588 "helper access to map: bounds check using s<, good access 2",
589 .insns = {
590 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
591 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
592 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
593 BPF_LD_MAP_FD(BPF_REG_1, 0),
594 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
595 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
596 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
597 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
598 BPF_JMP_IMM(BPF_JSLT, BPF_REG_3, 32, 2),
599 BPF_MOV64_IMM(BPF_REG_0, 0),
600 BPF_EXIT_INSN(),
601 BPF_JMP_IMM(BPF_JSLT, BPF_REG_3, -3, -3),
602 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
603 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0),
604 BPF_MOV64_IMM(BPF_REG_0, 0),
605 BPF_EXIT_INSN(),
607 .fixup_map_hash_48b = { 3 },
608 .result = ACCEPT,
609 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
612 "helper access to map: bounds check using s<, bad access",
613 .insns = {
614 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
615 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
616 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
617 BPF_LD_MAP_FD(BPF_REG_1, 0),
618 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
619 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
620 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
621 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_0, 0),
622 BPF_JMP_IMM(BPF_JSLT, BPF_REG_3, 32, 2),
623 BPF_MOV64_IMM(BPF_REG_0, 0),
624 BPF_EXIT_INSN(),
625 BPF_JMP_IMM(BPF_JSLT, BPF_REG_3, -3, -3),
626 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
627 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0),
628 BPF_MOV64_IMM(BPF_REG_0, 0),
629 BPF_EXIT_INSN(),
631 .fixup_map_hash_48b = { 3 },
632 .result = REJECT,
633 .errstr = "R1 min value is negative",
634 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
637 "helper access to map: bounds check using s<=, good access",
638 .insns = {
639 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
640 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
641 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
642 BPF_LD_MAP_FD(BPF_REG_1, 0),
643 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
644 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
645 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
646 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
647 BPF_JMP_IMM(BPF_JSLE, BPF_REG_3, 32, 2),
648 BPF_MOV64_IMM(BPF_REG_0, 0),
649 BPF_EXIT_INSN(),
650 BPF_JMP_IMM(BPF_JSLE, BPF_REG_3, 0, -3),
651 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
652 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0),
653 BPF_MOV64_IMM(BPF_REG_0, 0),
654 BPF_EXIT_INSN(),
656 .fixup_map_hash_48b = { 3 },
657 .result = ACCEPT,
658 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
661 "helper access to map: bounds check using s<=, good access 2",
662 .insns = {
663 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
664 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
665 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
666 BPF_LD_MAP_FD(BPF_REG_1, 0),
667 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
668 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
669 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
670 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
671 BPF_JMP_IMM(BPF_JSLE, BPF_REG_3, 32, 2),
672 BPF_MOV64_IMM(BPF_REG_0, 0),
673 BPF_EXIT_INSN(),
674 BPF_JMP_IMM(BPF_JSLE, BPF_REG_3, -3, -3),
675 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
676 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0),
677 BPF_MOV64_IMM(BPF_REG_0, 0),
678 BPF_EXIT_INSN(),
680 .fixup_map_hash_48b = { 3 },
681 .result = ACCEPT,
682 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
685 "helper access to map: bounds check using s<=, bad access",
686 .insns = {
687 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
688 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
689 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
690 BPF_LD_MAP_FD(BPF_REG_1, 0),
691 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
692 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
693 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
694 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_0, 0),
695 BPF_JMP_IMM(BPF_JSLE, BPF_REG_3, 32, 2),
696 BPF_MOV64_IMM(BPF_REG_0, 0),
697 BPF_EXIT_INSN(),
698 BPF_JMP_IMM(BPF_JSLE, BPF_REG_3, -3, -3),
699 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
700 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0),
701 BPF_MOV64_IMM(BPF_REG_0, 0),
702 BPF_EXIT_INSN(),
704 .fixup_map_hash_48b = { 3 },
705 .result = REJECT,
706 .errstr = "R1 min value is negative",
707 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
710 "map lookup helper access to map",
711 .insns = {
712 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
713 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
714 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
715 BPF_LD_MAP_FD(BPF_REG_1, 0),
716 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
717 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
718 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
719 BPF_LD_MAP_FD(BPF_REG_1, 0),
720 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
721 BPF_EXIT_INSN(),
723 .fixup_map_hash_16b = { 3, 8 },
724 .result = ACCEPT,
725 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
728 "map update helper access to map",
729 .insns = {
730 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
731 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
732 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
733 BPF_LD_MAP_FD(BPF_REG_1, 0),
734 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
735 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
736 BPF_MOV64_IMM(BPF_REG_4, 0),
737 BPF_MOV64_REG(BPF_REG_3, BPF_REG_0),
738 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
739 BPF_LD_MAP_FD(BPF_REG_1, 0),
740 BPF_EMIT_CALL(BPF_FUNC_map_update_elem),
741 BPF_EXIT_INSN(),
743 .fixup_map_hash_16b = { 3, 10 },
744 .result = ACCEPT,
745 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
748 "map update helper access to map: wrong size",
749 .insns = {
750 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
751 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
752 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
753 BPF_LD_MAP_FD(BPF_REG_1, 0),
754 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
755 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
756 BPF_MOV64_IMM(BPF_REG_4, 0),
757 BPF_MOV64_REG(BPF_REG_3, BPF_REG_0),
758 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
759 BPF_LD_MAP_FD(BPF_REG_1, 0),
760 BPF_EMIT_CALL(BPF_FUNC_map_update_elem),
761 BPF_EXIT_INSN(),
763 .fixup_map_hash_8b = { 3 },
764 .fixup_map_hash_16b = { 10 },
765 .result = REJECT,
766 .errstr = "invalid access to map value, value_size=8 off=0 size=16",
767 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
770 "map helper access to adjusted map (via const imm)",
771 .insns = {
772 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
773 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
774 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
775 BPF_LD_MAP_FD(BPF_REG_1, 0),
776 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
777 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
778 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
779 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, offsetof(struct other_val, bar)),
780 BPF_LD_MAP_FD(BPF_REG_1, 0),
781 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
782 BPF_EXIT_INSN(),
784 .fixup_map_hash_16b = { 3, 9 },
785 .result = ACCEPT,
786 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
789 "map helper access to adjusted map (via const imm): out-of-bound 1",
790 .insns = {
791 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
792 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
793 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
794 BPF_LD_MAP_FD(BPF_REG_1, 0),
795 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
796 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
797 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
798 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, sizeof(struct other_val) - 4),
799 BPF_LD_MAP_FD(BPF_REG_1, 0),
800 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
801 BPF_EXIT_INSN(),
803 .fixup_map_hash_16b = { 3, 9 },
804 .result = REJECT,
805 .errstr = "invalid access to map value, value_size=16 off=12 size=8",
806 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
809 "map helper access to adjusted map (via const imm): out-of-bound 2",
810 .insns = {
811 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
812 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
813 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
814 BPF_LD_MAP_FD(BPF_REG_1, 0),
815 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
816 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
817 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
818 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
819 BPF_LD_MAP_FD(BPF_REG_1, 0),
820 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
821 BPF_EXIT_INSN(),
823 .fixup_map_hash_16b = { 3, 9 },
824 .result = REJECT,
825 .errstr = "invalid access to map value, value_size=16 off=-4 size=8",
826 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
829 "map helper access to adjusted map (via const reg)",
830 .insns = {
831 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
832 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
833 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
834 BPF_LD_MAP_FD(BPF_REG_1, 0),
835 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
836 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
837 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
838 BPF_MOV64_IMM(BPF_REG_3, offsetof(struct other_val, bar)),
839 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_3),
840 BPF_LD_MAP_FD(BPF_REG_1, 0),
841 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
842 BPF_EXIT_INSN(),
844 .fixup_map_hash_16b = { 3, 10 },
845 .result = ACCEPT,
846 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
849 "map helper access to adjusted map (via const reg): out-of-bound 1",
850 .insns = {
851 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
852 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
853 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
854 BPF_LD_MAP_FD(BPF_REG_1, 0),
855 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
856 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
857 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
858 BPF_MOV64_IMM(BPF_REG_3, sizeof(struct other_val) - 4),
859 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_3),
860 BPF_LD_MAP_FD(BPF_REG_1, 0),
861 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
862 BPF_EXIT_INSN(),
864 .fixup_map_hash_16b = { 3, 10 },
865 .result = REJECT,
866 .errstr = "invalid access to map value, value_size=16 off=12 size=8",
867 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
870 "map helper access to adjusted map (via const reg): out-of-bound 2",
871 .insns = {
872 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
873 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
874 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
875 BPF_LD_MAP_FD(BPF_REG_1, 0),
876 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
877 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
878 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
879 BPF_MOV64_IMM(BPF_REG_3, -4),
880 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_3),
881 BPF_LD_MAP_FD(BPF_REG_1, 0),
882 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
883 BPF_EXIT_INSN(),
885 .fixup_map_hash_16b = { 3, 10 },
886 .result = REJECT,
887 .errstr = "invalid access to map value, value_size=16 off=-4 size=8",
888 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
891 "map helper access to adjusted map (via variable)",
892 .insns = {
893 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
894 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
895 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
896 BPF_LD_MAP_FD(BPF_REG_1, 0),
897 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
898 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7),
899 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
900 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
901 BPF_JMP_IMM(BPF_JGT, BPF_REG_3, offsetof(struct other_val, bar), 4),
902 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_3),
903 BPF_LD_MAP_FD(BPF_REG_1, 0),
904 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
905 BPF_EXIT_INSN(),
907 .fixup_map_hash_16b = { 3, 11 },
908 .result = ACCEPT,
909 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
912 "map helper access to adjusted map (via variable): no max check",
913 .insns = {
914 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
915 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
916 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
917 BPF_LD_MAP_FD(BPF_REG_1, 0),
918 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
919 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
920 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
921 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
922 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_3),
923 BPF_LD_MAP_FD(BPF_REG_1, 0),
924 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
925 BPF_EXIT_INSN(),
927 .fixup_map_hash_16b = { 3, 10 },
928 .result = REJECT,
929 .errstr = "R2 unbounded memory access, make sure to bounds check any array access into a map",
930 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
933 "map helper access to adjusted map (via variable): wrong max check",
934 .insns = {
935 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
936 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
937 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
938 BPF_LD_MAP_FD(BPF_REG_1, 0),
939 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
940 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7),
941 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
942 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
943 BPF_JMP_IMM(BPF_JGT, BPF_REG_3, offsetof(struct other_val, bar) + 1, 4),
944 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_3),
945 BPF_LD_MAP_FD(BPF_REG_1, 0),
946 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
947 BPF_EXIT_INSN(),
949 .fixup_map_hash_16b = { 3, 11 },
950 .result = REJECT,
951 .errstr = "invalid access to map value, value_size=16 off=9 size=8",
952 .prog_type = BPF_PROG_TYPE_TRACEPOINT,