• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 {
2 	"skb->sk: no NULL check",
3 	.insns = {
4 	BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
5 	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0),
6 	BPF_MOV64_IMM(BPF_REG_0, 0),
7 	BPF_EXIT_INSN(),
8 	},
9 	.prog_type = BPF_PROG_TYPE_CGROUP_SKB,
10 	.result = REJECT,
11 	.errstr = "invalid mem access 'sock_common_or_null'",
12 },
13 {
14 	"skb->sk: sk->family [non fullsock field]",
15 	.insns = {
16 	BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
17 	BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
18 	BPF_MOV64_IMM(BPF_REG_0, 0),
19 	BPF_EXIT_INSN(),
20 	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, offsetof(struct bpf_sock, family)),
21 	BPF_MOV64_IMM(BPF_REG_0, 0),
22 	BPF_EXIT_INSN(),
23 	},
24 	.prog_type = BPF_PROG_TYPE_CGROUP_SKB,
25 	.result = ACCEPT,
26 },
27 {
28 	"skb->sk: sk->type [fullsock field]",
29 	.insns = {
30 	BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
31 	BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
32 	BPF_MOV64_IMM(BPF_REG_0, 0),
33 	BPF_EXIT_INSN(),
34 	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, offsetof(struct bpf_sock, type)),
35 	BPF_MOV64_IMM(BPF_REG_0, 0),
36 	BPF_EXIT_INSN(),
37 	},
38 	.prog_type = BPF_PROG_TYPE_CGROUP_SKB,
39 	.result = REJECT,
40 	.errstr = "invalid sock_common access",
41 },
42 {
43 	"bpf_sk_fullsock(skb->sk): no !skb->sk check",
44 	.insns = {
45 	BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
46 	BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
47 	BPF_MOV64_IMM(BPF_REG_0, 0),
48 	BPF_EXIT_INSN(),
49 	},
50 	.prog_type = BPF_PROG_TYPE_CGROUP_SKB,
51 	.result = REJECT,
52 	.errstr = "type=sock_common_or_null expected=sock_common",
53 },
54 {
55 	"sk_fullsock(skb->sk): no NULL check on ret",
56 	.insns = {
57 	BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
58 	BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
59 	BPF_MOV64_IMM(BPF_REG_0, 0),
60 	BPF_EXIT_INSN(),
61 	BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
62 	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, offsetof(struct bpf_sock, type)),
63 	BPF_MOV64_IMM(BPF_REG_0, 0),
64 	BPF_EXIT_INSN(),
65 	},
66 	.prog_type = BPF_PROG_TYPE_CGROUP_SKB,
67 	.result = REJECT,
68 	.errstr = "invalid mem access 'sock_or_null'",
69 },
70 {
71 	"sk_fullsock(skb->sk): sk->type [fullsock field]",
72 	.insns = {
73 	BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
74 	BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
75 	BPF_MOV64_IMM(BPF_REG_0, 0),
76 	BPF_EXIT_INSN(),
77 	BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
78 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
79 	BPF_MOV64_IMM(BPF_REG_0, 0),
80 	BPF_EXIT_INSN(),
81 	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, offsetof(struct bpf_sock, type)),
82 	BPF_MOV64_IMM(BPF_REG_0, 0),
83 	BPF_EXIT_INSN(),
84 	},
85 	.prog_type = BPF_PROG_TYPE_CGROUP_SKB,
86 	.result = ACCEPT,
87 },
88 {
89 	"sk_fullsock(skb->sk): sk->family [non fullsock field]",
90 	.insns = {
91 	BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
92 	BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
93 	BPF_MOV64_IMM(BPF_REG_0, 0),
94 	BPF_EXIT_INSN(),
95 	BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
96 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
97 	BPF_EXIT_INSN(),
98 	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, offsetof(struct bpf_sock, family)),
99 	BPF_MOV64_IMM(BPF_REG_0, 0),
100 	BPF_EXIT_INSN(),
101 	},
102 	.prog_type = BPF_PROG_TYPE_CGROUP_SKB,
103 	.result = ACCEPT,
104 },
105 {
106 	"sk_fullsock(skb->sk): sk->state [narrow load]",
107 	.insns = {
108 	BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
109 	BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
110 	BPF_MOV64_IMM(BPF_REG_0, 0),
111 	BPF_EXIT_INSN(),
112 	BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
113 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
114 	BPF_MOV64_IMM(BPF_REG_0, 0),
115 	BPF_EXIT_INSN(),
116 	BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, offsetof(struct bpf_sock, state)),
117 	BPF_MOV64_IMM(BPF_REG_0, 0),
118 	BPF_EXIT_INSN(),
119 	},
120 	.prog_type = BPF_PROG_TYPE_CGROUP_SKB,
121 	.result = ACCEPT,
122 },
123 {
124 	"sk_fullsock(skb->sk): sk->dst_port [word load] (backward compatibility)",
125 	.insns = {
126 	BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
127 	BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
128 	BPF_MOV64_IMM(BPF_REG_0, 0),
129 	BPF_EXIT_INSN(),
130 	BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
131 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
132 	BPF_MOV64_IMM(BPF_REG_0, 0),
133 	BPF_EXIT_INSN(),
134 	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, offsetof(struct bpf_sock, dst_port)),
135 	BPF_MOV64_IMM(BPF_REG_0, 0),
136 	BPF_EXIT_INSN(),
137 	},
138 	.prog_type = BPF_PROG_TYPE_CGROUP_SKB,
139 	.result = ACCEPT,
140 },
141 {
142 	"sk_fullsock(skb->sk): sk->dst_port [half load]",
143 	.insns = {
144 	BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
145 	BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
146 	BPF_MOV64_IMM(BPF_REG_0, 0),
147 	BPF_EXIT_INSN(),
148 	BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
149 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
150 	BPF_MOV64_IMM(BPF_REG_0, 0),
151 	BPF_EXIT_INSN(),
152 	BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_0, offsetof(struct bpf_sock, dst_port)),
153 	BPF_MOV64_IMM(BPF_REG_0, 0),
154 	BPF_EXIT_INSN(),
155 	},
156 	.prog_type = BPF_PROG_TYPE_CGROUP_SKB,
157 	.result = ACCEPT,
158 },
159 {
160 	"sk_fullsock(skb->sk): sk->dst_port [half load] (invalid)",
161 	.insns = {
162 	BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
163 	BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
164 	BPF_MOV64_IMM(BPF_REG_0, 0),
165 	BPF_EXIT_INSN(),
166 	BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
167 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
168 	BPF_MOV64_IMM(BPF_REG_0, 0),
169 	BPF_EXIT_INSN(),
170 	BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_0, offsetof(struct bpf_sock, dst_port) + 2),
171 	BPF_MOV64_IMM(BPF_REG_0, 0),
172 	BPF_EXIT_INSN(),
173 	},
174 	.prog_type = BPF_PROG_TYPE_CGROUP_SKB,
175 	.result = REJECT,
176 	.errstr = "invalid sock access",
177 },
178 {
179 	"sk_fullsock(skb->sk): sk->dst_port [byte load]",
180 	.insns = {
181 	BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
182 	BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
183 	BPF_MOV64_IMM(BPF_REG_0, 0),
184 	BPF_EXIT_INSN(),
185 	BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
186 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
187 	BPF_MOV64_IMM(BPF_REG_0, 0),
188 	BPF_EXIT_INSN(),
189 	BPF_LDX_MEM(BPF_B, BPF_REG_2, BPF_REG_0, offsetof(struct bpf_sock, dst_port)),
190 	BPF_LDX_MEM(BPF_B, BPF_REG_2, BPF_REG_0, offsetof(struct bpf_sock, dst_port) + 1),
191 	BPF_MOV64_IMM(BPF_REG_0, 0),
192 	BPF_EXIT_INSN(),
193 	},
194 	.prog_type = BPF_PROG_TYPE_CGROUP_SKB,
195 	.result = ACCEPT,
196 },
197 {
198 	"sk_fullsock(skb->sk): sk->dst_port [byte load] (invalid)",
199 	.insns = {
200 	BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
201 	BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
202 	BPF_MOV64_IMM(BPF_REG_0, 0),
203 	BPF_EXIT_INSN(),
204 	BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
205 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
206 	BPF_MOV64_IMM(BPF_REG_0, 0),
207 	BPF_EXIT_INSN(),
208 	BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, offsetof(struct bpf_sock, dst_port) + 2),
209 	BPF_MOV64_IMM(BPF_REG_0, 0),
210 	BPF_EXIT_INSN(),
211 	},
212 	.prog_type = BPF_PROG_TYPE_CGROUP_SKB,
213 	.result = REJECT,
214 	.errstr = "invalid sock access",
215 },
216 {
217 	"sk_fullsock(skb->sk): past sk->dst_port [half load] (invalid)",
218 	.insns = {
219 	BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
220 	BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
221 	BPF_MOV64_IMM(BPF_REG_0, 0),
222 	BPF_EXIT_INSN(),
223 	BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
224 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
225 	BPF_MOV64_IMM(BPF_REG_0, 0),
226 	BPF_EXIT_INSN(),
227 	BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_0, offsetofend(struct bpf_sock, dst_port)),
228 	BPF_MOV64_IMM(BPF_REG_0, 0),
229 	BPF_EXIT_INSN(),
230 	},
231 	.prog_type = BPF_PROG_TYPE_CGROUP_SKB,
232 	.result = REJECT,
233 	.errstr = "invalid sock access",
234 },
235 {
236 	"sk_fullsock(skb->sk): sk->dst_ip6 [load 2nd byte]",
237 	.insns = {
238 	BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
239 	BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
240 	BPF_MOV64_IMM(BPF_REG_0, 0),
241 	BPF_EXIT_INSN(),
242 	BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
243 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
244 	BPF_MOV64_IMM(BPF_REG_0, 0),
245 	BPF_EXIT_INSN(),
246 	BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, offsetof(struct bpf_sock, dst_ip6[0]) + 1),
247 	BPF_MOV64_IMM(BPF_REG_0, 0),
248 	BPF_EXIT_INSN(),
249 	},
250 	.prog_type = BPF_PROG_TYPE_CGROUP_SKB,
251 	.result = ACCEPT,
252 },
253 {
254 	"sk_fullsock(skb->sk): sk->type [narrow load]",
255 	.insns = {
256 	BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
257 	BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
258 	BPF_MOV64_IMM(BPF_REG_0, 0),
259 	BPF_EXIT_INSN(),
260 	BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
261 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
262 	BPF_MOV64_IMM(BPF_REG_0, 0),
263 	BPF_EXIT_INSN(),
264 	BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, offsetof(struct bpf_sock, type)),
265 	BPF_MOV64_IMM(BPF_REG_0, 0),
266 	BPF_EXIT_INSN(),
267 	},
268 	.prog_type = BPF_PROG_TYPE_CGROUP_SKB,
269 	.result = ACCEPT,
270 },
271 {
272 	"sk_fullsock(skb->sk): sk->protocol [narrow load]",
273 	.insns = {
274 	BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
275 	BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
276 	BPF_MOV64_IMM(BPF_REG_0, 0),
277 	BPF_EXIT_INSN(),
278 	BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
279 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
280 	BPF_MOV64_IMM(BPF_REG_0, 0),
281 	BPF_EXIT_INSN(),
282 	BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, offsetof(struct bpf_sock, protocol)),
283 	BPF_MOV64_IMM(BPF_REG_0, 0),
284 	BPF_EXIT_INSN(),
285 	},
286 	.prog_type = BPF_PROG_TYPE_CGROUP_SKB,
287 	.result = ACCEPT,
288 },
289 {
290 	"sk_fullsock(skb->sk): beyond last field",
291 	.insns = {
292 	BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
293 	BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
294 	BPF_MOV64_IMM(BPF_REG_0, 0),
295 	BPF_EXIT_INSN(),
296 	BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
297 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
298 	BPF_MOV64_IMM(BPF_REG_0, 0),
299 	BPF_EXIT_INSN(),
300 	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, offsetofend(struct bpf_sock, rx_queue_mapping)),
301 	BPF_MOV64_IMM(BPF_REG_0, 0),
302 	BPF_EXIT_INSN(),
303 	},
304 	.prog_type = BPF_PROG_TYPE_CGROUP_SKB,
305 	.result = REJECT,
306 	.errstr = "invalid sock access",
307 },
308 {
309 	"bpf_tcp_sock(skb->sk): no !skb->sk check",
310 	.insns = {
311 	BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
312 	BPF_EMIT_CALL(BPF_FUNC_tcp_sock),
313 	BPF_MOV64_IMM(BPF_REG_0, 0),
314 	BPF_EXIT_INSN(),
315 	},
316 	.prog_type = BPF_PROG_TYPE_CGROUP_SKB,
317 	.result = REJECT,
318 	.errstr = "type=sock_common_or_null expected=sock_common",
319 },
320 {
321 	"bpf_tcp_sock(skb->sk): no NULL check on ret",
322 	.insns = {
323 	BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
324 	BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
325 	BPF_MOV64_IMM(BPF_REG_0, 0),
326 	BPF_EXIT_INSN(),
327 	BPF_EMIT_CALL(BPF_FUNC_tcp_sock),
328 	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, offsetof(struct bpf_tcp_sock, snd_cwnd)),
329 	BPF_MOV64_IMM(BPF_REG_0, 0),
330 	BPF_EXIT_INSN(),
331 	},
332 	.prog_type = BPF_PROG_TYPE_CGROUP_SKB,
333 	.result = REJECT,
334 	.errstr = "invalid mem access 'tcp_sock_or_null'",
335 },
336 {
337 	"bpf_tcp_sock(skb->sk): tp->snd_cwnd",
338 	.insns = {
339 	BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
340 	BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
341 	BPF_MOV64_IMM(BPF_REG_0, 0),
342 	BPF_EXIT_INSN(),
343 	BPF_EMIT_CALL(BPF_FUNC_tcp_sock),
344 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
345 	BPF_EXIT_INSN(),
346 	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, offsetof(struct bpf_tcp_sock, snd_cwnd)),
347 	BPF_MOV64_IMM(BPF_REG_0, 0),
348 	BPF_EXIT_INSN(),
349 	},
350 	.prog_type = BPF_PROG_TYPE_CGROUP_SKB,
351 	.result = ACCEPT,
352 },
353 {
354 	"bpf_tcp_sock(skb->sk): tp->bytes_acked",
355 	.insns = {
356 	BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
357 	BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
358 	BPF_MOV64_IMM(BPF_REG_0, 0),
359 	BPF_EXIT_INSN(),
360 	BPF_EMIT_CALL(BPF_FUNC_tcp_sock),
361 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
362 	BPF_EXIT_INSN(),
363 	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, offsetof(struct bpf_tcp_sock, bytes_acked)),
364 	BPF_MOV64_IMM(BPF_REG_0, 0),
365 	BPF_EXIT_INSN(),
366 	},
367 	.prog_type = BPF_PROG_TYPE_CGROUP_SKB,
368 	.result = ACCEPT,
369 },
370 {
371 	"bpf_tcp_sock(skb->sk): beyond last field",
372 	.insns = {
373 	BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
374 	BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
375 	BPF_MOV64_IMM(BPF_REG_0, 0),
376 	BPF_EXIT_INSN(),
377 	BPF_EMIT_CALL(BPF_FUNC_tcp_sock),
378 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
379 	BPF_EXIT_INSN(),
380 	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, offsetofend(struct bpf_tcp_sock, bytes_acked)),
381 	BPF_MOV64_IMM(BPF_REG_0, 0),
382 	BPF_EXIT_INSN(),
383 	},
384 	.prog_type = BPF_PROG_TYPE_CGROUP_SKB,
385 	.result = REJECT,
386 	.errstr = "invalid tcp_sock access",
387 },
388 {
389 	"bpf_tcp_sock(bpf_sk_fullsock(skb->sk)): tp->snd_cwnd",
390 	.insns = {
391 	BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
392 	BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
393 	BPF_MOV64_IMM(BPF_REG_0, 0),
394 	BPF_EXIT_INSN(),
395 	BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
396 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
397 	BPF_EXIT_INSN(),
398 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
399 	BPF_EMIT_CALL(BPF_FUNC_tcp_sock),
400 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
401 	BPF_EXIT_INSN(),
402 	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, offsetof(struct bpf_tcp_sock, snd_cwnd)),
403 	BPF_MOV64_IMM(BPF_REG_0, 0),
404 	BPF_EXIT_INSN(),
405 	},
406 	.prog_type = BPF_PROG_TYPE_CGROUP_SKB,
407 	.result = ACCEPT,
408 },
409 {
410 	"bpf_sk_release(skb->sk)",
411 	.insns = {
412 	BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
413 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1),
414 	BPF_EMIT_CALL(BPF_FUNC_sk_release),
415 	BPF_MOV64_IMM(BPF_REG_0, 0),
416 	BPF_EXIT_INSN(),
417 	},
418 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
419 	.result = REJECT,
420 	.errstr = "reference has not been acquired before",
421 },
422 {
423 	"bpf_sk_release(bpf_sk_fullsock(skb->sk))",
424 	.insns = {
425 	BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
426 	BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
427 	BPF_MOV64_IMM(BPF_REG_0, 0),
428 	BPF_EXIT_INSN(),
429 	BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
430 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
431 	BPF_EXIT_INSN(),
432 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
433 	BPF_EMIT_CALL(BPF_FUNC_sk_release),
434 	BPF_MOV64_IMM(BPF_REG_0, 1),
435 	BPF_EXIT_INSN(),
436 	},
437 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
438 	.result = REJECT,
439 	.errstr = "reference has not been acquired before",
440 },
441 {
442 	"bpf_sk_release(bpf_tcp_sock(skb->sk))",
443 	.insns = {
444 	BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
445 	BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
446 	BPF_MOV64_IMM(BPF_REG_0, 0),
447 	BPF_EXIT_INSN(),
448 	BPF_EMIT_CALL(BPF_FUNC_tcp_sock),
449 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
450 	BPF_EXIT_INSN(),
451 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
452 	BPF_EMIT_CALL(BPF_FUNC_sk_release),
453 	BPF_MOV64_IMM(BPF_REG_0, 1),
454 	BPF_EXIT_INSN(),
455 	},
456 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
457 	.result = REJECT,
458 	.errstr = "reference has not been acquired before",
459 },
460 {
461 	"sk_storage_get(map, skb->sk, NULL, 0): value == NULL",
462 	.insns = {
463 	BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
464 	BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
465 	BPF_MOV64_IMM(BPF_REG_0, 0),
466 	BPF_EXIT_INSN(),
467 	BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
468 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
469 	BPF_MOV64_IMM(BPF_REG_0, 0),
470 	BPF_EXIT_INSN(),
471 	BPF_MOV64_IMM(BPF_REG_4, 0),
472 	BPF_MOV64_IMM(BPF_REG_3, 0),
473 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
474 	BPF_LD_MAP_FD(BPF_REG_1, 0),
475 	BPF_EMIT_CALL(BPF_FUNC_sk_storage_get),
476 	BPF_MOV64_IMM(BPF_REG_0, 0),
477 	BPF_EXIT_INSN(),
478 	},
479 	.fixup_sk_storage_map = { 11 },
480 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
481 	.result = ACCEPT,
482 },
483 {
484 	"sk_storage_get(map, skb->sk, 1, 1): value == 1",
485 	.insns = {
486 	BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
487 	BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
488 	BPF_MOV64_IMM(BPF_REG_0, 0),
489 	BPF_EXIT_INSN(),
490 	BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
491 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
492 	BPF_MOV64_IMM(BPF_REG_0, 0),
493 	BPF_EXIT_INSN(),
494 	BPF_MOV64_IMM(BPF_REG_4, 1),
495 	BPF_MOV64_IMM(BPF_REG_3, 1),
496 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
497 	BPF_LD_MAP_FD(BPF_REG_1, 0),
498 	BPF_EMIT_CALL(BPF_FUNC_sk_storage_get),
499 	BPF_MOV64_IMM(BPF_REG_0, 0),
500 	BPF_EXIT_INSN(),
501 	},
502 	.fixup_sk_storage_map = { 11 },
503 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
504 	.result = REJECT,
505 	.errstr = "R3 type=inv expected=fp",
506 },
507 {
508 	"sk_storage_get(map, skb->sk, &stack_value, 1): stack_value",
509 	.insns = {
510 	BPF_MOV64_IMM(BPF_REG_2, 0),
511 	BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -8),
512 	BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
513 	BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
514 	BPF_MOV64_IMM(BPF_REG_0, 0),
515 	BPF_EXIT_INSN(),
516 	BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
517 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
518 	BPF_MOV64_IMM(BPF_REG_0, 0),
519 	BPF_EXIT_INSN(),
520 	BPF_MOV64_IMM(BPF_REG_4, 1),
521 	BPF_MOV64_REG(BPF_REG_3, BPF_REG_10),
522 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_3, -8),
523 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
524 	BPF_LD_MAP_FD(BPF_REG_1, 0),
525 	BPF_EMIT_CALL(BPF_FUNC_sk_storage_get),
526 	BPF_MOV64_IMM(BPF_REG_0, 0),
527 	BPF_EXIT_INSN(),
528 	},
529 	.fixup_sk_storage_map = { 14 },
530 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
531 	.result = ACCEPT,
532 },
533 {
534 	"sk_storage_get(map, skb->sk, &stack_value, 1): partially init stack_value",
535 	.insns = {
536 	BPF_MOV64_IMM(BPF_REG_2, 0),
537 	BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_2, -8),
538 	BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
539 	BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
540 	BPF_MOV64_IMM(BPF_REG_0, 0),
541 	BPF_EXIT_INSN(),
542 	BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
543 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
544 	BPF_MOV64_IMM(BPF_REG_0, 0),
545 	BPF_EXIT_INSN(),
546 	BPF_MOV64_IMM(BPF_REG_4, 1),
547 	BPF_MOV64_REG(BPF_REG_3, BPF_REG_10),
548 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_3, -8),
549 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
550 	BPF_LD_MAP_FD(BPF_REG_1, 0),
551 	BPF_EMIT_CALL(BPF_FUNC_sk_storage_get),
552 	BPF_MOV64_IMM(BPF_REG_0, 0),
553 	BPF_EXIT_INSN(),
554 	},
555 	.fixup_sk_storage_map = { 14 },
556 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
557 	.result = REJECT,
558 	.errstr = "invalid indirect read from stack",
559 },
560 {
561 	"bpf_map_lookup_elem(smap, &key)",
562 	.insns = {
563 	BPF_ST_MEM(BPF_W, BPF_REG_10, -4, 0),
564 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
565 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
566 	BPF_LD_MAP_FD(BPF_REG_1, 0),
567 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
568 	BPF_MOV64_IMM(BPF_REG_0, 0),
569 	BPF_EXIT_INSN(),
570 	},
571 	.fixup_sk_storage_map = { 3 },
572 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
573 	.result = REJECT,
574 	.errstr = "cannot pass map_type 24 into func bpf_map_lookup_elem",
575 },
576 {
577 	"bpf_map_lookup_elem(xskmap, &key); xs->queue_id",
578 	.insns = {
579 	BPF_ST_MEM(BPF_W, BPF_REG_10, -8, 0),
580 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
581 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
582 	BPF_LD_MAP_FD(BPF_REG_1, 0),
583 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
584 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
585 	BPF_EXIT_INSN(),
586 	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, offsetof(struct bpf_xdp_sock, queue_id)),
587 	BPF_MOV64_IMM(BPF_REG_0, 0),
588 	BPF_EXIT_INSN(),
589 	},
590 	.fixup_map_xskmap = { 3 },
591 	.prog_type = BPF_PROG_TYPE_XDP,
592 	.result = ACCEPT,
593 },
594 {
595 	"bpf_map_lookup_elem(sockmap, &key)",
596 	.insns = {
597 	BPF_ST_MEM(BPF_W, BPF_REG_10, -4, 0),
598 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
599 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
600 	BPF_LD_MAP_FD(BPF_REG_1, 0),
601 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
602 	BPF_MOV64_IMM(BPF_REG_0, 0),
603 	BPF_EXIT_INSN(),
604 	},
605 	.fixup_map_sockmap = { 3 },
606 	.prog_type = BPF_PROG_TYPE_SK_SKB,
607 	.result = REJECT,
608 	.errstr = "Unreleased reference id=2 alloc_insn=5",
609 },
610 {
611 	"bpf_map_lookup_elem(sockhash, &key)",
612 	.insns = {
613 	BPF_ST_MEM(BPF_W, BPF_REG_10, -4, 0),
614 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
615 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
616 	BPF_LD_MAP_FD(BPF_REG_1, 0),
617 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
618 	BPF_MOV64_IMM(BPF_REG_0, 0),
619 	BPF_EXIT_INSN(),
620 	},
621 	.fixup_map_sockhash = { 3 },
622 	.prog_type = BPF_PROG_TYPE_SK_SKB,
623 	.result = REJECT,
624 	.errstr = "Unreleased reference id=2 alloc_insn=5",
625 },
626 {
627 	"bpf_map_lookup_elem(sockmap, &key); sk->type [fullsock field]; bpf_sk_release(sk)",
628 	.insns = {
629 	BPF_ST_MEM(BPF_W, BPF_REG_10, -4, 0),
630 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
631 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
632 	BPF_LD_MAP_FD(BPF_REG_1, 0),
633 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
634 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
635 	BPF_EXIT_INSN(),
636 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
637 	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, offsetof(struct bpf_sock, type)),
638 	BPF_EMIT_CALL(BPF_FUNC_sk_release),
639 	BPF_EXIT_INSN(),
640 	},
641 	.fixup_map_sockmap = { 3 },
642 	.prog_type = BPF_PROG_TYPE_SK_SKB,
643 	.result = ACCEPT,
644 },
645 {
646 	"bpf_map_lookup_elem(sockhash, &key); sk->type [fullsock field]; bpf_sk_release(sk)",
647 	.insns = {
648 	BPF_ST_MEM(BPF_W, BPF_REG_10, -4, 0),
649 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
650 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
651 	BPF_LD_MAP_FD(BPF_REG_1, 0),
652 	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
653 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
654 	BPF_EXIT_INSN(),
655 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
656 	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, offsetof(struct bpf_sock, type)),
657 	BPF_EMIT_CALL(BPF_FUNC_sk_release),
658 	BPF_EXIT_INSN(),
659 	},
660 	.fixup_map_sockhash = { 3 },
661 	.prog_type = BPF_PROG_TYPE_SK_SKB,
662 	.result = ACCEPT,
663 },
664 {
665 	"bpf_sk_select_reuseport(ctx, reuseport_array, &key, flags)",
666 	.insns = {
667 	BPF_MOV64_IMM(BPF_REG_4, 0),
668 	BPF_ST_MEM(BPF_W, BPF_REG_10, -4, 0),
669 	BPF_MOV64_REG(BPF_REG_3, BPF_REG_10),
670 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_3, -4),
671 	BPF_LD_MAP_FD(BPF_REG_2, 0),
672 	BPF_EMIT_CALL(BPF_FUNC_sk_select_reuseport),
673 	BPF_EXIT_INSN(),
674 	},
675 	.fixup_map_reuseport_array = { 4 },
676 	.prog_type = BPF_PROG_TYPE_SK_REUSEPORT,
677 	.result = ACCEPT,
678 },
679 {
680 	"bpf_sk_select_reuseport(ctx, sockmap, &key, flags)",
681 	.insns = {
682 	BPF_MOV64_IMM(BPF_REG_4, 0),
683 	BPF_ST_MEM(BPF_W, BPF_REG_10, -4, 0),
684 	BPF_MOV64_REG(BPF_REG_3, BPF_REG_10),
685 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_3, -4),
686 	BPF_LD_MAP_FD(BPF_REG_2, 0),
687 	BPF_EMIT_CALL(BPF_FUNC_sk_select_reuseport),
688 	BPF_EXIT_INSN(),
689 	},
690 	.fixup_map_sockmap = { 4 },
691 	.prog_type = BPF_PROG_TYPE_SK_REUSEPORT,
692 	.result = ACCEPT,
693 },
694 {
695 	"bpf_sk_select_reuseport(ctx, sockhash, &key, flags)",
696 	.insns = {
697 	BPF_MOV64_IMM(BPF_REG_4, 0),
698 	BPF_ST_MEM(BPF_W, BPF_REG_10, -4, 0),
699 	BPF_MOV64_REG(BPF_REG_3, BPF_REG_10),
700 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_3, -4),
701 	BPF_LD_MAP_FD(BPF_REG_2, 0),
702 	BPF_EMIT_CALL(BPF_FUNC_sk_select_reuseport),
703 	BPF_EXIT_INSN(),
704 	},
705 	.fixup_map_sockmap = { 4 },
706 	.prog_type = BPF_PROG_TYPE_SK_REUSEPORT,
707 	.result = ACCEPT,
708 },
709 {
710 	"mark null check on return value of bpf_skc_to helpers",
711 	.insns = {
712 	BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
713 	BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
714 	BPF_MOV64_IMM(BPF_REG_0, 0),
715 	BPF_EXIT_INSN(),
716 	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
717 	BPF_EMIT_CALL(BPF_FUNC_skc_to_tcp_sock),
718 	BPF_MOV64_REG(BPF_REG_7, BPF_REG_0),
719 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
720 	BPF_EMIT_CALL(BPF_FUNC_skc_to_tcp_request_sock),
721 	BPF_MOV64_REG(BPF_REG_8, BPF_REG_0),
722 	BPF_JMP_IMM(BPF_JNE, BPF_REG_8, 0, 2),
723 	BPF_MOV64_IMM(BPF_REG_0, 0),
724 	BPF_EXIT_INSN(),
725 	BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_7, 0),
726 	BPF_EXIT_INSN(),
727 	},
728 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
729 	.result = REJECT,
730 	.errstr = "invalid mem access",
731 	.result_unpriv = REJECT,
732 	.errstr_unpriv = "unknown func",
733 },
734