Linux-libre 5.3.12-gnu
[librecmc/linux-libre.git] / tools / testing / selftests / bpf / verifier / helper_access_var_len.c
1 {
2         "helper access to variable memory: stack, bitwise AND + JMP, correct bounds",
3         .insns = {
4         BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
5         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64),
6         BPF_MOV64_IMM(BPF_REG_0, 0),
7         BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -64),
8         BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -56),
9         BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -48),
10         BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -40),
11         BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -32),
12         BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -24),
13         BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -16),
14         BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8),
15         BPF_MOV64_IMM(BPF_REG_2, 16),
16         BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128),
17         BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128),
18         BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 64),
19         BPF_MOV64_IMM(BPF_REG_4, 0),
20         BPF_JMP_REG(BPF_JGE, BPF_REG_4, BPF_REG_2, 2),
21         BPF_MOV64_IMM(BPF_REG_3, 0),
22         BPF_EMIT_CALL(BPF_FUNC_probe_read),
23         BPF_MOV64_IMM(BPF_REG_0, 0),
24         BPF_EXIT_INSN(),
25         },
26         .result = ACCEPT,
27         .prog_type = BPF_PROG_TYPE_TRACEPOINT,
28 },
29 {
30         "helper access to variable memory: stack, bitwise AND, zero included",
31         .insns = {
32         BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, 8),
33         BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
34         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64),
35         BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128),
36         BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128),
37         BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 64),
38         BPF_MOV64_IMM(BPF_REG_3, 0),
39         BPF_EMIT_CALL(BPF_FUNC_probe_read),
40         BPF_EXIT_INSN(),
41         },
42         .errstr = "invalid indirect read from stack off -64+0 size 64",
43         .result = REJECT,
44         .prog_type = BPF_PROG_TYPE_TRACEPOINT,
45 },
46 {
47         "helper access to variable memory: stack, bitwise AND + JMP, wrong max",
48         .insns = {
49         BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, 8),
50         BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
51         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64),
52         BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128),
53         BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128),
54         BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 65),
55         BPF_MOV64_IMM(BPF_REG_4, 0),
56         BPF_JMP_REG(BPF_JGE, BPF_REG_4, BPF_REG_2, 2),
57         BPF_MOV64_IMM(BPF_REG_3, 0),
58         BPF_EMIT_CALL(BPF_FUNC_probe_read),
59         BPF_MOV64_IMM(BPF_REG_0, 0),
60         BPF_EXIT_INSN(),
61         },
62         .errstr = "invalid stack type R1 off=-64 access_size=65",
63         .result = REJECT,
64         .prog_type = BPF_PROG_TYPE_TRACEPOINT,
65 },
66 {
67         "helper access to variable memory: stack, JMP, correct bounds",
68         .insns = {
69         BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
70         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64),
71         BPF_MOV64_IMM(BPF_REG_0, 0),
72         BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -64),
73         BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -56),
74         BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -48),
75         BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -40),
76         BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -32),
77         BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -24),
78         BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -16),
79         BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8),
80         BPF_MOV64_IMM(BPF_REG_2, 16),
81         BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128),
82         BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128),
83         BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 64, 4),
84         BPF_MOV64_IMM(BPF_REG_4, 0),
85         BPF_JMP_REG(BPF_JGE, BPF_REG_4, BPF_REG_2, 2),
86         BPF_MOV64_IMM(BPF_REG_3, 0),
87         BPF_EMIT_CALL(BPF_FUNC_probe_read),
88         BPF_MOV64_IMM(BPF_REG_0, 0),
89         BPF_EXIT_INSN(),
90         },
91         .result = ACCEPT,
92         .prog_type = BPF_PROG_TYPE_TRACEPOINT,
93 },
94 {
95         "helper access to variable memory: stack, JMP (signed), correct bounds",
96         .insns = {
97         BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
98         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64),
99         BPF_MOV64_IMM(BPF_REG_0, 0),
100         BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -64),
101         BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -56),
102         BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -48),
103         BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -40),
104         BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -32),
105         BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -24),
106         BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -16),
107         BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8),
108         BPF_MOV64_IMM(BPF_REG_2, 16),
109         BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128),
110         BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128),
111         BPF_JMP_IMM(BPF_JSGT, BPF_REG_2, 64, 4),
112         BPF_MOV64_IMM(BPF_REG_4, 0),
113         BPF_JMP_REG(BPF_JSGE, BPF_REG_4, BPF_REG_2, 2),
114         BPF_MOV64_IMM(BPF_REG_3, 0),
115         BPF_EMIT_CALL(BPF_FUNC_probe_read),
116         BPF_MOV64_IMM(BPF_REG_0, 0),
117         BPF_EXIT_INSN(),
118         },
119         .result = ACCEPT,
120         .prog_type = BPF_PROG_TYPE_TRACEPOINT,
121 },
122 {
123         "helper access to variable memory: stack, JMP, bounds + offset",
124         .insns = {
125         BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, 8),
126         BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
127         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64),
128         BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128),
129         BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128),
130         BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 64, 5),
131         BPF_MOV64_IMM(BPF_REG_4, 0),
132         BPF_JMP_REG(BPF_JGE, BPF_REG_4, BPF_REG_2, 3),
133         BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1),
134         BPF_MOV64_IMM(BPF_REG_3, 0),
135         BPF_EMIT_CALL(BPF_FUNC_probe_read),
136         BPF_MOV64_IMM(BPF_REG_0, 0),
137         BPF_EXIT_INSN(),
138         },
139         .errstr = "invalid stack type R1 off=-64 access_size=65",
140         .result = REJECT,
141         .prog_type = BPF_PROG_TYPE_TRACEPOINT,
142 },
143 {
144         "helper access to variable memory: stack, JMP, wrong max",
145         .insns = {
146         BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, 8),
147         BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
148         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64),
149         BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128),
150         BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128),
151         BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 65, 4),
152         BPF_MOV64_IMM(BPF_REG_4, 0),
153         BPF_JMP_REG(BPF_JGE, BPF_REG_4, BPF_REG_2, 2),
154         BPF_MOV64_IMM(BPF_REG_3, 0),
155         BPF_EMIT_CALL(BPF_FUNC_probe_read),
156         BPF_MOV64_IMM(BPF_REG_0, 0),
157         BPF_EXIT_INSN(),
158         },
159         .errstr = "invalid stack type R1 off=-64 access_size=65",
160         .result = REJECT,
161         .prog_type = BPF_PROG_TYPE_TRACEPOINT,
162 },
163 {
164         "helper access to variable memory: stack, JMP, no max check",
165         .insns = {
166         BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, 8),
167         BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
168         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64),
169         BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128),
170         BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128),
171         BPF_MOV64_IMM(BPF_REG_4, 0),
172         BPF_JMP_REG(BPF_JGE, BPF_REG_4, BPF_REG_2, 2),
173         BPF_MOV64_IMM(BPF_REG_3, 0),
174         BPF_EMIT_CALL(BPF_FUNC_probe_read),
175         BPF_MOV64_IMM(BPF_REG_0, 0),
176         BPF_EXIT_INSN(),
177         },
178         /* because max wasn't checked, signed min is negative */
179         .errstr = "R2 min value is negative, either use unsigned or 'var &= const'",
180         .result = REJECT,
181         .prog_type = BPF_PROG_TYPE_TRACEPOINT,
182 },
183 {
184         "helper access to variable memory: stack, JMP, no min check",
185         .insns = {
186         BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, 8),
187         BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
188         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64),
189         BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128),
190         BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128),
191         BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 64, 3),
192         BPF_MOV64_IMM(BPF_REG_3, 0),
193         BPF_EMIT_CALL(BPF_FUNC_probe_read),
194         BPF_MOV64_IMM(BPF_REG_0, 0),
195         BPF_EXIT_INSN(),
196         },
197         .errstr = "invalid indirect read from stack off -64+0 size 64",
198         .result = REJECT,
199         .prog_type = BPF_PROG_TYPE_TRACEPOINT,
200 },
201 {
202         "helper access to variable memory: stack, JMP (signed), no min check",
203         .insns = {
204         BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, 8),
205         BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
206         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64),
207         BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128),
208         BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128),
209         BPF_JMP_IMM(BPF_JSGT, BPF_REG_2, 64, 3),
210         BPF_MOV64_IMM(BPF_REG_3, 0),
211         BPF_EMIT_CALL(BPF_FUNC_probe_read),
212         BPF_MOV64_IMM(BPF_REG_0, 0),
213         BPF_EXIT_INSN(),
214         },
215         .errstr = "R2 min value is negative",
216         .result = REJECT,
217         .prog_type = BPF_PROG_TYPE_TRACEPOINT,
218 },
219 {
220         "helper access to variable memory: map, JMP, correct bounds",
221         .insns = {
222         BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
223         BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
224         BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
225         BPF_LD_MAP_FD(BPF_REG_1, 0),
226         BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
227         BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 10),
228         BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
229         BPF_MOV64_IMM(BPF_REG_2, sizeof(struct test_val)),
230         BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -128),
231         BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -128),
232         BPF_JMP_IMM(BPF_JSGT, BPF_REG_2, sizeof(struct test_val), 4),
233         BPF_MOV64_IMM(BPF_REG_4, 0),
234         BPF_JMP_REG(BPF_JSGE, BPF_REG_4, BPF_REG_2, 2),
235         BPF_MOV64_IMM(BPF_REG_3, 0),
236         BPF_EMIT_CALL(BPF_FUNC_probe_read),
237         BPF_MOV64_IMM(BPF_REG_0, 0),
238         BPF_EXIT_INSN(),
239         },
240         .fixup_map_hash_48b = { 3 },
241         .result = ACCEPT,
242         .prog_type = BPF_PROG_TYPE_TRACEPOINT,
243 },
244 {
245         "helper access to variable memory: map, JMP, wrong max",
246         .insns = {
247         BPF_LDX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 8),
248         BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
249         BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
250         BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
251         BPF_LD_MAP_FD(BPF_REG_1, 0),
252         BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
253         BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 10),
254         BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
255         BPF_MOV64_REG(BPF_REG_2, BPF_REG_6),
256         BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -128),
257         BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -128),
258         BPF_JMP_IMM(BPF_JSGT, BPF_REG_2, sizeof(struct test_val) + 1, 4),
259         BPF_MOV64_IMM(BPF_REG_4, 0),
260         BPF_JMP_REG(BPF_JSGE, BPF_REG_4, BPF_REG_2, 2),
261         BPF_MOV64_IMM(BPF_REG_3, 0),
262         BPF_EMIT_CALL(BPF_FUNC_probe_read),
263         BPF_MOV64_IMM(BPF_REG_0, 0),
264         BPF_EXIT_INSN(),
265         },
266         .fixup_map_hash_48b = { 4 },
267         .errstr = "invalid access to map value, value_size=48 off=0 size=49",
268         .result = REJECT,
269         .prog_type = BPF_PROG_TYPE_TRACEPOINT,
270 },
271 {
272         "helper access to variable memory: map adjusted, JMP, correct bounds",
273         .insns = {
274         BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
275         BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
276         BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
277         BPF_LD_MAP_FD(BPF_REG_1, 0),
278         BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
279         BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 11),
280         BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
281         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 20),
282         BPF_MOV64_IMM(BPF_REG_2, sizeof(struct test_val)),
283         BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -128),
284         BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -128),
285         BPF_JMP_IMM(BPF_JSGT, BPF_REG_2, sizeof(struct test_val) - 20, 4),
286         BPF_MOV64_IMM(BPF_REG_4, 0),
287         BPF_JMP_REG(BPF_JSGE, BPF_REG_4, BPF_REG_2, 2),
288         BPF_MOV64_IMM(BPF_REG_3, 0),
289         BPF_EMIT_CALL(BPF_FUNC_probe_read),
290         BPF_MOV64_IMM(BPF_REG_0, 0),
291         BPF_EXIT_INSN(),
292         },
293         .fixup_map_hash_48b = { 3 },
294         .result = ACCEPT,
295         .prog_type = BPF_PROG_TYPE_TRACEPOINT,
296 },
297 {
298         "helper access to variable memory: map adjusted, JMP, wrong max",
299         .insns = {
300         BPF_LDX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 8),
301         BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
302         BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
303         BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
304         BPF_LD_MAP_FD(BPF_REG_1, 0),
305         BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
306         BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 11),
307         BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
308         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 20),
309         BPF_MOV64_REG(BPF_REG_2, BPF_REG_6),
310         BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -128),
311         BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -128),
312         BPF_JMP_IMM(BPF_JSGT, BPF_REG_2, sizeof(struct test_val) - 19, 4),
313         BPF_MOV64_IMM(BPF_REG_4, 0),
314         BPF_JMP_REG(BPF_JSGE, BPF_REG_4, BPF_REG_2, 2),
315         BPF_MOV64_IMM(BPF_REG_3, 0),
316         BPF_EMIT_CALL(BPF_FUNC_probe_read),
317         BPF_MOV64_IMM(BPF_REG_0, 0),
318         BPF_EXIT_INSN(),
319         },
320         .fixup_map_hash_48b = { 4 },
321         .errstr = "R1 min value is outside of the array range",
322         .result = REJECT,
323         .prog_type = BPF_PROG_TYPE_TRACEPOINT,
324 },
325 {
326         "helper access to variable memory: size = 0 allowed on NULL (ARG_PTR_TO_MEM_OR_NULL)",
327         .insns = {
328         BPF_MOV64_IMM(BPF_REG_1, 0),
329         BPF_MOV64_IMM(BPF_REG_2, 0),
330         BPF_MOV64_IMM(BPF_REG_3, 0),
331         BPF_MOV64_IMM(BPF_REG_4, 0),
332         BPF_MOV64_IMM(BPF_REG_5, 0),
333         BPF_EMIT_CALL(BPF_FUNC_csum_diff),
334         BPF_EXIT_INSN(),
335         },
336         .result = ACCEPT,
337         .prog_type = BPF_PROG_TYPE_SCHED_CLS,
338 },
339 {
340         "helper access to variable memory: size > 0 not allowed on NULL (ARG_PTR_TO_MEM_OR_NULL)",
341         .insns = {
342         BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 0),
343         BPF_MOV64_IMM(BPF_REG_1, 0),
344         BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -128),
345         BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -128),
346         BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 64),
347         BPF_MOV64_IMM(BPF_REG_3, 0),
348         BPF_MOV64_IMM(BPF_REG_4, 0),
349         BPF_MOV64_IMM(BPF_REG_5, 0),
350         BPF_EMIT_CALL(BPF_FUNC_csum_diff),
351         BPF_EXIT_INSN(),
352         },
353         .errstr = "R1 type=inv expected=fp",
354         .result = REJECT,
355         .prog_type = BPF_PROG_TYPE_SCHED_CLS,
356 },
357 {
358         "helper access to variable memory: size = 0 allowed on != NULL stack pointer (ARG_PTR_TO_MEM_OR_NULL)",
359         .insns = {
360         BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
361         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
362         BPF_MOV64_IMM(BPF_REG_2, 0),
363         BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, 0),
364         BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 8),
365         BPF_MOV64_IMM(BPF_REG_3, 0),
366         BPF_MOV64_IMM(BPF_REG_4, 0),
367         BPF_MOV64_IMM(BPF_REG_5, 0),
368         BPF_EMIT_CALL(BPF_FUNC_csum_diff),
369         BPF_EXIT_INSN(),
370         },
371         .result = ACCEPT,
372         .prog_type = BPF_PROG_TYPE_SCHED_CLS,
373 },
374 {
375         "helper access to variable memory: size = 0 allowed on != NULL map pointer (ARG_PTR_TO_MEM_OR_NULL)",
376         .insns = {
377         BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
378         BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
379         BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
380         BPF_LD_MAP_FD(BPF_REG_1, 0),
381         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
382         BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
383         BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
384         BPF_MOV64_IMM(BPF_REG_2, 0),
385         BPF_MOV64_IMM(BPF_REG_3, 0),
386         BPF_MOV64_IMM(BPF_REG_4, 0),
387         BPF_MOV64_IMM(BPF_REG_5, 0),
388         BPF_EMIT_CALL(BPF_FUNC_csum_diff),
389         BPF_EXIT_INSN(),
390         },
391         .fixup_map_hash_8b = { 3 },
392         .result = ACCEPT,
393         .prog_type = BPF_PROG_TYPE_SCHED_CLS,
394 },
395 {
396         "helper access to variable memory: size possible = 0 allowed on != NULL stack pointer (ARG_PTR_TO_MEM_OR_NULL)",
397         .insns = {
398         BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
399         BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
400         BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
401         BPF_LD_MAP_FD(BPF_REG_1, 0),
402         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
403         BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9),
404         BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0),
405         BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 8, 7),
406         BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
407         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
408         BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, 0),
409         BPF_MOV64_IMM(BPF_REG_3, 0),
410         BPF_MOV64_IMM(BPF_REG_4, 0),
411         BPF_MOV64_IMM(BPF_REG_5, 0),
412         BPF_EMIT_CALL(BPF_FUNC_csum_diff),
413         BPF_EXIT_INSN(),
414         },
415         .fixup_map_hash_8b = { 3 },
416         .result = ACCEPT,
417         .prog_type = BPF_PROG_TYPE_SCHED_CLS,
418 },
419 {
420         "helper access to variable memory: size possible = 0 allowed on != NULL map pointer (ARG_PTR_TO_MEM_OR_NULL)",
421         .insns = {
422         BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
423         BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
424         BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
425         BPF_LD_MAP_FD(BPF_REG_1, 0),
426         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
427         BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7),
428         BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
429         BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0),
430         BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 8, 4),
431         BPF_MOV64_IMM(BPF_REG_3, 0),
432         BPF_MOV64_IMM(BPF_REG_4, 0),
433         BPF_MOV64_IMM(BPF_REG_5, 0),
434         BPF_EMIT_CALL(BPF_FUNC_csum_diff),
435         BPF_EXIT_INSN(),
436         },
437         .fixup_map_hash_8b = { 3 },
438         .result = ACCEPT,
439         .prog_type = BPF_PROG_TYPE_SCHED_CLS,
440 },
441 {
442         "helper access to variable memory: size possible = 0 allowed on != NULL packet pointer (ARG_PTR_TO_MEM_OR_NULL)",
443         .insns = {
444         BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1,
445                     offsetof(struct __sk_buff, data)),
446         BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
447                     offsetof(struct __sk_buff, data_end)),
448         BPF_MOV64_REG(BPF_REG_0, BPF_REG_6),
449         BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
450         BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 7),
451         BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
452         BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_6, 0),
453         BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 8, 4),
454         BPF_MOV64_IMM(BPF_REG_3, 0),
455         BPF_MOV64_IMM(BPF_REG_4, 0),
456         BPF_MOV64_IMM(BPF_REG_5, 0),
457         BPF_EMIT_CALL(BPF_FUNC_csum_diff),
458         BPF_EXIT_INSN(),
459         },
460         .result = ACCEPT,
461         .prog_type = BPF_PROG_TYPE_SCHED_CLS,
462         .retval = 0 /* csum_diff of 64-byte packet */,
463         .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
464 },
465 {
466         "helper access to variable memory: size = 0 not allowed on NULL (!ARG_PTR_TO_MEM_OR_NULL)",
467         .insns = {
468         BPF_MOV64_IMM(BPF_REG_1, 0),
469         BPF_MOV64_IMM(BPF_REG_2, 0),
470         BPF_MOV64_IMM(BPF_REG_3, 0),
471         BPF_EMIT_CALL(BPF_FUNC_probe_read),
472         BPF_EXIT_INSN(),
473         },
474         .errstr = "R1 type=inv expected=fp",
475         .result = REJECT,
476         .prog_type = BPF_PROG_TYPE_TRACEPOINT,
477 },
478 {
479         "helper access to variable memory: size > 0 not allowed on NULL (!ARG_PTR_TO_MEM_OR_NULL)",
480         .insns = {
481         BPF_MOV64_IMM(BPF_REG_1, 0),
482         BPF_MOV64_IMM(BPF_REG_2, 1),
483         BPF_MOV64_IMM(BPF_REG_3, 0),
484         BPF_EMIT_CALL(BPF_FUNC_probe_read),
485         BPF_EXIT_INSN(),
486         },
487         .errstr = "R1 type=inv expected=fp",
488         .result = REJECT,
489         .prog_type = BPF_PROG_TYPE_TRACEPOINT,
490 },
491 {
492         "helper access to variable memory: size = 0 allowed on != NULL stack pointer (!ARG_PTR_TO_MEM_OR_NULL)",
493         .insns = {
494         BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
495         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
496         BPF_MOV64_IMM(BPF_REG_2, 0),
497         BPF_MOV64_IMM(BPF_REG_3, 0),
498         BPF_EMIT_CALL(BPF_FUNC_probe_read),
499         BPF_EXIT_INSN(),
500         },
501         .result = ACCEPT,
502         .prog_type = BPF_PROG_TYPE_TRACEPOINT,
503 },
504 {
505         "helper access to variable memory: size = 0 allowed on != NULL map pointer (!ARG_PTR_TO_MEM_OR_NULL)",
506         .insns = {
507         BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
508         BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
509         BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
510         BPF_LD_MAP_FD(BPF_REG_1, 0),
511         BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
512         BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
513         BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
514         BPF_MOV64_IMM(BPF_REG_2, 0),
515         BPF_MOV64_IMM(BPF_REG_3, 0),
516         BPF_EMIT_CALL(BPF_FUNC_probe_read),
517         BPF_EXIT_INSN(),
518         },
519         .fixup_map_hash_8b = { 3 },
520         .result = ACCEPT,
521         .prog_type = BPF_PROG_TYPE_TRACEPOINT,
522 },
523 {
524         "helper access to variable memory: size possible = 0 allowed on != NULL stack pointer (!ARG_PTR_TO_MEM_OR_NULL)",
525         .insns = {
526         BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
527         BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
528         BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
529         BPF_LD_MAP_FD(BPF_REG_1, 0),
530         BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
531         BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
532         BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0),
533         BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 8, 4),
534         BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
535         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
536         BPF_MOV64_IMM(BPF_REG_3, 0),
537         BPF_EMIT_CALL(BPF_FUNC_probe_read),
538         BPF_EXIT_INSN(),
539         },
540         .fixup_map_hash_8b = { 3 },
541         .result = ACCEPT,
542         .prog_type = BPF_PROG_TYPE_TRACEPOINT,
543 },
544 {
545         "helper access to variable memory: size possible = 0 allowed on != NULL map pointer (!ARG_PTR_TO_MEM_OR_NULL)",
546         .insns = {
547         BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
548         BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
549         BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
550         BPF_LD_MAP_FD(BPF_REG_1, 0),
551         BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
552         BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
553         BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
554         BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0),
555         BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 8, 2),
556         BPF_MOV64_IMM(BPF_REG_3, 0),
557         BPF_EMIT_CALL(BPF_FUNC_probe_read),
558         BPF_EXIT_INSN(),
559         },
560         .fixup_map_hash_8b = { 3 },
561         .result = ACCEPT,
562         .prog_type = BPF_PROG_TYPE_TRACEPOINT,
563 },
564 {
565         "helper access to variable memory: 8 bytes leak",
566         .insns = {
567         BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, 8),
568         BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
569         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64),
570         BPF_MOV64_IMM(BPF_REG_0, 0),
571         BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -64),
572         BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -56),
573         BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -48),
574         BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -40),
575         BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -24),
576         BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -16),
577         BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8),
578         BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -128),
579         BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -128),
580         BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 63),
581         BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1),
582         BPF_MOV64_IMM(BPF_REG_3, 0),
583         BPF_EMIT_CALL(BPF_FUNC_probe_read),
584         BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16),
585         BPF_EXIT_INSN(),
586         },
587         .errstr = "invalid indirect read from stack off -64+32 size 64",
588         .result = REJECT,
589         .prog_type = BPF_PROG_TYPE_TRACEPOINT,
590 },
591 {
592         "helper access to variable memory: 8 bytes no leak (init memory)",
593         .insns = {
594         BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
595         BPF_MOV64_IMM(BPF_REG_0, 0),
596         BPF_MOV64_IMM(BPF_REG_0, 0),
597         BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -64),
598         BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -56),
599         BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -48),
600         BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -40),
601         BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -32),
602         BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -24),
603         BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -16),
604         BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8),
605         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64),
606         BPF_MOV64_IMM(BPF_REG_2, 0),
607         BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 32),
608         BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 32),
609         BPF_MOV64_IMM(BPF_REG_3, 0),
610         BPF_EMIT_CALL(BPF_FUNC_probe_read),
611         BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16),
612         BPF_EXIT_INSN(),
613         },
614         .result = ACCEPT,
615         .prog_type = BPF_PROG_TYPE_TRACEPOINT,
616 },