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