Linux Audio

Check our new training course

Loading...
  1{
  2	"multiple registers share map_lookup_elem result",
  3	.insns = {
  4	BPF_MOV64_IMM(BPF_REG_1, 10),
  5	BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8),
  6	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
  7	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
  8	BPF_LD_MAP_FD(BPF_REG_1, 0),
  9	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
 10	BPF_MOV64_REG(BPF_REG_4, BPF_REG_0),
 11	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1),
 12	BPF_ST_MEM(BPF_DW, BPF_REG_4, 0, 0),
 13	BPF_EXIT_INSN(),
 14	},
 15	.fixup_map_hash_8b = { 4 },
 16	.result = ACCEPT,
 17	.prog_type = BPF_PROG_TYPE_SCHED_CLS
 18},
 19{
 20	"alu ops on ptr_to_map_value_or_null, 1",
 21	.insns = {
 22	BPF_MOV64_IMM(BPF_REG_1, 10),
 23	BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8),
 24	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
 25	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
 26	BPF_LD_MAP_FD(BPF_REG_1, 0),
 27	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
 28	BPF_MOV64_REG(BPF_REG_4, BPF_REG_0),
 29	BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -2),
 30	BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 2),
 31	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1),
 32	BPF_ST_MEM(BPF_DW, BPF_REG_4, 0, 0),
 33	BPF_EXIT_INSN(),
 34	},
 35	.fixup_map_hash_8b = { 4 },
 36	.errstr = "R4 pointer arithmetic on map_value_or_null",
 37	.result = REJECT,
 38	.prog_type = BPF_PROG_TYPE_SCHED_CLS
 39},
 40{
 41	"alu ops on ptr_to_map_value_or_null, 2",
 42	.insns = {
 43	BPF_MOV64_IMM(BPF_REG_1, 10),
 44	BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8),
 45	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
 46	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
 47	BPF_LD_MAP_FD(BPF_REG_1, 0),
 48	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
 49	BPF_MOV64_REG(BPF_REG_4, BPF_REG_0),
 50	BPF_ALU64_IMM(BPF_AND, BPF_REG_4, -1),
 51	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1),
 52	BPF_ST_MEM(BPF_DW, BPF_REG_4, 0, 0),
 53	BPF_EXIT_INSN(),
 54	},
 55	.fixup_map_hash_8b = { 4 },
 56	.errstr = "R4 pointer arithmetic on map_value_or_null",
 57	.result = REJECT,
 58	.prog_type = BPF_PROG_TYPE_SCHED_CLS
 59},
 60{
 61	"alu ops on ptr_to_map_value_or_null, 3",
 62	.insns = {
 63	BPF_MOV64_IMM(BPF_REG_1, 10),
 64	BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8),
 65	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
 66	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
 67	BPF_LD_MAP_FD(BPF_REG_1, 0),
 68	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
 69	BPF_MOV64_REG(BPF_REG_4, BPF_REG_0),
 70	BPF_ALU64_IMM(BPF_LSH, BPF_REG_4, 1),
 71	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1),
 72	BPF_ST_MEM(BPF_DW, BPF_REG_4, 0, 0),
 73	BPF_EXIT_INSN(),
 74	},
 75	.fixup_map_hash_8b = { 4 },
 76	.errstr = "R4 pointer arithmetic on map_value_or_null",
 77	.result = REJECT,
 78	.prog_type = BPF_PROG_TYPE_SCHED_CLS
 79},
 80{
 81	"invalid memory access with multiple map_lookup_elem calls",
 82	.insns = {
 83	BPF_MOV64_IMM(BPF_REG_1, 10),
 84	BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8),
 85	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
 86	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
 87	BPF_LD_MAP_FD(BPF_REG_1, 0),
 88	BPF_MOV64_REG(BPF_REG_8, BPF_REG_1),
 89	BPF_MOV64_REG(BPF_REG_7, BPF_REG_2),
 90	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
 91	BPF_MOV64_REG(BPF_REG_4, BPF_REG_0),
 92	BPF_MOV64_REG(BPF_REG_1, BPF_REG_8),
 93	BPF_MOV64_REG(BPF_REG_2, BPF_REG_7),
 94	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
 95	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1),
 96	BPF_ST_MEM(BPF_DW, BPF_REG_4, 0, 0),
 97	BPF_EXIT_INSN(),
 98	},
 99	.fixup_map_hash_8b = { 4 },
100	.result = REJECT,
101	.errstr = "R4 !read_ok",
102	.prog_type = BPF_PROG_TYPE_SCHED_CLS
103},
104{
105	"valid indirect map_lookup_elem access with 2nd lookup in branch",
106	.insns = {
107	BPF_MOV64_IMM(BPF_REG_1, 10),
108	BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8),
109	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
110	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
111	BPF_LD_MAP_FD(BPF_REG_1, 0),
112	BPF_MOV64_REG(BPF_REG_8, BPF_REG_1),
113	BPF_MOV64_REG(BPF_REG_7, BPF_REG_2),
114	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
115	BPF_MOV64_IMM(BPF_REG_2, 10),
116	BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 0, 3),
117	BPF_MOV64_REG(BPF_REG_1, BPF_REG_8),
118	BPF_MOV64_REG(BPF_REG_2, BPF_REG_7),
119	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
120	BPF_MOV64_REG(BPF_REG_4, BPF_REG_0),
121	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1),
122	BPF_ST_MEM(BPF_DW, BPF_REG_4, 0, 0),
123	BPF_EXIT_INSN(),
124	},
125	.fixup_map_hash_8b = { 4 },
126	.result = ACCEPT,
127	.prog_type = BPF_PROG_TYPE_SCHED_CLS
128},
129{
130	"invalid map access from else condition",
131	.insns = {
132	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
133	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
134	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
135	BPF_LD_MAP_FD(BPF_REG_1, 0),
136	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
137	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
138	BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0),
139	BPF_JMP_IMM(BPF_JGE, BPF_REG_1, MAX_ENTRIES-1, 1),
140	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 1),
141	BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 2),
142	BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
143	BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, offsetof(struct test_val, foo)),
144	BPF_EXIT_INSN(),
145	},
146	.fixup_map_hash_48b = { 3 },
147	.errstr = "R0 unbounded memory access",
148	.result = REJECT,
149	.errstr_unpriv = "R0 leaks addr",
150	.result_unpriv = REJECT,
151	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
152},