Linux Audio

Check our new training course

Loading...
Note: File does not exist in v6.13.7.
  1{
  2	"map access: known scalar += value_ptr from different maps",
  3	.insns = {
  4	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
  5		    offsetof(struct __sk_buff, len)),
  6	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
  7	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
  8	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
  9	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 1, 3),
 10	BPF_LD_MAP_FD(BPF_REG_1, 0),
 11	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 1, 2),
 12	BPF_LD_MAP_FD(BPF_REG_1, 0),
 13	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
 14	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3),
 15	BPF_MOV64_IMM(BPF_REG_1, 4),
 16	BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_0),
 17	BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0),
 18	BPF_MOV64_IMM(BPF_REG_0, 1),
 19	BPF_EXIT_INSN(),
 20	},
 21	.fixup_map_hash_16b = { 5 },
 22	.fixup_map_array_48b = { 8 },
 23	.result = ACCEPT,
 24	.result_unpriv = REJECT,
 25	.errstr_unpriv = "R1 tried to add from different maps",
 26	.retval = 1,
 27},
 28{
 29	"map access: value_ptr -= known scalar from different maps",
 30	.insns = {
 31	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
 32		    offsetof(struct __sk_buff, len)),
 33	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
 34	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
 35	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
 36	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 1, 3),
 37	BPF_LD_MAP_FD(BPF_REG_1, 0),
 38	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 1, 2),
 39	BPF_LD_MAP_FD(BPF_REG_1, 0),
 40	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
 41	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
 42	BPF_MOV64_IMM(BPF_REG_1, 4),
 43	BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1),
 44	BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
 45	BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0),
 46	BPF_MOV64_IMM(BPF_REG_0, 1),
 47	BPF_EXIT_INSN(),
 48	},
 49	.fixup_map_hash_16b = { 5 },
 50	.fixup_map_array_48b = { 8 },
 51	.result = ACCEPT,
 52	.result_unpriv = REJECT,
 53	.errstr_unpriv = "R0 min value is outside of the array range",
 54	.retval = 1,
 55},
 56{
 57	"map access: known scalar += value_ptr from different maps, but same value properties",
 58	.insns = {
 59	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
 60		    offsetof(struct __sk_buff, len)),
 61	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
 62	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
 63	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
 64	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 1, 3),
 65	BPF_LD_MAP_FD(BPF_REG_1, 0),
 66	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 1, 2),
 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_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3),
 70	BPF_MOV64_IMM(BPF_REG_1, 4),
 71	BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_0),
 72	BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0),
 73	BPF_MOV64_IMM(BPF_REG_0, 1),
 74	BPF_EXIT_INSN(),
 75	},
 76	.fixup_map_hash_48b = { 5 },
 77	.fixup_map_array_48b = { 8 },
 78	.result = ACCEPT,
 79	.retval = 1,
 80},
 81{
 82	"map access: mixing value pointer and scalar, 1",
 83	.insns = {
 84	// load map value pointer into r0 and r2
 85	BPF_MOV64_IMM(BPF_REG_0, 1),
 86	BPF_LD_MAP_FD(BPF_REG_ARG1, 0),
 87	BPF_MOV64_REG(BPF_REG_ARG2, BPF_REG_FP),
 88	BPF_ALU64_IMM(BPF_ADD, BPF_REG_ARG2, -16),
 89	BPF_ST_MEM(BPF_DW, BPF_REG_FP, -16, 0),
 90	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
 91	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
 92	BPF_EXIT_INSN(),
 93	// load some number from the map into r1
 94	BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0),
 95	// depending on r1, branch:
 96	BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 3),
 97	// branch A
 98	BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
 99	BPF_MOV64_IMM(BPF_REG_3, 0),
