xref: /freebsd/tests/sys/netpfil/pf/ioctl/validation.c (revision 87c7063c2b4d8cc600a6c4871c7d9db4ecb261dc)
198c5f988SKristof Provost /*-
298c5f988SKristof Provost  * Copyright (c) 2018	Kristof Provost <kp@FreeBSD.org>
398c5f988SKristof Provost  *
498c5f988SKristof Provost  * Redistribution and use in source and binary forms, with or without
598c5f988SKristof Provost  * modification, are permitted provided that the following conditions
698c5f988SKristof Provost  * are met:
798c5f988SKristof Provost  * 1. Redistributions of source code must retain the above copyright
898c5f988SKristof Provost  *    notice, this list of conditions and the following disclaimer.
998c5f988SKristof Provost  * 2. Redistributions in binary form must reproduce the above copyright
1098c5f988SKristof Provost  *    notice, this list of conditions and the following disclaimer in the
1198c5f988SKristof Provost  *    documentation and/or other materials provided with the distribution.
1298c5f988SKristof Provost  *
1398c5f988SKristof Provost  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1498c5f988SKristof Provost  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1598c5f988SKristof Provost  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1698c5f988SKristof Provost  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1798c5f988SKristof Provost  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1898c5f988SKristof Provost  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
1998c5f988SKristof Provost  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2098c5f988SKristof Provost  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2198c5f988SKristof Provost  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2298c5f988SKristof Provost  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2398c5f988SKristof Provost  * SUCH DAMAGE.
2498c5f988SKristof Provost  *
2598c5f988SKristof Provost  * $FreeBSD$
2698c5f988SKristof Provost  */
2798c5f988SKristof Provost 
2898c5f988SKristof Provost #include <sys/param.h>
2998c5f988SKristof Provost #include <sys/module.h>
3098c5f988SKristof Provost #include <sys/types.h>
3198c5f988SKristof Provost #include <sys/ioctl.h>
3298c5f988SKristof Provost #include <sys/socket.h>
3398c5f988SKristof Provost 
3498c5f988SKristof Provost #include <net/if.h>
3598c5f988SKristof Provost #include <net/pfvar.h>
3698c5f988SKristof Provost 
3798c5f988SKristof Provost #include <fcntl.h>
3898c5f988SKristof Provost #include <stdio.h>
3998c5f988SKristof Provost 
4098c5f988SKristof Provost #include <atf-c.h>
4198c5f988SKristof Provost 
4298c5f988SKristof Provost static int dev;
4398c5f988SKristof Provost 
4498c5f988SKristof Provost #define COMMON_HEAD() \
4598c5f988SKristof Provost 	if (modfind("pf") == -1) \
4698c5f988SKristof Provost 		atf_tc_skip("pf not loaded"); \
4798c5f988SKristof Provost 	dev = open("/dev/pf", O_RDWR); \
4898c5f988SKristof Provost 	if (dev == -1) \
4998c5f988SKristof Provost 		atf_tc_skip("Failed to open /dev/pf");
5098c5f988SKristof Provost 
5198c5f988SKristof Provost #define COMMON_CLEANUP() \
5298c5f988SKristof Provost 	close(dev);
5398c5f988SKristof Provost 
541ff545d6SKristof Provost void
551ff545d6SKristof Provost common_init_tbl(struct pfr_table *tbl)
561ff545d6SKristof Provost {
571ff545d6SKristof Provost 	bzero(tbl, sizeof(struct pfr_table));
581ff545d6SKristof Provost 	strcpy(tbl->pfrt_anchor, "anchor");
591ff545d6SKristof Provost 	strcpy(tbl->pfrt_name, "name");
601ff545d6SKristof Provost 	tbl->pfrt_flags = 0;
611ff545d6SKristof Provost 	tbl->pfrt_fback = 0;
621ff545d6SKristof Provost }
631ff545d6SKristof Provost 
64*87c7063cSKristof Provost ATF_TC(addtables);
65*87c7063cSKristof Provost ATF_TC_HEAD(addtables, tc)
66*87c7063cSKristof Provost {
67*87c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
68*87c7063cSKristof Provost }
69*87c7063cSKristof Provost 
7098c5f988SKristof Provost ATF_TC_BODY(addtables, tc)
7198c5f988SKristof Provost {
7298c5f988SKristof Provost 	struct pfioc_table io;
7398c5f988SKristof Provost 	struct pfr_table tbl;
741bb72c29SKristof Provost 	struct pfr_table tbls[4];
7598c5f988SKristof Provost 	int flags;
7698c5f988SKristof Provost 
7798c5f988SKristof Provost 	COMMON_HEAD();
7898c5f988SKristof Provost 
7998c5f988SKristof Provost 	flags = 0;
8098c5f988SKristof Provost 
8198c5f988SKristof Provost 	bzero(&io, sizeof(io));
8298c5f988SKristof Provost 	io.pfrio_flags = flags;
8398c5f988SKristof Provost 	io.pfrio_buffer = &tbl;
8498c5f988SKristof Provost 	io.pfrio_esize = sizeof(tbl);
8598c5f988SKristof Provost 
8698c5f988SKristof Provost 	/* Negative size */
8798c5f988SKristof Provost 	io.pfrio_size = -1;
8898c5f988SKristof Provost 	if (ioctl(dev, DIOCRADDTABLES, &io) == 0)
8998c5f988SKristof Provost 		atf_tc_fail("Request with size -1 succeeded");
9098c5f988SKristof Provost 
9198c5f988SKristof Provost 	/* Overly large size */
9298c5f988SKristof Provost 	io.pfrio_size = 1 << 24;
9398c5f988SKristof Provost 	if (ioctl(dev, DIOCRADDTABLES, &io) == 0)
9498c5f988SKristof Provost 		atf_tc_fail("Request with size 1 << 24 succeeded");
9598c5f988SKristof Provost 
9698c5f988SKristof Provost 	/* NULL buffer */
9798c5f988SKristof Provost 	io.pfrio_size = 1;
9898c5f988SKristof Provost 	io.pfrio_buffer = NULL;
9998c5f988SKristof Provost 	if (ioctl(dev, DIOCRADDTABLES, &io) == 0)
10098c5f988SKristof Provost 		atf_tc_fail("Request with NULL buffer succeeded");
10198c5f988SKristof Provost 
1021bb72c29SKristof Provost 	/* This can provoke a memory leak, see r331225. */
1031bb72c29SKristof Provost 	io.pfrio_size = 4;
1041bb72c29SKristof Provost 	for (int i = 0; i < io.pfrio_size; i++)
1051bb72c29SKristof Provost 		common_init_tbl(&tbls[i]);
1061bb72c29SKristof Provost 
1071bb72c29SKristof Provost 	io.pfrio_buffer = &tbls;
1081bb72c29SKristof Provost 	ioctl(dev, DIOCRADDTABLES, &io);
1091bb72c29SKristof Provost 
11098c5f988SKristof Provost 	COMMON_CLEANUP();
11198c5f988SKristof Provost }
11298c5f988SKristof Provost 
113*87c7063cSKristof Provost ATF_TC(deltables);
114*87c7063cSKristof Provost ATF_TC_HEAD(deltables, tc)
115*87c7063cSKristof Provost {
116*87c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
117*87c7063cSKristof Provost }
118*87c7063cSKristof Provost 
11998c5f988SKristof Provost ATF_TC_BODY(deltables, tc)
12098c5f988SKristof Provost {
12198c5f988SKristof Provost 	struct pfioc_table io;
12298c5f988SKristof Provost 	struct pfr_table tbl;
12398c5f988SKristof Provost 	int flags;
12498c5f988SKristof Provost 
12598c5f988SKristof Provost 	COMMON_HEAD();
12698c5f988SKristof Provost 
12798c5f988SKristof Provost 	flags = 0;
12898c5f988SKristof Provost 
12998c5f988SKristof Provost 	bzero(&io, sizeof(io));
13098c5f988SKristof Provost 	io.pfrio_flags = flags;
13198c5f988SKristof Provost 	io.pfrio_buffer = &tbl;
13298c5f988SKristof Provost 	io.pfrio_esize = sizeof(tbl);
13398c5f988SKristof Provost 
13498c5f988SKristof Provost 	/* Negative size */
13598c5f988SKristof Provost 	io.pfrio_size = -1;
13698c5f988SKristof Provost 	if (ioctl(dev, DIOCRDELTABLES, &io) == 0)
13798c5f988SKristof Provost 		atf_tc_fail("Request with size -1 succeeded");
13898c5f988SKristof Provost 
13998c5f988SKristof Provost 	/* Overly large size */
14098c5f988SKristof Provost 	io.pfrio_size = 1 << 24;
14198c5f988SKristof Provost 	if (ioctl(dev, DIOCRDELTABLES, &io) == 0)
14298c5f988SKristof Provost 		atf_tc_fail("Request with size 1 << 24 succeeded");
14398c5f988SKristof Provost 
14498c5f988SKristof Provost 	/* NULL buffer */
14598c5f988SKristof Provost 	io.pfrio_size = 1;
14698c5f988SKristof Provost 	io.pfrio_buffer = NULL;
14798c5f988SKristof Provost 	if (ioctl(dev, DIOCRDELTABLES, &io) == 0)
14898c5f988SKristof Provost 		atf_tc_fail("Request with NULL buffer succeeded");
14998c5f988SKristof Provost 
15098c5f988SKristof Provost 	COMMON_CLEANUP();
15198c5f988SKristof Provost }
15298c5f988SKristof Provost 
153*87c7063cSKristof Provost ATF_TC(gettables);
154*87c7063cSKristof Provost ATF_TC_HEAD(gettables, tc)
155*87c7063cSKristof Provost {
156*87c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
157*87c7063cSKristof Provost }
158*87c7063cSKristof Provost 
1591ff545d6SKristof Provost ATF_TC_BODY(gettables, tc)
1601ff545d6SKristof Provost {
1611ff545d6SKristof Provost 	struct pfioc_table io;
1621ff545d6SKristof Provost 	struct pfr_table tbl;
1631ff545d6SKristof Provost 	int flags;
1641ff545d6SKristof Provost 
1651ff545d6SKristof Provost 	COMMON_HEAD();
1661ff545d6SKristof Provost 
1671ff545d6SKristof Provost 	flags = 0;
1681ff545d6SKristof Provost 
1691ff545d6SKristof Provost 	bzero(&io, sizeof(io));
1701ff545d6SKristof Provost 	io.pfrio_flags = flags;
1711ff545d6SKristof Provost 	io.pfrio_buffer = &tbl;
1721ff545d6SKristof Provost 	io.pfrio_esize = sizeof(tbl);
1731ff545d6SKristof Provost 
1741ff545d6SKristof Provost 	/* Negative size. This will succeed, because the kernel will not copy
1751ff545d6SKristof Provost 	 * tables than it has. */
1761ff545d6SKristof Provost 	io.pfrio_size = -1;
1771ff545d6SKristof Provost 	if (ioctl(dev, DIOCRGETTABLES, &io) != 0)
1781ff545d6SKristof Provost 		atf_tc_fail("Request with size -1 failed");
1791ff545d6SKristof Provost 
1801ff545d6SKristof Provost 	/* Overly large size. See above. */
1811ff545d6SKristof Provost 	io.pfrio_size = 1 << 24;
1821ff545d6SKristof Provost 	if (ioctl(dev, DIOCRGETTABLES, &io) != 0)
1831ff545d6SKristof Provost 		atf_tc_fail("Request with size 1 << 24 failed");
1841ff545d6SKristof Provost 
1851ff545d6SKristof Provost 	COMMON_CLEANUP();
1861ff545d6SKristof Provost }
1871ff545d6SKristof Provost 
188*87c7063cSKristof Provost ATF_TC(gettstats);
189*87c7063cSKristof Provost ATF_TC_HEAD(gettstats, tc)
190*87c7063cSKristof Provost {
191*87c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
192*87c7063cSKristof Provost }
193*87c7063cSKristof Provost 
1941ff545d6SKristof Provost ATF_TC_BODY(gettstats, tc)
1951ff545d6SKristof Provost {
1961ff545d6SKristof Provost 	struct pfioc_table io;
1971ff545d6SKristof Provost 	struct pfr_tstats stats;
1981ff545d6SKristof Provost 	int flags;
1991ff545d6SKristof Provost 
2001ff545d6SKristof Provost 	COMMON_HEAD();
2011ff545d6SKristof Provost 
2021ff545d6SKristof Provost 	flags = 0;
2031ff545d6SKristof Provost 
2041ff545d6SKristof Provost 	bzero(&io, sizeof(io));
2051ff545d6SKristof Provost 	io.pfrio_flags = flags;
2061ff545d6SKristof Provost 	io.pfrio_buffer = &stats;
2071ff545d6SKristof Provost 	io.pfrio_esize = sizeof(stats);
2081ff545d6SKristof Provost 
2091ff545d6SKristof Provost 	/* Negative size. This will succeed, because the kernel will not copy
2101ff545d6SKristof Provost 	 * tables than it has. */
2111ff545d6SKristof Provost 	io.pfrio_size = -1;
2121ff545d6SKristof Provost 	if (ioctl(dev, DIOCRGETTSTATS, &io) != 0)
2131ff545d6SKristof Provost 		atf_tc_fail("Request with size -1 failed");
2141ff545d6SKristof Provost 
2151ff545d6SKristof Provost 	/* Overly large size. See above. */
2161ff545d6SKristof Provost 	io.pfrio_size = 1 << 24;
2171ff545d6SKristof Provost 	if (ioctl(dev, DIOCRGETTSTATS, &io) != 0)
2181ff545d6SKristof Provost 		atf_tc_fail("Request with size 1 << 24 failed");
2191ff545d6SKristof Provost 
2201ff545d6SKristof Provost 	COMMON_CLEANUP();
2211ff545d6SKristof Provost }
2221ff545d6SKristof Provost 
223*87c7063cSKristof Provost ATF_TC(clrtstats);
224*87c7063cSKristof Provost ATF_TC_HEAD(clrtstats, tc)
225*87c7063cSKristof Provost {
226*87c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
227*87c7063cSKristof Provost }
228*87c7063cSKristof Provost 
2291ff545d6SKristof Provost ATF_TC_BODY(clrtstats, tc)
2301ff545d6SKristof Provost {
2311ff545d6SKristof Provost 	struct pfioc_table io;
2321ff545d6SKristof Provost 	struct pfr_table tbl;
2331ff545d6SKristof Provost 	int flags;
2341ff545d6SKristof Provost 
2351ff545d6SKristof Provost 	COMMON_HEAD();
2361ff545d6SKristof Provost 
2371ff545d6SKristof Provost 	flags = 0;
2381ff545d6SKristof Provost 
2391ff545d6SKristof Provost 	common_init_tbl(&tbl);
2401ff545d6SKristof Provost 
2411ff545d6SKristof Provost 	bzero(&io, sizeof(io));
2421ff545d6SKristof Provost 	io.pfrio_flags = flags;
2431ff545d6SKristof Provost 	io.pfrio_buffer = &tbl;
2441ff545d6SKristof Provost 	io.pfrio_esize = sizeof(tbl);
2451ff545d6SKristof Provost 
2461ff545d6SKristof Provost 	/* Negative size. This will succeed, because the kernel will not copy
2471ff545d6SKristof Provost 	 * tables than it has. */
2481ff545d6SKristof Provost 	io.pfrio_size = -1;
2491ff545d6SKristof Provost 	if (ioctl(dev, DIOCRCLRTSTATS, &io) != 0)
2501ff545d6SKristof Provost 		atf_tc_fail("Request with size -1 failed ");
2511ff545d6SKristof Provost 
2521ff545d6SKristof Provost 	/* Overly large size. See above. */
2531ff545d6SKristof Provost 	io.pfrio_size = 1 << 24;
2541ff545d6SKristof Provost 	if (ioctl(dev, DIOCRCLRTSTATS, &io) != 0)
2551ff545d6SKristof Provost 		atf_tc_fail("Request with size 1 << 24 failed");
2561ff545d6SKristof Provost 
2571ff545d6SKristof Provost 	COMMON_CLEANUP();
2581ff545d6SKristof Provost }
2591ff545d6SKristof Provost 
260*87c7063cSKristof Provost ATF_TC(settflags);
261*87c7063cSKristof Provost ATF_TC_HEAD(settflags, tc)
262*87c7063cSKristof Provost {
263*87c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
264*87c7063cSKristof Provost }
265*87c7063cSKristof Provost 
2661ff545d6SKristof Provost ATF_TC_BODY(settflags, tc)
2671ff545d6SKristof Provost {
2681ff545d6SKristof Provost 	struct pfioc_table io;
2691ff545d6SKristof Provost 	struct pfr_table tbl;
2701ff545d6SKristof Provost 	int flags;
2711ff545d6SKristof Provost 
2721ff545d6SKristof Provost 	COMMON_HEAD();
2731ff545d6SKristof Provost 
2741ff545d6SKristof Provost 	flags = 0;
2751ff545d6SKristof Provost 
2761ff545d6SKristof Provost 	common_init_tbl(&tbl);
2771ff545d6SKristof Provost 
2781ff545d6SKristof Provost 	bzero(&io, sizeof(io));
2791ff545d6SKristof Provost 	io.pfrio_flags = flags;
2801ff545d6SKristof Provost 	io.pfrio_buffer = &tbl;
2811ff545d6SKristof Provost 	io.pfrio_esize = sizeof(tbl);
2821ff545d6SKristof Provost 
2831ff545d6SKristof Provost 	/* Negative size. This will succeed, because the kernel will not copy
2841ff545d6SKristof Provost 	 * tables than it has. */
2851ff545d6SKristof Provost 	io.pfrio_size = -1;
2861ff545d6SKristof Provost 	if (ioctl(dev, DIOCRSETTFLAGS, &io) != 0)
2871ff545d6SKristof Provost 		atf_tc_fail("Request with size -1 failed");
2881ff545d6SKristof Provost 
2891ff545d6SKristof Provost 	/* Overly large size. See above. */
2901ff545d6SKristof Provost 	io.pfrio_size = 1 << 28;
2911ff545d6SKristof Provost 	if (ioctl(dev, DIOCRSETTFLAGS, &io) != 0)
2921ff545d6SKristof Provost 		atf_tc_fail("Request with size 1 << 24 failed");
2931ff545d6SKristof Provost 
2941ff545d6SKristof Provost 	COMMON_CLEANUP();
2951ff545d6SKristof Provost }
2961ff545d6SKristof Provost 
297*87c7063cSKristof Provost ATF_TC(addaddrs);
298*87c7063cSKristof Provost ATF_TC_HEAD(addaddrs, tc)
299*87c7063cSKristof Provost {
300*87c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
301*87c7063cSKristof Provost }
302*87c7063cSKristof Provost 
30362d28676SKristof Provost ATF_TC_BODY(addaddrs, tc)
30462d28676SKristof Provost {
30562d28676SKristof Provost 	struct pfioc_table io;
30662d28676SKristof Provost 	struct pfr_addr addr;
30762d28676SKristof Provost 
30862d28676SKristof Provost 	COMMON_HEAD();
30962d28676SKristof Provost 
31062d28676SKristof Provost 	bzero(&addr, sizeof(addr));
31162d28676SKristof Provost 	bzero(&io, sizeof(io));
31262d28676SKristof Provost 	io.pfrio_flags = 0;
31362d28676SKristof Provost 	io.pfrio_buffer = &addr;
31462d28676SKristof Provost 	io.pfrio_esize = sizeof(addr);
31562d28676SKristof Provost 
31662d28676SKristof Provost 	/* Negative size. */
31762d28676SKristof Provost 	io.pfrio_size = -1;
31862d28676SKristof Provost 	if (ioctl(dev, DIOCRADDADDRS, &io) == 0)
31962d28676SKristof Provost 		atf_tc_fail("Request with size -1 succeeded");
32062d28676SKristof Provost 
32162d28676SKristof Provost 	/* Overly large size. */
32262d28676SKristof Provost 	io.pfrio_size = 1 << 28;
32362d28676SKristof Provost 	if (ioctl(dev, DIOCRADDADDRS, &io) == 0)
32462d28676SKristof Provost 		atf_tc_fail("Reuqest with size 1 << 28 failed");
32562d28676SKristof Provost 
32662d28676SKristof Provost 	COMMON_CLEANUP();
32762d28676SKristof Provost }
32862d28676SKristof Provost 
329*87c7063cSKristof Provost ATF_TC(deladdrs);
330*87c7063cSKristof Provost ATF_TC_HEAD(deladdrs, tc)
331*87c7063cSKristof Provost {
332*87c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
333*87c7063cSKristof Provost }
334*87c7063cSKristof Provost 
33562d28676SKristof Provost ATF_TC_BODY(deladdrs, tc)
33662d28676SKristof Provost {
33762d28676SKristof Provost 	struct pfioc_table io;
33862d28676SKristof Provost 	struct pfr_addr addr;
33962d28676SKristof Provost 
34062d28676SKristof Provost 	COMMON_HEAD();
34162d28676SKristof Provost 
34262d28676SKristof Provost 	bzero(&addr, sizeof(addr));
34362d28676SKristof Provost 	bzero(&io, sizeof(io));
34462d28676SKristof Provost 	io.pfrio_flags = 0;
34562d28676SKristof Provost 	io.pfrio_buffer = &addr;
34662d28676SKristof Provost 	io.pfrio_esize = sizeof(addr);
34762d28676SKristof Provost 
34862d28676SKristof Provost 	/* Negative size. */
34962d28676SKristof Provost 	io.pfrio_size = -1;
35062d28676SKristof Provost 	if (ioctl(dev, DIOCRDELADDRS, &io) == 0)
35162d28676SKristof Provost 		atf_tc_fail("Request with size -1 succeeded");
35262d28676SKristof Provost 
35362d28676SKristof Provost 	/* Overly large size. */
35462d28676SKristof Provost 	io.pfrio_size = 1 << 28;
35562d28676SKristof Provost 	if (ioctl(dev, DIOCRDELADDRS, &io) == 0)
35662d28676SKristof Provost 		atf_tc_fail("Reuqest with size 1 << 28 failed");
35762d28676SKristof Provost 
35862d28676SKristof Provost 	COMMON_CLEANUP();
35962d28676SKristof Provost }
36062d28676SKristof Provost 
361*87c7063cSKristof Provost ATF_TC(setaddrs);
362*87c7063cSKristof Provost ATF_TC_HEAD(setaddrs, tc)
363*87c7063cSKristof Provost {
364*87c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
365*87c7063cSKristof Provost }
366*87c7063cSKristof Provost 
36762d28676SKristof Provost ATF_TC_BODY(setaddrs, tc)
36862d28676SKristof Provost {
36962d28676SKristof Provost 	struct pfioc_table io;
37062d28676SKristof Provost 	struct pfr_addr addr;
37162d28676SKristof Provost 
37262d28676SKristof Provost 	COMMON_HEAD();
37362d28676SKristof Provost 
37462d28676SKristof Provost 	bzero(&addr, sizeof(addr));
37562d28676SKristof Provost 	bzero(&io, sizeof(io));
37662d28676SKristof Provost 	io.pfrio_flags = 0;
37762d28676SKristof Provost 	io.pfrio_buffer = &addr;
37862d28676SKristof Provost 	io.pfrio_esize = sizeof(addr);
37962d28676SKristof Provost 
38062d28676SKristof Provost 	/* Negative size. */
38162d28676SKristof Provost 	io.pfrio_size = -1;
38262d28676SKristof Provost 	if (ioctl(dev, DIOCRSETADDRS, &io) == 0)
38362d28676SKristof Provost 		atf_tc_fail("Request with size -1 succeeded");
38462d28676SKristof Provost 
38562d28676SKristof Provost 	/* Overly large size. */
38662d28676SKristof Provost 	io.pfrio_size = 1 << 28;
38762d28676SKristof Provost 	if (ioctl(dev, DIOCRSETADDRS, &io) == 0)
38862d28676SKristof Provost 		atf_tc_fail("Reuqest with size 1 << 28 failed");
38962d28676SKristof Provost 
39062d28676SKristof Provost 	COMMON_CLEANUP();
39162d28676SKristof Provost }
39262d28676SKristof Provost 
393*87c7063cSKristof Provost ATF_TC(getaddrs);
394*87c7063cSKristof Provost ATF_TC_HEAD(getaddrs, tc)
395*87c7063cSKristof Provost {
396*87c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
397*87c7063cSKristof Provost }
398*87c7063cSKristof Provost 
39962d28676SKristof Provost ATF_TC_BODY(getaddrs, tc)
40062d28676SKristof Provost {
40162d28676SKristof Provost 	struct pfioc_table io;
40262d28676SKristof Provost 	struct pfr_addr addr;
40362d28676SKristof Provost 
40462d28676SKristof Provost 	COMMON_HEAD();
40562d28676SKristof Provost 
40662d28676SKristof Provost 	bzero(&addr, sizeof(addr));
40762d28676SKristof Provost 	bzero(&io, sizeof(io));
40862d28676SKristof Provost 	io.pfrio_flags = 0;
40962d28676SKristof Provost 	io.pfrio_buffer = &addr;
41062d28676SKristof Provost 	io.pfrio_esize = sizeof(addr);
41162d28676SKristof Provost 
41262d28676SKristof Provost 	common_init_tbl(&io.pfrio_table);
41362d28676SKristof Provost 
41462d28676SKristof Provost 	/* Negative size. */
41562d28676SKristof Provost 	io.pfrio_size = -1;
41662d28676SKristof Provost 	if (ioctl(dev, DIOCRGETADDRS, &io) == 0)
41762d28676SKristof Provost 		atf_tc_fail("Request with size -1 succeeded");
41862d28676SKristof Provost 
41962d28676SKristof Provost 	/* Overly large size. */
42062d28676SKristof Provost 	io.pfrio_size = 1 << 24;
42162d28676SKristof Provost 	if (ioctl(dev, DIOCRGETADDRS, &io) == 0)
42262d28676SKristof Provost 		atf_tc_fail("Request with size 1 << 24 failed");
42362d28676SKristof Provost 
42462d28676SKristof Provost 	COMMON_CLEANUP();
42562d28676SKristof Provost }
42662d28676SKristof Provost 
427*87c7063cSKristof Provost ATF_TC(getastats);
428*87c7063cSKristof Provost ATF_TC_HEAD(getastats, tc)
429*87c7063cSKristof Provost {
430*87c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
431*87c7063cSKristof Provost }
432*87c7063cSKristof Provost 
43362d28676SKristof Provost ATF_TC_BODY(getastats, tc)
43462d28676SKristof Provost {
43562d28676SKristof Provost 	struct pfioc_table io;
43662d28676SKristof Provost 	struct pfr_astats astats;
43762d28676SKristof Provost 
43862d28676SKristof Provost 	COMMON_HEAD();
43962d28676SKristof Provost 
44062d28676SKristof Provost 	bzero(&astats, sizeof(astats));
44162d28676SKristof Provost 	bzero(&io, sizeof(io));
44262d28676SKristof Provost 	io.pfrio_flags = 0;
44362d28676SKristof Provost 	io.pfrio_buffer = &astats;
44462d28676SKristof Provost 	io.pfrio_esize = sizeof(astats);
44562d28676SKristof Provost 
44662d28676SKristof Provost 	common_init_tbl(&io.pfrio_table);
44762d28676SKristof Provost 
44862d28676SKristof Provost 	/* Negative size. */
44962d28676SKristof Provost 	io.pfrio_size = -1;
45062d28676SKristof Provost 	if (ioctl(dev, DIOCRGETASTATS, &io) == 0)
45162d28676SKristof Provost 		atf_tc_fail("Request with size -1 succeeded");
45262d28676SKristof Provost 
45362d28676SKristof Provost 	/* Overly large size. */
45462d28676SKristof Provost 	io.pfrio_size = 1 << 24;
45562d28676SKristof Provost 	if (ioctl(dev, DIOCRGETASTATS, &io) == 0)
45662d28676SKristof Provost 		atf_tc_fail("Request with size 1 << 24 failed");
45762d28676SKristof Provost 
45862d28676SKristof Provost 	COMMON_CLEANUP();
45962d28676SKristof Provost }
46062d28676SKristof Provost 
461*87c7063cSKristof Provost ATF_TC(clrastats);
462*87c7063cSKristof Provost ATF_TC_HEAD(clrastats, tc)
463*87c7063cSKristof Provost {
464*87c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
465*87c7063cSKristof Provost }
466*87c7063cSKristof Provost 
46762d28676SKristof Provost ATF_TC_BODY(clrastats, tc)
46862d28676SKristof Provost {
46962d28676SKristof Provost 	struct pfioc_table io;
47062d28676SKristof Provost 	struct pfr_addr addr;
47162d28676SKristof Provost 
47262d28676SKristof Provost 	COMMON_HEAD();
47362d28676SKristof Provost 
47462d28676SKristof Provost 	bzero(&addr, sizeof(addr));
47562d28676SKristof Provost 	bzero(&io, sizeof(io));
47662d28676SKristof Provost 	io.pfrio_flags = 0;
47762d28676SKristof Provost 	io.pfrio_buffer = &addr;
47862d28676SKristof Provost 	io.pfrio_esize = sizeof(addr);
47962d28676SKristof Provost 
48062d28676SKristof Provost 	common_init_tbl(&io.pfrio_table);
48162d28676SKristof Provost 
48262d28676SKristof Provost 	/* Negative size. */
48362d28676SKristof Provost 	io.pfrio_size = -1;
48462d28676SKristof Provost 	if (ioctl(dev, DIOCRCLRASTATS, &io) == 0)
48562d28676SKristof Provost 		atf_tc_fail("Request with size -1 succeeded");
48662d28676SKristof Provost 
48762d28676SKristof Provost 	/* Overly large size. */
48862d28676SKristof Provost 	io.pfrio_size = 1 << 24;
48962d28676SKristof Provost 	if (ioctl(dev, DIOCRCLRASTATS, &io) == 0)
49062d28676SKristof Provost 		atf_tc_fail("Request with size 1 << 24 failed");
49162d28676SKristof Provost 
49262d28676SKristof Provost 	COMMON_CLEANUP();
49362d28676SKristof Provost }
49462d28676SKristof Provost 
495*87c7063cSKristof Provost ATF_TC(tstaddrs);
496*87c7063cSKristof Provost ATF_TC_HEAD(tstaddrs, tc)
497*87c7063cSKristof Provost {
498*87c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
499*87c7063cSKristof Provost }
500*87c7063cSKristof Provost 
50162d28676SKristof Provost ATF_TC_BODY(tstaddrs, tc)
50262d28676SKristof Provost {
50362d28676SKristof Provost 	struct pfioc_table io;
50462d28676SKristof Provost 	struct pfr_addr addr;
50562d28676SKristof Provost 
50662d28676SKristof Provost 	COMMON_HEAD();
50762d28676SKristof Provost 
50862d28676SKristof Provost 	bzero(&addr, sizeof(addr));
50962d28676SKristof Provost 	bzero(&io, sizeof(io));
51062d28676SKristof Provost 	io.pfrio_flags = 0;
51162d28676SKristof Provost 	io.pfrio_buffer = &addr;
51262d28676SKristof Provost 	io.pfrio_esize = sizeof(addr);
51362d28676SKristof Provost 
51462d28676SKristof Provost 	common_init_tbl(&io.pfrio_table);
51562d28676SKristof Provost 
51662d28676SKristof Provost 	/* Negative size. */
51762d28676SKristof Provost 	io.pfrio_size = -1;
51862d28676SKristof Provost 	if (ioctl(dev, DIOCRTSTADDRS, &io) == 0)
51962d28676SKristof Provost 		atf_tc_fail("Request with size -1 succeeded");
52062d28676SKristof Provost 
52162d28676SKristof Provost 	/* Overly large size. */
52262d28676SKristof Provost 	io.pfrio_size = 1 << 24;
52362d28676SKristof Provost 	if (ioctl(dev, DIOCRTSTADDRS, &io) == 0)
52462d28676SKristof Provost 		atf_tc_fail("Request with size 1 << 24 failed");
52562d28676SKristof Provost 
52662d28676SKristof Provost 	COMMON_CLEANUP();
52762d28676SKristof Provost }
52862d28676SKristof Provost 
529*87c7063cSKristof Provost ATF_TC(inadefine);
530*87c7063cSKristof Provost ATF_TC_HEAD(inadefine, tc)
531*87c7063cSKristof Provost {
532*87c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
533*87c7063cSKristof Provost }
534*87c7063cSKristof Provost 
53562d28676SKristof Provost ATF_TC_BODY(inadefine, tc)
53662d28676SKristof Provost {
53762d28676SKristof Provost 	struct pfioc_table io;
53862d28676SKristof Provost 	struct pfr_addr addr;
53962d28676SKristof Provost 
54062d28676SKristof Provost 	COMMON_HEAD();
54162d28676SKristof Provost 
54262d28676SKristof Provost 	bzero(&addr, sizeof(addr));
54362d28676SKristof Provost 	bzero(&io, sizeof(io));
54462d28676SKristof Provost 	io.pfrio_flags = 0;
54562d28676SKristof Provost 	io.pfrio_buffer = &addr;
54662d28676SKristof Provost 	io.pfrio_esize = sizeof(addr);
54762d28676SKristof Provost 
54862d28676SKristof Provost 	common_init_tbl(&io.pfrio_table);
54962d28676SKristof Provost 
55062d28676SKristof Provost 	/* Negative size. */
55162d28676SKristof Provost 	io.pfrio_size = -1;
55262d28676SKristof Provost 	if (ioctl(dev, DIOCRINADEFINE, &io) == 0)
55362d28676SKristof Provost 		atf_tc_fail("Request with size -1 succeeded");
55462d28676SKristof Provost 
55562d28676SKristof Provost 	/* Overly large size. */
55662d28676SKristof Provost 	io.pfrio_size = 1 << 24;
55762d28676SKristof Provost 	if (ioctl(dev, DIOCRINADEFINE, &io) == 0)
55862d28676SKristof Provost 		atf_tc_fail("Request with size 1 << 24 failed");
55962d28676SKristof Provost 
56062d28676SKristof Provost 	COMMON_CLEANUP();
56162d28676SKristof Provost }
56262d28676SKristof Provost 
563*87c7063cSKristof Provost ATF_TC(igetifaces);
564*87c7063cSKristof Provost ATF_TC_HEAD(igetifaces, tc)
565*87c7063cSKristof Provost {
566*87c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
567*87c7063cSKristof Provost }
568*87c7063cSKristof Provost 
5698e748b94SKristof Provost ATF_TC_BODY(igetifaces, tc)
5708e748b94SKristof Provost {
5718e748b94SKristof Provost 	struct pfioc_iface io;
5728e748b94SKristof Provost 	struct pfi_kif kif;
5738e748b94SKristof Provost 
5748e748b94SKristof Provost 	COMMON_HEAD();
5758e748b94SKristof Provost 
5768e748b94SKristof Provost 	bzero(&io, sizeof(io));
5778e748b94SKristof Provost 	io.pfiio_flags = 0;
5788e748b94SKristof Provost 	io.pfiio_buffer = &kif;
5798e748b94SKristof Provost 	io.pfiio_esize = sizeof(kif);
5808e748b94SKristof Provost 
5818e748b94SKristof Provost 	/* Negative size */
5828e748b94SKristof Provost 	io.pfiio_size = -1;
5838e748b94SKristof Provost 	if (ioctl(dev, DIOCIGETIFACES, &io) == 0)
5848e748b94SKristof Provost 		atf_tc_fail("request with size -1 succeeded");
5858e748b94SKristof Provost 
5868e748b94SKristof Provost 	/* Overflow size */
5878e748b94SKristof Provost 	io.pfiio_size = 1 << 31;
5888e748b94SKristof Provost 	if (ioctl(dev, DIOCIGETIFACES, &io) == 0)
5898e748b94SKristof Provost 		atf_tc_fail("request with size 1 << 31 succeeded");
5908e748b94SKristof Provost 
5918e748b94SKristof Provost 	COMMON_CLEANUP();
5928e748b94SKristof Provost }
5938e748b94SKristof Provost 
594*87c7063cSKristof Provost ATF_TC(cxbegin);
595*87c7063cSKristof Provost ATF_TC_HEAD(cxbegin, tc)
596*87c7063cSKristof Provost {
597*87c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
598*87c7063cSKristof Provost }
599*87c7063cSKristof Provost 
60062d28676SKristof Provost ATF_TC_BODY(cxbegin, tc)
60162d28676SKristof Provost {
60262d28676SKristof Provost 	struct pfioc_trans io;
60362d28676SKristof Provost 	struct pfioc_trans_e ioe;
60462d28676SKristof Provost 
60562d28676SKristof Provost 	COMMON_HEAD();
60662d28676SKristof Provost 
60762d28676SKristof Provost 	bzero(&io, sizeof(io));
60862d28676SKristof Provost 	io.esize = sizeof(ioe);
60962d28676SKristof Provost 	io.array = &ioe;
61062d28676SKristof Provost 
61162d28676SKristof Provost 	/* Negative size */
61262d28676SKristof Provost 	io.size = -1;
61362d28676SKristof Provost 	if (ioctl(dev, DIOCXBEGIN, &io) == 0)
61462d28676SKristof Provost 		atf_tc_fail("request with size -1 succeeded");
61562d28676SKristof Provost 
61662d28676SKristof Provost 	/* Overflow size */
61762d28676SKristof Provost 	io.size = 1 << 30;
61862d28676SKristof Provost 	if (ioctl(dev, DIOCXBEGIN, &io) == 0)
61962d28676SKristof Provost 		atf_tc_fail("request with size 1 << 30 succeeded");
62062d28676SKristof Provost 
62162d28676SKristof Provost 	/* NULL buffer */
62262d28676SKristof Provost 	io.size = 1;
62362d28676SKristof Provost 	io.array = NULL;
62462d28676SKristof Provost 	if (ioctl(dev, DIOCXBEGIN, &io) == 0)
62562d28676SKristof Provost 		atf_tc_fail("request with size -1 succeeded");
62662d28676SKristof Provost 
62762d28676SKristof Provost 	COMMON_CLEANUP();
62862d28676SKristof Provost }
62962d28676SKristof Provost 
630*87c7063cSKristof Provost ATF_TC(cxrollback);
631*87c7063cSKristof Provost ATF_TC_HEAD(cxrollback, tc)
632*87c7063cSKristof Provost {
633*87c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
634*87c7063cSKristof Provost }
635*87c7063cSKristof Provost 
63662d28676SKristof Provost ATF_TC_BODY(cxrollback, tc)
63762d28676SKristof Provost {
63862d28676SKristof Provost 	struct pfioc_trans io;
63962d28676SKristof Provost 	struct pfioc_trans_e ioe;
64062d28676SKristof Provost 
64162d28676SKristof Provost 	COMMON_HEAD();
64262d28676SKristof Provost 
64362d28676SKristof Provost 	bzero(&io, sizeof(io));
64462d28676SKristof Provost 	io.esize = sizeof(ioe);
64562d28676SKristof Provost 	io.array = &ioe;
64662d28676SKristof Provost 
64762d28676SKristof Provost 	/* Negative size */
64862d28676SKristof Provost 	io.size = -1;
64962d28676SKristof Provost 	if (ioctl(dev, DIOCXROLLBACK, &io) == 0)
65062d28676SKristof Provost 		atf_tc_fail("request with size -1 succeeded");
65162d28676SKristof Provost 
65262d28676SKristof Provost 	/* Overflow size */
65362d28676SKristof Provost 	io.size = 1 << 30;
65462d28676SKristof Provost 	if (ioctl(dev, DIOCXROLLBACK, &io) == 0)
65562d28676SKristof Provost 		atf_tc_fail("request with size 1 << 30 succeeded");
65662d28676SKristof Provost 
65762d28676SKristof Provost 	/* NULL buffer */
65862d28676SKristof Provost 	io.size = 1;
65962d28676SKristof Provost 	io.array = NULL;
66062d28676SKristof Provost 	if (ioctl(dev, DIOCXROLLBACK, &io) == 0)
66162d28676SKristof Provost 		atf_tc_fail("request with size -1 succeeded");
66262d28676SKristof Provost 
66362d28676SKristof Provost 	COMMON_CLEANUP();
66462d28676SKristof Provost }
66562d28676SKristof Provost 
666*87c7063cSKristof Provost ATF_TC(commit);
667*87c7063cSKristof Provost ATF_TC_HEAD(commit, tc)
668*87c7063cSKristof Provost {
669*87c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
670*87c7063cSKristof Provost }
671*87c7063cSKristof Provost 
6728e748b94SKristof Provost ATF_TC_BODY(commit, tc)
6738e748b94SKristof Provost {
6748e748b94SKristof Provost 	struct pfioc_trans io;
6758e748b94SKristof Provost 	struct pfioc_trans_e ioe;
6768e748b94SKristof Provost 
6778e748b94SKristof Provost 	COMMON_HEAD();
6788e748b94SKristof Provost 
6798e748b94SKristof Provost 	bzero(&io, sizeof(io));
6808e748b94SKristof Provost 	io.esize = sizeof(ioe);
6818e748b94SKristof Provost 	io.array = &ioe;
6828e748b94SKristof Provost 
6838e748b94SKristof Provost 	/* Negative size */
6848e748b94SKristof Provost 	io.size = -1;
6858e748b94SKristof Provost 	if (ioctl(dev, DIOCXCOMMIT, &io) == 0)
6868e748b94SKristof Provost 		atf_tc_fail("request with size -1 succeeded");
6878e748b94SKristof Provost 
6888e748b94SKristof Provost 	/* Overflow size */
6898e748b94SKristof Provost 	io.size = 1 << 30;
6908e748b94SKristof Provost 	if (ioctl(dev, DIOCXCOMMIT, &io) == 0)
6918e748b94SKristof Provost 		atf_tc_fail("request with size 1 << 30 succeeded");
6928e748b94SKristof Provost 
6938e748b94SKristof Provost 	/* NULL buffer */
6948e748b94SKristof Provost 	io.size = 1;
6958e748b94SKristof Provost 	io.array = NULL;
6968e748b94SKristof Provost 	if (ioctl(dev, DIOCXCOMMIT, &io) == 0)
6978e748b94SKristof Provost 		atf_tc_fail("request with size -1 succeeded");
6988e748b94SKristof Provost 
6998e748b94SKristof Provost 	COMMON_CLEANUP();
7008e748b94SKristof Provost }
7018e748b94SKristof Provost 
70298c5f988SKristof Provost ATF_TP_ADD_TCS(tp)
70398c5f988SKristof Provost {
70498c5f988SKristof Provost 	ATF_TP_ADD_TC(tp, addtables);
70598c5f988SKristof Provost 	ATF_TP_ADD_TC(tp, deltables);
7061ff545d6SKristof Provost 	ATF_TP_ADD_TC(tp, gettables);
7071ff545d6SKristof Provost 	ATF_TP_ADD_TC(tp, gettstats);
7081ff545d6SKristof Provost 	ATF_TP_ADD_TC(tp, clrtstats);
7091ff545d6SKristof Provost 	ATF_TP_ADD_TC(tp, settflags);
71062d28676SKristof Provost 	ATF_TP_ADD_TC(tp, addaddrs);
71162d28676SKristof Provost 	ATF_TP_ADD_TC(tp, deladdrs);
71262d28676SKristof Provost 	ATF_TP_ADD_TC(tp, setaddrs);
71362d28676SKristof Provost 	ATF_TP_ADD_TC(tp, getaddrs);
71462d28676SKristof Provost 	ATF_TP_ADD_TC(tp, clrastats);
71562d28676SKristof Provost 	ATF_TP_ADD_TC(tp, tstaddrs);
71662d28676SKristof Provost 	ATF_TP_ADD_TC(tp, inadefine);
7178e748b94SKristof Provost 	ATF_TP_ADD_TC(tp, igetifaces);
71862d28676SKristof Provost 	ATF_TP_ADD_TC(tp, cxbegin);
71962d28676SKristof Provost 	ATF_TP_ADD_TC(tp, cxrollback);
7208e748b94SKristof Provost 	ATF_TP_ADD_TC(tp, commit);
72198c5f988SKristof Provost 
72298c5f988SKristof Provost 	return (atf_no_error());
72398c5f988SKristof Provost }
724