2 * Testsuite for eBPF verifier
4 * Copyright (c) 2014 PLUMgrid, http://plumgrid.com
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of version 2 of the GNU General Public
8 * License as published by the Free Software Foundation.
21 #include <sys/capability.h>
22 #include <sys/resource.h>
24 #include <linux/unistd.h>
25 #include <linux/filter.h>
26 #include <linux/bpf_perf_event.h>
27 #include <linux/bpf.h>
31 #include "../../../include/linux/filter.h"
34 # define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
42 struct bpf_insn insns
[MAX_INSNS
];
43 int fixup_map1
[MAX_FIXUPS
];
44 int fixup_map2
[MAX_FIXUPS
];
45 int fixup_prog
[MAX_FIXUPS
];
47 const char *errstr_unpriv
;
52 } result
, result_unpriv
;
53 enum bpf_prog_type prog_type
;
56 /* Note we want this to be 64 bit aligned so that the end of our array is
57 * actually the end of the structure.
59 #define MAX_ENTRIES 11
66 static struct bpf_test tests
[] = {
70 BPF_MOV64_IMM(BPF_REG_1
, 1),
71 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_1
, 2),
72 BPF_MOV64_IMM(BPF_REG_2
, 3),
73 BPF_ALU64_REG(BPF_SUB
, BPF_REG_1
, BPF_REG_2
),
74 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_1
, -1),
75 BPF_ALU64_IMM(BPF_MUL
, BPF_REG_1
, 3),
76 BPF_MOV64_REG(BPF_REG_0
, BPF_REG_1
),
87 .errstr
= "unreachable",
93 BPF_JMP_IMM(BPF_JA
, 0, 0, 1),
94 BPF_JMP_IMM(BPF_JA
, 0, 0, 0),
97 .errstr
= "unreachable",
103 BPF_JMP_IMM(BPF_JA
, 0, 0, 1),
106 .errstr
= "jump out of range",
110 "out of range jump2",
112 BPF_JMP_IMM(BPF_JA
, 0, 0, -2),
115 .errstr
= "jump out of range",
121 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, 0, 1),
122 BPF_LD_IMM64(BPF_REG_0
, 0),
123 BPF_LD_IMM64(BPF_REG_0
, 0),
124 BPF_LD_IMM64(BPF_REG_0
, 1),
125 BPF_LD_IMM64(BPF_REG_0
, 1),
126 BPF_MOV64_IMM(BPF_REG_0
, 2),
129 .errstr
= "invalid BPF_LD_IMM insn",
130 .errstr_unpriv
= "R1 pointer comparison",
136 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, 0, 1),
137 BPF_LD_IMM64(BPF_REG_0
, 0),
138 BPF_LD_IMM64(BPF_REG_0
, 0),
139 BPF_LD_IMM64(BPF_REG_0
, 1),
140 BPF_LD_IMM64(BPF_REG_0
, 1),
143 .errstr
= "invalid BPF_LD_IMM insn",
144 .errstr_unpriv
= "R1 pointer comparison",
150 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, 0, 1),
151 BPF_RAW_INSN(BPF_LD
| BPF_IMM
| BPF_DW
, 0, 0, 0, 0),
152 BPF_LD_IMM64(BPF_REG_0
, 0),
153 BPF_LD_IMM64(BPF_REG_0
, 0),
154 BPF_LD_IMM64(BPF_REG_0
, 1),
155 BPF_LD_IMM64(BPF_REG_0
, 1),
158 .errstr
= "invalid bpf_ld_imm64 insn",
164 BPF_RAW_INSN(BPF_LD
| BPF_IMM
| BPF_DW
, 0, 0, 0, 0),
167 .errstr
= "invalid bpf_ld_imm64 insn",
173 BPF_RAW_INSN(BPF_LD
| BPF_IMM
| BPF_DW
, 0, 0, 0, 0),
175 .errstr
= "invalid bpf_ld_imm64 insn",
181 BPF_ALU64_REG(BPF_MOV
, BPF_REG_0
, BPF_REG_2
),
183 .errstr
= "jump out of range",
189 BPF_JMP_IMM(BPF_JA
, 0, 0, -1),
192 .errstr
= "back-edge",
198 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_0
),
199 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_0
),
200 BPF_MOV64_REG(BPF_REG_3
, BPF_REG_0
),
201 BPF_JMP_IMM(BPF_JA
, 0, 0, -4),
204 .errstr
= "back-edge",
210 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_0
),
211 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_0
),
212 BPF_MOV64_REG(BPF_REG_3
, BPF_REG_0
),
213 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, 0, -3),
216 .errstr
= "back-edge",
220 "read uninitialized register",
222 BPF_MOV64_REG(BPF_REG_0
, BPF_REG_2
),
225 .errstr
= "R2 !read_ok",
229 "read invalid register",
231 BPF_MOV64_REG(BPF_REG_0
, -1),
234 .errstr
= "R15 is invalid",
238 "program doesn't init R0 before exit",
240 BPF_ALU64_REG(BPF_MOV
, BPF_REG_2
, BPF_REG_1
),
243 .errstr
= "R0 !read_ok",
247 "program doesn't init R0 before exit in all branches",
249 BPF_JMP_IMM(BPF_JGE
, BPF_REG_1
, 0, 2),
250 BPF_MOV64_IMM(BPF_REG_0
, 1),
251 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_0
, 2),
254 .errstr
= "R0 !read_ok",
255 .errstr_unpriv
= "R1 pointer comparison",
259 "stack out of bounds",
261 BPF_ST_MEM(BPF_DW
, BPF_REG_10
, 8, 0),
264 .errstr
= "invalid stack",
268 "invalid call insn1",
270 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
| BPF_X
, 0, 0, 0, 0),
273 .errstr
= "BPF_CALL uses reserved",
277 "invalid call insn2",
279 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 1, 0),
282 .errstr
= "BPF_CALL uses reserved",
286 "invalid function call",
288 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0, 1234567),
291 .errstr
= "invalid func unknown#1234567",
295 "uninitialized stack1",
297 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
298 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
299 BPF_LD_MAP_FD(BPF_REG_1
, 0),
300 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
301 BPF_FUNC_map_lookup_elem
),
305 .errstr
= "invalid indirect read from stack",
309 "uninitialized stack2",
311 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
312 BPF_LDX_MEM(BPF_DW
, BPF_REG_0
, BPF_REG_2
, -8),
315 .errstr
= "invalid read from stack",
319 "invalid argument register",
321 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
322 BPF_FUNC_get_cgroup_classid
),
323 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
324 BPF_FUNC_get_cgroup_classid
),
327 .errstr
= "R1 !read_ok",
329 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
,
332 "non-invalid argument register",
334 BPF_ALU64_REG(BPF_MOV
, BPF_REG_6
, BPF_REG_1
),
335 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
336 BPF_FUNC_get_cgroup_classid
),
337 BPF_ALU64_REG(BPF_MOV
, BPF_REG_1
, BPF_REG_6
),
338 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
339 BPF_FUNC_get_cgroup_classid
),
343 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
,
346 "check valid spill/fill",
348 /* spill R1(ctx) into stack */
349 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_1
, -8),
350 /* fill it back into R2 */
351 BPF_LDX_MEM(BPF_DW
, BPF_REG_2
, BPF_REG_10
, -8),
352 /* should be able to access R0 = *(R2 + 8) */
353 /* BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_2, 8), */
354 BPF_MOV64_REG(BPF_REG_0
, BPF_REG_2
),
357 .errstr_unpriv
= "R0 leaks addr",
359 .result_unpriv
= REJECT
,
362 "check valid spill/fill, skb mark",
364 BPF_ALU64_REG(BPF_MOV
, BPF_REG_6
, BPF_REG_1
),
365 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_6
, -8),
366 BPF_LDX_MEM(BPF_DW
, BPF_REG_0
, BPF_REG_10
, -8),
367 BPF_LDX_MEM(BPF_W
, BPF_REG_0
, BPF_REG_0
,
368 offsetof(struct __sk_buff
, mark
)),
372 .result_unpriv
= ACCEPT
,
375 "check corrupted spill/fill",
377 /* spill R1(ctx) into stack */
378 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_1
, -8),
379 /* mess up with R1 pointer on stack */
380 BPF_ST_MEM(BPF_B
, BPF_REG_10
, -7, 0x23),
381 /* fill back into R0 should fail */
382 BPF_LDX_MEM(BPF_DW
, BPF_REG_0
, BPF_REG_10
, -8),
385 .errstr_unpriv
= "attempt to corrupt spilled",
386 .errstr
= "corrupted spill",
390 "invalid src register in STX",
392 BPF_STX_MEM(BPF_B
, BPF_REG_10
, -1, -1),
395 .errstr
= "R15 is invalid",
399 "invalid dst register in STX",
401 BPF_STX_MEM(BPF_B
, 14, BPF_REG_10
, -1),
404 .errstr
= "R14 is invalid",
408 "invalid dst register in ST",
410 BPF_ST_MEM(BPF_B
, 14, -1, -1),
413 .errstr
= "R14 is invalid",
417 "invalid src register in LDX",
419 BPF_LDX_MEM(BPF_B
, BPF_REG_0
, 12, 0),
422 .errstr
= "R12 is invalid",
426 "invalid dst register in LDX",
428 BPF_LDX_MEM(BPF_B
, 11, BPF_REG_1
, 0),
431 .errstr
= "R11 is invalid",
437 BPF_RAW_INSN(0, 0, 0, 0, 0),
440 .errstr
= "invalid BPF_LD_IMM",
446 BPF_RAW_INSN(1, 0, 0, 0, 0),
449 .errstr
= "BPF_LDX uses reserved fields",
455 BPF_RAW_INSN(-1, 0, 0, 0, 0),
458 .errstr
= "invalid BPF_ALU opcode f0",
464 BPF_RAW_INSN(-1, -1, -1, -1, -1),
467 .errstr
= "invalid BPF_ALU opcode f0",
473 BPF_RAW_INSN(0x7f, -1, -1, -1, -1),
476 .errstr
= "BPF_ALU uses reserved fields",
480 "misaligned read from stack",
482 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
483 BPF_LDX_MEM(BPF_DW
, BPF_REG_0
, BPF_REG_2
, -4),
486 .errstr
= "misaligned access",
490 "invalid map_fd for function call",
492 BPF_ST_MEM(BPF_DW
, BPF_REG_10
, -8, 0),
493 BPF_ALU64_REG(BPF_MOV
, BPF_REG_2
, BPF_REG_10
),
494 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
495 BPF_LD_MAP_FD(BPF_REG_1
, 0),
496 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
497 BPF_FUNC_map_delete_elem
),
500 .errstr
= "fd 0 is not pointing to valid bpf_map",
504 "don't check return value before access",
506 BPF_ST_MEM(BPF_DW
, BPF_REG_10
, -8, 0),
507 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
508 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
509 BPF_LD_MAP_FD(BPF_REG_1
, 0),
510 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
511 BPF_FUNC_map_lookup_elem
),
512 BPF_ST_MEM(BPF_DW
, BPF_REG_0
, 0, 0),
516 .errstr
= "R0 invalid mem access 'map_value_or_null'",
520 "access memory with incorrect alignment",
522 BPF_ST_MEM(BPF_DW
, BPF_REG_10
, -8, 0),
523 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
524 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
525 BPF_LD_MAP_FD(BPF_REG_1
, 0),
526 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
527 BPF_FUNC_map_lookup_elem
),
528 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_0
, 0, 1),
529 BPF_ST_MEM(BPF_DW
, BPF_REG_0
, 4, 0),
533 .errstr
= "misaligned access",
537 "sometimes access memory with incorrect alignment",
539 BPF_ST_MEM(BPF_DW
, BPF_REG_10
, -8, 0),
540 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
541 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
542 BPF_LD_MAP_FD(BPF_REG_1
, 0),
543 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
544 BPF_FUNC_map_lookup_elem
),
545 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_0
, 0, 2),
546 BPF_ST_MEM(BPF_DW
, BPF_REG_0
, 0, 0),
548 BPF_ST_MEM(BPF_DW
, BPF_REG_0
, 0, 1),
552 .errstr
= "R0 invalid mem access",
553 .errstr_unpriv
= "R0 leaks addr",
559 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
560 BPF_STX_MEM(BPF_DW
, BPF_REG_2
, BPF_REG_1
, -8),
561 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, 0, 1),
562 BPF_ST_MEM(BPF_DW
, BPF_REG_2
, -8, 0),
563 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, 1, 1),
564 BPF_ST_MEM(BPF_DW
, BPF_REG_2
, -16, 1),
565 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, 2, 1),
566 BPF_ST_MEM(BPF_DW
, BPF_REG_2
, -8, 2),
567 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, 3, 1),
568 BPF_ST_MEM(BPF_DW
, BPF_REG_2
, -16, 3),
569 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, 4, 1),
570 BPF_ST_MEM(BPF_DW
, BPF_REG_2
, -8, 4),
571 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, 5, 1),
572 BPF_ST_MEM(BPF_DW
, BPF_REG_2
, -32, 5),
573 BPF_MOV64_IMM(BPF_REG_0
, 0),
576 .errstr_unpriv
= "R1 pointer comparison",
577 .result_unpriv
= REJECT
,
583 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
584 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, 0, 2),
585 BPF_ST_MEM(BPF_DW
, BPF_REG_2
, -8, 0),
586 BPF_JMP_IMM(BPF_JA
, 0, 0, 14),
587 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, 1, 2),
588 BPF_ST_MEM(BPF_DW
, BPF_REG_2
, -16, 0),
589 BPF_JMP_IMM(BPF_JA
, 0, 0, 11),
590 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, 2, 2),
591 BPF_ST_MEM(BPF_DW
, BPF_REG_2
, -32, 0),
592 BPF_JMP_IMM(BPF_JA
, 0, 0, 8),
593 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, 3, 2),
594 BPF_ST_MEM(BPF_DW
, BPF_REG_2
, -40, 0),
595 BPF_JMP_IMM(BPF_JA
, 0, 0, 5),
596 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, 4, 2),
597 BPF_ST_MEM(BPF_DW
, BPF_REG_2
, -48, 0),
598 BPF_JMP_IMM(BPF_JA
, 0, 0, 2),
599 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, 5, 1),
600 BPF_ST_MEM(BPF_DW
, BPF_REG_2
, -56, 0),
601 BPF_MOV64_IMM(BPF_REG_0
, 0),
604 .errstr_unpriv
= "R1 pointer comparison",
605 .result_unpriv
= REJECT
,
611 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
612 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, 0, 3),
613 BPF_ST_MEM(BPF_DW
, BPF_REG_2
, -8, 0),
614 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
615 BPF_JMP_IMM(BPF_JA
, 0, 0, 19),
616 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, 1, 3),
617 BPF_ST_MEM(BPF_DW
, BPF_REG_2
, -16, 0),
618 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -16),
619 BPF_JMP_IMM(BPF_JA
, 0, 0, 15),
620 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, 2, 3),
621 BPF_ST_MEM(BPF_DW
, BPF_REG_2
, -32, 0),
622 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -32),
623 BPF_JMP_IMM(BPF_JA
, 0, 0, 11),
624 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, 3, 3),
625 BPF_ST_MEM(BPF_DW
, BPF_REG_2
, -40, 0),
626 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -40),
627 BPF_JMP_IMM(BPF_JA
, 0, 0, 7),
628 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, 4, 3),
629 BPF_ST_MEM(BPF_DW
, BPF_REG_2
, -48, 0),
630 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -48),
631 BPF_JMP_IMM(BPF_JA
, 0, 0, 3),
632 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, 5, 0),
633 BPF_ST_MEM(BPF_DW
, BPF_REG_2
, -56, 0),
634 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -56),
635 BPF_LD_MAP_FD(BPF_REG_1
, 0),
636 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
637 BPF_FUNC_map_delete_elem
),
640 .fixup_map1
= { 24 },
641 .errstr_unpriv
= "R1 pointer comparison",
642 .result_unpriv
= REJECT
,
648 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, BPF_REG_10
, 1),
649 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, BPF_REG_10
, 2),
650 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, BPF_REG_10
, 3),
651 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, BPF_REG_10
, 4),
652 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, BPF_REG_10
, 1),
653 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, BPF_REG_10
, 2),
654 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, BPF_REG_10
, 3),
655 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, BPF_REG_10
, 4),
656 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, BPF_REG_10
, 1),
657 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, BPF_REG_10
, 2),
658 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, BPF_REG_10
, 3),
659 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, BPF_REG_10
, 4),
660 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, BPF_REG_10
, 1),
661 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, BPF_REG_10
, 2),
662 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, BPF_REG_10
, 3),
663 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, BPF_REG_10
, 4),
664 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, BPF_REG_10
, 1),
665 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, BPF_REG_10
, 2),
666 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, BPF_REG_10
, 3),
667 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, BPF_REG_10
, 4),
668 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, BPF_REG_10
, 1),
669 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, BPF_REG_10
, 2),
670 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, BPF_REG_10
, 3),
671 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, BPF_REG_10
, 4),
672 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, BPF_REG_10
, 1),
673 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, BPF_REG_10
, 2),
674 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, BPF_REG_10
, 3),
675 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, BPF_REG_10
, 4),
676 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, BPF_REG_10
, 1),
677 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, BPF_REG_10
, 2),
678 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, BPF_REG_10
, 3),
679 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, BPF_REG_10
, 4),
680 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, BPF_REG_10
, 1),
681 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, BPF_REG_10
, 2),
682 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, BPF_REG_10
, 3),
683 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, BPF_REG_10
, 4),
684 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, BPF_REG_10
, 0),
685 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, BPF_REG_10
, 0),
686 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, BPF_REG_10
, 0),
687 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, BPF_REG_10
, 0),
688 BPF_MOV64_IMM(BPF_REG_0
, 0),
691 .errstr_unpriv
= "R1 pointer comparison",
692 .result_unpriv
= REJECT
,
698 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
699 BPF_MOV64_REG(BPF_REG_3
, BPF_REG_2
),
700 BPF_JMP_IMM(BPF_JGE
, BPF_REG_1
, 0, 2),
701 BPF_STX_MEM(BPF_DW
, BPF_REG_2
, BPF_REG_3
, -8),
702 BPF_JMP_IMM(BPF_JA
, 0, 0, 2),
703 BPF_STX_MEM(BPF_DW
, BPF_REG_2
, BPF_REG_2
, -8),
704 BPF_JMP_IMM(BPF_JA
, 0, 0, 0),
705 BPF_MOV64_IMM(BPF_REG_0
, 0),
706 BPF_JMP_IMM(BPF_JGE
, BPF_REG_1
, 0, 2),
707 BPF_STX_MEM(BPF_DW
, BPF_REG_2
, BPF_REG_3
, -8),
708 BPF_JMP_IMM(BPF_JA
, 0, 0, 2),
709 BPF_STX_MEM(BPF_DW
, BPF_REG_2
, BPF_REG_2
, -8),
710 BPF_JMP_IMM(BPF_JA
, 0, 0, 0),
711 BPF_MOV64_IMM(BPF_REG_0
, 0),
712 BPF_JMP_IMM(BPF_JGE
, BPF_REG_1
, 0, 2),
713 BPF_STX_MEM(BPF_DW
, BPF_REG_2
, BPF_REG_3
, -8),
714 BPF_JMP_IMM(BPF_JA
, 0, 0, 2),
715 BPF_STX_MEM(BPF_DW
, BPF_REG_2
, BPF_REG_2
, -8),
716 BPF_JMP_IMM(BPF_JA
, 0, 0, 0),
717 BPF_MOV64_IMM(BPF_REG_0
, 0),
718 BPF_JMP_IMM(BPF_JGE
, BPF_REG_1
, 0, 2),
719 BPF_STX_MEM(BPF_DW
, BPF_REG_2
, BPF_REG_3
, -8),
720 BPF_JMP_IMM(BPF_JA
, 0, 0, 2),
721 BPF_STX_MEM(BPF_DW
, BPF_REG_2
, BPF_REG_2
, -8),
722 BPF_JMP_IMM(BPF_JA
, 0, 0, 0),
723 BPF_MOV64_IMM(BPF_REG_0
, 0),
724 BPF_JMP_IMM(BPF_JGE
, BPF_REG_1
, 0, 2),
725 BPF_STX_MEM(BPF_DW
, BPF_REG_2
, BPF_REG_3
, -8),
726 BPF_JMP_IMM(BPF_JA
, 0, 0, 2),
727 BPF_STX_MEM(BPF_DW
, BPF_REG_2
, BPF_REG_2
, -8),
728 BPF_JMP_IMM(BPF_JA
, 0, 0, 0),
729 BPF_MOV64_IMM(BPF_REG_0
, 0),
732 .errstr_unpriv
= "R1 pointer comparison",
733 .result_unpriv
= REJECT
,
737 "access skb fields ok",
739 BPF_LDX_MEM(BPF_W
, BPF_REG_0
, BPF_REG_1
,
740 offsetof(struct __sk_buff
, len
)),
741 BPF_JMP_IMM(BPF_JGE
, BPF_REG_0
, 0, 1),
742 BPF_LDX_MEM(BPF_W
, BPF_REG_0
, BPF_REG_1
,
743 offsetof(struct __sk_buff
, mark
)),
744 BPF_JMP_IMM(BPF_JGE
, BPF_REG_0
, 0, 1),
745 BPF_LDX_MEM(BPF_W
, BPF_REG_0
, BPF_REG_1
,
746 offsetof(struct __sk_buff
, pkt_type
)),
747 BPF_JMP_IMM(BPF_JGE
, BPF_REG_0
, 0, 1),
748 BPF_LDX_MEM(BPF_W
, BPF_REG_0
, BPF_REG_1
,
749 offsetof(struct __sk_buff
, queue_mapping
)),
750 BPF_JMP_IMM(BPF_JGE
, BPF_REG_0
, 0, 0),
751 BPF_LDX_MEM(BPF_W
, BPF_REG_0
, BPF_REG_1
,
752 offsetof(struct __sk_buff
, protocol
)),
753 BPF_JMP_IMM(BPF_JGE
, BPF_REG_0
, 0, 0),
754 BPF_LDX_MEM(BPF_W
, BPF_REG_0
, BPF_REG_1
,
755 offsetof(struct __sk_buff
, vlan_present
)),
756 BPF_JMP_IMM(BPF_JGE
, BPF_REG_0
, 0, 0),
757 BPF_LDX_MEM(BPF_W
, BPF_REG_0
, BPF_REG_1
,
758 offsetof(struct __sk_buff
, vlan_tci
)),
759 BPF_JMP_IMM(BPF_JGE
, BPF_REG_0
, 0, 0),
765 "access skb fields bad1",
767 BPF_LDX_MEM(BPF_W
, BPF_REG_0
, BPF_REG_1
, -4),
770 .errstr
= "invalid bpf_context access",
774 "access skb fields bad2",
776 BPF_JMP_IMM(BPF_JGE
, BPF_REG_1
, 0, 9),
777 BPF_ST_MEM(BPF_DW
, BPF_REG_10
, -8, 0),
778 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
779 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
780 BPF_LD_MAP_FD(BPF_REG_1
, 0),
781 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
782 BPF_FUNC_map_lookup_elem
),
783 BPF_JMP_IMM(BPF_JNE
, BPF_REG_0
, 0, 1),
785 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_0
),
786 BPF_LDX_MEM(BPF_W
, BPF_REG_0
, BPF_REG_1
,
787 offsetof(struct __sk_buff
, pkt_type
)),
791 .errstr
= "different pointers",
792 .errstr_unpriv
= "R1 pointer comparison",
796 "access skb fields bad3",
798 BPF_JMP_IMM(BPF_JGE
, BPF_REG_1
, 0, 2),
799 BPF_LDX_MEM(BPF_W
, BPF_REG_0
, BPF_REG_1
,
800 offsetof(struct __sk_buff
, pkt_type
)),
802 BPF_ST_MEM(BPF_DW
, BPF_REG_10
, -8, 0),
803 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
804 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
805 BPF_LD_MAP_FD(BPF_REG_1
, 0),
806 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
807 BPF_FUNC_map_lookup_elem
),
808 BPF_JMP_IMM(BPF_JNE
, BPF_REG_0
, 0, 1),
810 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_0
),
811 BPF_JMP_IMM(BPF_JA
, 0, 0, -12),
814 .errstr
= "different pointers",
815 .errstr_unpriv
= "R1 pointer comparison",
819 "access skb fields bad4",
821 BPF_JMP_IMM(BPF_JGE
, BPF_REG_1
, 0, 3),
822 BPF_LDX_MEM(BPF_W
, BPF_REG_1
, BPF_REG_1
,
823 offsetof(struct __sk_buff
, len
)),
824 BPF_MOV64_IMM(BPF_REG_0
, 0),
826 BPF_ST_MEM(BPF_DW
, BPF_REG_10
, -8, 0),
827 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
828 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
829 BPF_LD_MAP_FD(BPF_REG_1
, 0),
830 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
831 BPF_FUNC_map_lookup_elem
),
832 BPF_JMP_IMM(BPF_JNE
, BPF_REG_0
, 0, 1),
834 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_0
),
835 BPF_JMP_IMM(BPF_JA
, 0, 0, -13),
838 .errstr
= "different pointers",
839 .errstr_unpriv
= "R1 pointer comparison",
843 "check skb->mark is not writeable by sockets",
845 BPF_STX_MEM(BPF_W
, BPF_REG_1
, BPF_REG_1
,
846 offsetof(struct __sk_buff
, mark
)),
849 .errstr
= "invalid bpf_context access",
850 .errstr_unpriv
= "R1 leaks addr",
854 "check skb->tc_index is not writeable by sockets",
856 BPF_STX_MEM(BPF_W
, BPF_REG_1
, BPF_REG_1
,
857 offsetof(struct __sk_buff
, tc_index
)),
860 .errstr
= "invalid bpf_context access",
861 .errstr_unpriv
= "R1 leaks addr",
865 "check cb access: byte",
867 BPF_MOV64_IMM(BPF_REG_0
, 0),
868 BPF_STX_MEM(BPF_B
, BPF_REG_1
, BPF_REG_0
,
869 offsetof(struct __sk_buff
, cb
[0])),
870 BPF_STX_MEM(BPF_B
, BPF_REG_1
, BPF_REG_0
,
871 offsetof(struct __sk_buff
, cb
[0]) + 1),
872 BPF_STX_MEM(BPF_B
, BPF_REG_1
, BPF_REG_0
,
873 offsetof(struct __sk_buff
, cb
[0]) + 2),
874 BPF_STX_MEM(BPF_B
, BPF_REG_1
, BPF_REG_0
,
875 offsetof(struct __sk_buff
, cb
[0]) + 3),
876 BPF_STX_MEM(BPF_B
, BPF_REG_1
, BPF_REG_0
,
877 offsetof(struct __sk_buff
, cb
[1])),
878 BPF_STX_MEM(BPF_B
, BPF_REG_1
, BPF_REG_0
,
879 offsetof(struct __sk_buff
, cb
[1]) + 1),
880 BPF_STX_MEM(BPF_B
, BPF_REG_1
, BPF_REG_0
,
881 offsetof(struct __sk_buff
, cb
[1]) + 2),
882 BPF_STX_MEM(BPF_B
, BPF_REG_1
, BPF_REG_0
,
883 offsetof(struct __sk_buff
, cb
[1]) + 3),
884 BPF_STX_MEM(BPF_B
, BPF_REG_1
, BPF_REG_0
,
885 offsetof(struct __sk_buff
, cb
[2])),
886 BPF_STX_MEM(BPF_B
, BPF_REG_1
, BPF_REG_0
,
887 offsetof(struct __sk_buff
, cb
[2]) + 1),
888 BPF_STX_MEM(BPF_B
, BPF_REG_1
, BPF_REG_0
,
889 offsetof(struct __sk_buff
, cb
[2]) + 2),
890 BPF_STX_MEM(BPF_B
, BPF_REG_1
, BPF_REG_0
,
891 offsetof(struct __sk_buff
, cb
[2]) + 3),
892 BPF_STX_MEM(BPF_B
, BPF_REG_1
, BPF_REG_0
,
893 offsetof(struct __sk_buff
, cb
[3])),
894 BPF_STX_MEM(BPF_B
, BPF_REG_1
, BPF_REG_0
,
895 offsetof(struct __sk_buff
, cb
[3]) + 1),
896 BPF_STX_MEM(BPF_B
, BPF_REG_1
, BPF_REG_0
,
897 offsetof(struct __sk_buff
, cb
[3]) + 2),
898 BPF_STX_MEM(BPF_B
, BPF_REG_1
, BPF_REG_0
,
899 offsetof(struct __sk_buff
, cb
[3]) + 3),
900 BPF_STX_MEM(BPF_B
, BPF_REG_1
, BPF_REG_0
,
901 offsetof(struct __sk_buff
, cb
[4])),
902 BPF_STX_MEM(BPF_B
, BPF_REG_1
, BPF_REG_0
,
903 offsetof(struct __sk_buff
, cb
[4]) + 1),
904 BPF_STX_MEM(BPF_B
, BPF_REG_1
, BPF_REG_0
,
905 offsetof(struct __sk_buff
, cb
[4]) + 2),
906 BPF_STX_MEM(BPF_B
, BPF_REG_1
, BPF_REG_0
,
907 offsetof(struct __sk_buff
, cb
[4]) + 3),
908 BPF_LDX_MEM(BPF_B
, BPF_REG_0
, BPF_REG_1
,
909 offsetof(struct __sk_buff
, cb
[0])),
910 BPF_LDX_MEM(BPF_B
, BPF_REG_0
, BPF_REG_1
,
911 offsetof(struct __sk_buff
, cb
[0]) + 1),
912 BPF_LDX_MEM(BPF_B
, BPF_REG_0
, BPF_REG_1
,
913 offsetof(struct __sk_buff
, cb
[0]) + 2),
914 BPF_LDX_MEM(BPF_B
, BPF_REG_0
, BPF_REG_1
,
915 offsetof(struct __sk_buff
, cb
[0]) + 3),
916 BPF_LDX_MEM(BPF_B
, BPF_REG_0
, BPF_REG_1
,
917 offsetof(struct __sk_buff
, cb
[1])),
918 BPF_LDX_MEM(BPF_B
, BPF_REG_0
, BPF_REG_1
,
919 offsetof(struct __sk_buff
, cb
[1]) + 1),
920 BPF_LDX_MEM(BPF_B
, BPF_REG_0
, BPF_REG_1
,
921 offsetof(struct __sk_buff
, cb
[1]) + 2),
922 BPF_LDX_MEM(BPF_B
, BPF_REG_0
, BPF_REG_1
,
923 offsetof(struct __sk_buff
, cb
[1]) + 3),
924 BPF_LDX_MEM(BPF_B
, BPF_REG_0
, BPF_REG_1
,
925 offsetof(struct __sk_buff
, cb
[2])),
926 BPF_LDX_MEM(BPF_B
, BPF_REG_0
, BPF_REG_1
,
927 offsetof(struct __sk_buff
, cb
[2]) + 1),
928 BPF_LDX_MEM(BPF_B
, BPF_REG_0
, BPF_REG_1
,
929 offsetof(struct __sk_buff
, cb
[2]) + 2),
930 BPF_LDX_MEM(BPF_B
, BPF_REG_0
, BPF_REG_1
,
931 offsetof(struct __sk_buff
, cb
[2]) + 3),
932 BPF_LDX_MEM(BPF_B
, BPF_REG_0
, BPF_REG_1
,
933 offsetof(struct __sk_buff
, cb
[3])),
934 BPF_LDX_MEM(BPF_B
, BPF_REG_0
, BPF_REG_1
,
935 offsetof(struct __sk_buff
, cb
[3]) + 1),
936 BPF_LDX_MEM(BPF_B
, BPF_REG_0
, BPF_REG_1
,
937 offsetof(struct __sk_buff
, cb
[3]) + 2),
938 BPF_LDX_MEM(BPF_B
, BPF_REG_0
, BPF_REG_1
,
939 offsetof(struct __sk_buff
, cb
[3]) + 3),
940 BPF_LDX_MEM(BPF_B
, BPF_REG_0
, BPF_REG_1
,
941 offsetof(struct __sk_buff
, cb
[4])),
942 BPF_LDX_MEM(BPF_B
, BPF_REG_0
, BPF_REG_1
,
943 offsetof(struct __sk_buff
, cb
[4]) + 1),
944 BPF_LDX_MEM(BPF_B
, BPF_REG_0
, BPF_REG_1
,
945 offsetof(struct __sk_buff
, cb
[4]) + 2),
946 BPF_LDX_MEM(BPF_B
, BPF_REG_0
, BPF_REG_1
,
947 offsetof(struct __sk_buff
, cb
[4]) + 3),
953 "check cb access: byte, oob 1",
955 BPF_MOV64_IMM(BPF_REG_0
, 0),
956 BPF_STX_MEM(BPF_B
, BPF_REG_1
, BPF_REG_0
,
957 offsetof(struct __sk_buff
, cb
[4]) + 4),
960 .errstr
= "invalid bpf_context access",
964 "check cb access: byte, oob 2",
966 BPF_MOV64_IMM(BPF_REG_0
, 0),
967 BPF_STX_MEM(BPF_B
, BPF_REG_1
, BPF_REG_0
,
968 offsetof(struct __sk_buff
, cb
[0]) - 1),
971 .errstr
= "invalid bpf_context access",
975 "check cb access: byte, oob 3",
977 BPF_MOV64_IMM(BPF_REG_0
, 0),
978 BPF_LDX_MEM(BPF_B
, BPF_REG_0
, BPF_REG_1
,
979 offsetof(struct __sk_buff
, cb
[4]) + 4),
982 .errstr
= "invalid bpf_context access",
986 "check cb access: byte, oob 4",
988 BPF_MOV64_IMM(BPF_REG_0
, 0),
989 BPF_LDX_MEM(BPF_B
, BPF_REG_0
, BPF_REG_1
,
990 offsetof(struct __sk_buff
, cb
[0]) - 1),
993 .errstr
= "invalid bpf_context access",
997 "check cb access: byte, wrong type",
999 BPF_MOV64_IMM(BPF_REG_0
, 0),
1000 BPF_STX_MEM(BPF_B
, BPF_REG_1
, BPF_REG_0
,
1001 offsetof(struct __sk_buff
, cb
[0])),
1004 .errstr
= "invalid bpf_context access",
1006 .prog_type
= BPF_PROG_TYPE_CGROUP_SOCK
,
1009 "check cb access: half",
1011 BPF_MOV64_IMM(BPF_REG_0
, 0),
1012 BPF_STX_MEM(BPF_H
, BPF_REG_1
, BPF_REG_0
,
1013 offsetof(struct __sk_buff
, cb
[0])),
1014 BPF_STX_MEM(BPF_H
, BPF_REG_1
, BPF_REG_0
,
1015 offsetof(struct __sk_buff
, cb
[0]) + 2),
1016 BPF_STX_MEM(BPF_H
, BPF_REG_1
, BPF_REG_0
,
1017 offsetof(struct __sk_buff
, cb
[1])),
1018 BPF_STX_MEM(BPF_H
, BPF_REG_1
, BPF_REG_0
,
1019 offsetof(struct __sk_buff
, cb
[1]) + 2),
1020 BPF_STX_MEM(BPF_H
, BPF_REG_1
, BPF_REG_0
,
1021 offsetof(struct __sk_buff
, cb
[2])),
1022 BPF_STX_MEM(BPF_H
, BPF_REG_1
, BPF_REG_0
,
1023 offsetof(struct __sk_buff
, cb
[2]) + 2),
1024 BPF_STX_MEM(BPF_H
, BPF_REG_1
, BPF_REG_0
,
1025 offsetof(struct __sk_buff
, cb
[3])),
1026 BPF_STX_MEM(BPF_H
, BPF_REG_1
, BPF_REG_0
,
1027 offsetof(struct __sk_buff
, cb
[3]) + 2),
1028 BPF_STX_MEM(BPF_H
, BPF_REG_1
, BPF_REG_0
,
1029 offsetof(struct __sk_buff
, cb
[4])),
1030 BPF_STX_MEM(BPF_H
, BPF_REG_1
, BPF_REG_0
,
1031 offsetof(struct __sk_buff
, cb
[4]) + 2),
1032 BPF_LDX_MEM(BPF_H
, BPF_REG_0
, BPF_REG_1
,
1033 offsetof(struct __sk_buff
, cb
[0])),
1034 BPF_LDX_MEM(BPF_H
, BPF_REG_0
, BPF_REG_1
,
1035 offsetof(struct __sk_buff
, cb
[0]) + 2),
1036 BPF_LDX_MEM(BPF_H
, BPF_REG_0
, BPF_REG_1
,
1037 offsetof(struct __sk_buff
, cb
[1])),
1038 BPF_LDX_MEM(BPF_H
, BPF_REG_0
, BPF_REG_1
,
1039 offsetof(struct __sk_buff
, cb
[1]) + 2),
1040 BPF_LDX_MEM(BPF_H
, BPF_REG_0
, BPF_REG_1
,
1041 offsetof(struct __sk_buff
, cb
[2])),
1042 BPF_LDX_MEM(BPF_H
, BPF_REG_0
, BPF_REG_1
,
1043 offsetof(struct __sk_buff
, cb
[2]) + 2),
1044 BPF_LDX_MEM(BPF_H
, BPF_REG_0
, BPF_REG_1
,
1045 offsetof(struct __sk_buff
, cb
[3])),
1046 BPF_LDX_MEM(BPF_H
, BPF_REG_0
, BPF_REG_1
,
1047 offsetof(struct __sk_buff
, cb
[3]) + 2),
1048 BPF_LDX_MEM(BPF_H
, BPF_REG_0
, BPF_REG_1
,
1049 offsetof(struct __sk_buff
, cb
[4])),
1050 BPF_LDX_MEM(BPF_H
, BPF_REG_0
, BPF_REG_1
,
1051 offsetof(struct __sk_buff
, cb
[4]) + 2),
1057 "check cb access: half, unaligned",
1059 BPF_MOV64_IMM(BPF_REG_0
, 0),
1060 BPF_STX_MEM(BPF_H
, BPF_REG_1
, BPF_REG_0
,
1061 offsetof(struct __sk_buff
, cb
[0]) + 1),
1064 .errstr
= "misaligned access",
1068 "check cb access: half, oob 1",
1070 BPF_MOV64_IMM(BPF_REG_0
, 0),
1071 BPF_STX_MEM(BPF_H
, BPF_REG_1
, BPF_REG_0
,
1072 offsetof(struct __sk_buff
, cb
[4]) + 4),
1075 .errstr
= "invalid bpf_context access",
1079 "check cb access: half, oob 2",
1081 BPF_MOV64_IMM(BPF_REG_0
, 0),
1082 BPF_STX_MEM(BPF_H
, BPF_REG_1
, BPF_REG_0
,
1083 offsetof(struct __sk_buff
, cb
[0]) - 2),
1086 .errstr
= "invalid bpf_context access",
1090 "check cb access: half, oob 3",
1092 BPF_MOV64_IMM(BPF_REG_0
, 0),
1093 BPF_LDX_MEM(BPF_H
, BPF_REG_0
, BPF_REG_1
,
1094 offsetof(struct __sk_buff
, cb
[4]) + 4),
1097 .errstr
= "invalid bpf_context access",
1101 "check cb access: half, oob 4",
1103 BPF_MOV64_IMM(BPF_REG_0
, 0),
1104 BPF_LDX_MEM(BPF_H
, BPF_REG_0
, BPF_REG_1
,
1105 offsetof(struct __sk_buff
, cb
[0]) - 2),
1108 .errstr
= "invalid bpf_context access",
1112 "check cb access: half, wrong type",
1114 BPF_MOV64_IMM(BPF_REG_0
, 0),
1115 BPF_STX_MEM(BPF_H
, BPF_REG_1
, BPF_REG_0
,
1116 offsetof(struct __sk_buff
, cb
[0])),
1119 .errstr
= "invalid bpf_context access",
1121 .prog_type
= BPF_PROG_TYPE_CGROUP_SOCK
,
1124 "check cb access: word",
1126 BPF_MOV64_IMM(BPF_REG_0
, 0),
1127 BPF_STX_MEM(BPF_W
, BPF_REG_1
, BPF_REG_0
,
1128 offsetof(struct __sk_buff
, cb
[0])),
1129 BPF_STX_MEM(BPF_W
, BPF_REG_1
, BPF_REG_0
,
1130 offsetof(struct __sk_buff
, cb
[1])),
1131 BPF_STX_MEM(BPF_W
, BPF_REG_1
, BPF_REG_0
,
1132 offsetof(struct __sk_buff
, cb
[2])),
1133 BPF_STX_MEM(BPF_W
, BPF_REG_1
, BPF_REG_0
,
1134 offsetof(struct __sk_buff
, cb
[3])),
1135 BPF_STX_MEM(BPF_W
, BPF_REG_1
, BPF_REG_0
,
1136 offsetof(struct __sk_buff
, cb
[4])),
1137 BPF_LDX_MEM(BPF_W
, BPF_REG_0
, BPF_REG_1
,
1138 offsetof(struct __sk_buff
, cb
[0])),
1139 BPF_LDX_MEM(BPF_W
, BPF_REG_0
, BPF_REG_1
,
1140 offsetof(struct __sk_buff
, cb
[1])),
1141 BPF_LDX_MEM(BPF_W
, BPF_REG_0
, BPF_REG_1
,
1142 offsetof(struct __sk_buff
, cb
[2])),
1143 BPF_LDX_MEM(BPF_W
, BPF_REG_0
, BPF_REG_1
,
1144 offsetof(struct __sk_buff
, cb
[3])),
1145 BPF_LDX_MEM(BPF_W
, BPF_REG_0
, BPF_REG_1
,
1146 offsetof(struct __sk_buff
, cb
[4])),
1152 "check cb access: word, unaligned 1",
1154 BPF_MOV64_IMM(BPF_REG_0
, 0),
1155 BPF_STX_MEM(BPF_W
, BPF_REG_1
, BPF_REG_0
,
1156 offsetof(struct __sk_buff
, cb
[0]) + 2),
1159 .errstr
= "misaligned access",
1163 "check cb access: word, unaligned 2",
1165 BPF_MOV64_IMM(BPF_REG_0
, 0),
1166 BPF_STX_MEM(BPF_W
, BPF_REG_1
, BPF_REG_0
,
1167 offsetof(struct __sk_buff
, cb
[4]) + 1),
1170 .errstr
= "misaligned access",
1174 "check cb access: word, unaligned 3",
1176 BPF_MOV64_IMM(BPF_REG_0
, 0),
1177 BPF_STX_MEM(BPF_W
, BPF_REG_1
, BPF_REG_0
,
1178 offsetof(struct __sk_buff
, cb
[4]) + 2),
1181 .errstr
= "misaligned access",
1185 "check cb access: word, unaligned 4",
1187 BPF_MOV64_IMM(BPF_REG_0
, 0),
1188 BPF_STX_MEM(BPF_W
, BPF_REG_1
, BPF_REG_0
,
1189 offsetof(struct __sk_buff
, cb
[4]) + 3),
1192 .errstr
= "misaligned access",
1196 "check cb access: double",
1198 BPF_MOV64_IMM(BPF_REG_0
, 0),
1199 BPF_STX_MEM(BPF_DW
, BPF_REG_1
, BPF_REG_0
,
1200 offsetof(struct __sk_buff
, cb
[0])),
1201 BPF_STX_MEM(BPF_DW
, BPF_REG_1
, BPF_REG_0
,
1202 offsetof(struct __sk_buff
, cb
[2])),
1203 BPF_LDX_MEM(BPF_DW
, BPF_REG_0
, BPF_REG_1
,
1204 offsetof(struct __sk_buff
, cb
[0])),
1205 BPF_LDX_MEM(BPF_DW
, BPF_REG_0
, BPF_REG_1
,
1206 offsetof(struct __sk_buff
, cb
[2])),
1212 "check cb access: double, unaligned 1",
1214 BPF_MOV64_IMM(BPF_REG_0
, 0),
1215 BPF_STX_MEM(BPF_DW
, BPF_REG_1
, BPF_REG_0
,
1216 offsetof(struct __sk_buff
, cb
[1])),
1219 .errstr
= "misaligned access",
1223 "check cb access: double, unaligned 2",
1225 BPF_MOV64_IMM(BPF_REG_0
, 0),
1226 BPF_STX_MEM(BPF_DW
, BPF_REG_1
, BPF_REG_0
,
1227 offsetof(struct __sk_buff
, cb
[3])),
1230 .errstr
= "misaligned access",
1234 "check cb access: double, oob 1",
1236 BPF_MOV64_IMM(BPF_REG_0
, 0),
1237 BPF_STX_MEM(BPF_DW
, BPF_REG_1
, BPF_REG_0
,
1238 offsetof(struct __sk_buff
, cb
[4])),
1241 .errstr
= "invalid bpf_context access",
1245 "check cb access: double, oob 2",
1247 BPF_MOV64_IMM(BPF_REG_0
, 0),
1248 BPF_STX_MEM(BPF_DW
, BPF_REG_1
, BPF_REG_0
,
1249 offsetof(struct __sk_buff
, cb
[4]) + 8),
1252 .errstr
= "invalid bpf_context access",
1256 "check cb access: double, oob 3",
1258 BPF_MOV64_IMM(BPF_REG_0
, 0),
1259 BPF_STX_MEM(BPF_DW
, BPF_REG_1
, BPF_REG_0
,
1260 offsetof(struct __sk_buff
, cb
[0]) - 8),
1263 .errstr
= "invalid bpf_context access",
1267 "check cb access: double, oob 4",
1269 BPF_MOV64_IMM(BPF_REG_0
, 0),
1270 BPF_LDX_MEM(BPF_DW
, BPF_REG_0
, BPF_REG_1
,
1271 offsetof(struct __sk_buff
, cb
[4])),
1274 .errstr
= "invalid bpf_context access",
1278 "check cb access: double, oob 5",
1280 BPF_MOV64_IMM(BPF_REG_0
, 0),
1281 BPF_LDX_MEM(BPF_DW
, BPF_REG_0
, BPF_REG_1
,
1282 offsetof(struct __sk_buff
, cb
[4]) + 8),
1285 .errstr
= "invalid bpf_context access",
1289 "check cb access: double, oob 6",
1291 BPF_MOV64_IMM(BPF_REG_0
, 0),
1292 BPF_LDX_MEM(BPF_DW
, BPF_REG_0
, BPF_REG_1
,
1293 offsetof(struct __sk_buff
, cb
[0]) - 8),
1296 .errstr
= "invalid bpf_context access",
1300 "check cb access: double, wrong type",
1302 BPF_MOV64_IMM(BPF_REG_0
, 0),
1303 BPF_STX_MEM(BPF_DW
, BPF_REG_1
, BPF_REG_0
,
1304 offsetof(struct __sk_buff
, cb
[0])),
1307 .errstr
= "invalid bpf_context access",
1309 .prog_type
= BPF_PROG_TYPE_CGROUP_SOCK
,
1312 "check out of range skb->cb access",
1314 BPF_LDX_MEM(BPF_W
, BPF_REG_0
, BPF_REG_1
,
1315 offsetof(struct __sk_buff
, cb
[0]) + 256),
1318 .errstr
= "invalid bpf_context access",
1319 .errstr_unpriv
= "",
1321 .prog_type
= BPF_PROG_TYPE_SCHED_ACT
,
1324 "write skb fields from socket prog",
1326 BPF_LDX_MEM(BPF_W
, BPF_REG_0
, BPF_REG_1
,
1327 offsetof(struct __sk_buff
, cb
[4])),
1328 BPF_JMP_IMM(BPF_JGE
, BPF_REG_0
, 0, 1),
1329 BPF_LDX_MEM(BPF_W
, BPF_REG_0
, BPF_REG_1
,
1330 offsetof(struct __sk_buff
, mark
)),
1331 BPF_LDX_MEM(BPF_W
, BPF_REG_0
, BPF_REG_1
,
1332 offsetof(struct __sk_buff
, tc_index
)),
1333 BPF_JMP_IMM(BPF_JGE
, BPF_REG_0
, 0, 1),
1334 BPF_STX_MEM(BPF_W
, BPF_REG_1
, BPF_REG_1
,
1335 offsetof(struct __sk_buff
, cb
[0])),
1336 BPF_STX_MEM(BPF_W
, BPF_REG_1
, BPF_REG_1
,
1337 offsetof(struct __sk_buff
, cb
[2])),
1341 .errstr_unpriv
= "R1 leaks addr",
1342 .result_unpriv
= REJECT
,
1345 "write skb fields from tc_cls_act prog",
1347 BPF_LDX_MEM(BPF_W
, BPF_REG_0
, BPF_REG_1
,
1348 offsetof(struct __sk_buff
, cb
[0])),
1349 BPF_STX_MEM(BPF_W
, BPF_REG_1
, BPF_REG_0
,
1350 offsetof(struct __sk_buff
, mark
)),
1351 BPF_LDX_MEM(BPF_W
, BPF_REG_0
, BPF_REG_1
,
1352 offsetof(struct __sk_buff
, tc_index
)),
1353 BPF_STX_MEM(BPF_W
, BPF_REG_1
, BPF_REG_0
,
1354 offsetof(struct __sk_buff
, tc_index
)),
1355 BPF_STX_MEM(BPF_W
, BPF_REG_1
, BPF_REG_0
,
1356 offsetof(struct __sk_buff
, cb
[3])),
1359 .errstr_unpriv
= "",
1360 .result_unpriv
= REJECT
,
1362 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
,
1365 "PTR_TO_STACK store/load",
1367 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_10
),
1368 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_1
, -10),
1369 BPF_ST_MEM(BPF_DW
, BPF_REG_1
, 2, 0xfaceb00c),
1370 BPF_LDX_MEM(BPF_DW
, BPF_REG_0
, BPF_REG_1
, 2),
1376 "PTR_TO_STACK store/load - bad alignment on off",
1378 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_10
),
1379 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_1
, -8),
1380 BPF_ST_MEM(BPF_DW
, BPF_REG_1
, 2, 0xfaceb00c),
1381 BPF_LDX_MEM(BPF_DW
, BPF_REG_0
, BPF_REG_1
, 2),
1385 .errstr
= "misaligned access off -6 size 8",
1388 "PTR_TO_STACK store/load - bad alignment on reg",
1390 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_10
),
1391 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_1
, -10),
1392 BPF_ST_MEM(BPF_DW
, BPF_REG_1
, 8, 0xfaceb00c),
1393 BPF_LDX_MEM(BPF_DW
, BPF_REG_0
, BPF_REG_1
, 8),
1397 .errstr
= "misaligned access off -2 size 8",
1400 "PTR_TO_STACK store/load - out of bounds low",
1402 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_10
),
1403 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_1
, -80000),
1404 BPF_ST_MEM(BPF_DW
, BPF_REG_1
, 8, 0xfaceb00c),
1405 BPF_LDX_MEM(BPF_DW
, BPF_REG_0
, BPF_REG_1
, 8),
1409 .errstr
= "invalid stack off=-79992 size=8",
1412 "PTR_TO_STACK store/load - out of bounds high",
1414 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_10
),
1415 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_1
, -8),
1416 BPF_ST_MEM(BPF_DW
, BPF_REG_1
, 8, 0xfaceb00c),
1417 BPF_LDX_MEM(BPF_DW
, BPF_REG_0
, BPF_REG_1
, 8),
1421 .errstr
= "invalid stack off=0 size=8",
1424 "unpriv: return pointer",
1426 BPF_MOV64_REG(BPF_REG_0
, BPF_REG_10
),
1430 .result_unpriv
= REJECT
,
1431 .errstr_unpriv
= "R0 leaks addr",
1434 "unpriv: add const to pointer",
1436 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_1
, 8),
1437 BPF_MOV64_IMM(BPF_REG_0
, 0),
1441 .result_unpriv
= REJECT
,
1442 .errstr_unpriv
= "R1 pointer arithmetic",
1445 "unpriv: add pointer to pointer",
1447 BPF_ALU64_REG(BPF_ADD
, BPF_REG_1
, BPF_REG_10
),
1448 BPF_MOV64_IMM(BPF_REG_0
, 0),
1452 .result_unpriv
= REJECT
,
1453 .errstr_unpriv
= "R1 pointer arithmetic",
1456 "unpriv: neg pointer",
1458 BPF_ALU64_IMM(BPF_NEG
, BPF_REG_1
, 0),
1459 BPF_MOV64_IMM(BPF_REG_0
, 0),
1463 .result_unpriv
= REJECT
,
1464 .errstr_unpriv
= "R1 pointer arithmetic",
1467 "unpriv: cmp pointer with const",
1469 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, 0, 0),
1470 BPF_MOV64_IMM(BPF_REG_0
, 0),
1474 .result_unpriv
= REJECT
,
1475 .errstr_unpriv
= "R1 pointer comparison",
1478 "unpriv: cmp pointer with pointer",
1480 BPF_JMP_REG(BPF_JEQ
, BPF_REG_1
, BPF_REG_10
, 0),
1481 BPF_MOV64_IMM(BPF_REG_0
, 0),
1485 .result_unpriv
= REJECT
,
1486 .errstr_unpriv
= "R10 pointer comparison",
1489 "unpriv: check that printk is disallowed",
1491 BPF_ST_MEM(BPF_DW
, BPF_REG_10
, -8, 0),
1492 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_10
),
1493 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_1
, -8),
1494 BPF_MOV64_IMM(BPF_REG_2
, 8),
1495 BPF_MOV64_REG(BPF_REG_3
, BPF_REG_1
),
1496 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
1497 BPF_FUNC_trace_printk
),
1498 BPF_MOV64_IMM(BPF_REG_0
, 0),
1501 .errstr_unpriv
= "unknown func bpf_trace_printk#6",
1502 .result_unpriv
= REJECT
,
1506 "unpriv: pass pointer to helper function",
1508 BPF_ST_MEM(BPF_DW
, BPF_REG_10
, -8, 0),
1509 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
1510 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
1511 BPF_LD_MAP_FD(BPF_REG_1
, 0),
1512 BPF_MOV64_REG(BPF_REG_3
, BPF_REG_2
),
1513 BPF_MOV64_REG(BPF_REG_4
, BPF_REG_2
),
1514 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
1515 BPF_FUNC_map_update_elem
),
1516 BPF_MOV64_IMM(BPF_REG_0
, 0),
1519 .fixup_map1
= { 3 },
1520 .errstr_unpriv
= "R4 leaks addr",
1521 .result_unpriv
= REJECT
,
1525 "unpriv: indirectly pass pointer on stack to helper function",
1527 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_10
, -8),
1528 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
1529 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
1530 BPF_LD_MAP_FD(BPF_REG_1
, 0),
1531 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
1532 BPF_FUNC_map_lookup_elem
),
1533 BPF_MOV64_IMM(BPF_REG_0
, 0),
1536 .fixup_map1
= { 3 },
1537 .errstr
= "invalid indirect read from stack off -8+0 size 8",
1541 "unpriv: mangle pointer on stack 1",
1543 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_10
, -8),
1544 BPF_ST_MEM(BPF_W
, BPF_REG_10
, -8, 0),
1545 BPF_MOV64_IMM(BPF_REG_0
, 0),
1548 .errstr_unpriv
= "attempt to corrupt spilled",
1549 .result_unpriv
= REJECT
,
1553 "unpriv: mangle pointer on stack 2",
1555 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_10
, -8),
1556 BPF_ST_MEM(BPF_B
, BPF_REG_10
, -1, 0),
1557 BPF_MOV64_IMM(BPF_REG_0
, 0),
1560 .errstr_unpriv
= "attempt to corrupt spilled",
1561 .result_unpriv
= REJECT
,
1565 "unpriv: read pointer from stack in small chunks",
1567 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_10
, -8),
1568 BPF_LDX_MEM(BPF_W
, BPF_REG_0
, BPF_REG_10
, -8),
1569 BPF_MOV64_IMM(BPF_REG_0
, 0),
1572 .errstr
= "invalid size",
1576 "unpriv: write pointer into ctx",
1578 BPF_STX_MEM(BPF_DW
, BPF_REG_1
, BPF_REG_1
, 0),
1579 BPF_MOV64_IMM(BPF_REG_0
, 0),
1582 .errstr_unpriv
= "R1 leaks addr",
1583 .result_unpriv
= REJECT
,
1584 .errstr
= "invalid bpf_context access",
1588 "unpriv: spill/fill of ctx",
1590 BPF_ALU64_REG(BPF_MOV
, BPF_REG_6
, BPF_REG_10
),
1591 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_6
, -8),
1592 BPF_STX_MEM(BPF_DW
, BPF_REG_6
, BPF_REG_1
, 0),
1593 BPF_LDX_MEM(BPF_DW
, BPF_REG_1
, BPF_REG_6
, 0),
1594 BPF_MOV64_IMM(BPF_REG_0
, 0),
1600 "unpriv: spill/fill of ctx 2",
1602 BPF_ALU64_REG(BPF_MOV
, BPF_REG_6
, BPF_REG_10
),
1603 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_6
, -8),
1604 BPF_STX_MEM(BPF_DW
, BPF_REG_6
, BPF_REG_1
, 0),
1605 BPF_LDX_MEM(BPF_DW
, BPF_REG_1
, BPF_REG_6
, 0),
1606 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
1607 BPF_FUNC_get_hash_recalc
),
1611 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
,
1614 "unpriv: spill/fill of ctx 3",
1616 BPF_ALU64_REG(BPF_MOV
, BPF_REG_6
, BPF_REG_10
),
1617 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_6
, -8),
1618 BPF_STX_MEM(BPF_DW
, BPF_REG_6
, BPF_REG_1
, 0),
1619 BPF_STX_MEM(BPF_DW
, BPF_REG_6
, BPF_REG_10
, 0),
1620 BPF_LDX_MEM(BPF_DW
, BPF_REG_1
, BPF_REG_6
, 0),
1621 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
1622 BPF_FUNC_get_hash_recalc
),
1626 .errstr
= "R1 type=fp expected=ctx",
1627 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
,
1630 "unpriv: spill/fill of ctx 4",
1632 BPF_ALU64_REG(BPF_MOV
, BPF_REG_6
, BPF_REG_10
),
1633 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_6
, -8),
1634 BPF_STX_MEM(BPF_DW
, BPF_REG_6
, BPF_REG_1
, 0),
1635 BPF_MOV64_IMM(BPF_REG_0
, 1),
1636 BPF_RAW_INSN(BPF_STX
| BPF_XADD
| BPF_DW
, BPF_REG_10
,
1638 BPF_LDX_MEM(BPF_DW
, BPF_REG_1
, BPF_REG_6
, 0),
1639 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
1640 BPF_FUNC_get_hash_recalc
),
1644 .errstr
= "R1 type=inv expected=ctx",
1645 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
,
1648 "unpriv: spill/fill of different pointers stx",
1650 BPF_MOV64_IMM(BPF_REG_3
, 42),
1651 BPF_ALU64_REG(BPF_MOV
, BPF_REG_6
, BPF_REG_10
),
1652 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_6
, -8),
1653 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, 0, 3),
1654 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
1655 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -16),
1656 BPF_STX_MEM(BPF_DW
, BPF_REG_6
, BPF_REG_2
, 0),
1657 BPF_JMP_IMM(BPF_JNE
, BPF_REG_1
, 0, 1),
1658 BPF_STX_MEM(BPF_DW
, BPF_REG_6
, BPF_REG_1
, 0),
1659 BPF_LDX_MEM(BPF_DW
, BPF_REG_1
, BPF_REG_6
, 0),
1660 BPF_STX_MEM(BPF_W
, BPF_REG_1
, BPF_REG_3
,
1661 offsetof(struct __sk_buff
, mark
)),
1662 BPF_MOV64_IMM(BPF_REG_0
, 0),
1666 .errstr
= "same insn cannot be used with different pointers",
1667 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
,
1670 "unpriv: spill/fill of different pointers ldx",
1672 BPF_ALU64_REG(BPF_MOV
, BPF_REG_6
, BPF_REG_10
),
1673 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_6
, -8),
1674 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, 0, 3),
1675 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
1676 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
,
1677 -(__s32
)offsetof(struct bpf_perf_event_data
,
1678 sample_period
) - 8),
1679 BPF_STX_MEM(BPF_DW
, BPF_REG_6
, BPF_REG_2
, 0),
1680 BPF_JMP_IMM(BPF_JNE
, BPF_REG_1
, 0, 1),
1681 BPF_STX_MEM(BPF_DW
, BPF_REG_6
, BPF_REG_1
, 0),
1682 BPF_LDX_MEM(BPF_DW
, BPF_REG_1
, BPF_REG_6
, 0),
1683 BPF_LDX_MEM(BPF_DW
, BPF_REG_1
, BPF_REG_1
,
1684 offsetof(struct bpf_perf_event_data
,
1686 BPF_MOV64_IMM(BPF_REG_0
, 0),
1690 .errstr
= "same insn cannot be used with different pointers",
1691 .prog_type
= BPF_PROG_TYPE_PERF_EVENT
,
1694 "unpriv: write pointer into map elem value",
1696 BPF_ST_MEM(BPF_DW
, BPF_REG_10
, -8, 0),
1697 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
1698 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
1699 BPF_LD_MAP_FD(BPF_REG_1
, 0),
1700 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
1701 BPF_FUNC_map_lookup_elem
),
1702 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_0
, 0, 1),
1703 BPF_STX_MEM(BPF_DW
, BPF_REG_0
, BPF_REG_0
, 0),
1706 .fixup_map1
= { 3 },
1707 .errstr_unpriv
= "R0 leaks addr",
1708 .result_unpriv
= REJECT
,
1712 "unpriv: partial copy of pointer",
1714 BPF_MOV32_REG(BPF_REG_1
, BPF_REG_10
),
1715 BPF_MOV64_IMM(BPF_REG_0
, 0),
1718 .errstr_unpriv
= "R10 partial copy",
1719 .result_unpriv
= REJECT
,
1723 "unpriv: pass pointer to tail_call",
1725 BPF_MOV64_REG(BPF_REG_3
, BPF_REG_1
),
1726 BPF_LD_MAP_FD(BPF_REG_2
, 0),
1727 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
1728 BPF_FUNC_tail_call
),
1729 BPF_MOV64_IMM(BPF_REG_0
, 0),
1732 .fixup_prog
= { 1 },
1733 .errstr_unpriv
= "R3 leaks addr into helper",
1734 .result_unpriv
= REJECT
,
1738 "unpriv: cmp map pointer with zero",
1740 BPF_MOV64_IMM(BPF_REG_1
, 0),
1741 BPF_LD_MAP_FD(BPF_REG_1
, 0),
1742 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_1
, 0, 0),
1743 BPF_MOV64_IMM(BPF_REG_0
, 0),
1746 .fixup_map1
= { 1 },
1747 .errstr_unpriv
= "R1 pointer comparison",
1748 .result_unpriv
= REJECT
,
1752 "unpriv: write into frame pointer",
1754 BPF_MOV64_REG(BPF_REG_10
, BPF_REG_1
),
1755 BPF_MOV64_IMM(BPF_REG_0
, 0),
1758 .errstr
= "frame pointer is read only",
1762 "unpriv: spill/fill frame pointer",
1764 BPF_ALU64_REG(BPF_MOV
, BPF_REG_6
, BPF_REG_10
),
1765 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_6
, -8),
1766 BPF_STX_MEM(BPF_DW
, BPF_REG_6
, BPF_REG_10
, 0),
1767 BPF_LDX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_6
, 0),
1768 BPF_MOV64_IMM(BPF_REG_0
, 0),
1771 .errstr
= "frame pointer is read only",
1775 "unpriv: cmp of frame pointer",
1777 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_10
, 0, 0),
1778 BPF_MOV64_IMM(BPF_REG_0
, 0),
1781 .errstr_unpriv
= "R10 pointer comparison",
1782 .result_unpriv
= REJECT
,
1786 "unpriv: cmp of stack pointer",
1788 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
1789 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
1790 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_2
, 0, 0),
1791 BPF_MOV64_IMM(BPF_REG_0
, 0),
1794 .errstr_unpriv
= "R2 pointer comparison",
1795 .result_unpriv
= REJECT
,
1799 "unpriv: obfuscate stack pointer",
1801 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
1802 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
1803 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
1804 BPF_MOV64_IMM(BPF_REG_0
, 0),
1807 .errstr_unpriv
= "R2 pointer arithmetic",
1808 .result_unpriv
= REJECT
,
1812 "raw_stack: no skb_load_bytes",
1814 BPF_MOV64_IMM(BPF_REG_2
, 4),
1815 BPF_ALU64_REG(BPF_MOV
, BPF_REG_6
, BPF_REG_10
),
1816 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_6
, -8),
1817 BPF_MOV64_REG(BPF_REG_3
, BPF_REG_6
),
1818 BPF_MOV64_IMM(BPF_REG_4
, 8),
1819 /* Call to skb_load_bytes() omitted. */
1820 BPF_LDX_MEM(BPF_DW
, BPF_REG_0
, BPF_REG_6
, 0),
1824 .errstr
= "invalid read from stack off -8+0 size 8",
1825 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
,
1828 "raw_stack: skb_load_bytes, negative len",
1830 BPF_MOV64_IMM(BPF_REG_2
, 4),
1831 BPF_ALU64_REG(BPF_MOV
, BPF_REG_6
, BPF_REG_10
),
1832 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_6
, -8),
1833 BPF_MOV64_REG(BPF_REG_3
, BPF_REG_6
),
1834 BPF_MOV64_IMM(BPF_REG_4
, -8),
1835 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
1836 BPF_FUNC_skb_load_bytes
),
1837 BPF_LDX_MEM(BPF_DW
, BPF_REG_0
, BPF_REG_6
, 0),
1841 .errstr
= "invalid stack type R3",
1842 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
,
1845 "raw_stack: skb_load_bytes, negative len 2",
1847 BPF_MOV64_IMM(BPF_REG_2
, 4),
1848 BPF_ALU64_REG(BPF_MOV
, BPF_REG_6
, BPF_REG_10
),
1849 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_6
, -8),
1850 BPF_MOV64_REG(BPF_REG_3
, BPF_REG_6
),
1851 BPF_MOV64_IMM(BPF_REG_4
, ~0),
1852 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
1853 BPF_FUNC_skb_load_bytes
),
1854 BPF_LDX_MEM(BPF_DW
, BPF_REG_0
, BPF_REG_6
, 0),
1858 .errstr
= "invalid stack type R3",
1859 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
,
1862 "raw_stack: skb_load_bytes, zero len",
1864 BPF_MOV64_IMM(BPF_REG_2
, 4),
1865 BPF_ALU64_REG(BPF_MOV
, BPF_REG_6
, BPF_REG_10
),
1866 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_6
, -8),
1867 BPF_MOV64_REG(BPF_REG_3
, BPF_REG_6
),
1868 BPF_MOV64_IMM(BPF_REG_4
, 0),
1869 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
1870 BPF_FUNC_skb_load_bytes
),
1871 BPF_LDX_MEM(BPF_DW
, BPF_REG_0
, BPF_REG_6
, 0),
1875 .errstr
= "invalid stack type R3",
1876 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
,
1879 "raw_stack: skb_load_bytes, no init",
1881 BPF_MOV64_IMM(BPF_REG_2
, 4),
1882 BPF_ALU64_REG(BPF_MOV
, BPF_REG_6
, BPF_REG_10
),
1883 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_6
, -8),
1884 BPF_MOV64_REG(BPF_REG_3
, BPF_REG_6
),
1885 BPF_MOV64_IMM(BPF_REG_4
, 8),
1886 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
1887 BPF_FUNC_skb_load_bytes
),
1888 BPF_LDX_MEM(BPF_DW
, BPF_REG_0
, BPF_REG_6
, 0),
1892 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
,
1895 "raw_stack: skb_load_bytes, init",
1897 BPF_MOV64_IMM(BPF_REG_2
, 4),
1898 BPF_ALU64_REG(BPF_MOV
, BPF_REG_6
, BPF_REG_10
),
1899 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_6
, -8),
1900 BPF_ST_MEM(BPF_DW
, BPF_REG_6
, 0, 0xcafe),
1901 BPF_MOV64_REG(BPF_REG_3
, BPF_REG_6
),
1902 BPF_MOV64_IMM(BPF_REG_4
, 8),
1903 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
1904 BPF_FUNC_skb_load_bytes
),
1905 BPF_LDX_MEM(BPF_DW
, BPF_REG_0
, BPF_REG_6
, 0),
1909 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
,
1912 "raw_stack: skb_load_bytes, spilled regs around bounds",
1914 BPF_MOV64_IMM(BPF_REG_2
, 4),
1915 BPF_ALU64_REG(BPF_MOV
, BPF_REG_6
, BPF_REG_10
),
1916 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_6
, -16),
1917 BPF_STX_MEM(BPF_DW
, BPF_REG_6
, BPF_REG_1
, -8),
1918 BPF_STX_MEM(BPF_DW
, BPF_REG_6
, BPF_REG_1
, 8),
1919 BPF_MOV64_REG(BPF_REG_3
, BPF_REG_6
),
1920 BPF_MOV64_IMM(BPF_REG_4
, 8),
1921 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
1922 BPF_FUNC_skb_load_bytes
),
1923 BPF_LDX_MEM(BPF_DW
, BPF_REG_0
, BPF_REG_6
, -8),
1924 BPF_LDX_MEM(BPF_DW
, BPF_REG_2
, BPF_REG_6
, 8),
1925 BPF_LDX_MEM(BPF_W
, BPF_REG_0
, BPF_REG_0
,
1926 offsetof(struct __sk_buff
, mark
)),
1927 BPF_LDX_MEM(BPF_W
, BPF_REG_2
, BPF_REG_2
,
1928 offsetof(struct __sk_buff
, priority
)),
1929 BPF_ALU64_REG(BPF_ADD
, BPF_REG_0
, BPF_REG_2
),
1933 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
,
1936 "raw_stack: skb_load_bytes, spilled regs corruption",
1938 BPF_MOV64_IMM(BPF_REG_2
, 4),
1939 BPF_ALU64_REG(BPF_MOV
, BPF_REG_6
, BPF_REG_10
),
1940 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_6
, -8),
1941 BPF_STX_MEM(BPF_DW
, BPF_REG_6
, BPF_REG_1
, 0),
1942 BPF_MOV64_REG(BPF_REG_3
, BPF_REG_6
),
1943 BPF_MOV64_IMM(BPF_REG_4
, 8),
1944 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
1945 BPF_FUNC_skb_load_bytes
),
1946 BPF_LDX_MEM(BPF_DW
, BPF_REG_0
, BPF_REG_6
, 0),
1947 BPF_LDX_MEM(BPF_W
, BPF_REG_0
, BPF_REG_0
,
1948 offsetof(struct __sk_buff
, mark
)),
1952 .errstr
= "R0 invalid mem access 'inv'",
1953 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
,
1956 "raw_stack: skb_load_bytes, spilled regs corruption 2",
1958 BPF_MOV64_IMM(BPF_REG_2
, 4),
1959 BPF_ALU64_REG(BPF_MOV
, BPF_REG_6
, BPF_REG_10
),
1960 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_6
, -16),
1961 BPF_STX_MEM(BPF_DW
, BPF_REG_6
, BPF_REG_1
, -8),
1962 BPF_STX_MEM(BPF_DW
, BPF_REG_6
, BPF_REG_1
, 0),
1963 BPF_STX_MEM(BPF_DW
, BPF_REG_6
, BPF_REG_1
, 8),
1964 BPF_MOV64_REG(BPF_REG_3
, BPF_REG_6
),
1965 BPF_MOV64_IMM(BPF_REG_4
, 8),
1966 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
1967 BPF_FUNC_skb_load_bytes
),
1968 BPF_LDX_MEM(BPF_DW
, BPF_REG_0
, BPF_REG_6
, -8),
1969 BPF_LDX_MEM(BPF_DW
, BPF_REG_2
, BPF_REG_6
, 8),
1970 BPF_LDX_MEM(BPF_DW
, BPF_REG_3
, BPF_REG_6
, 0),
1971 BPF_LDX_MEM(BPF_W
, BPF_REG_0
, BPF_REG_0
,
1972 offsetof(struct __sk_buff
, mark
)),
1973 BPF_LDX_MEM(BPF_W
, BPF_REG_2
, BPF_REG_2
,
1974 offsetof(struct __sk_buff
, priority
)),
1975 BPF_ALU64_REG(BPF_ADD
, BPF_REG_0
, BPF_REG_2
),
1976 BPF_LDX_MEM(BPF_W
, BPF_REG_3
, BPF_REG_3
,
1977 offsetof(struct __sk_buff
, pkt_type
)),
1978 BPF_ALU64_REG(BPF_ADD
, BPF_REG_0
, BPF_REG_3
),
1982 .errstr
= "R3 invalid mem access 'inv'",
1983 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
,
1986 "raw_stack: skb_load_bytes, spilled regs + data",
1988 BPF_MOV64_IMM(BPF_REG_2
, 4),
1989 BPF_ALU64_REG(BPF_MOV
, BPF_REG_6
, BPF_REG_10
),
1990 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_6
, -16),
1991 BPF_STX_MEM(BPF_DW
, BPF_REG_6
, BPF_REG_1
, -8),
1992 BPF_STX_MEM(BPF_DW
, BPF_REG_6
, BPF_REG_1
, 0),
1993 BPF_STX_MEM(BPF_DW
, BPF_REG_6
, BPF_REG_1
, 8),
1994 BPF_MOV64_REG(BPF_REG_3
, BPF_REG_6
),
1995 BPF_MOV64_IMM(BPF_REG_4
, 8),
1996 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
1997 BPF_FUNC_skb_load_bytes
),
1998 BPF_LDX_MEM(BPF_DW
, BPF_REG_0
, BPF_REG_6
, -8),
1999 BPF_LDX_MEM(BPF_DW
, BPF_REG_2
, BPF_REG_6
, 8),
2000 BPF_LDX_MEM(BPF_DW
, BPF_REG_3
, BPF_REG_6
, 0),
2001 BPF_LDX_MEM(BPF_W
, BPF_REG_0
, BPF_REG_0
,
2002 offsetof(struct __sk_buff
, mark
)),
2003 BPF_LDX_MEM(BPF_W
, BPF_REG_2
, BPF_REG_2
,
2004 offsetof(struct __sk_buff
, priority
)),
2005 BPF_ALU64_REG(BPF_ADD
, BPF_REG_0
, BPF_REG_2
),
2006 BPF_ALU64_REG(BPF_ADD
, BPF_REG_0
, BPF_REG_3
),
2010 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
,
2013 "raw_stack: skb_load_bytes, invalid access 1",
2015 BPF_MOV64_IMM(BPF_REG_2
, 4),
2016 BPF_ALU64_REG(BPF_MOV
, BPF_REG_6
, BPF_REG_10
),
2017 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_6
, -513),
2018 BPF_MOV64_REG(BPF_REG_3
, BPF_REG_6
),
2019 BPF_MOV64_IMM(BPF_REG_4
, 8),
2020 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
2021 BPF_FUNC_skb_load_bytes
),
2022 BPF_LDX_MEM(BPF_DW
, BPF_REG_0
, BPF_REG_6
, 0),
2026 .errstr
= "invalid stack type R3 off=-513 access_size=8",
2027 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
,
2030 "raw_stack: skb_load_bytes, invalid access 2",
2032 BPF_MOV64_IMM(BPF_REG_2
, 4),
2033 BPF_ALU64_REG(BPF_MOV
, BPF_REG_6
, BPF_REG_10
),
2034 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_6
, -1),
2035 BPF_MOV64_REG(BPF_REG_3
, BPF_REG_6
),
2036 BPF_MOV64_IMM(BPF_REG_4
, 8),
2037 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
2038 BPF_FUNC_skb_load_bytes
),
2039 BPF_LDX_MEM(BPF_DW
, BPF_REG_0
, BPF_REG_6
, 0),
2043 .errstr
= "invalid stack type R3 off=-1 access_size=8",
2044 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
,
2047 "raw_stack: skb_load_bytes, invalid access 3",
2049 BPF_MOV64_IMM(BPF_REG_2
, 4),
2050 BPF_ALU64_REG(BPF_MOV
, BPF_REG_6
, BPF_REG_10
),
2051 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_6
, 0xffffffff),
2052 BPF_MOV64_REG(BPF_REG_3
, BPF_REG_6
),
2053 BPF_MOV64_IMM(BPF_REG_4
, 0xffffffff),
2054 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
2055 BPF_FUNC_skb_load_bytes
),
2056 BPF_LDX_MEM(BPF_DW
, BPF_REG_0
, BPF_REG_6
, 0),
2060 .errstr
= "invalid stack type R3 off=-1 access_size=-1",
2061 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
,
2064 "raw_stack: skb_load_bytes, invalid access 4",
2066 BPF_MOV64_IMM(BPF_REG_2
, 4),
2067 BPF_ALU64_REG(BPF_MOV
, BPF_REG_6
, BPF_REG_10
),
2068 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_6
, -1),
2069 BPF_MOV64_REG(BPF_REG_3
, BPF_REG_6
),
2070 BPF_MOV64_IMM(BPF_REG_4
, 0x7fffffff),
2071 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
2072 BPF_FUNC_skb_load_bytes
),
2073 BPF_LDX_MEM(BPF_DW
, BPF_REG_0
, BPF_REG_6
, 0),
2077 .errstr
= "invalid stack type R3 off=-1 access_size=2147483647",
2078 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
,
2081 "raw_stack: skb_load_bytes, invalid access 5",
2083 BPF_MOV64_IMM(BPF_REG_2
, 4),
2084 BPF_ALU64_REG(BPF_MOV
, BPF_REG_6
, BPF_REG_10
),
2085 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_6
, -512),
2086 BPF_MOV64_REG(BPF_REG_3
, BPF_REG_6
),
2087 BPF_MOV64_IMM(BPF_REG_4
, 0x7fffffff),
2088 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
2089 BPF_FUNC_skb_load_bytes
),
2090 BPF_LDX_MEM(BPF_DW
, BPF_REG_0
, BPF_REG_6
, 0),
2094 .errstr
= "invalid stack type R3 off=-512 access_size=2147483647",
2095 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
,
2098 "raw_stack: skb_load_bytes, invalid access 6",
2100 BPF_MOV64_IMM(BPF_REG_2
, 4),
2101 BPF_ALU64_REG(BPF_MOV
, BPF_REG_6
, BPF_REG_10
),
2102 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_6
, -512),
2103 BPF_MOV64_REG(BPF_REG_3
, BPF_REG_6
),
2104 BPF_MOV64_IMM(BPF_REG_4
, 0),
2105 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
2106 BPF_FUNC_skb_load_bytes
),
2107 BPF_LDX_MEM(BPF_DW
, BPF_REG_0
, BPF_REG_6
, 0),
2111 .errstr
= "invalid stack type R3 off=-512 access_size=0",
2112 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
,
2115 "raw_stack: skb_load_bytes, large access",
2117 BPF_MOV64_IMM(BPF_REG_2
, 4),
2118 BPF_ALU64_REG(BPF_MOV
, BPF_REG_6
, BPF_REG_10
),
2119 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_6
, -512),
2120 BPF_MOV64_REG(BPF_REG_3
, BPF_REG_6
),
2121 BPF_MOV64_IMM(BPF_REG_4
, 512),
2122 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
2123 BPF_FUNC_skb_load_bytes
),
2124 BPF_LDX_MEM(BPF_DW
, BPF_REG_0
, BPF_REG_6
, 0),
2128 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
,
2131 "direct packet access: test1",
2133 BPF_LDX_MEM(BPF_W
, BPF_REG_2
, BPF_REG_1
,
2134 offsetof(struct __sk_buff
, data
)),
2135 BPF_LDX_MEM(BPF_W
, BPF_REG_3
, BPF_REG_1
,
2136 offsetof(struct __sk_buff
, data_end
)),
2137 BPF_MOV64_REG(BPF_REG_0
, BPF_REG_2
),
2138 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_0
, 8),
2139 BPF_JMP_REG(BPF_JGT
, BPF_REG_0
, BPF_REG_3
, 1),
2140 BPF_LDX_MEM(BPF_B
, BPF_REG_0
, BPF_REG_2
, 0),
2141 BPF_MOV64_IMM(BPF_REG_0
, 0),
2145 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
,
2148 "direct packet access: test2",
2150 BPF_MOV64_IMM(BPF_REG_0
, 1),
2151 BPF_LDX_MEM(BPF_W
, BPF_REG_4
, BPF_REG_1
,
2152 offsetof(struct __sk_buff
, data_end
)),
2153 BPF_LDX_MEM(BPF_W
, BPF_REG_3
, BPF_REG_1
,
2154 offsetof(struct __sk_buff
, data
)),
2155 BPF_MOV64_REG(BPF_REG_5
, BPF_REG_3
),
2156 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_5
, 14),
2157 BPF_JMP_REG(BPF_JGT
, BPF_REG_5
, BPF_REG_4
, 15),
2158 BPF_LDX_MEM(BPF_B
, BPF_REG_0
, BPF_REG_3
, 7),
2159 BPF_LDX_MEM(BPF_B
, BPF_REG_4
, BPF_REG_3
, 12),
2160 BPF_ALU64_IMM(BPF_MUL
, BPF_REG_4
, 14),
2161 BPF_LDX_MEM(BPF_W
, BPF_REG_3
, BPF_REG_1
,
2162 offsetof(struct __sk_buff
, data
)),
2163 BPF_ALU64_REG(BPF_ADD
, BPF_REG_3
, BPF_REG_4
),
2164 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_1
),
2165 BPF_ALU64_IMM(BPF_LSH
, BPF_REG_2
, 48),
2166 BPF_ALU64_IMM(BPF_RSH
, BPF_REG_2
, 48),
2167 BPF_ALU64_REG(BPF_ADD
, BPF_REG_3
, BPF_REG_2
),
2168 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_3
),
2169 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, 8),
2170 BPF_LDX_MEM(BPF_W
, BPF_REG_1
, BPF_REG_1
,
2171 offsetof(struct __sk_buff
, data_end
)),
2172 BPF_JMP_REG(BPF_JGT
, BPF_REG_2
, BPF_REG_1
, 1),
2173 BPF_LDX_MEM(BPF_B
, BPF_REG_1
, BPF_REG_3
, 4),
2174 BPF_MOV64_IMM(BPF_REG_0
, 0),
2178 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
,
2181 "direct packet access: test3",
2183 BPF_LDX_MEM(BPF_W
, BPF_REG_2
, BPF_REG_1
,
2184 offsetof(struct __sk_buff
, data
)),
2185 BPF_MOV64_IMM(BPF_REG_0
, 0),
2188 .errstr
= "invalid bpf_context access off=76",
2190 .prog_type
= BPF_PROG_TYPE_SOCKET_FILTER
,
2193 "direct packet access: test4 (write)",
2195 BPF_LDX_MEM(BPF_W
, BPF_REG_2
, BPF_REG_1
,
2196 offsetof(struct __sk_buff
, data
)),
2197 BPF_LDX_MEM(BPF_W
, BPF_REG_3
, BPF_REG_1
,
2198 offsetof(struct __sk_buff
, data_end
)),
2199 BPF_MOV64_REG(BPF_REG_0
, BPF_REG_2
),
2200 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_0
, 8),
2201 BPF_JMP_REG(BPF_JGT
, BPF_REG_0
, BPF_REG_3
, 1),
2202 BPF_STX_MEM(BPF_B
, BPF_REG_2
, BPF_REG_2
, 0),
2203 BPF_MOV64_IMM(BPF_REG_0
, 0),
2207 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
,
2210 "direct packet access: test5 (pkt_end >= reg, good access)",
2212 BPF_LDX_MEM(BPF_W
, BPF_REG_2
, BPF_REG_1
,
2213 offsetof(struct __sk_buff
, data
)),
2214 BPF_LDX_MEM(BPF_W
, BPF_REG_3
, BPF_REG_1
,
2215 offsetof(struct __sk_buff
, data_end
)),
2216 BPF_MOV64_REG(BPF_REG_0
, BPF_REG_2
),
2217 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_0
, 8),
2218 BPF_JMP_REG(BPF_JGE
, BPF_REG_3
, BPF_REG_0
, 2),
2219 BPF_MOV64_IMM(BPF_REG_0
, 1),
2221 BPF_LDX_MEM(BPF_B
, BPF_REG_0
, BPF_REG_2
, 0),
2222 BPF_MOV64_IMM(BPF_REG_0
, 0),
2226 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
,
2229 "direct packet access: test6 (pkt_end >= reg, bad access)",
2231 BPF_LDX_MEM(BPF_W
, BPF_REG_2
, BPF_REG_1
,
2232 offsetof(struct __sk_buff
, data
)),
2233 BPF_LDX_MEM(BPF_W
, BPF_REG_3
, BPF_REG_1
,
2234 offsetof(struct __sk_buff
, data_end
)),
2235 BPF_MOV64_REG(BPF_REG_0
, BPF_REG_2
),
2236 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_0
, 8),
2237 BPF_JMP_REG(BPF_JGE
, BPF_REG_3
, BPF_REG_0
, 3),
2238 BPF_LDX_MEM(BPF_B
, BPF_REG_0
, BPF_REG_2
, 0),
2239 BPF_MOV64_IMM(BPF_REG_0
, 1),
2241 BPF_MOV64_IMM(BPF_REG_0
, 0),
2244 .errstr
= "invalid access to packet",
2246 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
,
2249 "direct packet access: test7 (pkt_end >= reg, both accesses)",
2251 BPF_LDX_MEM(BPF_W
, BPF_REG_2
, BPF_REG_1
,
2252 offsetof(struct __sk_buff
, data
)),
2253 BPF_LDX_MEM(BPF_W
, BPF_REG_3
, BPF_REG_1
,
2254 offsetof(struct __sk_buff
, data_end
)),
2255 BPF_MOV64_REG(BPF_REG_0
, BPF_REG_2
),
2256 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_0
, 8),
2257 BPF_JMP_REG(BPF_JGE
, BPF_REG_3
, BPF_REG_0
, 3),
2258 BPF_LDX_MEM(BPF_B
, BPF_REG_0
, BPF_REG_2
, 0),
2259 BPF_MOV64_IMM(BPF_REG_0
, 1),
2261 BPF_LDX_MEM(BPF_B
, BPF_REG_0
, BPF_REG_2
, 0),
2262 BPF_MOV64_IMM(BPF_REG_0
, 0),
2265 .errstr
= "invalid access to packet",
2267 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
,
2270 "direct packet access: test8 (double test, variant 1)",
2272 BPF_LDX_MEM(BPF_W
, BPF_REG_2
, BPF_REG_1
,
2273 offsetof(struct __sk_buff
, data
)),
2274 BPF_LDX_MEM(BPF_W
, BPF_REG_3
, BPF_REG_1
,
2275 offsetof(struct __sk_buff
, data_end
)),
2276 BPF_MOV64_REG(BPF_REG_0
, BPF_REG_2
),
2277 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_0
, 8),
2278 BPF_JMP_REG(BPF_JGE
, BPF_REG_3
, BPF_REG_0
, 4),
2279 BPF_JMP_REG(BPF_JGT
, BPF_REG_0
, BPF_REG_3
, 1),
2280 BPF_LDX_MEM(BPF_B
, BPF_REG_0
, BPF_REG_2
, 0),
2281 BPF_MOV64_IMM(BPF_REG_0
, 1),
2283 BPF_LDX_MEM(BPF_B
, BPF_REG_0
, BPF_REG_2
, 0),
2284 BPF_MOV64_IMM(BPF_REG_0
, 0),
2288 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
,
2291 "direct packet access: test9 (double test, variant 2)",
2293 BPF_LDX_MEM(BPF_W
, BPF_REG_2
, BPF_REG_1
,
2294 offsetof(struct __sk_buff
, data
)),
2295 BPF_LDX_MEM(BPF_W
, BPF_REG_3
, BPF_REG_1
,
2296 offsetof(struct __sk_buff
, data_end
)),
2297 BPF_MOV64_REG(BPF_REG_0
, BPF_REG_2
),
2298 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_0
, 8),
2299 BPF_JMP_REG(BPF_JGE
, BPF_REG_3
, BPF_REG_0
, 2),
2300 BPF_MOV64_IMM(BPF_REG_0
, 1),
2302 BPF_JMP_REG(BPF_JGT
, BPF_REG_0
, BPF_REG_3
, 1),
2303 BPF_LDX_MEM(BPF_B
, BPF_REG_0
, BPF_REG_2
, 0),
2304 BPF_LDX_MEM(BPF_B
, BPF_REG_0
, BPF_REG_2
, 0),
2305 BPF_MOV64_IMM(BPF_REG_0
, 0),
2309 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
,
2312 "direct packet access: test10 (write invalid)",
2314 BPF_LDX_MEM(BPF_W
, BPF_REG_2
, BPF_REG_1
,
2315 offsetof(struct __sk_buff
, data
)),
2316 BPF_LDX_MEM(BPF_W
, BPF_REG_3
, BPF_REG_1
,
2317 offsetof(struct __sk_buff
, data_end
)),
2318 BPF_MOV64_REG(BPF_REG_0
, BPF_REG_2
),
2319 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_0
, 8),
2320 BPF_JMP_REG(BPF_JGT
, BPF_REG_0
, BPF_REG_3
, 2),
2321 BPF_MOV64_IMM(BPF_REG_0
, 0),
2323 BPF_STX_MEM(BPF_B
, BPF_REG_2
, BPF_REG_2
, 0),
2324 BPF_MOV64_IMM(BPF_REG_0
, 0),
2327 .errstr
= "invalid access to packet",
2329 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
,
2332 "direct packet access: test11 (shift, good access)",
2334 BPF_LDX_MEM(BPF_W
, BPF_REG_2
, BPF_REG_1
,
2335 offsetof(struct __sk_buff
, data
)),
2336 BPF_LDX_MEM(BPF_W
, BPF_REG_3
, BPF_REG_1
,
2337 offsetof(struct __sk_buff
, data_end
)),
2338 BPF_MOV64_REG(BPF_REG_0
, BPF_REG_2
),
2339 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_0
, 22),
2340 BPF_JMP_REG(BPF_JGT
, BPF_REG_0
, BPF_REG_3
, 8),
2341 BPF_MOV64_IMM(BPF_REG_3
, 144),
2342 BPF_MOV64_REG(BPF_REG_5
, BPF_REG_3
),
2343 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_5
, 23),
2344 BPF_ALU64_IMM(BPF_RSH
, BPF_REG_5
, 3),
2345 BPF_MOV64_REG(BPF_REG_6
, BPF_REG_2
),
2346 BPF_ALU64_REG(BPF_ADD
, BPF_REG_6
, BPF_REG_5
),
2347 BPF_MOV64_IMM(BPF_REG_0
, 1),
2349 BPF_MOV64_IMM(BPF_REG_0
, 0),
2353 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
,
2356 "direct packet access: test12 (and, good access)",
2358 BPF_LDX_MEM(BPF_W
, BPF_REG_2
, BPF_REG_1
,
2359 offsetof(struct __sk_buff
, data
)),
2360 BPF_LDX_MEM(BPF_W
, BPF_REG_3
, BPF_REG_1
,
2361 offsetof(struct __sk_buff
, data_end
)),
2362 BPF_MOV64_REG(BPF_REG_0
, BPF_REG_2
),
2363 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_0
, 22),
2364 BPF_JMP_REG(BPF_JGT
, BPF_REG_0
, BPF_REG_3
, 8),
2365 BPF_MOV64_IMM(BPF_REG_3
, 144),
2366 BPF_MOV64_REG(BPF_REG_5
, BPF_REG_3
),
2367 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_5
, 23),
2368 BPF_ALU64_IMM(BPF_AND
, BPF_REG_5
, 15),
2369 BPF_MOV64_REG(BPF_REG_6
, BPF_REG_2
),
2370 BPF_ALU64_REG(BPF_ADD
, BPF_REG_6
, BPF_REG_5
),
2371 BPF_MOV64_IMM(BPF_REG_0
, 1),
2373 BPF_MOV64_IMM(BPF_REG_0
, 0),
2377 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
,
2380 "direct packet access: test13 (branches, good access)",
2382 BPF_LDX_MEM(BPF_W
, BPF_REG_2
, BPF_REG_1
,
2383 offsetof(struct __sk_buff
, data
)),
2384 BPF_LDX_MEM(BPF_W
, BPF_REG_3
, BPF_REG_1
,
2385 offsetof(struct __sk_buff
, data_end
)),
2386 BPF_MOV64_REG(BPF_REG_0
, BPF_REG_2
),
2387 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_0
, 22),
2388 BPF_JMP_REG(BPF_JGT
, BPF_REG_0
, BPF_REG_3
, 13),
2389 BPF_LDX_MEM(BPF_W
, BPF_REG_3
, BPF_REG_1
,
2390 offsetof(struct __sk_buff
, mark
)),
2391 BPF_MOV64_IMM(BPF_REG_4
, 1),
2392 BPF_JMP_REG(BPF_JGT
, BPF_REG_3
, BPF_REG_4
, 2),
2393 BPF_MOV64_IMM(BPF_REG_3
, 14),
2394 BPF_JMP_IMM(BPF_JA
, 0, 0, 1),
2395 BPF_MOV64_IMM(BPF_REG_3
, 24),
2396 BPF_MOV64_REG(BPF_REG_5
, BPF_REG_3
),
2397 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_5
, 23),
2398 BPF_ALU64_IMM(BPF_AND
, BPF_REG_5
, 15),
2399 BPF_MOV64_REG(BPF_REG_6
, BPF_REG_2
),
2400 BPF_ALU64_REG(BPF_ADD
, BPF_REG_6
, BPF_REG_5
),
2401 BPF_MOV64_IMM(BPF_REG_0
, 1),
2403 BPF_MOV64_IMM(BPF_REG_0
, 0),
2407 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
,
2410 "direct packet access: test14 (pkt_ptr += 0, CONST_IMM, good access)",
2412 BPF_LDX_MEM(BPF_W
, BPF_REG_2
, BPF_REG_1
,
2413 offsetof(struct __sk_buff
, data
)),
2414 BPF_LDX_MEM(BPF_W
, BPF_REG_3
, BPF_REG_1
,
2415 offsetof(struct __sk_buff
, data_end
)),
2416 BPF_MOV64_REG(BPF_REG_0
, BPF_REG_2
),
2417 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_0
, 22),
2418 BPF_JMP_REG(BPF_JGT
, BPF_REG_0
, BPF_REG_3
, 7),
2419 BPF_MOV64_IMM(BPF_REG_5
, 12),
2420 BPF_ALU64_IMM(BPF_RSH
, BPF_REG_5
, 4),
2421 BPF_MOV64_REG(BPF_REG_6
, BPF_REG_2
),
2422 BPF_ALU64_REG(BPF_ADD
, BPF_REG_6
, BPF_REG_5
),
2423 BPF_LDX_MEM(BPF_B
, BPF_REG_0
, BPF_REG_6
, 0),
2424 BPF_MOV64_IMM(BPF_REG_0
, 1),
2426 BPF_MOV64_IMM(BPF_REG_0
, 0),
2430 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
,
2433 "helper access to packet: test1, valid packet_ptr range",
2435 BPF_LDX_MEM(BPF_W
, BPF_REG_2
, BPF_REG_1
,
2436 offsetof(struct xdp_md
, data
)),
2437 BPF_LDX_MEM(BPF_W
, BPF_REG_3
, BPF_REG_1
,
2438 offsetof(struct xdp_md
, data_end
)),
2439 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_2
),
2440 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_1
, 8),
2441 BPF_JMP_REG(BPF_JGT
, BPF_REG_1
, BPF_REG_3
, 5),
2442 BPF_LD_MAP_FD(BPF_REG_1
, 0),
2443 BPF_MOV64_REG(BPF_REG_3
, BPF_REG_2
),
2444 BPF_MOV64_IMM(BPF_REG_4
, 0),
2445 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
2446 BPF_FUNC_map_update_elem
),
2447 BPF_MOV64_IMM(BPF_REG_0
, 0),
2450 .fixup_map1
= { 5 },
2451 .result_unpriv
= ACCEPT
,
2453 .prog_type
= BPF_PROG_TYPE_XDP
,
2456 "helper access to packet: test2, unchecked packet_ptr",
2458 BPF_LDX_MEM(BPF_W
, BPF_REG_2
, BPF_REG_1
,
2459 offsetof(struct xdp_md
, data
)),
2460 BPF_LD_MAP_FD(BPF_REG_1
, 0),
2461 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
2462 BPF_FUNC_map_lookup_elem
),
2463 BPF_MOV64_IMM(BPF_REG_0
, 0),
2466 .fixup_map1
= { 1 },
2468 .errstr
= "invalid access to packet",
2469 .prog_type
= BPF_PROG_TYPE_XDP
,
2472 "helper access to packet: test3, variable add",
2474 BPF_LDX_MEM(BPF_W
, BPF_REG_2
, BPF_REG_1
,
2475 offsetof(struct xdp_md
, data
)),
2476 BPF_LDX_MEM(BPF_W
, BPF_REG_3
, BPF_REG_1
,
2477 offsetof(struct xdp_md
, data_end
)),
2478 BPF_MOV64_REG(BPF_REG_4
, BPF_REG_2
),
2479 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_4
, 8),
2480 BPF_JMP_REG(BPF_JGT
, BPF_REG_4
, BPF_REG_3
, 10),
2481 BPF_LDX_MEM(BPF_B
, BPF_REG_5
, BPF_REG_2
, 0),
2482 BPF_MOV64_REG(BPF_REG_4
, BPF_REG_2
),
2483 BPF_ALU64_REG(BPF_ADD
, BPF_REG_4
, BPF_REG_5
),
2484 BPF_MOV64_REG(BPF_REG_5
, BPF_REG_4
),
2485 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_5
, 8),
2486 BPF_JMP_REG(BPF_JGT
, BPF_REG_5
, BPF_REG_3
, 4),
2487 BPF_LD_MAP_FD(BPF_REG_1
, 0),
2488 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_4
),
2489 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
2490 BPF_FUNC_map_lookup_elem
),
2491 BPF_MOV64_IMM(BPF_REG_0
, 0),
2494 .fixup_map1
= { 11 },
2496 .prog_type
= BPF_PROG_TYPE_XDP
,
2499 "helper access to packet: test4, packet_ptr with bad range",
2501 BPF_LDX_MEM(BPF_W
, BPF_REG_2
, BPF_REG_1
,
2502 offsetof(struct xdp_md
, data
)),
2503 BPF_LDX_MEM(BPF_W
, BPF_REG_3
, BPF_REG_1
,
2504 offsetof(struct xdp_md
, data_end
)),
2505 BPF_MOV64_REG(BPF_REG_4
, BPF_REG_2
),
2506 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_4
, 4),
2507 BPF_JMP_REG(BPF_JGT
, BPF_REG_4
, BPF_REG_3
, 2),
2508 BPF_MOV64_IMM(BPF_REG_0
, 0),
2510 BPF_LD_MAP_FD(BPF_REG_1
, 0),
2511 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
2512 BPF_FUNC_map_lookup_elem
),
2513 BPF_MOV64_IMM(BPF_REG_0
, 0),
2516 .fixup_map1
= { 7 },
2518 .errstr
= "invalid access to packet",
2519 .prog_type
= BPF_PROG_TYPE_XDP
,
2522 "helper access to packet: test5, packet_ptr with too short range",
2524 BPF_LDX_MEM(BPF_W
, BPF_REG_2
, BPF_REG_1
,
2525 offsetof(struct xdp_md
, data
)),
2526 BPF_LDX_MEM(BPF_W
, BPF_REG_3
, BPF_REG_1
,
2527 offsetof(struct xdp_md
, data_end
)),
2528 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, 1),
2529 BPF_MOV64_REG(BPF_REG_4
, BPF_REG_2
),
2530 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_4
, 7),
2531 BPF_JMP_REG(BPF_JGT
, BPF_REG_4
, BPF_REG_3
, 3),
2532 BPF_LD_MAP_FD(BPF_REG_1
, 0),
2533 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
2534 BPF_FUNC_map_lookup_elem
),
2535 BPF_MOV64_IMM(BPF_REG_0
, 0),
2538 .fixup_map1
= { 6 },
2540 .errstr
= "invalid access to packet",
2541 .prog_type
= BPF_PROG_TYPE_XDP
,
2544 "helper access to packet: test6, cls valid packet_ptr range",
2546 BPF_LDX_MEM(BPF_W
, BPF_REG_2
, BPF_REG_1
,
2547 offsetof(struct __sk_buff
, data
)),
2548 BPF_LDX_MEM(BPF_W
, BPF_REG_3
, BPF_REG_1
,
2549 offsetof(struct __sk_buff
, data_end
)),
2550 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_2
),
2551 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_1
, 8),
2552 BPF_JMP_REG(BPF_JGT
, BPF_REG_1
, BPF_REG_3
, 5),
2553 BPF_LD_MAP_FD(BPF_REG_1
, 0),
2554 BPF_MOV64_REG(BPF_REG_3
, BPF_REG_2
),
2555 BPF_MOV64_IMM(BPF_REG_4
, 0),
2556 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
2557 BPF_FUNC_map_update_elem
),
2558 BPF_MOV64_IMM(BPF_REG_0
, 0),
2561 .fixup_map1
= { 5 },
2563 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
,
2566 "helper access to packet: test7, cls unchecked packet_ptr",
2568 BPF_LDX_MEM(BPF_W
, BPF_REG_2
, BPF_REG_1
,
2569 offsetof(struct __sk_buff
, data
)),
2570 BPF_LD_MAP_FD(BPF_REG_1
, 0),
2571 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
2572 BPF_FUNC_map_lookup_elem
),
2573 BPF_MOV64_IMM(BPF_REG_0
, 0),
2576 .fixup_map1
= { 1 },
2578 .errstr
= "invalid access to packet",
2579 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
,
2582 "helper access to packet: test8, cls variable add",
2584 BPF_LDX_MEM(BPF_W
, BPF_REG_2
, BPF_REG_1
,
2585 offsetof(struct __sk_buff
, data
)),
2586 BPF_LDX_MEM(BPF_W
, BPF_REG_3
, BPF_REG_1
,
2587 offsetof(struct __sk_buff
, data_end
)),
2588 BPF_MOV64_REG(BPF_REG_4
, BPF_REG_2
),
2589 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_4
, 8),
2590 BPF_JMP_REG(BPF_JGT
, BPF_REG_4
, BPF_REG_3
, 10),
2591 BPF_LDX_MEM(BPF_B
, BPF_REG_5
, BPF_REG_2
, 0),
2592 BPF_MOV64_REG(BPF_REG_4
, BPF_REG_2
),
2593 BPF_ALU64_REG(BPF_ADD
, BPF_REG_4
, BPF_REG_5
),
2594 BPF_MOV64_REG(BPF_REG_5
, BPF_REG_4
),
2595 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_5
, 8),
2596 BPF_JMP_REG(BPF_JGT
, BPF_REG_5
, BPF_REG_3
, 4),
2597 BPF_LD_MAP_FD(BPF_REG_1
, 0),
2598 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_4
),
2599 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
2600 BPF_FUNC_map_lookup_elem
),
2601 BPF_MOV64_IMM(BPF_REG_0
, 0),
2604 .fixup_map1
= { 11 },
2606 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
,
2609 "helper access to packet: test9, cls packet_ptr with bad range",
2611 BPF_LDX_MEM(BPF_W
, BPF_REG_2
, BPF_REG_1
,
2612 offsetof(struct __sk_buff
, data
)),
2613 BPF_LDX_MEM(BPF_W
, BPF_REG_3
, BPF_REG_1
,
2614 offsetof(struct __sk_buff
, data_end
)),
2615 BPF_MOV64_REG(BPF_REG_4
, BPF_REG_2
),
2616 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_4
, 4),
2617 BPF_JMP_REG(BPF_JGT
, BPF_REG_4
, BPF_REG_3
, 2),
2618 BPF_MOV64_IMM(BPF_REG_0
, 0),
2620 BPF_LD_MAP_FD(BPF_REG_1
, 0),
2621 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
2622 BPF_FUNC_map_lookup_elem
),
2623 BPF_MOV64_IMM(BPF_REG_0
, 0),
2626 .fixup_map1
= { 7 },
2628 .errstr
= "invalid access to packet",
2629 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
,
2632 "helper access to packet: test10, cls packet_ptr with too short range",
2634 BPF_LDX_MEM(BPF_W
, BPF_REG_2
, BPF_REG_1
,
2635 offsetof(struct __sk_buff
, data
)),
2636 BPF_LDX_MEM(BPF_W
, BPF_REG_3
, BPF_REG_1
,
2637 offsetof(struct __sk_buff
, data_end
)),
2638 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, 1),
2639 BPF_MOV64_REG(BPF_REG_4
, BPF_REG_2
),
2640 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_4
, 7),
2641 BPF_JMP_REG(BPF_JGT
, BPF_REG_4
, BPF_REG_3
, 3),
2642 BPF_LD_MAP_FD(BPF_REG_1
, 0),
2643 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
2644 BPF_FUNC_map_lookup_elem
),
2645 BPF_MOV64_IMM(BPF_REG_0
, 0),
2648 .fixup_map1
= { 6 },
2650 .errstr
= "invalid access to packet",
2651 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
,
2654 "helper access to packet: test11, cls unsuitable helper 1",
2656 BPF_LDX_MEM(BPF_W
, BPF_REG_6
, BPF_REG_1
,
2657 offsetof(struct __sk_buff
, data
)),
2658 BPF_LDX_MEM(BPF_W
, BPF_REG_7
, BPF_REG_1
,
2659 offsetof(struct __sk_buff
, data_end
)),
2660 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_6
, 1),
2661 BPF_MOV64_REG(BPF_REG_3
, BPF_REG_6
),
2662 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_3
, 7),
2663 BPF_JMP_REG(BPF_JGT
, BPF_REG_3
, BPF_REG_7
, 4),
2664 BPF_MOV64_IMM(BPF_REG_2
, 0),
2665 BPF_MOV64_IMM(BPF_REG_4
, 42),
2666 BPF_MOV64_IMM(BPF_REG_5
, 0),
2667 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
2668 BPF_FUNC_skb_store_bytes
),
2669 BPF_MOV64_IMM(BPF_REG_0
, 0),
2673 .errstr
= "helper access to the packet",
2674 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
,
2677 "helper access to packet: test12, cls unsuitable helper 2",
2679 BPF_LDX_MEM(BPF_W
, BPF_REG_6
, BPF_REG_1
,
2680 offsetof(struct __sk_buff
, data
)),
2681 BPF_LDX_MEM(BPF_W
, BPF_REG_7
, BPF_REG_1
,
2682 offsetof(struct __sk_buff
, data_end
)),
2683 BPF_MOV64_REG(BPF_REG_3
, BPF_REG_6
),
2684 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_6
, 8),
2685 BPF_JMP_REG(BPF_JGT
, BPF_REG_6
, BPF_REG_7
, 3),
2686 BPF_MOV64_IMM(BPF_REG_2
, 0),
2687 BPF_MOV64_IMM(BPF_REG_4
, 4),
2688 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
2689 BPF_FUNC_skb_load_bytes
),
2690 BPF_MOV64_IMM(BPF_REG_0
, 0),
2694 .errstr
= "helper access to the packet",
2695 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
,
2698 "helper access to packet: test13, cls helper ok",
2700 BPF_LDX_MEM(BPF_W
, BPF_REG_6
, BPF_REG_1
,
2701 offsetof(struct __sk_buff
, data
)),
2702 BPF_LDX_MEM(BPF_W
, BPF_REG_7
, BPF_REG_1
,
2703 offsetof(struct __sk_buff
, data_end
)),
2704 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_6
, 1),
2705 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_6
),
2706 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_1
, 7),
2707 BPF_JMP_REG(BPF_JGT
, BPF_REG_1
, BPF_REG_7
, 6),
2708 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_6
),
2709 BPF_MOV64_IMM(BPF_REG_2
, 4),
2710 BPF_MOV64_IMM(BPF_REG_3
, 0),
2711 BPF_MOV64_IMM(BPF_REG_4
, 0),
2712 BPF_MOV64_IMM(BPF_REG_5
, 0),
2713 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
2714 BPF_FUNC_csum_diff
),
2715 BPF_MOV64_IMM(BPF_REG_0
, 0),
2719 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
,
2722 "helper access to packet: test14, cls helper fail sub",
2724 BPF_LDX_MEM(BPF_W
, BPF_REG_6
, BPF_REG_1
,
2725 offsetof(struct __sk_buff
, data
)),
2726 BPF_LDX_MEM(BPF_W
, BPF_REG_7
, BPF_REG_1
,
2727 offsetof(struct __sk_buff
, data_end
)),
2728 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_6
, 1),
2729 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_6
),
2730 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_1
, 7),
2731 BPF_JMP_REG(BPF_JGT
, BPF_REG_1
, BPF_REG_7
, 6),
2732 BPF_ALU64_IMM(BPF_SUB
, BPF_REG_1
, 4),
2733 BPF_MOV64_IMM(BPF_REG_2
, 4),
2734 BPF_MOV64_IMM(BPF_REG_3
, 0),
2735 BPF_MOV64_IMM(BPF_REG_4
, 0),
2736 BPF_MOV64_IMM(BPF_REG_5
, 0),
2737 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
2738 BPF_FUNC_csum_diff
),
2739 BPF_MOV64_IMM(BPF_REG_0
, 0),
2743 .errstr
= "type=inv expected=fp",
2744 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
,
2747 "helper access to packet: test15, cls helper fail range 1",
2749 BPF_LDX_MEM(BPF_W
, BPF_REG_6
, BPF_REG_1
,
2750 offsetof(struct __sk_buff
, data
)),
2751 BPF_LDX_MEM(BPF_W
, BPF_REG_7
, BPF_REG_1
,
2752 offsetof(struct __sk_buff
, data_end
)),
2753 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_6
, 1),
2754 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_6
),
2755 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_1
, 7),
2756 BPF_JMP_REG(BPF_JGT
, BPF_REG_1
, BPF_REG_7
, 6),
2757 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_6
),
2758 BPF_MOV64_IMM(BPF_REG_2
, 8),
2759 BPF_MOV64_IMM(BPF_REG_3
, 0),
2760 BPF_MOV64_IMM(BPF_REG_4
, 0),
2761 BPF_MOV64_IMM(BPF_REG_5
, 0),
2762 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
2763 BPF_FUNC_csum_diff
),
2764 BPF_MOV64_IMM(BPF_REG_0
, 0),
2768 .errstr
= "invalid access to packet",
2769 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
,
2772 "helper access to packet: test16, cls helper fail range 2",
2774 BPF_LDX_MEM(BPF_W
, BPF_REG_6
, BPF_REG_1
,
2775 offsetof(struct __sk_buff
, data
)),
2776 BPF_LDX_MEM(BPF_W
, BPF_REG_7
, BPF_REG_1
,
2777 offsetof(struct __sk_buff
, data_end
)),
2778 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_6
, 1),
2779 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_6
),
2780 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_1
, 7),
2781 BPF_JMP_REG(BPF_JGT
, BPF_REG_1
, BPF_REG_7
, 6),
2782 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_6
),
2783 BPF_MOV64_IMM(BPF_REG_2
, -9),
2784 BPF_MOV64_IMM(BPF_REG_3
, 0),
2785 BPF_MOV64_IMM(BPF_REG_4
, 0),
2786 BPF_MOV64_IMM(BPF_REG_5
, 0),
2787 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
2788 BPF_FUNC_csum_diff
),
2789 BPF_MOV64_IMM(BPF_REG_0
, 0),
2793 .errstr
= "invalid access to packet",
2794 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
,
2797 "helper access to packet: test17, cls helper fail range 3",
2799 BPF_LDX_MEM(BPF_W
, BPF_REG_6
, BPF_REG_1
,
2800 offsetof(struct __sk_buff
, data
)),
2801 BPF_LDX_MEM(BPF_W
, BPF_REG_7
, BPF_REG_1
,
2802 offsetof(struct __sk_buff
, data_end
)),
2803 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_6
, 1),
2804 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_6
),
2805 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_1
, 7),
2806 BPF_JMP_REG(BPF_JGT
, BPF_REG_1
, BPF_REG_7
, 6),
2807 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_6
),
2808 BPF_MOV64_IMM(BPF_REG_2
, ~0),
2809 BPF_MOV64_IMM(BPF_REG_3
, 0),
2810 BPF_MOV64_IMM(BPF_REG_4
, 0),
2811 BPF_MOV64_IMM(BPF_REG_5
, 0),
2812 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
2813 BPF_FUNC_csum_diff
),
2814 BPF_MOV64_IMM(BPF_REG_0
, 0),
2818 .errstr
= "invalid access to packet",
2819 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
,
2822 "helper access to packet: test18, cls helper fail range zero",
2824 BPF_LDX_MEM(BPF_W
, BPF_REG_6
, BPF_REG_1
,
2825 offsetof(struct __sk_buff
, data
)),
2826 BPF_LDX_MEM(BPF_W
, BPF_REG_7
, BPF_REG_1
,
2827 offsetof(struct __sk_buff
, data_end
)),
2828 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_6
, 1),
2829 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_6
),
2830 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_1
, 7),
2831 BPF_JMP_REG(BPF_JGT
, BPF_REG_1
, BPF_REG_7
, 6),
2832 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_6
),
2833 BPF_MOV64_IMM(BPF_REG_2
, 0),
2834 BPF_MOV64_IMM(BPF_REG_3
, 0),
2835 BPF_MOV64_IMM(BPF_REG_4
, 0),
2836 BPF_MOV64_IMM(BPF_REG_5
, 0),
2837 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
2838 BPF_FUNC_csum_diff
),
2839 BPF_MOV64_IMM(BPF_REG_0
, 0),
2843 .errstr
= "invalid access to packet",
2844 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
,
2847 "helper access to packet: test19, pkt end as input",
2849 BPF_LDX_MEM(BPF_W
, BPF_REG_6
, BPF_REG_1
,
2850 offsetof(struct __sk_buff
, data
)),
2851 BPF_LDX_MEM(BPF_W
, BPF_REG_7
, BPF_REG_1
,
2852 offsetof(struct __sk_buff
, data_end
)),
2853 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_6
, 1),
2854 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_6
),
2855 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_1
, 7),
2856 BPF_JMP_REG(BPF_JGT
, BPF_REG_1
, BPF_REG_7
, 6),
2857 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_7
),
2858 BPF_MOV64_IMM(BPF_REG_2
, 4),
2859 BPF_MOV64_IMM(BPF_REG_3
, 0),
2860 BPF_MOV64_IMM(BPF_REG_4
, 0),
2861 BPF_MOV64_IMM(BPF_REG_5
, 0),
2862 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
2863 BPF_FUNC_csum_diff
),
2864 BPF_MOV64_IMM(BPF_REG_0
, 0),
2868 .errstr
= "R1 type=pkt_end expected=fp",
2869 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
,
2872 "helper access to packet: test20, wrong reg",
2874 BPF_LDX_MEM(BPF_W
, BPF_REG_6
, BPF_REG_1
,
2875 offsetof(struct __sk_buff
, data
)),
2876 BPF_LDX_MEM(BPF_W
, BPF_REG_7
, BPF_REG_1
,
2877 offsetof(struct __sk_buff
, data_end
)),
2878 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_6
, 1),
2879 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_6
),
2880 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_1
, 7),
2881 BPF_JMP_REG(BPF_JGT
, BPF_REG_1
, BPF_REG_7
, 6),
2882 BPF_MOV64_IMM(BPF_REG_2
, 4),
2883 BPF_MOV64_IMM(BPF_REG_3
, 0),
2884 BPF_MOV64_IMM(BPF_REG_4
, 0),
2885 BPF_MOV64_IMM(BPF_REG_5
, 0),
2886 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
2887 BPF_FUNC_csum_diff
),
2888 BPF_MOV64_IMM(BPF_REG_0
, 0),
2892 .errstr
= "invalid access to packet",
2893 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
,
2896 "valid map access into an array with a constant",
2898 BPF_ST_MEM(BPF_DW
, BPF_REG_10
, -8, 0),
2899 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
2900 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
2901 BPF_LD_MAP_FD(BPF_REG_1
, 0),
2902 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
2903 BPF_FUNC_map_lookup_elem
),
2904 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_0
, 0, 1),
2905 BPF_ST_MEM(BPF_DW
, BPF_REG_0
, 0,
2906 offsetof(struct test_val
, foo
)),
2909 .fixup_map2
= { 3 },
2910 .errstr_unpriv
= "R0 leaks addr",
2911 .result_unpriv
= REJECT
,
2915 "valid map access into an array with a register",
2917 BPF_ST_MEM(BPF_DW
, BPF_REG_10
, -8, 0),
2918 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
2919 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
2920 BPF_LD_MAP_FD(BPF_REG_1
, 0),
2921 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
2922 BPF_FUNC_map_lookup_elem
),
2923 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_0
, 0, 4),
2924 BPF_MOV64_IMM(BPF_REG_1
, 4),
2925 BPF_ALU64_IMM(BPF_LSH
, BPF_REG_1
, 2),
2926 BPF_ALU64_REG(BPF_ADD
, BPF_REG_0
, BPF_REG_1
),
2927 BPF_ST_MEM(BPF_DW
, BPF_REG_0
, 0,
2928 offsetof(struct test_val
, foo
)),
2931 .fixup_map2
= { 3 },
2932 .errstr_unpriv
= "R0 pointer arithmetic prohibited",
2933 .result_unpriv
= REJECT
,
2937 "valid map access into an array with a variable",
2939 BPF_ST_MEM(BPF_DW
, BPF_REG_10
, -8, 0),
2940 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
2941 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
2942 BPF_LD_MAP_FD(BPF_REG_1
, 0),
2943 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
2944 BPF_FUNC_map_lookup_elem
),
2945 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_0
, 0, 5),
2946 BPF_LDX_MEM(BPF_W
, BPF_REG_1
, BPF_REG_0
, 0),
2947 BPF_JMP_IMM(BPF_JGE
, BPF_REG_1
, MAX_ENTRIES
, 3),
2948 BPF_ALU64_IMM(BPF_LSH
, BPF_REG_1
, 2),
2949 BPF_ALU64_REG(BPF_ADD
, BPF_REG_0
, BPF_REG_1
),
2950 BPF_ST_MEM(BPF_DW
, BPF_REG_0
, 0,
2951 offsetof(struct test_val
, foo
)),
2954 .fixup_map2
= { 3 },
2955 .errstr_unpriv
= "R0 pointer arithmetic prohibited",
2956 .result_unpriv
= REJECT
,
2960 "valid map access into an array with a signed variable",
2962 BPF_ST_MEM(BPF_DW
, BPF_REG_10
, -8, 0),
2963 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
2964 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
2965 BPF_LD_MAP_FD(BPF_REG_1
, 0),
2966 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
2967 BPF_FUNC_map_lookup_elem
),
2968 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_0
, 0, 9),
2969 BPF_LDX_MEM(BPF_W
, BPF_REG_1
, BPF_REG_0
, 0),
2970 BPF_JMP_IMM(BPF_JSGT
, BPF_REG_1
, 0xffffffff, 1),
2971 BPF_MOV32_IMM(BPF_REG_1
, 0),
2972 BPF_MOV32_IMM(BPF_REG_2
, MAX_ENTRIES
),
2973 BPF_JMP_REG(BPF_JSGT
, BPF_REG_2
, BPF_REG_1
, 1),
2974 BPF_MOV32_IMM(BPF_REG_1
, 0),
2975 BPF_ALU32_IMM(BPF_LSH
, BPF_REG_1
, 2),
2976 BPF_ALU64_REG(BPF_ADD
, BPF_REG_0
, BPF_REG_1
),
2977 BPF_ST_MEM(BPF_DW
, BPF_REG_0
, 0,
2978 offsetof(struct test_val
, foo
)),
2981 .fixup_map2
= { 3 },
2982 .errstr_unpriv
= "R0 pointer arithmetic prohibited",
2983 .result_unpriv
= REJECT
,
2987 "invalid map access into an array with a constant",
2989 BPF_ST_MEM(BPF_DW
, BPF_REG_10
, -8, 0),
2990 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
2991 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
2992 BPF_LD_MAP_FD(BPF_REG_1
, 0),
2993 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
2994 BPF_FUNC_map_lookup_elem
),
2995 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_0
, 0, 1),
2996 BPF_ST_MEM(BPF_DW
, BPF_REG_0
, (MAX_ENTRIES
+ 1) << 2,
2997 offsetof(struct test_val
, foo
)),
3000 .fixup_map2
= { 3 },
3001 .errstr
= "invalid access to map value, value_size=48 off=48 size=8",
3005 "invalid map access into an array with a register",
3007 BPF_ST_MEM(BPF_DW
, BPF_REG_10
, -8, 0),
3008 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
3009 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
3010 BPF_LD_MAP_FD(BPF_REG_1
, 0),
3011 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
3012 BPF_FUNC_map_lookup_elem
),
3013 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_0
, 0, 4),
3014 BPF_MOV64_IMM(BPF_REG_1
, MAX_ENTRIES
+ 1),
3015 BPF_ALU64_IMM(BPF_LSH
, BPF_REG_1
, 2),
3016 BPF_ALU64_REG(BPF_ADD
, BPF_REG_0
, BPF_REG_1
),
3017 BPF_ST_MEM(BPF_DW
, BPF_REG_0
, 0,
3018 offsetof(struct test_val
, foo
)),
3021 .fixup_map2
= { 3 },
3022 .errstr_unpriv
= "R0 pointer arithmetic prohibited",
3023 .errstr
= "R0 min value is outside of the array range",
3024 .result_unpriv
= REJECT
,
3028 "invalid map access into an array with a variable",
3030 BPF_ST_MEM(BPF_DW
, BPF_REG_10
, -8, 0),
3031 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
3032 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
3033 BPF_LD_MAP_FD(BPF_REG_1
, 0),
3034 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
3035 BPF_FUNC_map_lookup_elem
),
3036 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_0
, 0, 4),
3037 BPF_LDX_MEM(BPF_W
, BPF_REG_1
, BPF_REG_0
, 0),
3038 BPF_ALU64_IMM(BPF_LSH
, BPF_REG_1
, 2),
3039 BPF_ALU64_REG(BPF_ADD
, BPF_REG_0
, BPF_REG_1
),
3040 BPF_ST_MEM(BPF_DW
, BPF_REG_0
, 0,
3041 offsetof(struct test_val
, foo
)),
3044 .fixup_map2
= { 3 },
3045 .errstr_unpriv
= "R0 pointer arithmetic prohibited",
3046 .errstr
= "R0 min value is negative, either use unsigned index or do a if (index >=0) check.",
3047 .result_unpriv
= REJECT
,
3051 "invalid map access into an array with no floor check",
3053 BPF_ST_MEM(BPF_DW
, BPF_REG_10
, -8, 0),
3054 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
3055 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
3056 BPF_LD_MAP_FD(BPF_REG_1
, 0),
3057 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
3058 BPF_FUNC_map_lookup_elem
),
3059 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_0
, 0, 7),
3060 BPF_LDX_MEM(BPF_W
, BPF_REG_1
, BPF_REG_0
, 0),
3061 BPF_MOV32_IMM(BPF_REG_2
, MAX_ENTRIES
),
3062 BPF_JMP_REG(BPF_JSGT
, BPF_REG_2
, BPF_REG_1
, 1),
3063 BPF_MOV32_IMM(BPF_REG_1
, 0),
3064 BPF_ALU32_IMM(BPF_LSH
, BPF_REG_1
, 2),
3065 BPF_ALU64_REG(BPF_ADD
, BPF_REG_0
, BPF_REG_1
),
3066 BPF_ST_MEM(BPF_DW
, BPF_REG_0
, 0,
3067 offsetof(struct test_val
, foo
)),
3070 .fixup_map2
= { 3 },
3071 .errstr_unpriv
= "R0 pointer arithmetic prohibited",
3072 .errstr
= "R0 min value is negative, either use unsigned index or do a if (index >=0) check.",
3073 .result_unpriv
= REJECT
,
3077 "invalid map access into an array with a invalid max check",
3079 BPF_ST_MEM(BPF_DW
, BPF_REG_10
, -8, 0),
3080 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
3081 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
3082 BPF_LD_MAP_FD(BPF_REG_1
, 0),
3083 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
3084 BPF_FUNC_map_lookup_elem
),
3085 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_0
, 0, 7),
3086 BPF_LDX_MEM(BPF_W
, BPF_REG_1
, BPF_REG_0
, 0),
3087 BPF_MOV32_IMM(BPF_REG_2
, MAX_ENTRIES
+ 1),
3088 BPF_JMP_REG(BPF_JGT
, BPF_REG_2
, BPF_REG_1
, 1),
3089 BPF_MOV32_IMM(BPF_REG_1
, 0),
3090 BPF_ALU32_IMM(BPF_LSH
, BPF_REG_1
, 2),
3091 BPF_ALU64_REG(BPF_ADD
, BPF_REG_0
, BPF_REG_1
),
3092 BPF_ST_MEM(BPF_DW
, BPF_REG_0
, 0,
3093 offsetof(struct test_val
, foo
)),
3096 .fixup_map2
= { 3 },
3097 .errstr_unpriv
= "R0 pointer arithmetic prohibited",
3098 .errstr
= "invalid access to map value, value_size=48 off=44 size=8",
3099 .result_unpriv
= REJECT
,
3103 "invalid map access into an array with a invalid max check",
3105 BPF_ST_MEM(BPF_DW
, BPF_REG_10
, -8, 0),
3106 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
3107 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
3108 BPF_LD_MAP_FD(BPF_REG_1
, 0),
3109 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
3110 BPF_FUNC_map_lookup_elem
),
3111 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_0
, 0, 10),
3112 BPF_MOV64_REG(BPF_REG_8
, BPF_REG_0
),
3113 BPF_ST_MEM(BPF_DW
, BPF_REG_10
, -8, 0),
3114 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
3115 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
3116 BPF_LD_MAP_FD(BPF_REG_1
, 0),
3117 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
3118 BPF_FUNC_map_lookup_elem
),
3119 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_0
, 0, 2),
3120 BPF_ALU64_REG(BPF_ADD
, BPF_REG_0
, BPF_REG_8
),
3121 BPF_LDX_MEM(BPF_W
, BPF_REG_0
, BPF_REG_0
,
3122 offsetof(struct test_val
, foo
)),
3125 .fixup_map2
= { 3, 11 },
3126 .errstr_unpriv
= "R0 pointer arithmetic prohibited",
3127 .errstr
= "R0 min value is negative, either use unsigned index or do a if (index >=0) check.",
3128 .result_unpriv
= REJECT
,
3132 "multiple registers share map_lookup_elem result",
3134 BPF_MOV64_IMM(BPF_REG_1
, 10),
3135 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_1
, -8),
3136 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
3137 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
3138 BPF_LD_MAP_FD(BPF_REG_1
, 0),
3139 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
3140 BPF_FUNC_map_lookup_elem
),
3141 BPF_MOV64_REG(BPF_REG_4
, BPF_REG_0
),
3142 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_0
, 0, 1),
3143 BPF_ST_MEM(BPF_DW
, BPF_REG_4
, 0, 0),
3146 .fixup_map1
= { 4 },
3148 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
3151 "invalid memory access with multiple map_lookup_elem calls",
3153 BPF_MOV64_IMM(BPF_REG_1
, 10),
3154 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_1
, -8),
3155 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
3156 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
3157 BPF_LD_MAP_FD(BPF_REG_1
, 0),
3158 BPF_MOV64_REG(BPF_REG_8
, BPF_REG_1
),
3159 BPF_MOV64_REG(BPF_REG_7
, BPF_REG_2
),
3160 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
3161 BPF_FUNC_map_lookup_elem
),
3162 BPF_MOV64_REG(BPF_REG_4
, BPF_REG_0
),
3163 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_8
),
3164 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_7
),
3165 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
3166 BPF_FUNC_map_lookup_elem
),
3167 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_0
, 0, 1),
3168 BPF_ST_MEM(BPF_DW
, BPF_REG_4
, 0, 0),
3171 .fixup_map1
= { 4 },
3173 .errstr
= "R4 !read_ok",
3174 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
3177 "valid indirect map_lookup_elem access with 2nd lookup in branch",
3179 BPF_MOV64_IMM(BPF_REG_1
, 10),
3180 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_1
, -8),
3181 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
3182 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
3183 BPF_LD_MAP_FD(BPF_REG_1
, 0),
3184 BPF_MOV64_REG(BPF_REG_8
, BPF_REG_1
),
3185 BPF_MOV64_REG(BPF_REG_7
, BPF_REG_2
),
3186 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
3187 BPF_FUNC_map_lookup_elem
),
3188 BPF_MOV64_IMM(BPF_REG_2
, 10),
3189 BPF_JMP_IMM(BPF_JNE
, BPF_REG_2
, 0, 3),
3190 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_8
),
3191 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_7
),
3192 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
3193 BPF_FUNC_map_lookup_elem
),
3194 BPF_MOV64_REG(BPF_REG_4
, BPF_REG_0
),
3195 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_0
, 0, 1),
3196 BPF_ST_MEM(BPF_DW
, BPF_REG_4
, 0, 0),
3199 .fixup_map1
= { 4 },
3201 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
3204 "multiple registers share map_lookup_elem bad reg type",
3206 BPF_MOV64_IMM(BPF_REG_1
, 10),
3207 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_1
, -8),
3208 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
3209 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
3210 BPF_LD_MAP_FD(BPF_REG_1
, 0),
3211 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
3212 BPF_FUNC_map_lookup_elem
),
3213 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_0
),
3214 BPF_MOV64_REG(BPF_REG_3
, BPF_REG_0
),
3215 BPF_MOV64_REG(BPF_REG_4
, BPF_REG_0
),
3216 BPF_MOV64_REG(BPF_REG_5
, BPF_REG_0
),
3217 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_0
, 0, 1),
3218 BPF_MOV64_IMM(BPF_REG_1
, 1),
3219 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_0
, 0, 1),
3220 BPF_MOV64_IMM(BPF_REG_1
, 2),
3221 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_3
, 0, 1),
3222 BPF_ST_MEM(BPF_DW
, BPF_REG_3
, 0, 0),
3223 BPF_MOV64_IMM(BPF_REG_1
, 3),
3226 .fixup_map1
= { 4 },
3228 .errstr
= "R3 invalid mem access 'inv'",
3229 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
3232 "invalid map access from else condition",
3234 BPF_ST_MEM(BPF_DW
, BPF_REG_10
, -8, 0),
3235 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
3236 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
3237 BPF_LD_MAP_FD(BPF_REG_1
, 0),
3238 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0, BPF_FUNC_map_lookup_elem
),
3239 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_0
, 0, 6),
3240 BPF_LDX_MEM(BPF_W
, BPF_REG_1
, BPF_REG_0
, 0),
3241 BPF_JMP_IMM(BPF_JGE
, BPF_REG_1
, MAX_ENTRIES
-1, 1),
3242 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_1
, 1),
3243 BPF_ALU64_IMM(BPF_LSH
, BPF_REG_1
, 2),
3244 BPF_ALU64_REG(BPF_ADD
, BPF_REG_0
, BPF_REG_1
),
3245 BPF_ST_MEM(BPF_DW
, BPF_REG_0
, 0, offsetof(struct test_val
, foo
)),
3248 .fixup_map2
= { 3 },
3249 .errstr
= "R0 unbounded memory access, make sure to bounds check any array access into a map",
3251 .errstr_unpriv
= "R0 pointer arithmetic prohibited",
3252 .result_unpriv
= REJECT
,
3255 "constant register |= constant should keep constant type",
3257 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_10
),
3258 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_1
, -48),
3259 BPF_MOV64_IMM(BPF_REG_2
, 34),
3260 BPF_ALU64_IMM(BPF_OR
, BPF_REG_2
, 13),
3261 BPF_MOV64_IMM(BPF_REG_3
, 0),
3262 BPF_EMIT_CALL(BPF_FUNC_probe_read
),
3266 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
3269 "constant register |= constant should not bypass stack boundary checks",
3271 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_10
),
3272 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_1
, -48),
3273 BPF_MOV64_IMM(BPF_REG_2
, 34),
3274 BPF_ALU64_IMM(BPF_OR
, BPF_REG_2
, 24),
3275 BPF_MOV64_IMM(BPF_REG_3
, 0),
3276 BPF_EMIT_CALL(BPF_FUNC_probe_read
),
3279 .errstr
= "invalid stack type R1 off=-48 access_size=58",
3281 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
3284 "constant register |= constant register should keep constant type",
3286 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_10
),
3287 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_1
, -48),
3288 BPF_MOV64_IMM(BPF_REG_2
, 34),
3289 BPF_MOV64_IMM(BPF_REG_4
, 13),
3290 BPF_ALU64_REG(BPF_OR
, BPF_REG_2
, BPF_REG_4
),
3291 BPF_MOV64_IMM(BPF_REG_3
, 0),
3292 BPF_EMIT_CALL(BPF_FUNC_probe_read
),
3296 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
3299 "constant register |= constant register should not bypass stack boundary checks",
3301 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_10
),
3302 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_1
, -48),
3303 BPF_MOV64_IMM(BPF_REG_2
, 34),
3304 BPF_MOV64_IMM(BPF_REG_4
, 24),
3305 BPF_ALU64_REG(BPF_OR
, BPF_REG_2
, BPF_REG_4
),
3306 BPF_MOV64_IMM(BPF_REG_3
, 0),
3307 BPF_EMIT_CALL(BPF_FUNC_probe_read
),
3310 .errstr
= "invalid stack type R1 off=-48 access_size=58",
3312 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
3315 "invalid direct packet write for LWT_IN",
3317 BPF_LDX_MEM(BPF_W
, BPF_REG_2
, BPF_REG_1
,
3318 offsetof(struct __sk_buff
, data
)),
3319 BPF_LDX_MEM(BPF_W
, BPF_REG_3
, BPF_REG_1
,
3320 offsetof(struct __sk_buff
, data_end
)),
3321 BPF_MOV64_REG(BPF_REG_0
, BPF_REG_2
),
3322 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_0
, 8),
3323 BPF_JMP_REG(BPF_JGT
, BPF_REG_0
, BPF_REG_3
, 1),
3324 BPF_STX_MEM(BPF_B
, BPF_REG_2
, BPF_REG_2
, 0),
3325 BPF_MOV64_IMM(BPF_REG_0
, 0),
3328 .errstr
= "cannot write into packet",
3330 .prog_type
= BPF_PROG_TYPE_LWT_IN
,
3333 "invalid direct packet write for LWT_OUT",
3335 BPF_LDX_MEM(BPF_W
, BPF_REG_2
, BPF_REG_1
,
3336 offsetof(struct __sk_buff
, data
)),
3337 BPF_LDX_MEM(BPF_W
, BPF_REG_3
, BPF_REG_1
,
3338 offsetof(struct __sk_buff
, data_end
)),
3339 BPF_MOV64_REG(BPF_REG_0
, BPF_REG_2
),
3340 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_0
, 8),
3341 BPF_JMP_REG(BPF_JGT
, BPF_REG_0
, BPF_REG_3
, 1),
3342 BPF_STX_MEM(BPF_B
, BPF_REG_2
, BPF_REG_2
, 0),
3343 BPF_MOV64_IMM(BPF_REG_0
, 0),
3346 .errstr
= "cannot write into packet",
3348 .prog_type
= BPF_PROG_TYPE_LWT_OUT
,
3351 "direct packet write for LWT_XMIT",
3353 BPF_LDX_MEM(BPF_W
, BPF_REG_2
, BPF_REG_1
,
3354 offsetof(struct __sk_buff
, data
)),
3355 BPF_LDX_MEM(BPF_W
, BPF_REG_3
, BPF_REG_1
,
3356 offsetof(struct __sk_buff
, data_end
)),
3357 BPF_MOV64_REG(BPF_REG_0
, BPF_REG_2
),
3358 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_0
, 8),
3359 BPF_JMP_REG(BPF_JGT
, BPF_REG_0
, BPF_REG_3
, 1),
3360 BPF_STX_MEM(BPF_B
, BPF_REG_2
, BPF_REG_2
, 0),
3361 BPF_MOV64_IMM(BPF_REG_0
, 0),
3365 .prog_type
= BPF_PROG_TYPE_LWT_XMIT
,
3368 "direct packet read for LWT_IN",
3370 BPF_LDX_MEM(BPF_W
, BPF_REG_2
, BPF_REG_1
,
3371 offsetof(struct __sk_buff
, data
)),
3372 BPF_LDX_MEM(BPF_W
, BPF_REG_3
, BPF_REG_1
,
3373 offsetof(struct __sk_buff
, data_end
)),
3374 BPF_MOV64_REG(BPF_REG_0
, BPF_REG_2
),
3375 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_0
, 8),
3376 BPF_JMP_REG(BPF_JGT
, BPF_REG_0
, BPF_REG_3
, 1),
3377 BPF_LDX_MEM(BPF_B
, BPF_REG_0
, BPF_REG_2
, 0),
3378 BPF_MOV64_IMM(BPF_REG_0
, 0),
3382 .prog_type
= BPF_PROG_TYPE_LWT_IN
,
3385 "direct packet read for LWT_OUT",
3387 BPF_LDX_MEM(BPF_W
, BPF_REG_2
, BPF_REG_1
,
3388 offsetof(struct __sk_buff
, data
)),
3389 BPF_LDX_MEM(BPF_W
, BPF_REG_3
, BPF_REG_1
,
3390 offsetof(struct __sk_buff
, data_end
)),
3391 BPF_MOV64_REG(BPF_REG_0
, BPF_REG_2
),
3392 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_0
, 8),
3393 BPF_JMP_REG(BPF_JGT
, BPF_REG_0
, BPF_REG_3
, 1),
3394 BPF_LDX_MEM(BPF_B
, BPF_REG_0
, BPF_REG_2
, 0),
3395 BPF_MOV64_IMM(BPF_REG_0
, 0),
3399 .prog_type
= BPF_PROG_TYPE_LWT_OUT
,
3402 "direct packet read for LWT_XMIT",
3404 BPF_LDX_MEM(BPF_W
, BPF_REG_2
, BPF_REG_1
,
3405 offsetof(struct __sk_buff
, data
)),
3406 BPF_LDX_MEM(BPF_W
, BPF_REG_3
, BPF_REG_1
,
3407 offsetof(struct __sk_buff
, data_end
)),
3408 BPF_MOV64_REG(BPF_REG_0
, BPF_REG_2
),
3409 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_0
, 8),
3410 BPF_JMP_REG(BPF_JGT
, BPF_REG_0
, BPF_REG_3
, 1),
3411 BPF_LDX_MEM(BPF_B
, BPF_REG_0
, BPF_REG_2
, 0),
3412 BPF_MOV64_IMM(BPF_REG_0
, 0),
3416 .prog_type
= BPF_PROG_TYPE_LWT_XMIT
,
3419 "invalid access of tc_classid for LWT_IN",
3421 BPF_LDX_MEM(BPF_W
, BPF_REG_0
, BPF_REG_1
,
3422 offsetof(struct __sk_buff
, tc_classid
)),
3426 .errstr
= "invalid bpf_context access",
3429 "invalid access of tc_classid for LWT_OUT",
3431 BPF_LDX_MEM(BPF_W
, BPF_REG_0
, BPF_REG_1
,
3432 offsetof(struct __sk_buff
, tc_classid
)),
3436 .errstr
= "invalid bpf_context access",
3439 "invalid access of tc_classid for LWT_XMIT",
3441 BPF_LDX_MEM(BPF_W
, BPF_REG_0
, BPF_REG_1
,
3442 offsetof(struct __sk_buff
, tc_classid
)),
3446 .errstr
= "invalid bpf_context access",
3449 "helper access to map: full range",
3451 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
3452 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
3453 BPF_ST_MEM(BPF_DW
, BPF_REG_2
, 0, 0),
3454 BPF_LD_MAP_FD(BPF_REG_1
, 0),
3455 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem
),
3456 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_0
, 0, 4),
3457 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_0
),
3458 BPF_MOV64_IMM(BPF_REG_2
, sizeof(struct test_val
)),
3459 BPF_MOV64_IMM(BPF_REG_3
, 0),
3460 BPF_EMIT_CALL(BPF_FUNC_probe_read
),
3463 .fixup_map2
= { 3 },
3465 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
3468 "helper access to map: partial range",
3470 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
3471 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
3472 BPF_ST_MEM(BPF_DW
, BPF_REG_2
, 0, 0),
3473 BPF_LD_MAP_FD(BPF_REG_1
, 0),
3474 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem
),
3475 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_0
, 0, 4),
3476 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_0
),
3477 BPF_MOV64_IMM(BPF_REG_2
, 8),
3478 BPF_MOV64_IMM(BPF_REG_3
, 0),
3479 BPF_EMIT_CALL(BPF_FUNC_probe_read
),
3482 .fixup_map2
= { 3 },
3484 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
3487 "helper access to map: empty range",
3489 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
3490 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
3491 BPF_ST_MEM(BPF_DW
, BPF_REG_2
, 0, 0),
3492 BPF_LD_MAP_FD(BPF_REG_1
, 0),
3493 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem
),
3494 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_0
, 0, 4),
3495 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_0
),
3496 BPF_MOV64_IMM(BPF_REG_2
, 0),
3497 BPF_MOV64_IMM(BPF_REG_3
, 0),
3498 BPF_EMIT_CALL(BPF_FUNC_probe_read
),
3501 .fixup_map2
= { 3 },
3502 .errstr
= "invalid access to map value, value_size=48 off=0 size=0",
3504 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
3507 "helper access to map: out-of-bound range",
3509 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
3510 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
3511 BPF_ST_MEM(BPF_DW
, BPF_REG_2
, 0, 0),
3512 BPF_LD_MAP_FD(BPF_REG_1
, 0),
3513 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem
),
3514 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_0
, 0, 4),
3515 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_0
),
3516 BPF_MOV64_IMM(BPF_REG_2
, sizeof(struct test_val
) + 8),
3517 BPF_MOV64_IMM(BPF_REG_3
, 0),
3518 BPF_EMIT_CALL(BPF_FUNC_probe_read
),
3521 .fixup_map2
= { 3 },
3522 .errstr
= "invalid access to map value, value_size=48 off=0 size=56",
3524 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
3527 "helper access to map: negative range",
3529 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
3530 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
3531 BPF_ST_MEM(BPF_DW
, BPF_REG_2
, 0, 0),
3532 BPF_LD_MAP_FD(BPF_REG_1
, 0),
3533 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem
),
3534 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_0
, 0, 4),
3535 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_0
),
3536 BPF_MOV64_IMM(BPF_REG_2
, -8),
3537 BPF_MOV64_IMM(BPF_REG_3
, 0),
3538 BPF_EMIT_CALL(BPF_FUNC_probe_read
),
3541 .fixup_map2
= { 3 },
3542 .errstr
= "invalid access to map value, value_size=48 off=0 size=-8",
3544 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
3547 "helper access to adjusted map (via const imm): full range",
3549 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
3550 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
3551 BPF_ST_MEM(BPF_DW
, BPF_REG_2
, 0, 0),
3552 BPF_LD_MAP_FD(BPF_REG_1
, 0),
3553 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem
),
3554 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_0
, 0, 5),
3555 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_0
),
3556 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_1
,
3557 offsetof(struct test_val
, foo
)),
3558 BPF_MOV64_IMM(BPF_REG_2
,
3559 sizeof(struct test_val
) -
3560 offsetof(struct test_val
, foo
)),
3561 BPF_MOV64_IMM(BPF_REG_3
, 0),
3562 BPF_EMIT_CALL(BPF_FUNC_probe_read
),
3565 .fixup_map2
= { 3 },
3567 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
3570 "helper access to adjusted map (via const imm): partial range",
3572 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
3573 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
3574 BPF_ST_MEM(BPF_DW
, BPF_REG_2
, 0, 0),
3575 BPF_LD_MAP_FD(BPF_REG_1
, 0),
3576 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem
),
3577 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_0
, 0, 5),
3578 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_0
),
3579 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_1
,
3580 offsetof(struct test_val
, foo
)),
3581 BPF_MOV64_IMM(BPF_REG_2
, 8),
3582 BPF_MOV64_IMM(BPF_REG_3
, 0),
3583 BPF_EMIT_CALL(BPF_FUNC_probe_read
),
3586 .fixup_map2
= { 3 },
3588 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
3591 "helper access to adjusted map (via const imm): empty range",
3593 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
3594 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
3595 BPF_ST_MEM(BPF_DW
, BPF_REG_2
, 0, 0),
3596 BPF_LD_MAP_FD(BPF_REG_1
, 0),
3597 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem
),
3598 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_0
, 0, 5),
3599 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_0
),
3600 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_1
,
3601 offsetof(struct test_val
, foo
)),
3602 BPF_MOV64_IMM(BPF_REG_2
, 0),
3603 BPF_MOV64_IMM(BPF_REG_3
, 0),
3604 BPF_EMIT_CALL(BPF_FUNC_probe_read
),
3607 .fixup_map2
= { 3 },
3608 .errstr
= "R1 min value is outside of the array range",
3610 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
3613 "helper access to adjusted map (via const imm): out-of-bound range",
3615 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
3616 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
3617 BPF_ST_MEM(BPF_DW
, BPF_REG_2
, 0, 0),
3618 BPF_LD_MAP_FD(BPF_REG_1
, 0),
3619 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem
),
3620 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_0
, 0, 5),
3621 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_0
),
3622 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_1
,
3623 offsetof(struct test_val
, foo
)),
3624 BPF_MOV64_IMM(BPF_REG_2
,
3625 sizeof(struct test_val
) -
3626 offsetof(struct test_val
, foo
) + 8),
3627 BPF_MOV64_IMM(BPF_REG_3
, 0),
3628 BPF_EMIT_CALL(BPF_FUNC_probe_read
),
3631 .fixup_map2
= { 3 },
3632 .errstr
= "invalid access to map value, value_size=48 off=4 size=52",
3634 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
3637 "helper access to adjusted map (via const imm): negative range (> adjustment)",
3639 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
3640 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
3641 BPF_ST_MEM(BPF_DW
, BPF_REG_2
, 0, 0),
3642 BPF_LD_MAP_FD(BPF_REG_1
, 0),
3643 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem
),
3644 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_0
, 0, 5),
3645 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_0
),
3646 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_1
,
3647 offsetof(struct test_val
, foo
)),
3648 BPF_MOV64_IMM(BPF_REG_2
, -8),
3649 BPF_MOV64_IMM(BPF_REG_3
, 0),
3650 BPF_EMIT_CALL(BPF_FUNC_probe_read
),
3653 .fixup_map2
= { 3 },
3654 .errstr
= "invalid access to map value, value_size=48 off=4 size=-8",
3656 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
3659 "helper access to adjusted map (via const imm): negative range (< adjustment)",
3661 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
3662 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
3663 BPF_ST_MEM(BPF_DW
, BPF_REG_2
, 0, 0),
3664 BPF_LD_MAP_FD(BPF_REG_1
, 0),
3665 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem
),
3666 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_0
, 0, 5),
3667 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_0
),
3668 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_1
,
3669 offsetof(struct test_val
, foo
)),
3670 BPF_MOV64_IMM(BPF_REG_2
, -1),
3671 BPF_MOV64_IMM(BPF_REG_3
, 0),
3672 BPF_EMIT_CALL(BPF_FUNC_probe_read
),
3675 .fixup_map2
= { 3 },
3676 .errstr
= "R1 min value is outside of the array range",
3678 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
3681 "helper access to adjusted map (via const reg): full range",
3683 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
3684 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
3685 BPF_ST_MEM(BPF_DW
, BPF_REG_2
, 0, 0),
3686 BPF_LD_MAP_FD(BPF_REG_1
, 0),
3687 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem
),
3688 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_0
, 0, 6),
3689 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_0
),
3690 BPF_MOV64_IMM(BPF_REG_3
,
3691 offsetof(struct test_val
, foo
)),
3692 BPF_ALU64_REG(BPF_ADD
, BPF_REG_1
, BPF_REG_3
),
3693 BPF_MOV64_IMM(BPF_REG_2
,
3694 sizeof(struct test_val
) -
3695 offsetof(struct test_val
, foo
)),
3696 BPF_MOV64_IMM(BPF_REG_3
, 0),
3697 BPF_EMIT_CALL(BPF_FUNC_probe_read
),
3700 .fixup_map2
= { 3 },
3702 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
3705 "helper access to adjusted map (via const reg): partial range",
3707 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
3708 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
3709 BPF_ST_MEM(BPF_DW
, BPF_REG_2
, 0, 0),
3710 BPF_LD_MAP_FD(BPF_REG_1
, 0),
3711 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem
),
3712 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_0
, 0, 6),
3713 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_0
),
3714 BPF_MOV64_IMM(BPF_REG_3
,
3715 offsetof(struct test_val
, foo
)),
3716 BPF_ALU64_REG(BPF_ADD
, BPF_REG_1
, BPF_REG_3
),
3717 BPF_MOV64_IMM(BPF_REG_2
, 8),
3718 BPF_MOV64_IMM(BPF_REG_3
, 0),
3719 BPF_EMIT_CALL(BPF_FUNC_probe_read
),
3722 .fixup_map2
= { 3 },
3724 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
3727 "helper access to adjusted map (via const reg): empty range",
3729 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
3730 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
3731 BPF_ST_MEM(BPF_DW
, BPF_REG_2
, 0, 0),
3732 BPF_LD_MAP_FD(BPF_REG_1
, 0),
3733 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem
),
3734 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_0
, 0, 6),
3735 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_0
),
3736 BPF_MOV64_IMM(BPF_REG_3
, 0),
3737 BPF_ALU64_REG(BPF_ADD
, BPF_REG_1
, BPF_REG_3
),
3738 BPF_MOV64_IMM(BPF_REG_2
, 0),
3739 BPF_MOV64_IMM(BPF_REG_3
, 0),
3740 BPF_EMIT_CALL(BPF_FUNC_probe_read
),
3743 .fixup_map2
= { 3 },
3744 .errstr
= "R1 min value is outside of the array range",
3746 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
3749 "helper access to adjusted map (via const reg): out-of-bound range",
3751 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
3752 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
3753 BPF_ST_MEM(BPF_DW
, BPF_REG_2
, 0, 0),
3754 BPF_LD_MAP_FD(BPF_REG_1
, 0),
3755 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem
),
3756 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_0
, 0, 6),
3757 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_0
),
3758 BPF_MOV64_IMM(BPF_REG_3
,
3759 offsetof(struct test_val
, foo
)),
3760 BPF_ALU64_REG(BPF_ADD
, BPF_REG_1
, BPF_REG_3
),
3761 BPF_MOV64_IMM(BPF_REG_2
,
3762 sizeof(struct test_val
) -
3763 offsetof(struct test_val
, foo
) + 8),
3764 BPF_MOV64_IMM(BPF_REG_3
, 0),
3765 BPF_EMIT_CALL(BPF_FUNC_probe_read
),
3768 .fixup_map2
= { 3 },
3769 .errstr
= "invalid access to map value, value_size=48 off=4 size=52",
3771 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
3774 "helper access to adjusted map (via const reg): negative range (> adjustment)",
3776 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
3777 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
3778 BPF_ST_MEM(BPF_DW
, BPF_REG_2
, 0, 0),
3779 BPF_LD_MAP_FD(BPF_REG_1
, 0),
3780 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem
),
3781 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_0
, 0, 6),
3782 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_0
),
3783 BPF_MOV64_IMM(BPF_REG_3
,
3784 offsetof(struct test_val
, foo
)),
3785 BPF_ALU64_REG(BPF_ADD
, BPF_REG_1
, BPF_REG_3
),
3786 BPF_MOV64_IMM(BPF_REG_2
, -8),
3787 BPF_MOV64_IMM(BPF_REG_3
, 0),
3788 BPF_EMIT_CALL(BPF_FUNC_probe_read
),
3791 .fixup_map2
= { 3 },
3792 .errstr
= "invalid access to map value, value_size=48 off=4 size=-8",
3794 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
3797 "helper access to adjusted map (via const reg): negative range (< adjustment)",
3799 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
3800 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
3801 BPF_ST_MEM(BPF_DW
, BPF_REG_2
, 0, 0),
3802 BPF_LD_MAP_FD(BPF_REG_1
, 0),
3803 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem
),
3804 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_0
, 0, 6),
3805 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_0
),
3806 BPF_MOV64_IMM(BPF_REG_3
,
3807 offsetof(struct test_val
, foo
)),
3808 BPF_ALU64_REG(BPF_ADD
, BPF_REG_1
, BPF_REG_3
),
3809 BPF_MOV64_IMM(BPF_REG_2
, -1),
3810 BPF_MOV64_IMM(BPF_REG_3
, 0),
3811 BPF_EMIT_CALL(BPF_FUNC_probe_read
),
3814 .fixup_map2
= { 3 },
3815 .errstr
= "R1 min value is outside of the array range",
3817 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
3820 "helper access to adjusted map (via variable): full range",
3822 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
3823 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
3824 BPF_ST_MEM(BPF_DW
, BPF_REG_2
, 0, 0),
3825 BPF_LD_MAP_FD(BPF_REG_1
, 0),
3826 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem
),
3827 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_0
, 0, 7),
3828 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_0
),
3829 BPF_LDX_MEM(BPF_W
, BPF_REG_3
, BPF_REG_0
, 0),
3830 BPF_JMP_IMM(BPF_JGT
, BPF_REG_3
,
3831 offsetof(struct test_val
, foo
), 4),
3832 BPF_ALU64_REG(BPF_ADD
, BPF_REG_1
, BPF_REG_3
),
3833 BPF_MOV64_IMM(BPF_REG_2
,
3834 sizeof(struct test_val
) -
3835 offsetof(struct test_val
, foo
)),
3836 BPF_MOV64_IMM(BPF_REG_3
, 0),
3837 BPF_EMIT_CALL(BPF_FUNC_probe_read
),
3840 .fixup_map2
= { 3 },
3842 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
3845 "helper access to adjusted map (via variable): partial range",
3847 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
3848 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
3849 BPF_ST_MEM(BPF_DW
, BPF_REG_2
, 0, 0),
3850 BPF_LD_MAP_FD(BPF_REG_1
, 0),
3851 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem
),
3852 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_0
, 0, 7),
3853 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_0
),
3854 BPF_LDX_MEM(BPF_W
, BPF_REG_3
, BPF_REG_0
, 0),
3855 BPF_JMP_IMM(BPF_JGT
, BPF_REG_3
,
3856 offsetof(struct test_val
, foo
), 4),
3857 BPF_ALU64_REG(BPF_ADD
, BPF_REG_1
, BPF_REG_3
),
3858 BPF_MOV64_IMM(BPF_REG_2
, 8),
3859 BPF_MOV64_IMM(BPF_REG_3
, 0),
3860 BPF_EMIT_CALL(BPF_FUNC_probe_read
),
3863 .fixup_map2
= { 3 },
3865 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
3868 "helper access to adjusted map (via variable): empty range",
3870 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
3871 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
3872 BPF_ST_MEM(BPF_DW
, BPF_REG_2
, 0, 0),
3873 BPF_LD_MAP_FD(BPF_REG_1
, 0),
3874 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem
),
3875 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_0
, 0, 7),
3876 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_0
),
3877 BPF_LDX_MEM(BPF_W
, BPF_REG_3
, BPF_REG_0
, 0),
3878 BPF_JMP_IMM(BPF_JGT
, BPF_REG_3
,
3879 offsetof(struct test_val
, foo
), 4),
3880 BPF_ALU64_REG(BPF_ADD
, BPF_REG_1
, BPF_REG_3
),
3881 BPF_MOV64_IMM(BPF_REG_2
, 0),
3882 BPF_MOV64_IMM(BPF_REG_3
, 0),
3883 BPF_EMIT_CALL(BPF_FUNC_probe_read
),
3886 .fixup_map2
= { 3 },
3887 .errstr
= "R1 min value is outside of the array range",
3889 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
3892 "helper access to adjusted map (via variable): no max check",
3894 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
3895 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
3896 BPF_ST_MEM(BPF_DW
, BPF_REG_2
, 0, 0),
3897 BPF_LD_MAP_FD(BPF_REG_1
, 0),
3898 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem
),
3899 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_0
, 0, 6),
3900 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_0
),
3901 BPF_LDX_MEM(BPF_W
, BPF_REG_3
, BPF_REG_0
, 0),
3902 BPF_ALU64_REG(BPF_ADD
, BPF_REG_1
, BPF_REG_3
),
3903 BPF_MOV64_IMM(BPF_REG_2
, 0),
3904 BPF_MOV64_IMM(BPF_REG_3
, 0),
3905 BPF_EMIT_CALL(BPF_FUNC_probe_read
),
3908 .fixup_map2
= { 3 },
3909 .errstr
= "R1 min value is negative, either use unsigned index or do a if (index >=0) check",
3911 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
3914 "helper access to adjusted map (via variable): wrong max check",
3916 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
3917 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
3918 BPF_ST_MEM(BPF_DW
, BPF_REG_2
, 0, 0),
3919 BPF_LD_MAP_FD(BPF_REG_1
, 0),
3920 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem
),
3921 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_0
, 0, 7),
3922 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_0
),
3923 BPF_LDX_MEM(BPF_W
, BPF_REG_3
, BPF_REG_0
, 0),
3924 BPF_JMP_IMM(BPF_JGT
, BPF_REG_3
,
3925 offsetof(struct test_val
, foo
), 4),
3926 BPF_ALU64_REG(BPF_ADD
, BPF_REG_1
, BPF_REG_3
),
3927 BPF_MOV64_IMM(BPF_REG_2
,
3928 sizeof(struct test_val
) -
3929 offsetof(struct test_val
, foo
) + 1),
3930 BPF_MOV64_IMM(BPF_REG_3
, 0),
3931 BPF_EMIT_CALL(BPF_FUNC_probe_read
),
3934 .fixup_map2
= { 3 },
3935 .errstr
= "invalid access to map value, value_size=48 off=4 size=45",
3937 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
3940 "map element value is preserved across register spilling",
3942 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
3943 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
3944 BPF_ST_MEM(BPF_DW
, BPF_REG_2
, 0, 0),
3945 BPF_LD_MAP_FD(BPF_REG_1
, 0),
3946 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem
),
3947 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_0
, 0, 6),
3948 BPF_ST_MEM(BPF_DW
, BPF_REG_0
, 0, 42),
3949 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_10
),
3950 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_1
, -184),
3951 BPF_STX_MEM(BPF_DW
, BPF_REG_1
, BPF_REG_0
, 0),
3952 BPF_LDX_MEM(BPF_DW
, BPF_REG_3
, BPF_REG_1
, 0),
3953 BPF_ST_MEM(BPF_DW
, BPF_REG_3
, 0, 42),
3956 .fixup_map2
= { 3 },
3957 .errstr_unpriv
= "R0 leaks addr",
3959 .result_unpriv
= REJECT
,
3962 "map element value (adjusted) is preserved across register spilling",
3964 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
3965 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
3966 BPF_ST_MEM(BPF_DW
, BPF_REG_2
, 0, 0),
3967 BPF_LD_MAP_FD(BPF_REG_1
, 0),
3968 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem
),
3969 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_0
, 0, 7),
3970 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_0
,
3971 offsetof(struct test_val
, foo
)),
3972 BPF_ST_MEM(BPF_DW
, BPF_REG_0
, 0, 42),
3973 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_10
),
3974 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_1
, -184),
3975 BPF_STX_MEM(BPF_DW
, BPF_REG_1
, BPF_REG_0
, 0),
3976 BPF_LDX_MEM(BPF_DW
, BPF_REG_3
, BPF_REG_1
, 0),
3977 BPF_ST_MEM(BPF_DW
, BPF_REG_3
, 0, 42),
3980 .fixup_map2
= { 3 },
3981 .errstr_unpriv
= "R0 pointer arithmetic prohibited",
3983 .result_unpriv
= REJECT
,
3986 "helper access to variable memory: stack, bitwise AND + JMP, correct bounds",
3988 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_10
),
3989 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_1
, -64),
3990 BPF_MOV64_IMM(BPF_REG_0
, 0),
3991 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_0
, -64),
3992 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_0
, -56),
3993 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_0
, -48),
3994 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_0
, -40),
3995 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_0
, -32),
3996 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_0
, -24),
3997 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_0
, -16),
3998 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_0
, -8),
3999 BPF_MOV64_IMM(BPF_REG_2
, 16),
4000 BPF_STX_MEM(BPF_DW
, BPF_REG_1
, BPF_REG_2
, -128),
4001 BPF_LDX_MEM(BPF_DW
, BPF_REG_2
, BPF_REG_1
, -128),
4002 BPF_ALU64_IMM(BPF_AND
, BPF_REG_2
, 64),
4003 BPF_MOV64_IMM(BPF_REG_4
, 0),
4004 BPF_JMP_REG(BPF_JGE
, BPF_REG_4
, BPF_REG_2
, 2),
4005 BPF_MOV64_IMM(BPF_REG_3
, 0),
4006 BPF_EMIT_CALL(BPF_FUNC_probe_read
),
4007 BPF_MOV64_IMM(BPF_REG_0
, 0),
4011 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
4014 "helper access to variable memory: stack, bitwise AND, zero included",
4016 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_10
),
4017 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_1
, -64),
4018 BPF_MOV64_IMM(BPF_REG_2
, 16),
4019 BPF_STX_MEM(BPF_DW
, BPF_REG_1
, BPF_REG_2
, -128),
4020 BPF_LDX_MEM(BPF_DW
, BPF_REG_2
, BPF_REG_1
, -128),
4021 BPF_ALU64_IMM(BPF_AND
, BPF_REG_2
, 64),
4022 BPF_MOV64_IMM(BPF_REG_3
, 0),
4023 BPF_EMIT_CALL(BPF_FUNC_probe_read
),
4026 .errstr
= "invalid stack type R1 off=-64 access_size=0",
4028 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
4031 "helper access to variable memory: stack, bitwise AND + JMP, wrong max",
4033 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_10
),
4034 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_1
, -64),
4035 BPF_MOV64_IMM(BPF_REG_2
, 16),
4036 BPF_STX_MEM(BPF_DW
, BPF_REG_1
, BPF_REG_2
, -128),
4037 BPF_LDX_MEM(BPF_DW
, BPF_REG_2
, BPF_REG_1
, -128),
4038 BPF_ALU64_IMM(BPF_AND
, BPF_REG_2
, 65),
4039 BPF_MOV64_IMM(BPF_REG_4
, 0),
4040 BPF_JMP_REG(BPF_JGE
, BPF_REG_4
, BPF_REG_2
, 2),
4041 BPF_MOV64_IMM(BPF_REG_3
, 0),
4042 BPF_EMIT_CALL(BPF_FUNC_probe_read
),
4043 BPF_MOV64_IMM(BPF_REG_0
, 0),
4046 .errstr
= "invalid stack type R1 off=-64 access_size=65",
4048 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
4051 "helper access to variable memory: stack, JMP, correct bounds",
4053 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_10
),
4054 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_1
, -64),
4055 BPF_MOV64_IMM(BPF_REG_0
, 0),
4056 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_0
, -64),
4057 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_0
, -56),
4058 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_0
, -48),
4059 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_0
, -40),
4060 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_0
, -32),
4061 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_0
, -24),
4062 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_0
, -16),
4063 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_0
, -8),
4064 BPF_MOV64_IMM(BPF_REG_2
, 16),
4065 BPF_STX_MEM(BPF_DW
, BPF_REG_1
, BPF_REG_2
, -128),
4066 BPF_LDX_MEM(BPF_DW
, BPF_REG_2
, BPF_REG_1
, -128),
4067 BPF_JMP_IMM(BPF_JGT
, BPF_REG_2
, 64, 4),
4068 BPF_MOV64_IMM(BPF_REG_4
, 0),
4069 BPF_JMP_REG(BPF_JGE
, BPF_REG_4
, BPF_REG_2
, 2),
4070 BPF_MOV64_IMM(BPF_REG_3
, 0),
4071 BPF_EMIT_CALL(BPF_FUNC_probe_read
),
4072 BPF_MOV64_IMM(BPF_REG_0
, 0),
4076 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
4079 "helper access to variable memory: stack, JMP (signed), correct bounds",
4081 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_10
),
4082 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_1
, -64),
4083 BPF_MOV64_IMM(BPF_REG_0
, 0),
4084 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_0
, -64),
4085 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_0
, -56),
4086 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_0
, -48),
4087 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_0
, -40),
4088 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_0
, -32),
4089 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_0
, -24),
4090 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_0
, -16),
4091 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_0
, -8),
4092 BPF_MOV64_IMM(BPF_REG_2
, 16),
4093 BPF_STX_MEM(BPF_DW
, BPF_REG_1
, BPF_REG_2
, -128),
4094 BPF_LDX_MEM(BPF_DW
, BPF_REG_2
, BPF_REG_1
, -128),
4095 BPF_JMP_IMM(BPF_JSGT
, BPF_REG_2
, 64, 4),
4096 BPF_MOV64_IMM(BPF_REG_4
, 0),
4097 BPF_JMP_REG(BPF_JSGE
, BPF_REG_4
, BPF_REG_2
, 2),
4098 BPF_MOV64_IMM(BPF_REG_3
, 0),
4099 BPF_EMIT_CALL(BPF_FUNC_probe_read
),
4100 BPF_MOV64_IMM(BPF_REG_0
, 0),
4104 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
4107 "helper access to variable memory: stack, JMP, bounds + offset",
4109 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_10
),
4110 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_1
, -64),
4111 BPF_MOV64_IMM(BPF_REG_2
, 16),
4112 BPF_STX_MEM(BPF_DW
, BPF_REG_1
, BPF_REG_2
, -128),
4113 BPF_LDX_MEM(BPF_DW
, BPF_REG_2
, BPF_REG_1
, -128),
4114 BPF_JMP_IMM(BPF_JGT
, BPF_REG_2
, 64, 5),
4115 BPF_MOV64_IMM(BPF_REG_4
, 0),
4116 BPF_JMP_REG(BPF_JGE
, BPF_REG_4
, BPF_REG_2
, 3),
4117 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, 1),
4118 BPF_MOV64_IMM(BPF_REG_3
, 0),
4119 BPF_EMIT_CALL(BPF_FUNC_probe_read
),
4120 BPF_MOV64_IMM(BPF_REG_0
, 0),
4123 .errstr
= "invalid stack type R1 off=-64 access_size=65",
4125 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
4128 "helper access to variable memory: stack, JMP, wrong max",
4130 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_10
),
4131 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_1
, -64),
4132 BPF_MOV64_IMM(BPF_REG_2
, 16),
4133 BPF_STX_MEM(BPF_DW
, BPF_REG_1
, BPF_REG_2
, -128),
4134 BPF_LDX_MEM(BPF_DW
, BPF_REG_2
, BPF_REG_1
, -128),
4135 BPF_JMP_IMM(BPF_JGT
, BPF_REG_2
, 65, 4),
4136 BPF_MOV64_IMM(BPF_REG_4
, 0),
4137 BPF_JMP_REG(BPF_JGE
, BPF_REG_4
, BPF_REG_2
, 2),
4138 BPF_MOV64_IMM(BPF_REG_3
, 0),
4139 BPF_EMIT_CALL(BPF_FUNC_probe_read
),
4140 BPF_MOV64_IMM(BPF_REG_0
, 0),
4143 .errstr
= "invalid stack type R1 off=-64 access_size=65",
4145 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
4148 "helper access to variable memory: stack, JMP, no max check",
4150 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_10
),
4151 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_1
, -64),
4152 BPF_MOV64_IMM(BPF_REG_2
, 16),
4153 BPF_STX_MEM(BPF_DW
, BPF_REG_1
, BPF_REG_2
, -128),
4154 BPF_LDX_MEM(BPF_DW
, BPF_REG_2
, BPF_REG_1
, -128),
4155 BPF_MOV64_IMM(BPF_REG_4
, 0),
4156 BPF_JMP_REG(BPF_JGE
, BPF_REG_4
, BPF_REG_2
, 2),
4157 BPF_MOV64_IMM(BPF_REG_3
, 0),
4158 BPF_EMIT_CALL(BPF_FUNC_probe_read
),
4159 BPF_MOV64_IMM(BPF_REG_0
, 0),
4162 .errstr
= "R2 unbounded memory access",
4164 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
4167 "helper access to variable memory: stack, JMP, no min check",
4169 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_10
),
4170 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_1
, -64),
4171 BPF_MOV64_IMM(BPF_REG_2
, 16),
4172 BPF_STX_MEM(BPF_DW
, BPF_REG_1
, BPF_REG_2
, -128),
4173 BPF_LDX_MEM(BPF_DW
, BPF_REG_2
, BPF_REG_1
, -128),
4174 BPF_JMP_IMM(BPF_JGT
, BPF_REG_2
, 64, 3),
4175 BPF_MOV64_IMM(BPF_REG_3
, 0),
4176 BPF_EMIT_CALL(BPF_FUNC_probe_read
),
4177 BPF_MOV64_IMM(BPF_REG_0
, 0),
4180 .errstr
= "invalid stack type R1 off=-64 access_size=0",
4182 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
4185 "helper access to variable memory: stack, JMP (signed), no min check",
4187 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_10
),
4188 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_1
, -64),
4189 BPF_MOV64_IMM(BPF_REG_2
, 16),
4190 BPF_STX_MEM(BPF_DW
, BPF_REG_1
, BPF_REG_2
, -128),
4191 BPF_LDX_MEM(BPF_DW
, BPF_REG_2
, BPF_REG_1
, -128),
4192 BPF_JMP_IMM(BPF_JSGT
, BPF_REG_2
, 64, 3),
4193 BPF_MOV64_IMM(BPF_REG_3
, 0),
4194 BPF_EMIT_CALL(BPF_FUNC_probe_read
),
4195 BPF_MOV64_IMM(BPF_REG_0
, 0),
4198 .errstr
= "R2 min value is negative",
4200 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
4203 "helper access to variable memory: map, JMP, correct bounds",
4205 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
4206 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
4207 BPF_ST_MEM(BPF_DW
, BPF_REG_2
, 0, 0),
4208 BPF_LD_MAP_FD(BPF_REG_1
, 0),
4209 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem
),
4210 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_0
, 0, 10),
4211 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_0
),
4212 BPF_MOV64_IMM(BPF_REG_2
, sizeof(struct test_val
)),
4213 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_2
, -128),
4214 BPF_LDX_MEM(BPF_DW
, BPF_REG_2
, BPF_REG_10
, -128),
4215 BPF_JMP_IMM(BPF_JSGT
, BPF_REG_2
,
4216 sizeof(struct test_val
), 4),
4217 BPF_MOV64_IMM(BPF_REG_4
, 0),
4218 BPF_JMP_REG(BPF_JGE
, BPF_REG_4
, BPF_REG_2
, 2),
4219 BPF_MOV64_IMM(BPF_REG_3
, 0),
4220 BPF_EMIT_CALL(BPF_FUNC_probe_read
),
4221 BPF_MOV64_IMM(BPF_REG_0
, 0),
4224 .fixup_map2
= { 3 },
4226 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
4229 "helper access to variable memory: map, JMP, wrong max",
4231 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
4232 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
4233 BPF_ST_MEM(BPF_DW
, BPF_REG_2
, 0, 0),
4234 BPF_LD_MAP_FD(BPF_REG_1
, 0),
4235 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem
),
4236 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_0
, 0, 10),
4237 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_0
),
4238 BPF_MOV64_IMM(BPF_REG_2
, sizeof(struct test_val
)),
4239 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_2
, -128),
4240 BPF_LDX_MEM(BPF_DW
, BPF_REG_2
, BPF_REG_10
, -128),
4241 BPF_JMP_IMM(BPF_JSGT
, BPF_REG_2
,
4242 sizeof(struct test_val
) + 1, 4),
4243 BPF_MOV64_IMM(BPF_REG_4
, 0),
4244 BPF_JMP_REG(BPF_JGE
, BPF_REG_4
, BPF_REG_2
, 2),
4245 BPF_MOV64_IMM(BPF_REG_3
, 0),
4246 BPF_EMIT_CALL(BPF_FUNC_probe_read
),
4247 BPF_MOV64_IMM(BPF_REG_0
, 0),
4250 .fixup_map2
= { 3 },
4251 .errstr
= "invalid access to map value, value_size=48 off=0 size=49",
4253 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
4256 "helper access to variable memory: map adjusted, JMP, correct bounds",
4258 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
4259 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
4260 BPF_ST_MEM(BPF_DW
, BPF_REG_2
, 0, 0),
4261 BPF_LD_MAP_FD(BPF_REG_1
, 0),
4262 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem
),
4263 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_0
, 0, 11),
4264 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_0
),
4265 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_1
, 20),
4266 BPF_MOV64_IMM(BPF_REG_2
, sizeof(struct test_val
)),
4267 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_2
, -128),
4268 BPF_LDX_MEM(BPF_DW
, BPF_REG_2
, BPF_REG_10
, -128),
4269 BPF_JMP_IMM(BPF_JSGT
, BPF_REG_2
,
4270 sizeof(struct test_val
) - 20, 4),
4271 BPF_MOV64_IMM(BPF_REG_4
, 0),
4272 BPF_JMP_REG(BPF_JGE
, BPF_REG_4
, BPF_REG_2
, 2),
4273 BPF_MOV64_IMM(BPF_REG_3
, 0),
4274 BPF_EMIT_CALL(BPF_FUNC_probe_read
),
4275 BPF_MOV64_IMM(BPF_REG_0
, 0),
4278 .fixup_map2
= { 3 },
4280 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
4283 "helper access to variable memory: map adjusted, JMP, wrong max",
4285 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
4286 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
4287 BPF_ST_MEM(BPF_DW
, BPF_REG_2
, 0, 0),
4288 BPF_LD_MAP_FD(BPF_REG_1
, 0),
4289 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem
),
4290 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_0
, 0, 11),
4291 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_0
),
4292 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_1
, 20),
4293 BPF_MOV64_IMM(BPF_REG_2
, sizeof(struct test_val
)),
4294 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_2
, -128),
4295 BPF_LDX_MEM(BPF_DW
, BPF_REG_2
, BPF_REG_10
, -128),
4296 BPF_JMP_IMM(BPF_JSGT
, BPF_REG_2
,
4297 sizeof(struct test_val
) - 19, 4),
4298 BPF_MOV64_IMM(BPF_REG_4
, 0),
4299 BPF_JMP_REG(BPF_JGE
, BPF_REG_4
, BPF_REG_2
, 2),
4300 BPF_MOV64_IMM(BPF_REG_3
, 0),
4301 BPF_EMIT_CALL(BPF_FUNC_probe_read
),
4302 BPF_MOV64_IMM(BPF_REG_0
, 0),
4305 .fixup_map2
= { 3 },
4306 .errstr
= "R1 min value is outside of the array range",
4308 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
4311 "helper access to variable memory: size > 0 not allowed on NULL",
4313 BPF_MOV64_IMM(BPF_REG_1
, 0),
4314 BPF_MOV64_IMM(BPF_REG_2
, 0),
4315 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_2
, -128),
4316 BPF_LDX_MEM(BPF_DW
, BPF_REG_2
, BPF_REG_10
, -128),
4317 BPF_ALU64_IMM(BPF_AND
, BPF_REG_2
, 64),
4318 BPF_MOV64_IMM(BPF_REG_3
, 0),
4319 BPF_MOV64_IMM(BPF_REG_4
, 0),
4320 BPF_MOV64_IMM(BPF_REG_5
, 0),
4321 BPF_EMIT_CALL(BPF_FUNC_csum_diff
),
4324 .errstr
= "R1 type=imm expected=fp",
4326 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
,
4329 "helper access to variable memory: size = 0 not allowed on != NULL",
4331 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_10
),
4332 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_1
, -8),
4333 BPF_MOV64_IMM(BPF_REG_2
, 0),
4334 BPF_STX_MEM(BPF_DW
, BPF_REG_1
, BPF_REG_2
, 0),
4335 BPF_ALU64_IMM(BPF_AND
, BPF_REG_2
, 8),
4336 BPF_MOV64_IMM(BPF_REG_3
, 0),
4337 BPF_MOV64_IMM(BPF_REG_4
, 0),
4338 BPF_MOV64_IMM(BPF_REG_5
, 0),
4339 BPF_EMIT_CALL(BPF_FUNC_csum_diff
),
4342 .errstr
= "invalid stack type R1 off=-8 access_size=0",
4344 .prog_type
= BPF_PROG_TYPE_SCHED_CLS
,
4347 "helper access to variable memory: 8 bytes leak",
4349 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_10
),
4350 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_1
, -64),
4351 BPF_MOV64_IMM(BPF_REG_0
, 0),
4352 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_0
, -64),
4353 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_0
, -56),
4354 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_0
, -48),
4355 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_0
, -40),
4356 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_0
, -24),
4357 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_0
, -16),
4358 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_0
, -8),
4359 BPF_MOV64_IMM(BPF_REG_2
, 0),
4360 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_2
, -128),
4361 BPF_LDX_MEM(BPF_DW
, BPF_REG_2
, BPF_REG_10
, -128),
4362 BPF_ALU64_IMM(BPF_AND
, BPF_REG_2
, 63),
4363 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, 1),
4364 BPF_MOV64_IMM(BPF_REG_3
, 0),
4365 BPF_EMIT_CALL(BPF_FUNC_probe_read
),
4366 BPF_LDX_MEM(BPF_DW
, BPF_REG_1
, BPF_REG_10
, -16),
4369 .errstr
= "invalid indirect read from stack off -64+32 size 64",
4371 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
4374 "helper access to variable memory: 8 bytes no leak (init memory)",
4376 BPF_MOV64_REG(BPF_REG_1
, BPF_REG_10
),
4377 BPF_MOV64_IMM(BPF_REG_0
, 0),
4378 BPF_MOV64_IMM(BPF_REG_0
, 0),
4379 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_0
, -64),
4380 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_0
, -56),
4381 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_0
, -48),
4382 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_0
, -40),
4383 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_0
, -32),
4384 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_0
, -24),
4385 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_0
, -16),
4386 BPF_STX_MEM(BPF_DW
, BPF_REG_10
, BPF_REG_0
, -8),
4387 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_1
, -64),
4388 BPF_MOV64_IMM(BPF_REG_2
, 0),
4389 BPF_ALU64_IMM(BPF_AND
, BPF_REG_2
, 32),
4390 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, 32),
4391 BPF_MOV64_IMM(BPF_REG_3
, 0),
4392 BPF_EMIT_CALL(BPF_FUNC_probe_read
),
4393 BPF_LDX_MEM(BPF_DW
, BPF_REG_1
, BPF_REG_10
, -16),
4397 .prog_type
= BPF_PROG_TYPE_TRACEPOINT
,
4400 "invalid and of negative number",
4402 BPF_ST_MEM(BPF_DW
, BPF_REG_10
, -8, 0),
4403 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
4404 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
4405 BPF_LD_MAP_FD(BPF_REG_1
, 0),
4406 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
4407 BPF_FUNC_map_lookup_elem
),
4408 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_0
, 0, 4),
4409 BPF_MOV64_IMM(BPF_REG_1
, 6),
4410 BPF_ALU64_IMM(BPF_AND
, BPF_REG_1
, -4),
4411 BPF_ALU64_IMM(BPF_LSH
, BPF_REG_1
, 2),
4412 BPF_ALU64_REG(BPF_ADD
, BPF_REG_0
, BPF_REG_1
),
4413 BPF_ST_MEM(BPF_DW
, BPF_REG_0
, 0,
4414 offsetof(struct test_val
, foo
)),
4417 .fixup_map2
= { 3 },
4418 .errstr_unpriv
= "R0 pointer arithmetic prohibited",
4419 .errstr
= "R0 min value is negative, either use unsigned index or do a if (index >=0) check.",
4421 .result_unpriv
= REJECT
,
4424 "invalid range check",
4426 BPF_ST_MEM(BPF_DW
, BPF_REG_10
, -8, 0),
4427 BPF_MOV64_REG(BPF_REG_2
, BPF_REG_10
),
4428 BPF_ALU64_IMM(BPF_ADD
, BPF_REG_2
, -8),
4429 BPF_LD_MAP_FD(BPF_REG_1
, 0),
4430 BPF_RAW_INSN(BPF_JMP
| BPF_CALL
, 0, 0, 0,
4431 BPF_FUNC_map_lookup_elem
),
4432 BPF_JMP_IMM(BPF_JEQ
, BPF_REG_0
, 0, 12),
4433 BPF_LDX_MEM(BPF_W
, BPF_REG_1
, BPF_REG_0
, 0),
4434 BPF_MOV64_IMM(BPF_REG_9
, 1),
4435 BPF_ALU32_IMM(BPF_MOD
, BPF_REG_1
, 2),
4436 BPF_ALU32_IMM(BPF_ADD
, BPF_REG_1
, 1),
4437 BPF_ALU32_REG(BPF_AND
, BPF_REG_9
, BPF_REG_1
),
4438 BPF_ALU32_IMM(BPF_ADD
, BPF_REG_9
, 1),
4439 BPF_ALU32_IMM(BPF_RSH
, BPF_REG_9
, 1),
4440 BPF_MOV32_IMM(BPF_REG_3
, 1),
4441 BPF_ALU32_REG(BPF_SUB
, BPF_REG_3
, BPF_REG_9
),
4442 BPF_ALU32_IMM(BPF_MUL
, BPF_REG_3
, 0x10000000),
4443 BPF_ALU64_REG(BPF_ADD
, BPF_REG_0
, BPF_REG_3
),
4444 BPF_STX_MEM(BPF_W
, BPF_REG_0
, BPF_REG_3
, 0),
4445 BPF_MOV64_REG(BPF_REG_0
, 0),
4448 .fixup_map2
= { 3 },
4449 .errstr_unpriv
= "R0 pointer arithmetic prohibited",
4450 .errstr
= "R0 min value is negative, either use unsigned index or do a if (index >=0) check.",
4452 .result_unpriv
= REJECT
,
4456 static int probe_filter_length(const struct bpf_insn
*fp
)
4460 for (len
= MAX_INSNS
- 1; len
> 0; --len
)
4461 if (fp
[len
].code
!= 0 || fp
[len
].imm
!= 0)
4466 static int create_map(uint32_t size_value
, uint32_t max_elem
)
4470 fd
= bpf_create_map(BPF_MAP_TYPE_HASH
, sizeof(long long),
4471 size_value
, max_elem
, BPF_F_NO_PREALLOC
);
4473 printf("Failed to create hash map '%s'!\n", strerror(errno
));
4478 static int create_prog_array(void)
4482 fd
= bpf_create_map(BPF_MAP_TYPE_PROG_ARRAY
, sizeof(int),
4485 printf("Failed to create prog array '%s'!\n", strerror(errno
));
4490 static char bpf_vlog
[32768];
4492 static void do_test_fixup(struct bpf_test
*test
, struct bpf_insn
*prog
,
4493 int *fd_f1
, int *fd_f2
, int *fd_f3
)
4495 int *fixup_map1
= test
->fixup_map1
;
4496 int *fixup_map2
= test
->fixup_map2
;
4497 int *fixup_prog
= test
->fixup_prog
;
4499 /* Allocating HTs with 1 elem is fine here, since we only test
4500 * for verifier and not do a runtime lookup, so the only thing
4501 * that really matters is value size in this case.
4504 *fd_f1
= create_map(sizeof(long long), 1);
4506 prog
[*fixup_map1
].imm
= *fd_f1
;
4508 } while (*fixup_map1
);
4512 *fd_f2
= create_map(sizeof(struct test_val
), 1);
4514 prog
[*fixup_map2
].imm
= *fd_f2
;
4516 } while (*fixup_map2
);
4520 *fd_f3
= create_prog_array();
4522 prog
[*fixup_prog
].imm
= *fd_f3
;
4524 } while (*fixup_prog
);
4528 static void do_test_single(struct bpf_test
*test
, bool unpriv
,
4529 int *passes
, int *errors
)
4531 struct bpf_insn
*prog
= test
->insns
;
4532 int prog_len
= probe_filter_length(prog
);
4533 int prog_type
= test
->prog_type
;
4534 int fd_f1
= -1, fd_f2
= -1, fd_f3
= -1;
4535 int fd_prog
, expected_ret
;
4536 const char *expected_err
;
4538 do_test_fixup(test
, prog
, &fd_f1
, &fd_f2
, &fd_f3
);
4540 fd_prog
= bpf_load_program(prog_type
? : BPF_PROG_TYPE_SOCKET_FILTER
,
4541 prog
, prog_len
, "GPL", 0, bpf_vlog
,
4544 expected_ret
= unpriv
&& test
->result_unpriv
!= UNDEF
?
4545 test
->result_unpriv
: test
->result
;
4546 expected_err
= unpriv
&& test
->errstr_unpriv
?
4547 test
->errstr_unpriv
: test
->errstr
;
4548 if (expected_ret
== ACCEPT
) {
4550 printf("FAIL\nFailed to load prog '%s'!\n",
4556 printf("FAIL\nUnexpected success to load!\n");
4559 if (!strstr(bpf_vlog
, expected_err
)) {
4560 printf("FAIL\nUnexpected error message!\n");
4576 printf("%s", bpf_vlog
);
4580 static bool is_admin(void)
4583 cap_flag_value_t sysadmin
= CAP_CLEAR
;
4584 const cap_value_t cap_val
= CAP_SYS_ADMIN
;
4586 if (!CAP_IS_SUPPORTED(CAP_SETFCAP
)) {
4587 perror("cap_get_flag");
4590 caps
= cap_get_proc();
4592 perror("cap_get_proc");
4595 if (cap_get_flag(caps
, cap_val
, CAP_EFFECTIVE
, &sysadmin
))
4596 perror("cap_get_flag");
4599 return (sysadmin
== CAP_SET
);
4602 static int set_admin(bool admin
)
4605 const cap_value_t cap_val
= CAP_SYS_ADMIN
;
4608 caps
= cap_get_proc();
4610 perror("cap_get_proc");
4613 if (cap_set_flag(caps
, CAP_EFFECTIVE
, 1, &cap_val
,
4614 admin
? CAP_SET
: CAP_CLEAR
)) {
4615 perror("cap_set_flag");
4618 if (cap_set_proc(caps
)) {
4619 perror("cap_set_proc");
4629 static int do_test(bool unpriv
, unsigned int from
, unsigned int to
)
4631 int i
, passes
= 0, errors
= 0;
4633 for (i
= from
; i
< to
; i
++) {
4634 struct bpf_test
*test
= &tests
[i
];
4636 /* Program types that are not supported by non-root we
4639 if (!test
->prog_type
) {
4642 printf("#%d/u %s ", i
, test
->descr
);
4643 do_test_single(test
, true, &passes
, &errors
);
4649 printf("#%d/p %s ", i
, test
->descr
);
4650 do_test_single(test
, false, &passes
, &errors
);
4654 printf("Summary: %d PASSED, %d FAILED\n", passes
, errors
);
4655 return errors
? -errors
: 0;
4658 int main(int argc
, char **argv
)
4660 struct rlimit rinf
= { RLIM_INFINITY
, RLIM_INFINITY
};
4661 struct rlimit rlim
= { 1 << 20, 1 << 20 };
4662 unsigned int from
= 0, to
= ARRAY_SIZE(tests
);
4663 bool unpriv
= !is_admin();
4666 unsigned int l
= atoi(argv
[argc
- 2]);
4667 unsigned int u
= atoi(argv
[argc
- 1]);
4669 if (l
< to
&& u
< to
) {
4673 } else if (argc
== 2) {
4674 unsigned int t
= atoi(argv
[argc
- 1]);
4682 setrlimit(RLIMIT_MEMLOCK
, unpriv
? &rlim
: &rinf
);
4683 return do_test(unpriv
, from
, to
);