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