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