t_mbuf.c revision 1.2 1 1.2 christos /* $NetBSD: t_mbuf.c,v 1.2 2017/01/13 21:30:42 christos Exp $ */
2 1.1 alnsn
3 1.1 alnsn /*-
4 1.1 alnsn * Copyright (c) 2014 Alexander Nasonov.
5 1.1 alnsn * All rights reserved.
6 1.1 alnsn *
7 1.1 alnsn * Redistribution and use in source and binary forms, with or without
8 1.1 alnsn * modification, are permitted provided that the following conditions
9 1.1 alnsn * are met:
10 1.1 alnsn * 1. Redistributions of source code must retain the above copyright
11 1.1 alnsn * notice, this list of conditions and the following disclaimer.
12 1.1 alnsn * 2. Redistributions in binary form must reproduce the above copyright
13 1.1 alnsn * notice, this list of conditions and the following disclaimer in the
14 1.1 alnsn * documentation and/or other materials provided with the distribution.
15 1.1 alnsn *
16 1.1 alnsn * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
17 1.1 alnsn * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 1.1 alnsn * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 1.1 alnsn * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 1.1 alnsn * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 1.1 alnsn * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22 1.1 alnsn * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 1.1 alnsn * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 1.1 alnsn * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 1.1 alnsn * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 1.1 alnsn * SUCH DAMAGE.
27 1.1 alnsn */
28 1.1 alnsn
29 1.1 alnsn #include <sys/cdefs.h>
30 1.2 christos __RCSID("$NetBSD: t_mbuf.c,v 1.2 2017/01/13 21:30:42 christos Exp $");
31 1.1 alnsn
32 1.1 alnsn #include <sys/param.h>
33 1.1 alnsn #include <sys/mbuf.h>
34 1.1 alnsn
35 1.1 alnsn #include <net/bpf.h>
36 1.1 alnsn #include <net/bpfjit.h>
37 1.1 alnsn
38 1.1 alnsn #include <stdint.h>
39 1.1 alnsn #include <string.h>
40 1.1 alnsn
41 1.1 alnsn #include <rump/rump.h>
42 1.1 alnsn #include <rump/rump_syscalls.h>
43 1.1 alnsn
44 1.1 alnsn #include "../../net/bpf/h_bpf.h"
45 1.1 alnsn
46 1.1 alnsn /* XXX: atf-c.h has collisions with mbuf */
47 1.1 alnsn #undef m_type
48 1.1 alnsn #undef m_data
49 1.1 alnsn #include <atf-c.h>
50 1.1 alnsn
51 1.2 christos #include "h_macros.h"
52 1.1 alnsn
53 1.1 alnsn static bool
54 1.1 alnsn test_ldb_abs(size_t split)
55 1.1 alnsn {
56 1.1 alnsn /* Return a product of all packet bytes. */
57 1.1 alnsn static struct bpf_insn insns[] = {
58 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1), /* X <- 1 */
59 1.1 alnsn
60 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 0), /* A <- P[0] */
61 1.1 alnsn BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0), /* A <- A * X */
62 1.1 alnsn BPF_STMT(BPF_MISC+BPF_TAX, 0), /* X <- A */
63 1.1 alnsn
64 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 1), /* A <- P[1] */
65 1.1 alnsn BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0), /* A <- A * X */
66 1.1 alnsn BPF_STMT(BPF_MISC+BPF_TAX, 0), /* X <- A */
67 1.1 alnsn
68 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 2), /* A <- P[2] */
69 1.1 alnsn BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0), /* A <- A * X */
70 1.1 alnsn BPF_STMT(BPF_MISC+BPF_TAX, 0), /* X <- A */
71 1.1 alnsn
72 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 3), /* A <- P[3] */
73 1.1 alnsn BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0), /* A <- A * X */
74 1.1 alnsn BPF_STMT(BPF_MISC+BPF_TAX, 0), /* X <- A */
75 1.1 alnsn
76 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 4), /* A <- P[4] */
77 1.1 alnsn BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0), /* A <- A * X */
78 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0), /* ret A */
79 1.1 alnsn };
80 1.1 alnsn
81 1.1 alnsn static unsigned char P[] = { 1, 2, 3, 4, 5 };
82 1.1 alnsn const unsigned int res = 120;
83 1.1 alnsn const size_t insn_count = sizeof(insns) / sizeof(insns[0]);
84 1.1 alnsn
85 1.1 alnsn if (!prog_validate(insns, insn_count))
86 1.1 alnsn return false;
87 1.1 alnsn
88 1.1 alnsn return exec_prog_mchain2(insns, insn_count, P, sizeof(P), split) == res;
89 1.1 alnsn }
90 1.1 alnsn
91 1.1 alnsn static bool
92 1.1 alnsn test_ldh_abs(size_t split)
93 1.1 alnsn {
94 1.1 alnsn static struct bpf_insn insns[] = {
95 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 0), /* A <- P[0:2] */
96 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0), /* A <- A + X */
97 1.1 alnsn BPF_STMT(BPF_MISC+BPF_TAX, 0), /* X <- A */
98 1.1 alnsn
99 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 1), /* A <- P[1:2] */
100 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0), /* A <- A + X */
101 1.1 alnsn BPF_STMT(BPF_MISC+BPF_TAX, 0), /* X <- A */
102 1.1 alnsn
103 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 2), /* A <- P[2:2] */
104 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0), /* A <- A + X */
105 1.1 alnsn BPF_STMT(BPF_MISC+BPF_TAX, 0), /* X <- A */
106 1.1 alnsn
107 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 3), /* A <- P[3:2] */
108 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0), /* A <- A + X */
109 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0), /* ret A */
110 1.1 alnsn };
111 1.1 alnsn
112 1.1 alnsn static unsigned char P[] = { 1, 2, 3, 4, 5 };
113 1.1 alnsn const unsigned int res = 0x0a0e; /* 10 14 */
114 1.1 alnsn const size_t insn_count = sizeof(insns) / sizeof(insns[0]);
115 1.1 alnsn
116 1.1 alnsn if (!prog_validate(insns, insn_count))
117 1.1 alnsn return false;
118 1.1 alnsn
119 1.1 alnsn return exec_prog_mchain2(insns, insn_count, P, sizeof(P), split) == res;
120 1.1 alnsn }
121 1.1 alnsn
122 1.1 alnsn static bool
123 1.1 alnsn test_ldw_abs(size_t split)
124 1.1 alnsn {
125 1.1 alnsn static struct bpf_insn insns[] = {
126 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), /* A <- P[0:4] */
127 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0), /* A <- A + X */
128 1.1 alnsn BPF_STMT(BPF_MISC+BPF_TAX, 0), /* X <- A */
129 1.1 alnsn
130 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), /* A <- P[1:4] */
131 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0), /* A <- A + X */
132 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0), /* ret A */
133 1.1 alnsn };
134 1.1 alnsn
135 1.1 alnsn static unsigned char P[] = { 1, 2, 3, 4, 5 };
136 1.1 alnsn const unsigned int res = 0x03050709;
137 1.1 alnsn const size_t insn_count = sizeof(insns) / sizeof(insns[0]);
138 1.1 alnsn
139 1.1 alnsn if (!prog_validate(insns, insn_count))
140 1.1 alnsn return false;
141 1.1 alnsn
142 1.1 alnsn return exec_prog_mchain2(insns, insn_count, P, sizeof(P), split) == res;
143 1.1 alnsn }
144 1.1 alnsn
145 1.1 alnsn static bool
146 1.1 alnsn test_ldb_ind(size_t split)
147 1.1 alnsn {
148 1.1 alnsn /* Return a sum of all packet bytes. */
149 1.1 alnsn static struct bpf_insn insns[] = {
150 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_IND, 0), /* A <- P[0+X] */
151 1.1 alnsn BPF_STMT(BPF_ST, 0), /* M[0] <- A */
152 1.1 alnsn
153 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_IND, 1), /* A <- P[1+X] */
154 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0), /* X <- M[0] */
155 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0), /* A <- A + X */
156 1.1 alnsn BPF_STMT(BPF_ST, 0), /* M[0] <- A */
157 1.1 alnsn
158 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1), /* X <- 1 */
159 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_IND, 1), /* A <- P[1+X] */
160 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0), /* X <- M[0] */
161 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0), /* A <- A + X */
162 1.1 alnsn BPF_STMT(BPF_ST, 0), /* M[0] <- A */
163 1.1 alnsn
164 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1), /* X <- 1 */
165 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_IND, 2), /* A <- P[2+X] */
166 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0), /* X <- M[0] */
167 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0), /* A <- A + X */
168 1.1 alnsn BPF_STMT(BPF_ST, 0), /* M[0] <- A */
169 1.1 alnsn
170 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1), /* X <- 1 */
171 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_IND, 3), /* A <- P[3+X] */
172 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0), /* X <- M[0] */
173 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0), /* A <- A + X */
174 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0), /* ret A */
175 1.1 alnsn };
176 1.1 alnsn
177 1.1 alnsn static unsigned char P[] = { 1, 2, 3, 4, 5 };
178 1.1 alnsn const unsigned int res = 15;
179 1.1 alnsn const size_t insn_count = sizeof(insns) / sizeof(insns[0]);
180 1.1 alnsn
181 1.1 alnsn if (!prog_validate(insns, insn_count))
182 1.1 alnsn return false;
183 1.1 alnsn
184 1.1 alnsn return exec_prog_mchain2(insns, insn_count, P, sizeof(P), split) == res;
185 1.1 alnsn }
186 1.1 alnsn
187 1.1 alnsn static bool
188 1.1 alnsn test_ldw_ind(size_t split)
189 1.1 alnsn {
190 1.1 alnsn static struct bpf_insn insns[] = {
191 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, 0), /* A <- P[X+0:4] */
192 1.1 alnsn BPF_STMT(BPF_ST, 0), /* M[0] <- A */
193 1.1 alnsn
194 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1), /* X <- 1 */
195 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, 0), /* A <- P[X+0:4] */
196 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0), /* X <- M[0] */
197 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0), /* A <- A + X */
198 1.1 alnsn BPF_STMT(BPF_ST, 0), /* M[0] <- A */
199 1.1 alnsn
200 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0), /* X <- 0 */
201 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, 1), /* A <- P[X+1:4] */
202 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0), /* X <- M[0] */
203 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0), /* A <- A + X */
204 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0), /* ret A */
205 1.1 alnsn };
206 1.1 alnsn
207 1.1 alnsn static unsigned char P[] = { 1, 2, 3, 4, 5 };
208 1.1 alnsn const unsigned int res = 0x05080b0e;
209 1.1 alnsn const size_t insn_count = sizeof(insns) / sizeof(insns[0]);
210 1.1 alnsn
211 1.1 alnsn if (!prog_validate(insns, insn_count))
212 1.1 alnsn return false;
213 1.1 alnsn
214 1.1 alnsn return exec_prog_mchain2(insns, insn_count, P, sizeof(P), split) == res;
215 1.1 alnsn }
216 1.1 alnsn
217 1.1 alnsn static bool
218 1.1 alnsn test_ldh_ind(size_t split)
219 1.1 alnsn {
220 1.1 alnsn static struct bpf_insn insns[] = {
221 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 0), /* A <- P[X+0:2] */
222 1.1 alnsn BPF_STMT(BPF_ST, 0), /* M[0] <- A */
223 1.1 alnsn
224 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 1), /* A <- P[X+1:2] */
225 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0), /* X <- M[0] */
226 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0), /* A <- A + X */
227 1.1 alnsn BPF_STMT(BPF_ST, 0), /* M[0] <- A */
228 1.1 alnsn
229 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1), /* X <- 1 */
230 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 1), /* A <- P[X+1:2] */
231 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0), /* X <- M[0] */
232 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0), /* A <- A + X */
233 1.1 alnsn BPF_STMT(BPF_ST, 0), /* M[0] <- A */
234 1.1 alnsn
235 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1), /* X <- 1 */
236 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 2), /* A <- P[X+2:2] */
237 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0), /* X <- M[0] */
238 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0), /* A <- A + X */
239 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0), /* ret A */
240 1.1 alnsn };
241 1.1 alnsn
242 1.1 alnsn static unsigned char P[] = { 1, 2, 3, 4, 5 };
243 1.1 alnsn const unsigned int res = 0x0a0e; /* 10 14 */
244 1.1 alnsn const size_t insn_count = sizeof(insns) / sizeof(insns[0]);
245 1.1 alnsn
246 1.1 alnsn if (!prog_validate(insns, insn_count))
247 1.1 alnsn return false;
248 1.1 alnsn
249 1.1 alnsn return exec_prog_mchain2(insns, insn_count, P, sizeof(P), split) == res;
250 1.1 alnsn }
251 1.1 alnsn
252 1.1 alnsn static bool
253 1.1 alnsn test_msh(size_t split)
254 1.1 alnsn {
255 1.1 alnsn /* Return a product of all packet bytes. */
256 1.1 alnsn static struct bpf_insn insns[] = {
257 1.1 alnsn BPF_STMT(BPF_LD+BPF_IMM, 1), /* A <- 1 */
258 1.1 alnsn
259 1.1 alnsn BPF_STMT(BPF_LDX+BPF_B+BPF_MSH, 0), /* X <- 4*(P[0]&0xf) */
260 1.1 alnsn BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0), /* A <- A * X */
261 1.1 alnsn BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 4), /* A <- A / 4 */
262 1.1 alnsn
263 1.1 alnsn BPF_STMT(BPF_LDX+BPF_B+BPF_MSH, 1), /* X <- 4*(P[1]&0xf) */
264 1.1 alnsn BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0), /* A <- A * X */
265 1.1 alnsn BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 4), /* A <- A / 4 */
266 1.1 alnsn
267 1.1 alnsn BPF_STMT(BPF_LDX+BPF_B+BPF_MSH, 2), /* X <- 4*(P[2]&0xf) */
268 1.1 alnsn BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0), /* A <- A * X */
269 1.1 alnsn BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 4), /* A <- A / 4 */
270 1.1 alnsn
271 1.1 alnsn BPF_STMT(BPF_LDX+BPF_B+BPF_MSH, 3), /* X <- 4*(P[3]&0xf) */
272 1.1 alnsn BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0), /* A <- A * X */
273 1.1 alnsn BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 4), /* A <- A / 4 */
274 1.1 alnsn
275 1.1 alnsn BPF_STMT(BPF_LDX+BPF_B+BPF_MSH, 4), /* X <- 4*(P[4]&0xf) */
276 1.1 alnsn BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0), /* A <- A * X */
277 1.1 alnsn BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 4), /* A <- A / 4 */
278 1.1 alnsn
279 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0), /* ret A */
280 1.1 alnsn };
281 1.1 alnsn
282 1.1 alnsn static unsigned char P[] = { 1, 2, 3, 4, 5 };
283 1.1 alnsn const unsigned int res = 120;
284 1.1 alnsn const size_t insn_count = sizeof(insns) / sizeof(insns[0]);
285 1.1 alnsn
286 1.1 alnsn if (!prog_validate(insns, insn_count))
287 1.1 alnsn return false;
288 1.1 alnsn
289 1.1 alnsn return exec_prog_mchain2(insns, insn_count, P, sizeof(P), split) == res;
290 1.1 alnsn }
291 1.1 alnsn
292 1.1 alnsn static bool
293 1.1 alnsn test_ldb_abs_overflow(size_t split)
294 1.1 alnsn {
295 1.1 alnsn static struct bpf_insn insns[] = {
296 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 5),
297 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 1),
298 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0),
299 1.1 alnsn };
300 1.1 alnsn
301 1.1 alnsn static unsigned char P[] = { 1, 2, 3, 4, 5 };
302 1.1 alnsn const size_t insn_count = sizeof(insns) / sizeof(insns[0]);
303 1.1 alnsn
304 1.1 alnsn if (!prog_validate(insns, insn_count))
305 1.1 alnsn return false;
306 1.1 alnsn
307 1.1 alnsn return exec_prog_mchain2(insns, insn_count, P, sizeof(P), split) == 0;
308 1.1 alnsn }
309 1.1 alnsn
310 1.1 alnsn static bool
311 1.1 alnsn test_ldh_abs_overflow(size_t split)
312 1.1 alnsn {
313 1.1 alnsn static struct bpf_insn insns[] = {
314 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 4),
315 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 1),
316 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0),
317 1.1 alnsn };
318 1.1 alnsn
319 1.1 alnsn static unsigned char P[] = { 1, 2, 3, 4, 5 };
320 1.1 alnsn const size_t insn_count = sizeof(insns) / sizeof(insns[0]);
321 1.1 alnsn
322 1.1 alnsn if (!prog_validate(insns, insn_count))
323 1.1 alnsn return false;
324 1.1 alnsn
325 1.1 alnsn return exec_prog_mchain2(insns, insn_count, P, sizeof(P), split) == 0;
326 1.1 alnsn }
327 1.1 alnsn
328 1.1 alnsn static bool
329 1.1 alnsn test_ldw_abs_overflow(size_t split)
330 1.1 alnsn {
331 1.1 alnsn static struct bpf_insn insns[] = {
332 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 2),
333 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 1),
334 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0),
335 1.1 alnsn };
336 1.1 alnsn
337 1.1 alnsn static unsigned char P[] = { 1, 2, 3, 4, 5 };
338 1.1 alnsn const size_t insn_count = sizeof(insns) / sizeof(insns[0]);
339 1.1 alnsn
340 1.1 alnsn if (!prog_validate(insns, insn_count))
341 1.1 alnsn return false;
342 1.1 alnsn
343 1.1 alnsn return exec_prog_mchain2(insns, insn_count, P, sizeof(P), split) == 0;
344 1.1 alnsn }
345 1.1 alnsn
346 1.1 alnsn static bool
347 1.1 alnsn test_ldb_ind_overflow1(size_t split)
348 1.1 alnsn {
349 1.1 alnsn static struct bpf_insn insns[] = {
350 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_IND, 5),
351 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 1),
352 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0),
353 1.1 alnsn };
354 1.1 alnsn
355 1.1 alnsn static unsigned char P[] = { 1, 2, 3, 4, 5 };
356 1.1 alnsn const size_t insn_count = sizeof(insns) / sizeof(insns[0]);
357 1.1 alnsn
358 1.1 alnsn if (!prog_validate(insns, insn_count))
359 1.1 alnsn return false;
360 1.1 alnsn
361 1.1 alnsn return exec_prog_mchain2(insns, insn_count, P, sizeof(P), split) == 0;
362 1.1 alnsn }
363 1.1 alnsn
364 1.1 alnsn static bool
365 1.1 alnsn test_ldb_ind_overflow2(size_t split)
366 1.1 alnsn {
367 1.1 alnsn static struct bpf_insn insns[] = {
368 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 4),
369 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_IND, 1),
370 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
371 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0),
372 1.1 alnsn };
373 1.1 alnsn
374 1.1 alnsn static unsigned char P[] = { 1, 2, 3, 4, 5 };
375 1.1 alnsn const size_t insn_count = sizeof(insns) / sizeof(insns[0]);
376 1.1 alnsn
377 1.1 alnsn if (!prog_validate(insns, insn_count))
378 1.1 alnsn return false;
379 1.1 alnsn
380 1.1 alnsn return exec_prog_mchain2(insns, insn_count, P, sizeof(P), split) == 0;
381 1.1 alnsn }
382 1.1 alnsn
383 1.1 alnsn static bool
384 1.1 alnsn test_ldb_ind_overflow3(size_t split)
385 1.1 alnsn {
386 1.1 alnsn static struct bpf_insn insns[] = {
387 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_MAX),
388 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_IND, 1),
389 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 1),
390 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0),
391 1.1 alnsn };
392 1.1 alnsn
393 1.1 alnsn static unsigned char P[] = { 1, 2, 3, 4, 5 };
394 1.1 alnsn const size_t insn_count = sizeof(insns) / sizeof(insns[0]);
395 1.1 alnsn
396 1.1 alnsn if (!prog_validate(insns, insn_count))
397 1.1 alnsn return false;
398 1.1 alnsn
399 1.1 alnsn return exec_prog_mchain2(insns, insn_count, P, sizeof(P), split) == 0;
400 1.1 alnsn }
401 1.1 alnsn
402 1.1 alnsn static bool
403 1.1 alnsn test_ldh_ind_overflow1(size_t split)
404 1.1 alnsn {
405 1.1 alnsn static struct bpf_insn insns[] = {
406 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 4),
407 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 1),
408 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0),
409 1.1 alnsn };
410 1.1 alnsn
411 1.1 alnsn static unsigned char P[] = { 1, 2, 3, 4, 5 };
412 1.1 alnsn const size_t insn_count = sizeof(insns) / sizeof(insns[0]);
413 1.1 alnsn
414 1.1 alnsn if (!prog_validate(insns, insn_count))
415 1.1 alnsn return false;
416 1.1 alnsn
417 1.1 alnsn return exec_prog_mchain2(insns, insn_count, P, sizeof(P), split) == 0;
418 1.1 alnsn }
419 1.1 alnsn
420 1.1 alnsn static bool
421 1.1 alnsn test_ldh_ind_overflow2(size_t split)
422 1.1 alnsn {
423 1.1 alnsn static struct bpf_insn insns[] = {
424 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
425 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 1),
426 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
427 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0),
428 1.1 alnsn };
429 1.1 alnsn
430 1.1 alnsn static unsigned char P[] = { 1, 2, 3, 4, 5 };
431 1.1 alnsn const size_t insn_count = sizeof(insns) / sizeof(insns[0]);
432 1.1 alnsn
433 1.1 alnsn if (!prog_validate(insns, insn_count))
434 1.1 alnsn return false;
435 1.1 alnsn
436 1.1 alnsn return exec_prog_mchain2(insns, insn_count, P, sizeof(P), split) == 0;
437 1.1 alnsn }
438 1.1 alnsn
439 1.1 alnsn static bool
440 1.1 alnsn test_ldh_ind_overflow3(size_t split)
441 1.1 alnsn {
442 1.1 alnsn static struct bpf_insn insns[] = {
443 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_MAX),
444 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 1),
445 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 1),
446 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0),
447 1.1 alnsn };
448 1.1 alnsn
449 1.1 alnsn static unsigned char P[] = { 1, 2, 3, 4, 5 };
450 1.1 alnsn const size_t insn_count = sizeof(insns) / sizeof(insns[0]);
451 1.1 alnsn
452 1.1 alnsn if (!prog_validate(insns, insn_count))
453 1.1 alnsn return false;
454 1.1 alnsn
455 1.1 alnsn return exec_prog_mchain2(insns, insn_count, P, sizeof(P), split) == 0;
456 1.1 alnsn }
457 1.1 alnsn
458 1.1 alnsn static bool
459 1.1 alnsn test_ldw_ind_overflow1(size_t split)
460 1.1 alnsn {
461 1.1 alnsn static struct bpf_insn insns[] = {
462 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, 2),
463 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 1),
464 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0),
465 1.1 alnsn };
466 1.1 alnsn
467 1.1 alnsn static unsigned char P[] = { 1, 2, 3, 4, 5 };
468 1.1 alnsn const size_t insn_count = sizeof(insns) / sizeof(insns[0]);
469 1.1 alnsn
470 1.1 alnsn if (!prog_validate(insns, insn_count))
471 1.1 alnsn return false;
472 1.1 alnsn
473 1.1 alnsn return exec_prog_mchain2(insns, insn_count, P, sizeof(P), split) == 0;
474 1.1 alnsn }
475 1.1 alnsn
476 1.1 alnsn static bool
477 1.1 alnsn test_ldw_ind_overflow2(size_t split)
478 1.1 alnsn {
479 1.1 alnsn static struct bpf_insn insns[] = {
480 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1),
481 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, 1),
482 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
483 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0),
484 1.1 alnsn };
485 1.1 alnsn
486 1.1 alnsn static unsigned char P[] = { 1, 2, 3, 4, 5 };
487 1.1 alnsn const size_t insn_count = sizeof(insns) / sizeof(insns[0]);
488 1.1 alnsn
489 1.1 alnsn if (!prog_validate(insns, insn_count))
490 1.1 alnsn return false;
491 1.1 alnsn
492 1.1 alnsn return exec_prog_mchain2(insns, insn_count, P, sizeof(P), split) == 0;
493 1.1 alnsn }
494 1.1 alnsn
495 1.1 alnsn static bool
496 1.1 alnsn test_ldw_ind_overflow3(size_t split)
497 1.1 alnsn {
498 1.1 alnsn static struct bpf_insn insns[] = {
499 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_MAX),
500 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, 1),
501 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 1),
502 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0),
503 1.1 alnsn };
504 1.1 alnsn
505 1.1 alnsn static unsigned char P[] = { 1, 2, 3, 4, 5 };
506 1.1 alnsn const size_t insn_count = sizeof(insns) / sizeof(insns[0]);
507 1.1 alnsn
508 1.1 alnsn if (!prog_validate(insns, insn_count))
509 1.1 alnsn return false;
510 1.1 alnsn
511 1.1 alnsn return exec_prog_mchain2(insns, insn_count, P, sizeof(P), split) == 0;
512 1.1 alnsn }
513 1.1 alnsn
514 1.1 alnsn static bool
515 1.1 alnsn test_msh_overflow(size_t split)
516 1.1 alnsn {
517 1.1 alnsn static struct bpf_insn insns[] = {
518 1.1 alnsn BPF_STMT(BPF_LDX+BPF_B+BPF_MSH, 5),
519 1.1 alnsn BPF_STMT(BPF_MISC+BPF_TXA, 0),
520 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 1),
521 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0),
522 1.1 alnsn };
523 1.1 alnsn
524 1.1 alnsn static unsigned char P[] = { 1, 2, 3, 4, 5 };
525 1.1 alnsn const size_t insn_count = sizeof(insns) / sizeof(insns[0]);
526 1.1 alnsn
527 1.1 alnsn if (!prog_validate(insns, insn_count))
528 1.1 alnsn return false;
529 1.1 alnsn
530 1.1 alnsn return exec_prog_mchain2(insns, insn_count, P, sizeof(P), split) == 0;
531 1.1 alnsn }
532 1.1 alnsn
533 1.1 alnsn ATF_TC(bpfjit_mbuf_ldb_abs);
534 1.1 alnsn ATF_TC_HEAD(bpfjit_mbuf_ldb_abs, tc)
535 1.1 alnsn {
536 1.1 alnsn
537 1.1 alnsn atf_tc_set_md_var(tc, "descr", "Check that BPF_LD+BPF_B+BPF_ABS "
538 1.1 alnsn "loads bytes from mbuf correctly");
539 1.1 alnsn }
540 1.1 alnsn
541 1.1 alnsn ATF_TC_BODY(bpfjit_mbuf_ldb_abs, tc)
542 1.1 alnsn {
543 1.1 alnsn
544 1.1 alnsn RZ(rump_init());
545 1.1 alnsn
546 1.1 alnsn ATF_CHECK(test_ldb_abs(0));
547 1.1 alnsn ATF_CHECK(test_ldb_abs(1));
548 1.1 alnsn ATF_CHECK(test_ldb_abs(2));
549 1.1 alnsn ATF_CHECK(test_ldb_abs(3));
550 1.1 alnsn ATF_CHECK(test_ldb_abs(4));
551 1.1 alnsn ATF_CHECK(test_ldb_abs(5));
552 1.1 alnsn }
553 1.1 alnsn
554 1.1 alnsn ATF_TC(bpfjit_mbuf_ldh_abs);
555 1.1 alnsn ATF_TC_HEAD(bpfjit_mbuf_ldh_abs, tc)
556 1.1 alnsn {
557 1.1 alnsn
558 1.1 alnsn atf_tc_set_md_var(tc, "descr", "Check that BPF_LD+BPF_H+BPF_ABS "
559 1.1 alnsn "loads halfwords from mbuf correctly");
560 1.1 alnsn }
561 1.1 alnsn
562 1.1 alnsn ATF_TC_BODY(bpfjit_mbuf_ldh_abs, tc)
563 1.1 alnsn {
564 1.1 alnsn
565 1.1 alnsn RZ(rump_init());
566 1.1 alnsn
567 1.1 alnsn ATF_CHECK(test_ldh_abs(0));
568 1.1 alnsn ATF_CHECK(test_ldh_abs(1));
569 1.1 alnsn ATF_CHECK(test_ldh_abs(2));
570 1.1 alnsn ATF_CHECK(test_ldh_abs(3));
571 1.1 alnsn ATF_CHECK(test_ldh_abs(4));
572 1.1 alnsn ATF_CHECK(test_ldh_abs(5));
573 1.1 alnsn }
574 1.1 alnsn
575 1.1 alnsn ATF_TC(bpfjit_mbuf_ldw_abs);
576 1.1 alnsn ATF_TC_HEAD(bpfjit_mbuf_ldw_abs, tc)
577 1.1 alnsn {
578 1.1 alnsn
579 1.1 alnsn atf_tc_set_md_var(tc, "descr", "Check that BPF_LD+BPF_W+BPF_ABS "
580 1.1 alnsn "loads words from mbuf correctly");
581 1.1 alnsn }
582 1.1 alnsn
583 1.1 alnsn ATF_TC_BODY(bpfjit_mbuf_ldw_abs, tc)
584 1.1 alnsn {
585 1.1 alnsn
586 1.1 alnsn RZ(rump_init());
587 1.1 alnsn
588 1.1 alnsn ATF_CHECK(test_ldw_abs(0));
589 1.1 alnsn ATF_CHECK(test_ldw_abs(1));
590 1.1 alnsn ATF_CHECK(test_ldw_abs(2));
591 1.1 alnsn ATF_CHECK(test_ldw_abs(3));
592 1.1 alnsn ATF_CHECK(test_ldw_abs(4));
593 1.1 alnsn ATF_CHECK(test_ldw_abs(5));
594 1.1 alnsn }
595 1.1 alnsn
596 1.1 alnsn ATF_TC(bpfjit_mbuf_ldb_ind);
597 1.1 alnsn ATF_TC_HEAD(bpfjit_mbuf_ldb_ind, tc)
598 1.1 alnsn {
599 1.1 alnsn
600 1.1 alnsn atf_tc_set_md_var(tc, "descr", "Check that BPF_LD+BPF_B+BPF_IND "
601 1.1 alnsn "loads bytes from mbuf correctly");
602 1.1 alnsn }
603 1.1 alnsn
604 1.1 alnsn ATF_TC_BODY(bpfjit_mbuf_ldb_ind, tc)
605 1.1 alnsn {
606 1.1 alnsn
607 1.1 alnsn RZ(rump_init());
608 1.1 alnsn
609 1.1 alnsn ATF_CHECK(test_ldb_ind(0));
610 1.1 alnsn ATF_CHECK(test_ldb_ind(1));
611 1.1 alnsn ATF_CHECK(test_ldb_ind(2));
612 1.1 alnsn ATF_CHECK(test_ldb_ind(3));
613 1.1 alnsn ATF_CHECK(test_ldb_ind(4));
614 1.1 alnsn ATF_CHECK(test_ldb_ind(5));
615 1.1 alnsn }
616 1.1 alnsn
617 1.1 alnsn ATF_TC(bpfjit_mbuf_ldh_ind);
618 1.1 alnsn ATF_TC_HEAD(bpfjit_mbuf_ldh_ind, tc)
619 1.1 alnsn {
620 1.1 alnsn
621 1.1 alnsn atf_tc_set_md_var(tc, "descr", "Check that BPF_LD+BPF_H+BPF_IND "
622 1.1 alnsn "loads halfwords from mbuf correctly");
623 1.1 alnsn }
624 1.1 alnsn
625 1.1 alnsn ATF_TC_BODY(bpfjit_mbuf_ldh_ind, tc)
626 1.1 alnsn {
627 1.1 alnsn
628 1.1 alnsn RZ(rump_init());
629 1.1 alnsn
630 1.1 alnsn ATF_CHECK(test_ldh_ind(0));
631 1.1 alnsn ATF_CHECK(test_ldh_ind(1));
632 1.1 alnsn ATF_CHECK(test_ldh_ind(2));
633 1.1 alnsn ATF_CHECK(test_ldh_ind(3));
634 1.1 alnsn ATF_CHECK(test_ldh_ind(4));
635 1.1 alnsn ATF_CHECK(test_ldh_ind(5));
636 1.1 alnsn }
637 1.1 alnsn
638 1.1 alnsn ATF_TC(bpfjit_mbuf_ldw_ind);
639 1.1 alnsn ATF_TC_HEAD(bpfjit_mbuf_ldw_ind, tc)
640 1.1 alnsn {
641 1.1 alnsn
642 1.1 alnsn atf_tc_set_md_var(tc, "descr", "Check that BPF_LD+BPF_W+BPF_IND "
643 1.1 alnsn "loads words from mbuf correctly");
644 1.1 alnsn }
645 1.1 alnsn
646 1.1 alnsn ATF_TC_BODY(bpfjit_mbuf_ldw_ind, tc)
647 1.1 alnsn {
648 1.1 alnsn
649 1.1 alnsn RZ(rump_init());
650 1.1 alnsn
651 1.1 alnsn ATF_CHECK(test_ldw_ind(0));
652 1.1 alnsn ATF_CHECK(test_ldw_ind(1));
653 1.1 alnsn ATF_CHECK(test_ldw_ind(2));
654 1.1 alnsn ATF_CHECK(test_ldw_ind(3));
655 1.1 alnsn ATF_CHECK(test_ldw_ind(4));
656 1.1 alnsn ATF_CHECK(test_ldw_ind(5));
657 1.1 alnsn }
658 1.1 alnsn
659 1.1 alnsn ATF_TC(bpfjit_mbuf_msh);
660 1.1 alnsn ATF_TC_HEAD(bpfjit_mbuf_msh, tc)
661 1.1 alnsn {
662 1.1 alnsn
663 1.1 alnsn atf_tc_set_md_var(tc, "descr", "Check that BPF_LDX+BPF_B+BPF_MSH "
664 1.1 alnsn "loads bytes from mbuf correctly");
665 1.1 alnsn }
666 1.1 alnsn
667 1.1 alnsn ATF_TC_BODY(bpfjit_mbuf_msh, tc)
668 1.1 alnsn {
669 1.1 alnsn
670 1.1 alnsn RZ(rump_init());
671 1.1 alnsn
672 1.1 alnsn ATF_CHECK(test_msh(0));
673 1.1 alnsn ATF_CHECK(test_msh(1));
674 1.1 alnsn ATF_CHECK(test_msh(2));
675 1.1 alnsn ATF_CHECK(test_msh(3));
676 1.1 alnsn ATF_CHECK(test_msh(4));
677 1.1 alnsn ATF_CHECK(test_msh(5));
678 1.1 alnsn }
679 1.1 alnsn
680 1.1 alnsn ATF_TC(bpfjit_mbuf_ldb_abs_overflow);
681 1.1 alnsn ATF_TC_HEAD(bpfjit_mbuf_ldb_abs_overflow, tc)
682 1.1 alnsn {
683 1.1 alnsn
684 1.1 alnsn atf_tc_set_md_var(tc, "descr", "Check that BPF_LD+BPF_B+BPF_ABS "
685 1.1 alnsn "with out-of-bounds index aborts a filter program");
686 1.1 alnsn }
687 1.1 alnsn
688 1.1 alnsn ATF_TC_BODY(bpfjit_mbuf_ldb_abs_overflow, tc)
689 1.1 alnsn {
690 1.1 alnsn
691 1.1 alnsn RZ(rump_init());
692 1.1 alnsn
693 1.1 alnsn ATF_CHECK(test_ldb_abs_overflow(0));
694 1.1 alnsn ATF_CHECK(test_ldb_abs_overflow(1));
695 1.1 alnsn ATF_CHECK(test_ldb_abs_overflow(2));
696 1.1 alnsn ATF_CHECK(test_ldb_abs_overflow(3));
697 1.1 alnsn ATF_CHECK(test_ldb_abs_overflow(4));
698 1.1 alnsn ATF_CHECK(test_ldb_abs_overflow(5));
699 1.1 alnsn }
700 1.1 alnsn
701 1.1 alnsn ATF_TC(bpfjit_mbuf_ldh_abs_overflow);
702 1.1 alnsn ATF_TC_HEAD(bpfjit_mbuf_ldh_abs_overflow, tc)
703 1.1 alnsn {
704 1.1 alnsn
705 1.1 alnsn atf_tc_set_md_var(tc, "descr", "Check that BPF_LD+BPF_H+BPF_ABS "
706 1.1 alnsn "with out-of-bounds index aborts a filter program");
707 1.1 alnsn }
708 1.1 alnsn
709 1.1 alnsn ATF_TC_BODY(bpfjit_mbuf_ldh_abs_overflow, tc)
710 1.1 alnsn {
711 1.1 alnsn
712 1.1 alnsn RZ(rump_init());
713 1.1 alnsn
714 1.1 alnsn ATF_CHECK(test_ldh_abs_overflow(0));
715 1.1 alnsn ATF_CHECK(test_ldh_abs_overflow(1));
716 1.1 alnsn ATF_CHECK(test_ldh_abs_overflow(2));
717 1.1 alnsn ATF_CHECK(test_ldh_abs_overflow(3));
718 1.1 alnsn ATF_CHECK(test_ldh_abs_overflow(4));
719 1.1 alnsn ATF_CHECK(test_ldh_abs_overflow(5));
720 1.1 alnsn }
721 1.1 alnsn
722 1.1 alnsn ATF_TC(bpfjit_mbuf_ldw_abs_overflow);
723 1.1 alnsn ATF_TC_HEAD(bpfjit_mbuf_ldw_abs_overflow, tc)
724 1.1 alnsn {
725 1.1 alnsn
726 1.1 alnsn atf_tc_set_md_var(tc, "descr", "Check that BPF_LD+BPF_W+BPF_ABS "
727 1.1 alnsn "with out-of-bounds index aborts a filter program");
728 1.1 alnsn }
729 1.1 alnsn
730 1.1 alnsn ATF_TC_BODY(bpfjit_mbuf_ldw_abs_overflow, tc)
731 1.1 alnsn {
732 1.1 alnsn
733 1.1 alnsn RZ(rump_init());
734 1.1 alnsn
735 1.1 alnsn ATF_CHECK(test_ldw_abs_overflow(0));
736 1.1 alnsn ATF_CHECK(test_ldw_abs_overflow(1));
737 1.1 alnsn ATF_CHECK(test_ldw_abs_overflow(2));
738 1.1 alnsn ATF_CHECK(test_ldw_abs_overflow(3));
739 1.1 alnsn ATF_CHECK(test_ldw_abs_overflow(4));
740 1.1 alnsn ATF_CHECK(test_ldw_abs_overflow(5));
741 1.1 alnsn }
742 1.1 alnsn
743 1.1 alnsn ATF_TC(bpfjit_mbuf_ldb_ind_overflow1);
744 1.1 alnsn ATF_TC_HEAD(bpfjit_mbuf_ldb_ind_overflow1, tc)
745 1.1 alnsn {
746 1.1 alnsn
747 1.1 alnsn atf_tc_set_md_var(tc, "descr", "Check that BPF_LD+BPF_B+BPF_IND "
748 1.1 alnsn "with out-of-bounds index aborts a filter program");
749 1.1 alnsn }
750 1.1 alnsn
751 1.1 alnsn ATF_TC_BODY(bpfjit_mbuf_ldb_ind_overflow1, tc)
752 1.1 alnsn {
753 1.1 alnsn
754 1.1 alnsn RZ(rump_init());
755 1.1 alnsn
756 1.1 alnsn ATF_CHECK(test_ldb_ind_overflow1(0));
757 1.1 alnsn ATF_CHECK(test_ldb_ind_overflow1(1));
758 1.1 alnsn ATF_CHECK(test_ldb_ind_overflow1(2));
759 1.1 alnsn ATF_CHECK(test_ldb_ind_overflow1(3));
760 1.1 alnsn ATF_CHECK(test_ldb_ind_overflow1(4));
761 1.1 alnsn ATF_CHECK(test_ldb_ind_overflow1(5));
762 1.1 alnsn }
763 1.1 alnsn
764 1.1 alnsn ATF_TC(bpfjit_mbuf_ldb_ind_overflow2);
765 1.1 alnsn ATF_TC_HEAD(bpfjit_mbuf_ldb_ind_overflow2, tc)
766 1.1 alnsn {
767 1.1 alnsn
768 1.1 alnsn atf_tc_set_md_var(tc, "descr", "Check that BPF_LD+BPF_B+BPF_IND "
769 1.1 alnsn "with out-of-bounds index aborts a filter program");
770 1.1 alnsn }
771 1.1 alnsn
772 1.1 alnsn ATF_TC_BODY(bpfjit_mbuf_ldb_ind_overflow2, tc)
773 1.1 alnsn {
774 1.1 alnsn
775 1.1 alnsn RZ(rump_init());
776 1.1 alnsn
777 1.1 alnsn ATF_CHECK(test_ldb_ind_overflow2(0));
778 1.1 alnsn ATF_CHECK(test_ldb_ind_overflow2(1));
779 1.1 alnsn ATF_CHECK(test_ldb_ind_overflow2(2));
780 1.1 alnsn ATF_CHECK(test_ldb_ind_overflow2(3));
781 1.1 alnsn ATF_CHECK(test_ldb_ind_overflow2(4));
782 1.1 alnsn ATF_CHECK(test_ldb_ind_overflow2(5));
783 1.1 alnsn }
784 1.1 alnsn
785 1.1 alnsn ATF_TC(bpfjit_mbuf_ldb_ind_overflow3);
786 1.1 alnsn ATF_TC_HEAD(bpfjit_mbuf_ldb_ind_overflow3, tc)
787 1.1 alnsn {
788 1.1 alnsn
789 1.1 alnsn atf_tc_set_md_var(tc, "descr", "Check that BPF_LD+BPF_B+BPF_IND "
790 1.1 alnsn "with out-of-bounds index aborts a filter program");
791 1.1 alnsn }
792 1.1 alnsn
793 1.1 alnsn ATF_TC_BODY(bpfjit_mbuf_ldb_ind_overflow3, tc)
794 1.1 alnsn {
795 1.1 alnsn
796 1.1 alnsn RZ(rump_init());
797 1.1 alnsn
798 1.1 alnsn ATF_CHECK(test_ldb_ind_overflow3(0));
799 1.1 alnsn ATF_CHECK(test_ldb_ind_overflow3(1));
800 1.1 alnsn ATF_CHECK(test_ldb_ind_overflow3(2));
801 1.1 alnsn ATF_CHECK(test_ldb_ind_overflow3(3));
802 1.1 alnsn ATF_CHECK(test_ldb_ind_overflow3(4));
803 1.1 alnsn ATF_CHECK(test_ldb_ind_overflow3(5));
804 1.1 alnsn }
805 1.1 alnsn
806 1.1 alnsn ATF_TC(bpfjit_mbuf_ldh_ind_overflow1);
807 1.1 alnsn ATF_TC_HEAD(bpfjit_mbuf_ldh_ind_overflow1, tc)
808 1.1 alnsn {
809 1.1 alnsn
810 1.1 alnsn atf_tc_set_md_var(tc, "descr", "Check that BPF_LD+BPF_H+BPF_IND "
811 1.1 alnsn "with out-of-bounds index aborts a filter program");
812 1.1 alnsn }
813 1.1 alnsn
814 1.1 alnsn ATF_TC_BODY(bpfjit_mbuf_ldh_ind_overflow1, tc)
815 1.1 alnsn {
816 1.1 alnsn
817 1.1 alnsn RZ(rump_init());
818 1.1 alnsn
819 1.1 alnsn ATF_CHECK(test_ldh_ind_overflow1(0));
820 1.1 alnsn ATF_CHECK(test_ldh_ind_overflow1(1));
821 1.1 alnsn ATF_CHECK(test_ldh_ind_overflow1(2));
822 1.1 alnsn ATF_CHECK(test_ldh_ind_overflow1(3));
823 1.1 alnsn ATF_CHECK(test_ldh_ind_overflow1(4));
824 1.1 alnsn ATF_CHECK(test_ldh_ind_overflow1(5));
825 1.1 alnsn }
826 1.1 alnsn
827 1.1 alnsn ATF_TC(bpfjit_mbuf_ldh_ind_overflow2);
828 1.1 alnsn ATF_TC_HEAD(bpfjit_mbuf_ldh_ind_overflow2, tc)
829 1.1 alnsn {
830 1.1 alnsn
831 1.1 alnsn atf_tc_set_md_var(tc, "descr", "Check that BPF_LD+BPF_H+BPF_IND "
832 1.1 alnsn "with out-of-bounds index aborts a filter program");
833 1.1 alnsn }
834 1.1 alnsn
835 1.1 alnsn ATF_TC_BODY(bpfjit_mbuf_ldh_ind_overflow2, tc)
836 1.1 alnsn {
837 1.1 alnsn
838 1.1 alnsn RZ(rump_init());
839 1.1 alnsn
840 1.1 alnsn ATF_CHECK(test_ldh_ind_overflow2(0));
841 1.1 alnsn ATF_CHECK(test_ldh_ind_overflow2(1));
842 1.1 alnsn ATF_CHECK(test_ldh_ind_overflow2(2));
843 1.1 alnsn ATF_CHECK(test_ldh_ind_overflow2(3));
844 1.1 alnsn ATF_CHECK(test_ldh_ind_overflow2(4));
845 1.1 alnsn ATF_CHECK(test_ldh_ind_overflow2(5));
846 1.1 alnsn }
847 1.1 alnsn
848 1.1 alnsn ATF_TC(bpfjit_mbuf_ldh_ind_overflow3);
849 1.1 alnsn ATF_TC_HEAD(bpfjit_mbuf_ldh_ind_overflow3, tc)
850 1.1 alnsn {
851 1.1 alnsn
852 1.1 alnsn atf_tc_set_md_var(tc, "descr", "Check that BPF_LD+BPF_H+BPF_IND "
853 1.1 alnsn "with out-of-bounds index aborts a filter program");
854 1.1 alnsn }
855 1.1 alnsn
856 1.1 alnsn ATF_TC_BODY(bpfjit_mbuf_ldh_ind_overflow3, tc)
857 1.1 alnsn {
858 1.1 alnsn
859 1.1 alnsn RZ(rump_init());
860 1.1 alnsn
861 1.1 alnsn ATF_CHECK(test_ldh_ind_overflow3(0));
862 1.1 alnsn ATF_CHECK(test_ldh_ind_overflow3(1));
863 1.1 alnsn ATF_CHECK(test_ldh_ind_overflow3(2));
864 1.1 alnsn ATF_CHECK(test_ldh_ind_overflow3(3));
865 1.1 alnsn ATF_CHECK(test_ldh_ind_overflow3(4));
866 1.1 alnsn ATF_CHECK(test_ldh_ind_overflow3(5));
867 1.1 alnsn }
868 1.1 alnsn
869 1.1 alnsn ATF_TC(bpfjit_mbuf_ldw_ind_overflow1);
870 1.1 alnsn ATF_TC_HEAD(bpfjit_mbuf_ldw_ind_overflow1, tc)
871 1.1 alnsn {
872 1.1 alnsn
873 1.1 alnsn atf_tc_set_md_var(tc, "descr", "Check that BPF_LD+BPF_W+BPF_IND "
874 1.1 alnsn "with out-of-bounds index aborts a filter program");
875 1.1 alnsn }
876 1.1 alnsn
877 1.1 alnsn ATF_TC_BODY(bpfjit_mbuf_ldw_ind_overflow1, tc)
878 1.1 alnsn {
879 1.1 alnsn
880 1.1 alnsn RZ(rump_init());
881 1.1 alnsn
882 1.1 alnsn ATF_CHECK(test_ldw_ind_overflow1(0));
883 1.1 alnsn ATF_CHECK(test_ldw_ind_overflow1(1));
884 1.1 alnsn ATF_CHECK(test_ldw_ind_overflow1(2));
885 1.1 alnsn ATF_CHECK(test_ldw_ind_overflow1(3));
886 1.1 alnsn ATF_CHECK(test_ldw_ind_overflow1(4));
887 1.1 alnsn ATF_CHECK(test_ldw_ind_overflow1(5));
888 1.1 alnsn }
889 1.1 alnsn
890 1.1 alnsn ATF_TC(bpfjit_mbuf_ldw_ind_overflow2);
891 1.1 alnsn ATF_TC_HEAD(bpfjit_mbuf_ldw_ind_overflow2, tc)
892 1.1 alnsn {
893 1.1 alnsn
894 1.1 alnsn atf_tc_set_md_var(tc, "descr", "Check that BPF_LD+BPF_W+BPF_IND "
895 1.1 alnsn "with out-of-bounds index aborts a filter program");
896 1.1 alnsn }
897 1.1 alnsn
898 1.1 alnsn ATF_TC_BODY(bpfjit_mbuf_ldw_ind_overflow2, tc)
899 1.1 alnsn {
900 1.1 alnsn
901 1.1 alnsn RZ(rump_init());
902 1.1 alnsn
903 1.1 alnsn ATF_CHECK(test_ldw_ind_overflow2(0));
904 1.1 alnsn ATF_CHECK(test_ldw_ind_overflow2(1));
905 1.1 alnsn ATF_CHECK(test_ldw_ind_overflow2(2));
906 1.1 alnsn ATF_CHECK(test_ldw_ind_overflow2(3));
907 1.1 alnsn ATF_CHECK(test_ldw_ind_overflow2(4));
908 1.1 alnsn ATF_CHECK(test_ldw_ind_overflow2(5));
909 1.1 alnsn }
910 1.1 alnsn
911 1.1 alnsn ATF_TC(bpfjit_mbuf_ldw_ind_overflow3);
912 1.1 alnsn ATF_TC_HEAD(bpfjit_mbuf_ldw_ind_overflow3, tc)
913 1.1 alnsn {
914 1.1 alnsn
915 1.1 alnsn atf_tc_set_md_var(tc, "descr", "Check that BPF_LD+BPF_W+BPF_IND "
916 1.1 alnsn "with out-of-bounds index aborts a filter program");
917 1.1 alnsn }
918 1.1 alnsn
919 1.1 alnsn ATF_TC_BODY(bpfjit_mbuf_ldw_ind_overflow3, tc)
920 1.1 alnsn {
921 1.1 alnsn
922 1.1 alnsn RZ(rump_init());
923 1.1 alnsn
924 1.1 alnsn ATF_CHECK(test_ldw_ind_overflow3(0));
925 1.1 alnsn ATF_CHECK(test_ldw_ind_overflow3(1));
926 1.1 alnsn ATF_CHECK(test_ldw_ind_overflow3(2));
927 1.1 alnsn ATF_CHECK(test_ldw_ind_overflow3(3));
928 1.1 alnsn ATF_CHECK(test_ldw_ind_overflow3(4));
929 1.1 alnsn ATF_CHECK(test_ldw_ind_overflow3(5));
930 1.1 alnsn }
931 1.1 alnsn
932 1.1 alnsn ATF_TC(bpfjit_mbuf_msh_overflow);
933 1.1 alnsn ATF_TC_HEAD(bpfjit_mbuf_msh_overflow, tc)
934 1.1 alnsn {
935 1.1 alnsn
936 1.1 alnsn atf_tc_set_md_var(tc, "descr", "Check that BPF_LDX+BPF_B+BPF_MSH "
937 1.1 alnsn "with out-of-bounds index aborts a filter program");
938 1.1 alnsn }
939 1.1 alnsn
940 1.1 alnsn ATF_TC_BODY(bpfjit_mbuf_msh_overflow, tc)
941 1.1 alnsn {
942 1.1 alnsn
943 1.1 alnsn RZ(rump_init());
944 1.1 alnsn
945 1.1 alnsn ATF_CHECK(test_msh_overflow(0));
946 1.1 alnsn ATF_CHECK(test_msh_overflow(1));
947 1.1 alnsn ATF_CHECK(test_msh_overflow(2));
948 1.1 alnsn ATF_CHECK(test_msh_overflow(3));
949 1.1 alnsn ATF_CHECK(test_msh_overflow(4));
950 1.1 alnsn ATF_CHECK(test_msh_overflow(5));
951 1.1 alnsn }
952 1.1 alnsn
953 1.1 alnsn ATF_TP_ADD_TCS(tp)
954 1.1 alnsn {
955 1.1 alnsn
956 1.1 alnsn /*
957 1.1 alnsn * For every new test please also add a similar test
958 1.1 alnsn * to ../../net/bpf/t_mbuf.c
959 1.1 alnsn */
960 1.1 alnsn ATF_TP_ADD_TC(tp, bpfjit_mbuf_ldb_abs);
961 1.1 alnsn ATF_TP_ADD_TC(tp, bpfjit_mbuf_ldh_abs);
962 1.1 alnsn ATF_TP_ADD_TC(tp, bpfjit_mbuf_ldw_abs);
963 1.1 alnsn ATF_TP_ADD_TC(tp, bpfjit_mbuf_ldb_ind);
964 1.1 alnsn ATF_TP_ADD_TC(tp, bpfjit_mbuf_ldh_ind);
965 1.1 alnsn ATF_TP_ADD_TC(tp, bpfjit_mbuf_ldw_ind);
966 1.1 alnsn ATF_TP_ADD_TC(tp, bpfjit_mbuf_msh);
967 1.1 alnsn ATF_TP_ADD_TC(tp, bpfjit_mbuf_ldb_abs_overflow);
968 1.1 alnsn ATF_TP_ADD_TC(tp, bpfjit_mbuf_ldh_abs_overflow);
969 1.1 alnsn ATF_TP_ADD_TC(tp, bpfjit_mbuf_ldw_abs_overflow);
970 1.1 alnsn ATF_TP_ADD_TC(tp, bpfjit_mbuf_ldb_ind_overflow1);
971 1.1 alnsn ATF_TP_ADD_TC(tp, bpfjit_mbuf_ldb_ind_overflow2);
972 1.1 alnsn ATF_TP_ADD_TC(tp, bpfjit_mbuf_ldb_ind_overflow3);
973 1.1 alnsn ATF_TP_ADD_TC(tp, bpfjit_mbuf_ldh_ind_overflow1);
974 1.1 alnsn ATF_TP_ADD_TC(tp, bpfjit_mbuf_ldh_ind_overflow2);
975 1.1 alnsn ATF_TP_ADD_TC(tp, bpfjit_mbuf_ldh_ind_overflow3);
976 1.1 alnsn ATF_TP_ADD_TC(tp, bpfjit_mbuf_ldw_ind_overflow1);
977 1.1 alnsn ATF_TP_ADD_TC(tp, bpfjit_mbuf_ldw_ind_overflow2);
978 1.1 alnsn ATF_TP_ADD_TC(tp, bpfjit_mbuf_ldw_ind_overflow3);
979 1.1 alnsn ATF_TP_ADD_TC(tp, bpfjit_mbuf_msh_overflow);
980 1.1 alnsn
981 1.1 alnsn return atf_no_error();
982 1.1 alnsn }
983