1272343Sngie#include <sys/types.h>
2272343Sngie#include <sys/ioctl.h>
3272343Sngie
4272343Sngie#include <net/bpf.h>
5272343Sngie
6272343Sngie#include <atf-c.h>
7272343Sngie#include <fcntl.h>
8272343Sngie
9272343Sngie#include <rump/rump.h>
10272343Sngie#include <rump/rump_syscalls.h>
11272343Sngie
12272343SngieATF_TC(div_by_zero);
13272343SngieATF_TC_HEAD(div_by_zero, tc)
14272343Sngie{
15272343Sngie
16272343Sngie	atf_tc_set_md_var(tc, "descr", "Check that BPF rejects a filter "
17272343Sngie	    "which divides by 0");
18272343Sngie}
19272343Sngie
20272343SngieATF_TC_BODY(div_by_zero, tc)
21272343Sngie{
22272343Sngie	struct bpf_program bp;
23272343Sngie	int fd;
24272343Sngie
25272343Sngie	/*
26272343Sngie	 * Source code for following program:
27272343Sngie	 * link[0:4]/0 = 2
28272343Sngie	 */
29272343Sngie	struct bpf_insn bins[] = {
30272343Sngie	    { 0x20, 0, 0, 0x00000000 },
31272343Sngie	    { 0x34, 0, 0, 0x00000000 },
32272343Sngie	    { 0x15, 0, 1, 0x00000002 },
33272343Sngie	    { 0x6, 0, 0, 0x00000060 },
34272343Sngie	    { 0x6, 0, 0, 0x00000000 },
35272343Sngie	};
36272343Sngie
37272343Sngie	bp.bf_len = __arraycount(bins);
38272343Sngie	bp.bf_insns = bins;
39272343Sngie
40272343Sngie	rump_init();
41272343Sngie	fd = rump_sys_open("/dev/bpf", O_RDWR);
42272343Sngie	ATF_CHECK(fd != -1);
43272343Sngie	ATF_REQUIRE_EQ_MSG(rump_sys_ioctl(fd, BIOCSETF, &bp), -1,
44272343Sngie	    "bpf accepted program with division by zero");
45272343Sngie}
46272343Sngie
47272343SngieATF_TP_ADD_TCS(tp)
48272343Sngie{
49272343Sngie
50272343Sngie	ATF_TP_ADD_TC(tp, div_by_zero);
51272343Sngie	return atf_no_error();
52272343Sngie}
53