t_mbuf.c revision 1.2 1 1.2 alnsn /* $NetBSD: t_mbuf.c,v 1.2 2014/07/08 21:44:26 alnsn 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 alnsn __RCSID("$NetBSD: t_mbuf.c,v 1.2 2014/07/08 21:44:26 alnsn 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
37 1.1 alnsn #include <stdint.h>
38 1.1 alnsn #include <string.h>
39 1.1 alnsn
40 1.1 alnsn #include <rump/rump.h>
41 1.1 alnsn #include <rump/rump_syscalls.h>
42 1.1 alnsn
43 1.1 alnsn #include "../../net/bpf/h_bpf.h"
44 1.1 alnsn
45 1.1 alnsn /* XXX: atf-c.h has collisions with mbuf */
46 1.1 alnsn #undef m_type
47 1.1 alnsn #undef m_data
48 1.1 alnsn #include <atf-c.h>
49 1.1 alnsn
50 1.1 alnsn #include "../../h_macros.h"
51 1.1 alnsn
52 1.1 alnsn static bool
53 1.1 alnsn test_ldb_abs(size_t split)
54 1.1 alnsn {
55 1.1 alnsn /* Return a product of all packet bytes. */
56 1.1 alnsn static struct bpf_insn insns[] = {
57 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1), /* X <- 1 */
58 1.1 alnsn
59 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 0), /* A <- P[0] */
60 1.1 alnsn BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0), /* A <- A * X */
61 1.1 alnsn BPF_STMT(BPF_MISC+BPF_TAX, 0), /* X <- A */
62 1.1 alnsn
63 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 1), /* A <- P[1] */
64 1.1 alnsn BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0), /* A <- A * X */
65 1.1 alnsn BPF_STMT(BPF_MISC+BPF_TAX, 0), /* X <- A */
66 1.1 alnsn
67 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 2), /* A <- P[2] */
68 1.1 alnsn BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0), /* A <- A * X */
69 1.1 alnsn BPF_STMT(BPF_MISC+BPF_TAX, 0), /* X <- A */
70 1.1 alnsn
71 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 3), /* A <- P[3] */
72 1.1 alnsn BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0), /* A <- A * X */
73 1.1 alnsn BPF_STMT(BPF_MISC+BPF_TAX, 0), /* X <- A */
74 1.1 alnsn
75 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 4), /* A <- P[4] */
76 1.1 alnsn BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0), /* A <- A * X */
77 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0), /* ret A */
78 1.1 alnsn };
79 1.1 alnsn
80 1.2 alnsn static unsigned char P[] = { 1, 2, 3, 4, 5 };
81 1.1 alnsn const unsigned int res = 120;
82 1.1 alnsn
83 1.1 alnsn if (!prog_validate(insns, sizeof(insns) / sizeof(insns[0])))
84 1.1 alnsn return false;
85 1.1 alnsn
86 1.1 alnsn return interp_prog_mchain2(insns, P, sizeof(P), split) == res;
87 1.1 alnsn }
88 1.1 alnsn
89 1.1 alnsn static bool
90 1.1 alnsn test_ldh_abs(size_t split)
91 1.1 alnsn {
92 1.1 alnsn static struct bpf_insn insns[] = {
93 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 0), /* A <- P[0:2] */
94 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0), /* A <- A + X */
95 1.1 alnsn BPF_STMT(BPF_MISC+BPF_TAX, 0), /* X <- A */
96 1.1 alnsn
97 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 1), /* A <- P[1:2] */
98 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0), /* A <- A + X */
99 1.1 alnsn BPF_STMT(BPF_MISC+BPF_TAX, 0), /* X <- A */
100 1.1 alnsn
101 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 2), /* A <- P[2:2] */
102 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0), /* A <- A + X */
103 1.1 alnsn BPF_STMT(BPF_MISC+BPF_TAX, 0), /* X <- A */
104 1.1 alnsn
105 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 3), /* A <- P[3:2] */
106 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0), /* A <- A + X */
107 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0), /* ret A */
108 1.1 alnsn };
109 1.1 alnsn
110 1.2 alnsn static unsigned char P[] = { 1, 2, 3, 4, 5 };
111 1.1 alnsn const unsigned int res = 0x0a0e; /* 10 14 */
112 1.1 alnsn
113 1.1 alnsn if (!prog_validate(insns, sizeof(insns) / sizeof(insns[0])))
114 1.1 alnsn return false;
115 1.1 alnsn
116 1.1 alnsn return interp_prog_mchain2(insns, P, sizeof(P), split) == res;
117 1.1 alnsn }
118 1.1 alnsn
119 1.1 alnsn static bool
120 1.1 alnsn test_ldw_abs(size_t split)
121 1.1 alnsn {
122 1.1 alnsn static struct bpf_insn insns[] = {
123 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), /* A <- P[0:4] */
124 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0), /* A <- A + X */
125 1.1 alnsn BPF_STMT(BPF_MISC+BPF_TAX, 0), /* X <- A */
126 1.1 alnsn
127 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), /* A <- P[1:4] */
128 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0), /* A <- A + X */
129 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0), /* ret A */
130 1.1 alnsn };
131 1.1 alnsn
132 1.2 alnsn static unsigned char P[] = { 1, 2, 3, 4, 5 };
133 1.1 alnsn const unsigned int res = 0x03050709;
134 1.1 alnsn
135 1.1 alnsn if (!prog_validate(insns, sizeof(insns) / sizeof(insns[0])))
136 1.1 alnsn return false;
137 1.1 alnsn
138 1.1 alnsn return interp_prog_mchain2(insns, P, sizeof(P), split) == res;
139 1.1 alnsn }
140 1.1 alnsn
141 1.1 alnsn static bool
142 1.1 alnsn test_ldb_ind(size_t split)
143 1.1 alnsn {
144 1.1 alnsn /* Return a sum of all packet bytes. */
145 1.1 alnsn static struct bpf_insn insns[] = {
146 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_IND, 0), /* A <- P[0+X] */
147 1.1 alnsn BPF_STMT(BPF_ST, 0), /* M[0] <- A */
148 1.1 alnsn
149 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_IND, 1), /* A <- P[1+X] */
150 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0), /* X <- M[0] */
151 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0), /* A <- A + X */
152 1.1 alnsn BPF_STMT(BPF_ST, 0), /* M[0] <- A */
153 1.1 alnsn
154 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1), /* X <- 1 */
155 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_IND, 1), /* A <- P[1+X] */
156 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0), /* X <- M[0] */
157 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0), /* A <- A + X */
158 1.1 alnsn BPF_STMT(BPF_ST, 0), /* M[0] <- A */
159 1.1 alnsn
160 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1), /* X <- 1 */
161 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_IND, 2), /* A <- P[2+X] */
162 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0), /* X <- M[0] */
163 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0), /* A <- A + X */
164 1.1 alnsn BPF_STMT(BPF_ST, 0), /* M[0] <- A */
165 1.1 alnsn
166 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1), /* X <- 1 */
167 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_IND, 3), /* A <- P[3+X] */
168 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0), /* X <- M[0] */
169 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0), /* A <- A + X */
170 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0), /* ret A */
171 1.1 alnsn };
172 1.1 alnsn
173 1.2 alnsn static unsigned char P[] = { 1, 2, 3, 4, 5 };
174 1.1 alnsn const unsigned int res = 15;
175 1.1 alnsn
176 1.1 alnsn if (!prog_validate(insns, sizeof(insns) / sizeof(insns[0])))
177 1.1 alnsn return false;
178 1.1 alnsn
179 1.1 alnsn return interp_prog_mchain2(insns, P, sizeof(P), split) == res;
180 1.1 alnsn }
181 1.1 alnsn
182 1.1 alnsn static bool
183 1.1 alnsn test_ldw_ind(size_t split)
184 1.1 alnsn {
185 1.1 alnsn static struct bpf_insn insns[] = {
186 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, 0), /* A <- P[X+0:4] */
187 1.1 alnsn BPF_STMT(BPF_ST, 0), /* M[0] <- A */
188 1.1 alnsn
189 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1), /* X <- 1 */
190 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, 0), /* A <- P[X+0:4] */
191 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0), /* X <- M[0] */
192 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0), /* A <- A + X */
193 1.1 alnsn BPF_STMT(BPF_ST, 0), /* M[0] <- A */
194 1.1 alnsn
195 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0), /* X <- 0 */
196 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, 1), /* A <- P[X+1:4] */
197 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0), /* X <- M[0] */
198 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0), /* A <- A + X */
199 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0), /* ret A */
200 1.1 alnsn };
201 1.1 alnsn
202 1.2 alnsn static unsigned char P[] = { 1, 2, 3, 4, 5 };
203 1.1 alnsn const unsigned int res = 0x05080b0e;
204 1.1 alnsn
205 1.1 alnsn if (!prog_validate(insns, sizeof(insns) / sizeof(insns[0])))
206 1.1 alnsn return false;
207 1.1 alnsn
208 1.1 alnsn return interp_prog_mchain2(insns, P, sizeof(P), split) == res;
209 1.1 alnsn }
210 1.1 alnsn
211 1.1 alnsn static bool
212 1.1 alnsn test_ldh_ind(size_t split)
213 1.1 alnsn {
214 1.1 alnsn static struct bpf_insn insns[] = {
215 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 0), /* A <- P[X+0:2] */
216 1.1 alnsn BPF_STMT(BPF_ST, 0), /* M[0] <- A */
217 1.1 alnsn
218 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 1), /* A <- P[X+1:2] */
219 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0), /* X <- M[0] */
220 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0), /* A <- A + X */
221 1.1 alnsn BPF_STMT(BPF_ST, 0), /* M[0] <- A */
222 1.1 alnsn
223 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1), /* X <- 1 */
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, 2), /* A <- P[X+2: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_RET+BPF_A, 0), /* ret A */
234 1.1 alnsn };
235 1.1 alnsn
236 1.2 alnsn static unsigned char P[] = { 1, 2, 3, 4, 5 };
237 1.1 alnsn const unsigned int res = 0x0a0e; /* 10 14 */
238 1.1 alnsn
239 1.1 alnsn if (!prog_validate(insns, sizeof(insns) / sizeof(insns[0])))
240 1.1 alnsn return false;
241 1.1 alnsn
242 1.1 alnsn return interp_prog_mchain2(insns, P, sizeof(P), split) == res;
243 1.1 alnsn }
244 1.1 alnsn
245 1.1 alnsn static bool
246 1.1 alnsn test_msh(size_t split)
247 1.1 alnsn {
248 1.1 alnsn /* Return a product of all packet bytes. */
249 1.1 alnsn static struct bpf_insn insns[] = {
250 1.1 alnsn BPF_STMT(BPF_LD+BPF_IMM, 1), /* A <- 1 */
251 1.1 alnsn
252 1.1 alnsn BPF_STMT(BPF_LDX+BPF_B+BPF_MSH, 0), /* X <- 4*(P[0]&0xf) */
253 1.1 alnsn BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0), /* A <- A * X */
254 1.1 alnsn BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 4), /* A <- A / 4 */
255 1.1 alnsn
256 1.1 alnsn BPF_STMT(BPF_LDX+BPF_B+BPF_MSH, 1), /* X <- 4*(P[1]&0xf) */
257 1.1 alnsn BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0), /* A <- A * X */
258 1.1 alnsn BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 4), /* A <- A / 4 */
259 1.1 alnsn
260 1.1 alnsn BPF_STMT(BPF_LDX+BPF_B+BPF_MSH, 2), /* X <- 4*(P[2]&0xf) */
261 1.1 alnsn BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0), /* A <- A * X */
262 1.1 alnsn BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 4), /* A <- A / 4 */
263 1.1 alnsn
264 1.1 alnsn BPF_STMT(BPF_LDX+BPF_B+BPF_MSH, 3), /* X <- 4*(P[3]&0xf) */
265 1.1 alnsn BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0), /* A <- A * X */
266 1.1 alnsn BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 4), /* A <- A / 4 */
267 1.1 alnsn
268 1.1 alnsn BPF_STMT(BPF_LDX+BPF_B+BPF_MSH, 4), /* X <- 4*(P[4]&0xf) */
269 1.1 alnsn BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0), /* A <- A * X */
270 1.1 alnsn BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 4), /* A <- A / 4 */
271 1.1 alnsn
272 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0), /* ret A */
273 1.1 alnsn };
274 1.1 alnsn
275 1.2 alnsn static unsigned char P[] = { 1, 2, 3, 4, 5 };
276 1.1 alnsn const unsigned int res = 120;
277 1.1 alnsn
278 1.1 alnsn if (!prog_validate(insns, sizeof(insns) / sizeof(insns[0])))
279 1.1 alnsn return false;
280 1.1 alnsn
281 1.1 alnsn return interp_prog_mchain2(insns, P, sizeof(P), split) == res;
282 1.1 alnsn }
283 1.1 alnsn
284 1.1 alnsn static bool
285 1.1 alnsn test_ldb_abs_overflow(size_t split)
286 1.1 alnsn {
287 1.1 alnsn static struct bpf_insn insns[] = {
288 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 5),
289 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 1),
290 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0),
291 1.1 alnsn };
292 1.1 alnsn
293 1.2 alnsn static unsigned char P[] = { 1, 2, 3, 4, 5 };
294 1.1 alnsn
295 1.1 alnsn if (!prog_validate(insns, sizeof(insns) / sizeof(insns[0])))
296 1.1 alnsn return false;
297 1.1 alnsn
298 1.1 alnsn return interp_prog_mchain2(insns, P, sizeof(P), split) == 0;
299 1.1 alnsn }
300 1.1 alnsn
301 1.1 alnsn static bool
302 1.1 alnsn test_ldh_abs_overflow(size_t split)
303 1.1 alnsn {
304 1.1 alnsn static struct bpf_insn insns[] = {
305 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 4),
306 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 1),
307 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0),
308 1.1 alnsn };
309 1.1 alnsn
310 1.2 alnsn static unsigned char P[] = { 1, 2, 3, 4, 5 };
311 1.1 alnsn
312 1.1 alnsn if (!prog_validate(insns, sizeof(insns) / sizeof(insns[0])))
313 1.1 alnsn return false;
314 1.1 alnsn
315 1.1 alnsn return interp_prog_mchain2(insns, P, sizeof(P), split) == 0;
316 1.1 alnsn }
317 1.1 alnsn
318 1.1 alnsn static bool
319 1.1 alnsn test_ldw_abs_overflow(size_t split)
320 1.1 alnsn {
321 1.1 alnsn static struct bpf_insn insns[] = {
322 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 2),
323 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 1),
324 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0),
325 1.1 alnsn };
326 1.1 alnsn
327 1.2 alnsn static unsigned char P[] = { 1, 2, 3, 4, 5 };
328 1.1 alnsn
329 1.1 alnsn if (!prog_validate(insns, sizeof(insns) / sizeof(insns[0])))
330 1.1 alnsn return false;
331 1.1 alnsn
332 1.1 alnsn return interp_prog_mchain2(insns, P, sizeof(P), split) == 0;
333 1.1 alnsn }
334 1.1 alnsn
335 1.1 alnsn static bool
336 1.1 alnsn test_ldb_ind_overflow1(size_t split)
337 1.1 alnsn {
338 1.1 alnsn static struct bpf_insn insns[] = {
339 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_IND, 5),
340 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 1),
341 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0),
342 1.1 alnsn };
343 1.1 alnsn
344 1.2 alnsn static unsigned char P[] = { 1, 2, 3, 4, 5 };
345 1.1 alnsn
346 1.1 alnsn if (!prog_validate(insns, sizeof(insns) / sizeof(insns[0])))
347 1.1 alnsn return false;
348 1.1 alnsn
349 1.1 alnsn return interp_prog_mchain2(insns, P, sizeof(P), split) == 0;
350 1.1 alnsn }
351 1.1 alnsn
352 1.1 alnsn static bool
353 1.1 alnsn test_ldb_ind_overflow2(size_t split)
354 1.1 alnsn {
355 1.1 alnsn static struct bpf_insn insns[] = {
356 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 4),
357 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_IND, 1),
358 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
359 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0),
360 1.1 alnsn };
361 1.1 alnsn
362 1.2 alnsn static unsigned char P[] = { 1, 2, 3, 4, 5 };
363 1.1 alnsn
364 1.1 alnsn if (!prog_validate(insns, sizeof(insns) / sizeof(insns[0])))
365 1.1 alnsn return false;
366 1.1 alnsn
367 1.1 alnsn return interp_prog_mchain2(insns, P, sizeof(P), split) == 0;
368 1.1 alnsn }
369 1.1 alnsn
370 1.1 alnsn static bool
371 1.1 alnsn test_ldb_ind_overflow3(size_t split)
372 1.1 alnsn {
373 1.1 alnsn static struct bpf_insn insns[] = {
374 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_MAX),
375 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_IND, 1),
376 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 1),
377 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0),
378 1.1 alnsn };
379 1.1 alnsn
380 1.2 alnsn static unsigned char P[] = { 1, 2, 3, 4, 5 };
381 1.1 alnsn
382 1.1 alnsn if (!prog_validate(insns, sizeof(insns) / sizeof(insns[0])))
383 1.1 alnsn return false;
384 1.1 alnsn
385 1.1 alnsn return interp_prog_mchain2(insns, P, sizeof(P), split) == 0;
386 1.1 alnsn }
387 1.1 alnsn
388 1.1 alnsn static bool
389 1.1 alnsn test_ldh_ind_overflow1(size_t split)
390 1.1 alnsn {
391 1.1 alnsn static struct bpf_insn insns[] = {
392 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 4),
393 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 1),
394 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0),
395 1.1 alnsn };
396 1.1 alnsn
397 1.2 alnsn static unsigned char P[] = { 1, 2, 3, 4, 5 };
398 1.1 alnsn
399 1.1 alnsn if (!prog_validate(insns, sizeof(insns) / sizeof(insns[0])))
400 1.1 alnsn return false;
401 1.1 alnsn
402 1.1 alnsn return interp_prog_mchain2(insns, P, sizeof(P), split) == 0;
403 1.1 alnsn }
404 1.1 alnsn
405 1.1 alnsn static bool
406 1.1 alnsn test_ldh_ind_overflow2(size_t split)
407 1.1 alnsn {
408 1.1 alnsn static struct bpf_insn insns[] = {
409 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
410 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 1),
411 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
412 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0),
413 1.1 alnsn };
414 1.1 alnsn
415 1.2 alnsn static unsigned char P[] = { 1, 2, 3, 4, 5 };
416 1.1 alnsn
417 1.1 alnsn if (!prog_validate(insns, sizeof(insns) / sizeof(insns[0])))
418 1.1 alnsn return false;
419 1.1 alnsn
420 1.1 alnsn return interp_prog_mchain2(insns, P, sizeof(P), split) == 0;
421 1.1 alnsn }
422 1.1 alnsn
423 1.1 alnsn static bool
424 1.1 alnsn test_ldh_ind_overflow3(size_t split)
425 1.1 alnsn {
426 1.1 alnsn static struct bpf_insn insns[] = {
427 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_MAX),
428 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 1),
429 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 1),
430 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0),
431 1.1 alnsn };
432 1.1 alnsn
433 1.2 alnsn static unsigned char P[] = { 1, 2, 3, 4, 5 };
434 1.1 alnsn
435 1.1 alnsn if (!prog_validate(insns, sizeof(insns) / sizeof(insns[0])))
436 1.1 alnsn return false;
437 1.1 alnsn
438 1.1 alnsn return interp_prog_mchain2(insns, P, sizeof(P), split) == 0;
439 1.1 alnsn }
440 1.1 alnsn
441 1.1 alnsn static bool
442 1.1 alnsn test_ldw_ind_overflow1(size_t split)
443 1.1 alnsn {
444 1.1 alnsn static struct bpf_insn insns[] = {
445 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, 2),
446 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 1),
447 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0),
448 1.1 alnsn };
449 1.1 alnsn
450 1.2 alnsn static unsigned char P[] = { 1, 2, 3, 4, 5 };
451 1.1 alnsn
452 1.1 alnsn if (!prog_validate(insns, sizeof(insns) / sizeof(insns[0])))
453 1.1 alnsn return false;
454 1.1 alnsn
455 1.1 alnsn return interp_prog_mchain2(insns, 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_overflow2(size_t split)
460 1.1 alnsn {
461 1.1 alnsn static struct bpf_insn insns[] = {
462 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1),
463 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, 1),
464 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
465 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0),
466 1.1 alnsn };
467 1.1 alnsn
468 1.2 alnsn static unsigned char P[] = { 1, 2, 3, 4, 5 };
469 1.1 alnsn
470 1.1 alnsn if (!prog_validate(insns, sizeof(insns) / sizeof(insns[0])))
471 1.1 alnsn return false;
472 1.1 alnsn
473 1.1 alnsn return interp_prog_mchain2(insns, 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_overflow3(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, UINT32_MAX),
481 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, 1),
482 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 1),
483 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0),
484 1.1 alnsn };
485 1.1 alnsn
486 1.2 alnsn static unsigned char P[] = { 1, 2, 3, 4, 5 };
487 1.1 alnsn
488 1.1 alnsn if (!prog_validate(insns, sizeof(insns) / sizeof(insns[0])))
489 1.1 alnsn return false;
490 1.1 alnsn
491 1.1 alnsn return interp_prog_mchain2(insns, P, sizeof(P), split) == 0;
492 1.1 alnsn }
493 1.1 alnsn
494 1.1 alnsn static bool
495 1.1 alnsn test_msh_overflow(size_t split)
496 1.1 alnsn {
497 1.1 alnsn static struct bpf_insn insns[] = {
498 1.1 alnsn BPF_STMT(BPF_LDX+BPF_B+BPF_MSH, 5),
499 1.1 alnsn BPF_STMT(BPF_MISC+BPF_TXA, 0),
500 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 1),
501 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0),
502 1.1 alnsn };
503 1.1 alnsn
504 1.2 alnsn static unsigned char P[] = { 1, 2, 3, 4, 5 };
505 1.1 alnsn
506 1.1 alnsn if (!prog_validate(insns, sizeof(insns) / sizeof(insns[0])))
507 1.1 alnsn return false;
508 1.1 alnsn
509 1.1 alnsn return interp_prog_mchain2(insns, P, sizeof(P), split) == 0;
510 1.1 alnsn }
511 1.1 alnsn
512 1.1 alnsn ATF_TC(bpf_mbuf_ldb_abs);
513 1.1 alnsn ATF_TC_HEAD(bpf_mbuf_ldb_abs, tc)
514 1.1 alnsn {
515 1.1 alnsn
516 1.1 alnsn atf_tc_set_md_var(tc, "descr", "Check that BPF_LD+BPF_B+BPF_ABS "
517 1.1 alnsn "loads bytes from mbuf correctly");
518 1.1 alnsn }
519 1.1 alnsn
520 1.1 alnsn ATF_TC_BODY(bpf_mbuf_ldb_abs, tc)
521 1.1 alnsn {
522 1.1 alnsn
523 1.1 alnsn RZ(rump_init());
524 1.1 alnsn
525 1.1 alnsn ATF_CHECK(test_ldb_abs(0));
526 1.1 alnsn ATF_CHECK(test_ldb_abs(1));
527 1.1 alnsn ATF_CHECK(test_ldb_abs(2));
528 1.1 alnsn ATF_CHECK(test_ldb_abs(3));
529 1.1 alnsn ATF_CHECK(test_ldb_abs(4));
530 1.1 alnsn ATF_CHECK(test_ldb_abs(5));
531 1.1 alnsn }
532 1.1 alnsn
533 1.1 alnsn ATF_TC(bpf_mbuf_ldh_abs);
534 1.1 alnsn ATF_TC_HEAD(bpf_mbuf_ldh_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_H+BPF_ABS "
538 1.1 alnsn "loads halfwords from mbuf correctly");
539 1.1 alnsn }
540 1.1 alnsn
541 1.1 alnsn ATF_TC_BODY(bpf_mbuf_ldh_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_ldh_abs(0));
547 1.1 alnsn ATF_CHECK(test_ldh_abs(1));
548 1.1 alnsn ATF_CHECK(test_ldh_abs(2));
549 1.1 alnsn ATF_CHECK(test_ldh_abs(3));
550 1.1 alnsn ATF_CHECK(test_ldh_abs(4));
551 1.1 alnsn ATF_CHECK(test_ldh_abs(5));
552 1.1 alnsn }
553 1.1 alnsn
554 1.1 alnsn ATF_TC(bpf_mbuf_ldw_abs);
555 1.1 alnsn ATF_TC_HEAD(bpf_mbuf_ldw_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_W+BPF_ABS "
559 1.1 alnsn "loads words from mbuf correctly");
560 1.1 alnsn }
561 1.1 alnsn
562 1.1 alnsn ATF_TC_BODY(bpf_mbuf_ldw_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_ldw_abs(0));
568 1.1 alnsn ATF_CHECK(test_ldw_abs(1));
569 1.1 alnsn ATF_CHECK(test_ldw_abs(2));
570 1.1 alnsn ATF_CHECK(test_ldw_abs(3));
571 1.1 alnsn ATF_CHECK(test_ldw_abs(4));
572 1.1 alnsn ATF_CHECK(test_ldw_abs(5));
573 1.1 alnsn }
574 1.1 alnsn
575 1.1 alnsn ATF_TC(bpf_mbuf_ldb_ind);
576 1.1 alnsn ATF_TC_HEAD(bpf_mbuf_ldb_ind, 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_B+BPF_IND "
580 1.1 alnsn "loads bytes from mbuf correctly");
581 1.1 alnsn }
582 1.1 alnsn
583 1.1 alnsn ATF_TC_BODY(bpf_mbuf_ldb_ind, 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_ldb_ind(0));
589 1.1 alnsn ATF_CHECK(test_ldb_ind(1));
590 1.1 alnsn ATF_CHECK(test_ldb_ind(2));
591 1.1 alnsn ATF_CHECK(test_ldb_ind(3));
592 1.1 alnsn ATF_CHECK(test_ldb_ind(4));
593 1.1 alnsn ATF_CHECK(test_ldb_ind(5));
594 1.1 alnsn }
595 1.1 alnsn
596 1.1 alnsn ATF_TC(bpf_mbuf_ldh_ind);
597 1.1 alnsn ATF_TC_HEAD(bpf_mbuf_ldh_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_H+BPF_IND "
601 1.1 alnsn "loads halfwords from mbuf correctly");
602 1.1 alnsn }
603 1.1 alnsn
604 1.1 alnsn ATF_TC_BODY(bpf_mbuf_ldh_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_ldh_ind(0));
610 1.1 alnsn ATF_CHECK(test_ldh_ind(1));
611 1.1 alnsn ATF_CHECK(test_ldh_ind(2));
612 1.1 alnsn ATF_CHECK(test_ldh_ind(3));
613 1.1 alnsn ATF_CHECK(test_ldh_ind(4));
614 1.1 alnsn ATF_CHECK(test_ldh_ind(5));
615 1.1 alnsn }
616 1.1 alnsn
617 1.1 alnsn ATF_TC(bpf_mbuf_ldw_ind);
618 1.1 alnsn ATF_TC_HEAD(bpf_mbuf_ldw_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_W+BPF_IND "
622 1.1 alnsn "loads words from mbuf correctly");
623 1.1 alnsn }
624 1.1 alnsn
625 1.1 alnsn ATF_TC_BODY(bpf_mbuf_ldw_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_ldw_ind(0));
631 1.1 alnsn ATF_CHECK(test_ldw_ind(1));
632 1.1 alnsn ATF_CHECK(test_ldw_ind(2));
633 1.1 alnsn ATF_CHECK(test_ldw_ind(3));
634 1.1 alnsn ATF_CHECK(test_ldw_ind(4));
635 1.1 alnsn ATF_CHECK(test_ldw_ind(5));
636 1.1 alnsn }
637 1.1 alnsn
638 1.1 alnsn ATF_TC(bpf_mbuf_msh);
639 1.1 alnsn ATF_TC_HEAD(bpf_mbuf_msh, tc)
640 1.1 alnsn {
641 1.1 alnsn
642 1.1 alnsn atf_tc_set_md_var(tc, "descr", "Check that BPF_LDX+BPF_B+BPF_MSH "
643 1.1 alnsn "loads bytes from mbuf correctly");
644 1.1 alnsn }
645 1.1 alnsn
646 1.1 alnsn ATF_TC_BODY(bpf_mbuf_msh, 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_msh(0));
652 1.1 alnsn ATF_CHECK(test_msh(1));
653 1.1 alnsn ATF_CHECK(test_msh(2));
654 1.1 alnsn ATF_CHECK(test_msh(3));
655 1.1 alnsn ATF_CHECK(test_msh(4));
656 1.1 alnsn ATF_CHECK(test_msh(5));
657 1.1 alnsn }
658 1.1 alnsn
659 1.1 alnsn ATF_TC(bpf_mbuf_ldb_abs_overflow);
660 1.1 alnsn ATF_TC_HEAD(bpf_mbuf_ldb_abs_overflow, tc)
661 1.1 alnsn {
662 1.1 alnsn
663 1.1 alnsn atf_tc_set_md_var(tc, "descr", "Check that BPF_LD+BPF_B+BPF_ABS "
664 1.1 alnsn "with out-of-bounds index aborts a filter program");
665 1.1 alnsn }
666 1.1 alnsn
667 1.1 alnsn ATF_TC_BODY(bpf_mbuf_ldb_abs_overflow, 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_ldb_abs_overflow(0));
673 1.1 alnsn ATF_CHECK(test_ldb_abs_overflow(1));
674 1.1 alnsn ATF_CHECK(test_ldb_abs_overflow(2));
675 1.1 alnsn ATF_CHECK(test_ldb_abs_overflow(3));
676 1.1 alnsn ATF_CHECK(test_ldb_abs_overflow(4));
677 1.1 alnsn ATF_CHECK(test_ldb_abs_overflow(5));
678 1.1 alnsn }
679 1.1 alnsn
680 1.1 alnsn ATF_TC(bpf_mbuf_ldh_abs_overflow);
681 1.1 alnsn ATF_TC_HEAD(bpf_mbuf_ldh_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_H+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(bpf_mbuf_ldh_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_ldh_abs_overflow(0));
694 1.1 alnsn ATF_CHECK(test_ldh_abs_overflow(1));
695 1.1 alnsn ATF_CHECK(test_ldh_abs_overflow(2));
696 1.1 alnsn ATF_CHECK(test_ldh_abs_overflow(3));
697 1.1 alnsn ATF_CHECK(test_ldh_abs_overflow(4));
698 1.1 alnsn ATF_CHECK(test_ldh_abs_overflow(5));
699 1.1 alnsn }
700 1.1 alnsn
701 1.1 alnsn ATF_TC(bpf_mbuf_ldw_abs_overflow);
702 1.1 alnsn ATF_TC_HEAD(bpf_mbuf_ldw_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_W+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(bpf_mbuf_ldw_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_ldw_abs_overflow(0));
715 1.1 alnsn ATF_CHECK(test_ldw_abs_overflow(1));
716 1.1 alnsn ATF_CHECK(test_ldw_abs_overflow(2));
717 1.1 alnsn ATF_CHECK(test_ldw_abs_overflow(3));
718 1.1 alnsn ATF_CHECK(test_ldw_abs_overflow(4));
719 1.1 alnsn ATF_CHECK(test_ldw_abs_overflow(5));
720 1.1 alnsn }
721 1.1 alnsn
722 1.1 alnsn ATF_TC(bpf_mbuf_ldb_ind_overflow1);
723 1.1 alnsn ATF_TC_HEAD(bpf_mbuf_ldb_ind_overflow1, 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_B+BPF_IND "
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(bpf_mbuf_ldb_ind_overflow1, 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_ldb_ind_overflow1(0));
736 1.1 alnsn ATF_CHECK(test_ldb_ind_overflow1(1));
737 1.1 alnsn ATF_CHECK(test_ldb_ind_overflow1(2));
738 1.1 alnsn ATF_CHECK(test_ldb_ind_overflow1(3));
739 1.1 alnsn ATF_CHECK(test_ldb_ind_overflow1(4));
740 1.1 alnsn ATF_CHECK(test_ldb_ind_overflow1(5));
741 1.1 alnsn }
742 1.1 alnsn
743 1.1 alnsn ATF_TC(bpf_mbuf_ldb_ind_overflow2);
744 1.1 alnsn ATF_TC_HEAD(bpf_mbuf_ldb_ind_overflow2, 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(bpf_mbuf_ldb_ind_overflow2, 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_overflow2(0));
757 1.1 alnsn ATF_CHECK(test_ldb_ind_overflow2(1));
758 1.1 alnsn ATF_CHECK(test_ldb_ind_overflow2(2));
759 1.1 alnsn ATF_CHECK(test_ldb_ind_overflow2(3));
760 1.1 alnsn ATF_CHECK(test_ldb_ind_overflow2(4));
761 1.1 alnsn ATF_CHECK(test_ldb_ind_overflow2(5));
762 1.1 alnsn }
763 1.1 alnsn
764 1.1 alnsn ATF_TC(bpf_mbuf_ldb_ind_overflow3);
765 1.1 alnsn ATF_TC_HEAD(bpf_mbuf_ldb_ind_overflow3, 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(bpf_mbuf_ldb_ind_overflow3, 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_overflow3(0));
778 1.1 alnsn ATF_CHECK(test_ldb_ind_overflow3(1));
779 1.1 alnsn ATF_CHECK(test_ldb_ind_overflow3(2));
780 1.1 alnsn ATF_CHECK(test_ldb_ind_overflow3(3));
781 1.1 alnsn ATF_CHECK(test_ldb_ind_overflow3(4));
782 1.1 alnsn ATF_CHECK(test_ldb_ind_overflow3(5));
783 1.1 alnsn }
784 1.1 alnsn
785 1.1 alnsn ATF_TC(bpf_mbuf_ldh_ind_overflow1);
786 1.1 alnsn ATF_TC_HEAD(bpf_mbuf_ldh_ind_overflow1, 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_H+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(bpf_mbuf_ldh_ind_overflow1, 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_ldh_ind_overflow1(0));
799 1.1 alnsn ATF_CHECK(test_ldh_ind_overflow1(1));
800 1.1 alnsn ATF_CHECK(test_ldh_ind_overflow1(2));
801 1.1 alnsn ATF_CHECK(test_ldh_ind_overflow1(3));
802 1.1 alnsn ATF_CHECK(test_ldh_ind_overflow1(4));
803 1.1 alnsn ATF_CHECK(test_ldh_ind_overflow1(5));
804 1.1 alnsn }
805 1.1 alnsn
806 1.1 alnsn ATF_TC(bpf_mbuf_ldh_ind_overflow2);
807 1.1 alnsn ATF_TC_HEAD(bpf_mbuf_ldh_ind_overflow2, 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(bpf_mbuf_ldh_ind_overflow2, 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_overflow2(0));
820 1.1 alnsn ATF_CHECK(test_ldh_ind_overflow2(1));
821 1.1 alnsn ATF_CHECK(test_ldh_ind_overflow2(2));
822 1.1 alnsn ATF_CHECK(test_ldh_ind_overflow2(3));
823 1.1 alnsn ATF_CHECK(test_ldh_ind_overflow2(4));
824 1.1 alnsn ATF_CHECK(test_ldh_ind_overflow2(5));
825 1.1 alnsn }
826 1.1 alnsn
827 1.1 alnsn ATF_TC(bpf_mbuf_ldh_ind_overflow3);
828 1.1 alnsn ATF_TC_HEAD(bpf_mbuf_ldh_ind_overflow3, 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(bpf_mbuf_ldh_ind_overflow3, 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_overflow3(0));
841 1.1 alnsn ATF_CHECK(test_ldh_ind_overflow3(1));
842 1.1 alnsn ATF_CHECK(test_ldh_ind_overflow3(2));
843 1.1 alnsn ATF_CHECK(test_ldh_ind_overflow3(3));
844 1.1 alnsn ATF_CHECK(test_ldh_ind_overflow3(4));
845 1.1 alnsn ATF_CHECK(test_ldh_ind_overflow3(5));
846 1.1 alnsn }
847 1.1 alnsn
848 1.1 alnsn ATF_TC(bpf_mbuf_ldw_ind_overflow1);
849 1.1 alnsn ATF_TC_HEAD(bpf_mbuf_ldw_ind_overflow1, 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_W+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(bpf_mbuf_ldw_ind_overflow1, 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_ldw_ind_overflow1(0));
862 1.1 alnsn ATF_CHECK(test_ldw_ind_overflow1(1));
863 1.1 alnsn ATF_CHECK(test_ldw_ind_overflow1(2));
864 1.1 alnsn ATF_CHECK(test_ldw_ind_overflow1(3));
865 1.1 alnsn ATF_CHECK(test_ldw_ind_overflow1(4));
866 1.1 alnsn ATF_CHECK(test_ldw_ind_overflow1(5));
867 1.1 alnsn }
868 1.1 alnsn
869 1.1 alnsn ATF_TC(bpf_mbuf_ldw_ind_overflow2);
870 1.1 alnsn ATF_TC_HEAD(bpf_mbuf_ldw_ind_overflow2, 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(bpf_mbuf_ldw_ind_overflow2, 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_overflow2(0));
883 1.1 alnsn ATF_CHECK(test_ldw_ind_overflow2(1));
884 1.1 alnsn ATF_CHECK(test_ldw_ind_overflow2(2));
885 1.1 alnsn ATF_CHECK(test_ldw_ind_overflow2(3));
886 1.1 alnsn ATF_CHECK(test_ldw_ind_overflow2(4));
887 1.1 alnsn ATF_CHECK(test_ldw_ind_overflow2(5));
888 1.1 alnsn }
889 1.1 alnsn
890 1.1 alnsn ATF_TC(bpf_mbuf_ldw_ind_overflow3);
891 1.1 alnsn ATF_TC_HEAD(bpf_mbuf_ldw_ind_overflow3, 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(bpf_mbuf_ldw_ind_overflow3, 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_overflow3(0));
904 1.1 alnsn ATF_CHECK(test_ldw_ind_overflow3(1));
905 1.1 alnsn ATF_CHECK(test_ldw_ind_overflow3(2));
906 1.1 alnsn ATF_CHECK(test_ldw_ind_overflow3(3));
907 1.1 alnsn ATF_CHECK(test_ldw_ind_overflow3(4));
908 1.1 alnsn ATF_CHECK(test_ldw_ind_overflow3(5));
909 1.1 alnsn }
910 1.1 alnsn
911 1.1 alnsn ATF_TC(bpf_mbuf_msh_overflow);
912 1.1 alnsn ATF_TC_HEAD(bpf_mbuf_msh_overflow, tc)
913 1.1 alnsn {
914 1.1 alnsn
915 1.1 alnsn atf_tc_set_md_var(tc, "descr", "Check that BPF_LDX+BPF_B+BPF_MSH "
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(bpf_mbuf_msh_overflow, 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_msh_overflow(0));
925 1.1 alnsn ATF_CHECK(test_msh_overflow(1));
926 1.1 alnsn ATF_CHECK(test_msh_overflow(2));
927 1.1 alnsn ATF_CHECK(test_msh_overflow(3));
928 1.1 alnsn ATF_CHECK(test_msh_overflow(4));
929 1.1 alnsn ATF_CHECK(test_msh_overflow(5));
930 1.1 alnsn }
931 1.1 alnsn
932 1.1 alnsn ATF_TP_ADD_TCS(tp)
933 1.1 alnsn {
934 1.1 alnsn
935 1.1 alnsn /*
936 1.1 alnsn * For every new test please also add a similar test
937 1.1 alnsn * to ../../net/bpfjit/t_mbuf.c
938 1.1 alnsn */
939 1.1 alnsn ATF_TP_ADD_TC(tp, bpf_mbuf_ldb_abs);
940 1.1 alnsn ATF_TP_ADD_TC(tp, bpf_mbuf_ldh_abs);
941 1.1 alnsn ATF_TP_ADD_TC(tp, bpf_mbuf_ldw_abs);
942 1.1 alnsn ATF_TP_ADD_TC(tp, bpf_mbuf_ldb_ind);
943 1.1 alnsn ATF_TP_ADD_TC(tp, bpf_mbuf_ldh_ind);
944 1.1 alnsn ATF_TP_ADD_TC(tp, bpf_mbuf_ldw_ind);
945 1.1 alnsn ATF_TP_ADD_TC(tp, bpf_mbuf_msh);
946 1.1 alnsn ATF_TP_ADD_TC(tp, bpf_mbuf_ldb_abs_overflow);
947 1.1 alnsn ATF_TP_ADD_TC(tp, bpf_mbuf_ldh_abs_overflow);
948 1.1 alnsn ATF_TP_ADD_TC(tp, bpf_mbuf_ldw_abs_overflow);
949 1.1 alnsn ATF_TP_ADD_TC(tp, bpf_mbuf_ldb_ind_overflow1);
950 1.1 alnsn ATF_TP_ADD_TC(tp, bpf_mbuf_ldb_ind_overflow2);
951 1.1 alnsn ATF_TP_ADD_TC(tp, bpf_mbuf_ldb_ind_overflow3);
952 1.1 alnsn ATF_TP_ADD_TC(tp, bpf_mbuf_ldh_ind_overflow1);
953 1.1 alnsn ATF_TP_ADD_TC(tp, bpf_mbuf_ldh_ind_overflow2);
954 1.1 alnsn ATF_TP_ADD_TC(tp, bpf_mbuf_ldh_ind_overflow3);
955 1.1 alnsn ATF_TP_ADD_TC(tp, bpf_mbuf_ldw_ind_overflow1);
956 1.1 alnsn ATF_TP_ADD_TC(tp, bpf_mbuf_ldw_ind_overflow2);
957 1.1 alnsn ATF_TP_ADD_TC(tp, bpf_mbuf_ldw_ind_overflow3);
958 1.1 alnsn ATF_TP_ADD_TC(tp, bpf_mbuf_msh_overflow);
959 1.1 alnsn
960 1.1 alnsn return atf_no_error();
961 1.1 alnsn }
962