100	BPF_JMP_A(2),
101	// branch B
102	BPF_MOV64_IMM(BPF_REG_2, 0),
103	BPF_MOV64_IMM(BPF_REG_3, 0x100000),
104	// common instruction
105	BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_3),
106	// depending on r1, branch:
107	BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 1),
108	// branch A
109	BPF_JMP_A(4),
110	// branch B
111	BPF_MOV64_IMM(BPF_REG_0, 0x13371337),
112	// verifier follows fall-through
113	BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 0x100000, 2),
114	BPF_MOV64_IMM(BPF_REG_0, 0),
115	BPF_EXIT_INSN(),
116	// fake-dead code; targeted from branch A to
117	// prevent dead code sanitization
118	BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0),
119	BPF_MOV64_IMM(BPF_REG_0, 0),
120	BPF_EXIT_INSN(),
121	},
122	.fixup_map_array_48b = { 1 },
123	.result = ACCEPT,
124	.result_unpriv = REJECT,
125	.errstr_unpriv = "R2 tried to add from different pointers or scalars",
126	.retval = 0,
127},
128{
129	"map access: mixing value pointer and scalar, 2",
130	.insns = {
131	// load map value pointer into r0 and r2
132	BPF_MOV64_IMM(BPF_REG_0, 1),
133	BPF_LD_MAP_FD(BPF_REG_ARG1, 0),
134	BPF_MOV64_REG(BPF_REG_ARG2, BPF_REG_FP),
135	BPF_ALU64_IMM(BPF_ADD, BPF_REG_ARG2, -16),
136	BPF_ST_MEM(BPF_DW, BPF_REG_FP, -16, 0),
137	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
138	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
139	BPF_EXIT_INSN(),
140	// load some number from the map into r1
141	BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0),
142	// depending on r1, branch:
143	BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 3),
144	// branch A
145	BPF_MOV64_IMM(BPF_REG_2, 0),
146	BPF_MOV64_IMM(BPF_REG_3, 0x100000),
147	BPF_JMP_A(2),
148	// branch B
149	BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
150	BPF_MOV64_IMM(BPF_REG_3, 0),
151	// common instruction
152	BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_3),
153	// depending on r1, branch:
154	BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 1),
155	// branch A
156	BPF_JMP_A(4),
157	// branch B
158	BPF_MOV64_IMM(BPF_REG_0, 0x13371337),
159	// verifier follows fall-through
160	BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 0x100000, 2),
161	BPF_MOV64_IMM(BPF_REG_0, 0),
162	BPF_EXIT_INSN(),
163	// fake-dead code; targeted from branch A to
164	// prevent dead code sanitization
165	BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0),
166	BPF_MOV64_IMM(BPF_REG_0, 0),
167	BPF_EXIT_INSN(),
168	},
169	.fixup_map_array_48b = { 1 },
170	.result = ACCEPT,
171	.result_unpriv = REJECT,
172	.errstr_unpriv = "R2 tried to add from different maps or paths",
173	.retval = 0,
174},
175{
176	"sanitation: alu with different scalars 1",
177	.insns = {
178	BPF_MOV64_IMM(BPF_REG_0, 1),
179	BPF_LD_MAP_FD(BPF_REG_ARG1, 0),
180	BPF_MOV64_REG(BPF_REG_ARG2, BPF_REG_FP),
181	BPF_ALU64_IMM(BPF_ADD, BPF_REG_ARG2, -16),
182	BPF_ST_MEM(BPF_DW, BPF_REG_FP, -16, 0),
183	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
184	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
185	BPF_EXIT_INSN(),
186	BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0),
187	BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 3),
188	BPF_MOV64_IMM(BPF_REG_2, 0),
189	BPF_MOV64_IMM(BPF_REG_3, 0x100000),
190	BPF_JMP_A(2),
191	BPF_MOV64_IMM(BPF_REG_2, 42),
192	BPF_MOV64_IMM(BPF_REG_3, 0x100001),
193	BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_3),
194	BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
195	BPF_EXIT_INSN(),
196	},
197	.fixup_map_array_48b = { 1 },
198	.result = ACCEPT,
199	.retval = 0x100000,
200},
201{
202	"sanitation: alu with different scalars 2",
203	.insns = {
204	BPF_MOV64_IMM(BPF_REG_0, 1),
205	BPF_LD_MAP_FD(BPF_REG_1, 0),
206	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
207	BPF_MOV64_REG(BPF_REG_2, BPF_REG_FP),
208	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16),
209	BPF_ST_MEM(BPF_DW, BPF_REG_FP, -16, 0),
210	BPF_EMIT_CALL(BPF_FUNC_map_delete_elem),
211	BPF_MOV64_REG(BPF_REG_7, BPF_REG_0),
212	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
213	BPF_MOV64_REG(BPF_REG_2, BPF_REG_FP),
214	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16),
215	BPF_EMIT_CALL(BPF_FUNC_map_delete_elem),
216	BPF_MOV64_REG(BPF_REG_6, BPF_REG_0),
217	BPF_MOV64_REG(BPF_REG_8, BPF_REG_6),
218	BPF_ALU64_REG(BPF_ADD, BPF_REG_8, BPF_REG_7),
219	BPF_MOV64_REG(BPF_REG_0, BPF_REG_8),
220	BPF_EXIT_INSN(),
221	},
222	.fixup_map_array_48b = { 1 },
223	.result = ACCEPT,
224	.retval = -EINVAL * 2,
225},
226{
227	"sanitation: alu with different scalars 3",
228	.insns = {
229	BPF_MOV64_IMM(BPF_REG_0, EINVAL),
230	BPF_ALU64_IMM(BPF_MUL, BPF_REG_0, -1),
231	BPF_MOV64_REG(BPF_REG_7, BPF_REG_0),
232	BPF_MOV64_IMM(BPF_REG_0, EINVAL),
233	BPF_ALU64_IMM(BPF_MUL, BPF_REG_0, -1),
234	BPF_MOV64_REG(BPF_REG_6, BPF_REG_0),
235	BPF_MOV64_REG(BPF_REG_8, BPF_REG_6),
236	BPF_ALU64_REG(BPF_ADD, BPF_REG_8, BPF_REG_7),
237	BPF_MOV64_REG(BPF_REG_0, BPF_REG_8),
238	BPF_EXIT_INSN(),
239	},
240	.result = ACCEPT,
241	.retval = -EINVAL * 2,
242},
243{
244	"map access: value_ptr += known scalar, upper oob arith, test 1",
245	.insns = {
246	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
247	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
248	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
249	BPF_LD_MAP_FD(BPF_REG_1, 0),
250	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
251	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
252	BPF_MOV64_IMM(BPF_REG_1, 48),
253	BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
254	BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1),
255	BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0),
256	BPF_MOV64_IMM(BPF_REG_0, 1),
257	BPF_EXIT_INSN(),
258	},
259	.fixup_map_array_48b = { 3 },
260	.result = ACCEPT,
261	.result_unpriv = REJECT,
262	.errstr_unpriv = "R0 pointer arithmetic of map value goes out of range",
263	.retval = 1,
264},
265{
266	"map access: value_ptr += known scalar, upper oob arith, test 2",
267	.insns = {
268	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
269	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
270	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
271	BPF_LD_MAP_FD(BPF_REG_1, 0),
272	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
273	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
274	BPF_MOV64_IMM(BPF_REG_1, 49),
275	BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
276	BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1),
277	BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0),
278	BPF_MOV64_IMM(BPF_REG_0, 1),
279	BPF_EXIT_INSN(),
280	},
281	.fixup_map_array_48b = { 3 },
282	.result = ACCEPT,
283	.result_unpriv = REJECT,
284	.errstr_unpriv = "R0 pointer arithmetic of map value goes out of range",
285	.retval = 1,
286},
287{
288	"map access: value_ptr += known scalar, upper oob arith, test 3",
289	.insns = {
290	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
291	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
292	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
293	BPF_LD_MAP_FD(BPF_REG_1, 0),
294	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
295	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
296	BPF_MOV64_IMM(BPF_REG_1, 47),
297	BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
298	BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1),
299	BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0),
300	BPF_MOV64_IMM(BPF_REG_0, 1),
301	BPF_EXIT_INSN(),
302	},
303	.fixup_map_array_48b = { 3 },
304	.result = ACCEPT,
305	.result_unpriv = REJECT,
306	.errstr_unpriv = "R0 pointer arithmetic of map value goes out of range",
307	.retval = 1,
308},
309{
310	"map access: value_ptr -= known scalar, lower oob arith, test 1",
311	.insns = {
312	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
313	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
314	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
315	BPF_LD_MAP_FD(BPF_REG_1, 0),
316	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
317	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
318	BPF_MOV64_IMM(BPF_REG_1, 47),
319	BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
320	BPF_MOV64_IMM(BPF_REG_1, 48),
321	BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1),
322	BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0),
323	BPF_MOV64_IMM(BPF_REG_0, 1),
324	BPF_EXIT_INSN(),
325	},
326	.fixup_map_array_48b = { 3 },
327	.result = REJECT,
328	.errstr = "R0 min value is outside of the array range",
329	.result_unpriv = REJECT,
330	.errstr_unpriv = "R0 pointer arithmetic of map value goes out of range",
331},
332{
333	"map access: value_ptr -= known scalar, lower oob arith, test 2",
334	.insns = {
335	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
336	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
337	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
338	BPF_LD_MAP_FD(BPF_REG_1, 0),
339	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
340	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7),
341	BPF_MOV64_IMM(BPF_REG_1, 47),
342	BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
343	BPF_MOV64_IMM(BPF_REG_1, 48),
344	BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1),
345	BPF_MOV64_IMM(BPF_REG_1, 1),
346	BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
347	BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0),
348	BPF_MOV64_IMM(BPF_REG_0, 1),
349	BPF_EXIT_INSN(),
350	},
351	.fixup_map_array_48b = { 3 },
352	.result = ACCEPT,
353	.result_unpriv = REJECT,
354	.errstr_unpriv = "R0 pointer arithmetic of map value goes out of range",
355	.retval = 1,
356},
357{
358	"map access: value_ptr -= known scalar, lower oob arith, test 3",
359	.insns = {
360	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
361	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
362	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
363	BPF_LD_MAP_FD(BPF_REG_1, 0),
364	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
365	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
366	BPF_MOV64_IMM(BPF_REG_1, 47),
367	BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
368	BPF_MOV64_IMM(BPF_REG_1, 47),
369	BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1),
370	BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0),
371	BPF_MOV64_IMM(BPF_REG_0, 1),
372	BPF_EXIT_INSN(),
373	},
374	.fixup_map_array_48b = { 3 },
375	.result = ACCEPT,
376	.result_unpriv = REJECT,
377	.errstr_unpriv = "R0 pointer arithmetic of map value goes out of range",
378	.retval = 1,
379},
380{
381	"map access: known scalar += value_ptr",
382	.insns = {
383	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
384	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
385	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
386	BPF_LD_MAP_FD(BPF_REG_1, 0),
387	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
388	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3),
389	BPF_MOV64_IMM(BPF_REG_1, 4),
390	BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_0),
391	BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0),
392	BPF_MOV64_IMM(BPF_REG_0, 1),
393	BPF_EXIT_INSN(),
394	},
395	.fixup_map_array_48b = { 3 },
396	.result = ACCEPT,
397	.retval = 1,
398},
399{
400	"map access: value_ptr += known scalar, 1",
401	.insns = {
402	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
403	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
404	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
405	BPF_LD_MAP_FD(BPF_REG_1, 0),
406	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
407	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3),
408	BPF_MOV64_IMM(BPF_REG_1, 4),
409	BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
410	BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0),
411	BPF_MOV64_IMM(BPF_REG_0, 1),
412	BPF_EXIT_INSN(),
413	},
414	.fixup_map_array_48b = { 3 },
415	.result = ACCEPT,
416	.retval = 1,
417},
418{
419	"map access: value_ptr += known scalar, 2",
420	.insns = {
421	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
422	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
423	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
424	BPF_LD_MAP_FD(BPF_REG_1, 0),
425	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
426	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3),
427	BPF_MOV64_IMM(BPF_REG_1, 49),
428	BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
429	BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0),
430	BPF_MOV64_IMM(BPF_REG_0, 1),
431	BPF_EXIT_INSN(),
432	},
433	.fixup_map_array_48b = { 3 },
434	.result = REJECT,
435	.errstr = "invalid access to map value",
436},
437{
438	"map access: value_ptr += known scalar, 3",
439	.insns = {
440	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
441	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
442	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
443	BPF_LD_MAP_FD(BPF_REG_1, 0),
444	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
445	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3),
446	BPF_MOV64_IMM(BPF_REG_1, -1),
447	BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
448	BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0),
449	BPF_MOV64_IMM(BPF_REG_0, 1),
450	BPF_EXIT_INSN(),
451	},
452	.fixup_map_array_48b = { 3 },
453	.result = REJECT,
454	.errstr = "invalid access to map value",
455},
456{
457	"map access: value_ptr += known scalar, 4",
458	.insns = {
459	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
460	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
461	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
462	BPF_LD_MAP_FD(BPF_REG_1, 0),
463	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
464	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7),
465	BPF_MOV64_IMM(BPF_REG_1, 5),
466	BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
467	BPF_MOV64_IMM(BPF_REG_1, -2),
468	BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
469	BPF_MOV64_IMM(BPF_REG_1, -1),
470	BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
471	BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0),
472	BPF_MOV64_IMM(BPF_REG_0, 1),
473	BPF_EXIT_INSN(),
474	},
475	.fixup_map_array_48b = { 3 },
476	.result = ACCEPT,
477	.result_unpriv = REJECT,
478	.errstr_unpriv = "R0 pointer arithmetic of map value goes out of range",
479	.retval = 1,
480},
481{
482	"map access: value_ptr += known scalar, 5",
483	.insns = {
484	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
485	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
486	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
487	BPF_LD_MAP_FD(BPF_REG_1, 0),
488	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
489	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3),
490	BPF_MOV64_IMM(BPF_REG_1, (6 + 1) * sizeof(int)),
491	BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_0),
492	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0),
493	BPF_EXIT_INSN(),
494	},
495	.fixup_map_array_48b = { 3 },
496	.result = ACCEPT,
497	.retval = 0xabcdef12,
498},
499{
500	"map access: value_ptr += known scalar, 6",
501	.insns = {
502	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
503	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
504	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
505	BPF_LD_MAP_FD(BPF_REG_1, 0),
506	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
507	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
508	BPF_MOV64_IMM(BPF_REG_1, (3 + 1) * sizeof(int)),
509	BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
510	BPF_MOV64_IMM(BPF_REG_1, 3 * sizeof(int)),
511	BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
512	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, 0),
513	BPF_EXIT_INSN(),
514	},
515	.fixup_map_array_48b = { 3 },
516	.result = ACCEPT,
517	.retval = 0xabcdef12,
518},
519{
520	"map access: unknown scalar += value_ptr, 1",
521	.insns = {
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, BPF_FUNC_map_lookup_elem),
527	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
528	BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0),
529	BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 0xf),
530	BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_0),
531	BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0),
532	BPF_MOV64_IMM(BPF_REG_0, 1),
533	BPF_EXIT_INSN(),
534	},
535	.fixup_map_array_48b = { 3 },
536	.result = ACCEPT,
537	.retval = 1,
538},
539{
540	"map access: unknown scalar += value_ptr, 2",
541	.insns = {
542	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
543	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
544	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
545	BPF_LD_MAP_FD(BPF_REG_1, 0),
546	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
547	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
548	BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0),
549	BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 31),
550	BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_0),
551	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0),
552	BPF_EXIT_INSN(),
553	},
554	.fixup_map_array_48b = { 3 },
555	.result = ACCEPT,
556	.retval = 0xabcdef12,
557	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
558},
559{
560	"map access: unknown scalar += value_ptr, 3",
561	.insns = {
562	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
563	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
564	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
565	BPF_LD_MAP_FD(BPF_REG_1, 0),
566	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
567	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 8),
568	BPF_MOV64_IMM(BPF_REG_1, -1),
569	BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
570	BPF_MOV64_IMM(BPF_REG_1, 1),
571	BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
572	BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0),
573	BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 31),
574	BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_0),
575	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0),
576	BPF_EXIT_INSN(),
577	},
578	.fixup_map_array_48b = { 3 },
579	.result = ACCEPT,
580	.result_unpriv = REJECT,
581	.errstr_unpriv = "R0 pointer arithmetic of map value goes out of range",
582	.retval = 0xabcdef12,
583	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
584},
585{
586	"map access: unknown scalar += value_ptr, 4",
587	.insns = {
588	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
589	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
590	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
591	BPF_LD_MAP_FD(BPF_REG_1, 0),
592	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
593	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
594	BPF_MOV64_IMM(BPF_REG_1, 19),
595	BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
596	BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0),
597	BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 31),
598	BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_0),
599	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0),
600	BPF_EXIT_INSN(),
601	},
602	.fixup_map_array_48b = { 3 },
603	.result = REJECT,
604	.errstr = "R1 max value is outside of the array range",
605	.errstr_unpriv = "R1 pointer arithmetic of map value goes out of range",
606	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
607},
608{
609	"map access: value_ptr += unknown scalar, 1",
610	.insns = {
611	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
612	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
613	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
614	BPF_LD_MAP_FD(BPF_REG_1, 0),
615	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
616	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
617	BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0),
618	BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 0xf),
619	BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
620	BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0),
621	BPF_MOV64_IMM(BPF_REG_0, 1),
622	BPF_EXIT_INSN(),
623	},
624	.fixup_map_array_48b = { 3 },
625	.result = ACCEPT,
626	.retval = 1,
627},
628{
629	"map access: value_ptr += unknown scalar, 2",
630	.insns = {
631	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
632	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
633	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
634	BPF_LD_MAP_FD(BPF_REG_1, 0),
635	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
636	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
637	BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0),
638	BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 31),
639	BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
640	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, 0),
641	BPF_EXIT_INSN(),
642	},
643	.fixup_map_array_48b = { 3 },
644	.result = ACCEPT,
645	.retval = 0xabcdef12,
646	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
647},
648{
649	"map access: value_ptr += unknown scalar, 3",
650	.insns = {
651	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
652	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
653	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
654	BPF_LD_MAP_FD(BPF_REG_1, 0),
655	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
656	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 11),
657	BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 0),
658	BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 8),
659	BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_0, 16),
660	BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 0xf),
661	BPF_ALU64_IMM(BPF_AND, BPF_REG_3, 1),
662	BPF_ALU64_IMM(BPF_OR, BPF_REG_3, 1),
663	BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_3, 4),
664	BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_3),
665	BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0),
666	BPF_MOV64_IMM(BPF_REG_0, 1),
667	BPF_EXIT_INSN(),
668	BPF_MOV64_IMM(BPF_REG_0, 2),
669	BPF_JMP_IMM(BPF_JA, 0, 0, -3),
670	},
671	.fixup_map_array_48b = { 3 },
672	.result = ACCEPT,
673	.retval = 1,
674},
675{
676	"map access: value_ptr += value_ptr",
677	.insns = {
678	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
679	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
680	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
681	BPF_LD_MAP_FD(BPF_REG_1, 0),
682	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
683	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2),
684	BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_0),
685	BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0),
686	BPF_MOV64_IMM(BPF_REG_0, 1),
687	BPF_EXIT_INSN(),
688	},
689	.fixup_map_array_48b = { 3 },
690	.result = REJECT,
691	.errstr = "R0 pointer += pointer prohibited",
692},
693{
694	"map access: known scalar -= value_ptr",
695	.insns = {
696	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
697	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
698	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
699	BPF_LD_MAP_FD(BPF_REG_1, 0),
700	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
701	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3),
702	BPF_MOV64_IMM(BPF_REG_1, 4),
703	BPF_ALU64_REG(BPF_SUB, BPF_REG_1, BPF_REG_0),
704	BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0),
705	BPF_MOV64_IMM(BPF_REG_0, 1),
706	BPF_EXIT_INSN(),
707	},
708	.fixup_map_array_48b = { 3 },
709	.result = REJECT,
710	.errstr = "R1 tried to subtract pointer from scalar",
711},
712{
713	"map access: value_ptr -= known scalar",
714	.insns = {
715	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
716	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
717	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
718	BPF_LD_MAP_FD(BPF_REG_1, 0),
719	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
720	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3),
721	BPF_MOV64_IMM(BPF_REG_1, 4),
722	BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1),
723	BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0),
724	BPF_MOV64_IMM(BPF_REG_0, 1),
725	BPF_EXIT_INSN(),
726	},
727	.fixup_map_array_48b = { 3 },
728	.result = REJECT,
729	.errstr = "R0 min value is outside of the array range",
730},
731{
732	"map access: value_ptr -= known scalar, 2",
733	.insns = {
734	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
735	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
736	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
737	BPF_LD_MAP_FD(BPF_REG_1, 0),
738	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
739	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
740	BPF_MOV64_IMM(BPF_REG_1, 6),
741	BPF_MOV64_IMM(BPF_REG_2, 4),
742	BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
743	BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_2),
744	BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0),
745	BPF_MOV64_IMM(BPF_REG_0, 1),
746	BPF_EXIT_INSN(),
747	},
748	.fixup_map_array_48b = { 3 },
749	.result = ACCEPT,
750	.result_unpriv = REJECT,
751	.errstr_unpriv = "R0 pointer arithmetic of map value goes out of range",
752	.retval = 1,
753},
754{
755	"map access: unknown scalar -= value_ptr",
756	.insns = {
757	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
758	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
759	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
760	BPF_LD_MAP_FD(BPF_REG_1, 0),
761	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
762	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
763	BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0),
764	BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 0xf),
765	BPF_ALU64_REG(BPF_SUB, BPF_REG_1, BPF_REG_0),
766	BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0),
767	BPF_MOV64_IMM(BPF_REG_0, 1),
768	BPF_EXIT_INSN(),
769	},
770	.fixup_map_array_48b = { 3 },
771	.result = REJECT,
772	.errstr = "R1 tried to subtract pointer from scalar",
773},
774{
775	"map access: value_ptr -= unknown scalar",
776	.insns = {
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, BPF_FUNC_map_lookup_elem),
782	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
783	BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0),
784	BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 0xf),
785	BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1),
786	BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0),
787	BPF_MOV64_IMM(BPF_REG_0, 1),
788	BPF_EXIT_INSN(),
789	},
790	.fixup_map_array_48b = { 3 },
791	.result = REJECT,
792	.errstr = "R0 min value is negative",
793},
794{
795	"map access: value_ptr -= unknown scalar, 2",
796	.insns = {
797	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
798	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
799	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
800	BPF_LD_MAP_FD(BPF_REG_1, 0),
801	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
802	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 8),
803	BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0),
804	BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 0xf),
805	BPF_ALU64_IMM(BPF_OR, BPF_REG_1, 0x7),
806	BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
807	BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0),
808	BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 0x7),
809	BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1),
810	BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0),
811	BPF_MOV64_IMM(BPF_REG_0, 1),
812	BPF_EXIT_INSN(),
813	},
814	.fixup_map_array_48b = { 3 },
815	.result = ACCEPT,
816	.result_unpriv = REJECT,
817	.errstr_unpriv = "R0 pointer arithmetic of map value goes out of range",
818	.retval = 1,
819},
820{
821	"map access: value_ptr -= value_ptr",
822	.insns = {
823	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
824	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
825	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
826	BPF_LD_MAP_FD(BPF_REG_1, 0),
827	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
828	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2),
829	BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_0),
830	BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0),
831	BPF_MOV64_IMM(BPF_REG_0, 1),
832	BPF_EXIT_INSN(),
833	},
834	.fixup_map_array_48b = { 3 },
835	.result = REJECT,
836	.errstr = "R0 invalid mem access 'inv'",
837	.errstr_unpriv = "R0 pointer -= pointer prohibited",
838},