]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - tests/sys/netpfil/pf/ioctl/validation.c
MFC r361065: pf tests: fix up a couple WARNS= 6 nits
[FreeBSD/FreeBSD.git] / tests / sys / netpfil / pf / ioctl / validation.c
1 /*-
2  * Copyright (c) 2018   Kristof Provost <kp@FreeBSD.org>
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23  * SUCH DAMAGE.
24  *
25  * $FreeBSD$
26  */
27
28 #include <sys/param.h>
29 #include <sys/module.h>
30 #include <sys/types.h>
31 #include <sys/ioctl.h>
32 #include <sys/socket.h>
33
34 #include <net/if.h>
35 #include <net/pfvar.h>
36
37 #include <fcntl.h>
38 #include <stdio.h>
39
40 #include <atf-c.h>
41
42 static int dev;
43
44 #define COMMON_HEAD() \
45         if (modfind("pf") == -1) \
46                 atf_tc_skip("pf not loaded"); \
47         dev = open("/dev/pf", O_RDWR); \
48         if (dev == -1) \
49                 atf_tc_skip("Failed to open /dev/pf");
50
51 #define COMMON_CLEANUP() \
52         close(dev);
53
54 static void
55 common_init_tbl(struct pfr_table *tbl)
56 {
57         bzero(tbl, sizeof(struct pfr_table));
58         strcpy(tbl->pfrt_anchor, "anchor");
59         strcpy(tbl->pfrt_name, "name");
60         tbl->pfrt_flags = 0;
61         tbl->pfrt_fback = 0;
62 }
63
64 ATF_TC_WITH_CLEANUP(addtables);
65 ATF_TC_HEAD(addtables, tc)
66 {
67         atf_tc_set_md_var(tc, "require.user", "root");
68 }
69
70 ATF_TC_BODY(addtables, tc)
71 {
72         struct pfioc_table io;
73         struct pfr_table tbl;
74         struct pfr_table tbls[4];
75         int flags;
76
77         COMMON_HEAD();
78
79         flags = 0;
80
81         bzero(&io, sizeof(io));
82         io.pfrio_flags = flags;
83         io.pfrio_buffer = &tbl;
84         io.pfrio_esize = sizeof(tbl);
85
86         /* Negative size */
87         io.pfrio_size = -1;
88         if (ioctl(dev, DIOCRADDTABLES, &io) == 0)
89                 atf_tc_fail("Request with size -1 succeeded");
90
91         /* Overly large size */
92         io.pfrio_size = 1 << 24;
93         if (ioctl(dev, DIOCRADDTABLES, &io) == 0)
94                 atf_tc_fail("Request with size 1 << 24 succeeded");
95
96         /* NULL buffer */
97         io.pfrio_size = 1;
98         io.pfrio_buffer = NULL;
99         if (ioctl(dev, DIOCRADDTABLES, &io) == 0)
100                 atf_tc_fail("Request with NULL buffer succeeded");
101
102         /* This can provoke a memory leak, see r331225. */
103         io.pfrio_size = 4;
104         for (int i = 0; i < io.pfrio_size; i++)
105                 common_init_tbl(&tbls[i]);
106
107         io.pfrio_buffer = &tbls;
108         ioctl(dev, DIOCRADDTABLES, &io);
109 }
110
111 ATF_TC_CLEANUP(addtables, tc)
112 {
113         COMMON_CLEANUP();
114 }
115
116 ATF_TC_WITH_CLEANUP(deltables);
117 ATF_TC_HEAD(deltables, tc)
118 {
119         atf_tc_set_md_var(tc, "require.user", "root");
120 }
121
122 ATF_TC_BODY(deltables, tc)
123 {
124         struct pfioc_table io;
125         struct pfr_table tbl;
126         int flags;
127
128         COMMON_HEAD();
129
130         flags = 0;
131
132         bzero(&io, sizeof(io));
133         io.pfrio_flags = flags;
134         io.pfrio_buffer = &tbl;
135         io.pfrio_esize = sizeof(tbl);
136
137         /* Negative size */
138         io.pfrio_size = -1;
139         if (ioctl(dev, DIOCRDELTABLES, &io) == 0)
140                 atf_tc_fail("Request with size -1 succeeded");
141
142         /* Overly large size */
143         io.pfrio_size = 1 << 24;
144         if (ioctl(dev, DIOCRDELTABLES, &io) == 0)
145                 atf_tc_fail("Request with size 1 << 24 succeeded");
146
147         /* NULL buffer */
148         io.pfrio_size = 1;
149         io.pfrio_buffer = NULL;
150         if (ioctl(dev, DIOCRDELTABLES, &io) == 0)
151                 atf_tc_fail("Request with NULL buffer succeeded");
152 }
153
154 ATF_TC_CLEANUP(deltables, tc)
155 {
156         COMMON_CLEANUP();
157 }
158
159 ATF_TC_WITH_CLEANUP(gettables);
160 ATF_TC_HEAD(gettables, tc)
161 {
162         atf_tc_set_md_var(tc, "require.user", "root");
163 }
164
165 ATF_TC_BODY(gettables, tc)
166 {
167         struct pfioc_table io;
168         struct pfr_table tbl;
169         int flags;
170
171         COMMON_HEAD();
172
173         flags = 0;
174
175         bzero(&io, sizeof(io));
176         io.pfrio_flags = flags;
177         io.pfrio_buffer = &tbl;
178         io.pfrio_esize = sizeof(tbl);
179
180         /* Negative size. This will succeed, because the kernel will not copy
181          * tables than it has. */
182         io.pfrio_size = -1;
183         if (ioctl(dev, DIOCRGETTABLES, &io) != 0)
184                 atf_tc_fail("Request with size -1 failed");
185
186         /* Overly large size. See above. */
187         io.pfrio_size = 1 << 24;
188         if (ioctl(dev, DIOCRGETTABLES, &io) != 0)
189                 atf_tc_fail("Request with size 1 << 24 failed");
190 }
191
192 ATF_TC_CLEANUP(gettables, tc)
193 {
194         COMMON_CLEANUP();
195 }
196
197 ATF_TC_WITH_CLEANUP(gettstats);
198 ATF_TC_HEAD(gettstats, tc)
199 {
200         atf_tc_set_md_var(tc, "require.user", "root");
201 }
202
203 ATF_TC_BODY(gettstats, tc)
204 {
205         struct pfioc_table io;
206         struct pfr_tstats stats;
207         int flags;
208
209         COMMON_HEAD();
210
211         flags = 0;
212
213         bzero(&io, sizeof(io));
214         io.pfrio_flags = flags;
215         io.pfrio_buffer = &stats;
216         io.pfrio_esize = sizeof(stats);
217
218         /* Negative size. This will succeed, because the kernel will not copy
219          * tables than it has. */
220         io.pfrio_size = -1;
221         if (ioctl(dev, DIOCRGETTSTATS, &io) != 0)
222                 atf_tc_fail("Request with size -1 failed");
223
224         /* Overly large size. See above. */
225         io.pfrio_size = 1 << 24;
226         if (ioctl(dev, DIOCRGETTSTATS, &io) != 0)
227                 atf_tc_fail("Request with size 1 << 24 failed");
228 }
229
230 ATF_TC_CLEANUP(gettstats, tc)
231 {
232         COMMON_CLEANUP();
233 }
234
235 ATF_TC_WITH_CLEANUP(clrtstats);
236 ATF_TC_HEAD(clrtstats, tc)
237 {
238         atf_tc_set_md_var(tc, "require.user", "root");
239 }
240
241 ATF_TC_BODY(clrtstats, tc)
242 {
243         struct pfioc_table io;
244         struct pfr_table tbl;
245         int flags;
246
247         COMMON_HEAD();
248
249         flags = 0;
250
251         common_init_tbl(&tbl);
252
253         bzero(&io, sizeof(io));
254         io.pfrio_flags = flags;
255         io.pfrio_buffer = &tbl;
256         io.pfrio_esize = sizeof(tbl);
257
258         /* Negative size. This will succeed, because the kernel will not copy
259          * tables than it has. */
260         io.pfrio_size = -1;
261         if (ioctl(dev, DIOCRCLRTSTATS, &io) != 0)
262                 atf_tc_fail("Request with size -1 failed ");
263
264         /* Overly large size. See above. */
265         io.pfrio_size = 1 << 24;
266         if (ioctl(dev, DIOCRCLRTSTATS, &io) != 0)
267                 atf_tc_fail("Request with size 1 << 24 failed");
268 }
269
270 ATF_TC_CLEANUP(clrtstats, tc)
271 {
272         COMMON_CLEANUP();
273 }
274
275 ATF_TC_WITH_CLEANUP(settflags);
276 ATF_TC_HEAD(settflags, tc)
277 {
278         atf_tc_set_md_var(tc, "require.user", "root");
279 }
280
281 ATF_TC_BODY(settflags, tc)
282 {
283         struct pfioc_table io;
284         struct pfr_table tbl;
285         int flags;
286
287         COMMON_HEAD();
288
289         flags = 0;
290
291         common_init_tbl(&tbl);
292
293         bzero(&io, sizeof(io));
294         io.pfrio_flags = flags;
295         io.pfrio_buffer = &tbl;
296         io.pfrio_esize = sizeof(tbl);
297
298         /* Negative size. This will succeed, because the kernel will not copy
299          * tables than it has. */
300         io.pfrio_size = -1;
301         if (ioctl(dev, DIOCRSETTFLAGS, &io) != 0)
302                 atf_tc_fail("Request with size -1 failed");
303
304         /* Overly large size. See above. */
305         io.pfrio_size = 1 << 28;
306         if (ioctl(dev, DIOCRSETTFLAGS, &io) != 0)
307                 atf_tc_fail("Request with size 1 << 24 failed");
308
309         /* NULL buffer */
310         io.pfrio_buffer = NULL;
311         if (ioctl(dev, DIOCRSETTFLAGS, &io) != -1)
312                 atf_tc_fail("Request with NULL buffer succeeded");
313 }
314
315 ATF_TC_CLEANUP(settflags, tc)
316 {
317         COMMON_CLEANUP();
318 }
319
320 ATF_TC_WITH_CLEANUP(addaddrs);
321 ATF_TC_HEAD(addaddrs, tc)
322 {
323         atf_tc_set_md_var(tc, "require.user", "root");
324 }
325
326 ATF_TC_BODY(addaddrs, tc)
327 {
328         struct pfioc_table io;
329         struct pfr_addr addr;
330
331         COMMON_HEAD();
332
333         bzero(&addr, sizeof(addr));
334         bzero(&io, sizeof(io));
335         io.pfrio_flags = 0;
336         io.pfrio_buffer = &addr;
337         io.pfrio_esize = sizeof(addr);
338
339         /* Negative size. */
340         io.pfrio_size = -1;
341         if (ioctl(dev, DIOCRADDADDRS, &io) == 0)
342                 atf_tc_fail("Request with size -1 succeeded");
343
344         /* Overly large size. */
345         io.pfrio_size = 1 << 28;
346         if (ioctl(dev, DIOCRADDADDRS, &io) == 0)
347                 atf_tc_fail("Reuqest with size 1 << 28 failed");
348 }
349
350 ATF_TC_CLEANUP(addaddrs, tc)
351 {
352         COMMON_CLEANUP();
353 }
354
355 ATF_TC_WITH_CLEANUP(deladdrs);
356 ATF_TC_HEAD(deladdrs, tc)
357 {
358         atf_tc_set_md_var(tc, "require.user", "root");
359 }
360
361 ATF_TC_BODY(deladdrs, tc)
362 {
363         struct pfioc_table io;
364         struct pfr_addr addr;
365
366         COMMON_HEAD();
367
368         bzero(&addr, sizeof(addr));
369         bzero(&io, sizeof(io));
370         io.pfrio_flags = 0;
371         io.pfrio_buffer = &addr;
372         io.pfrio_esize = sizeof(addr);
373
374         /* Negative size. */
375         io.pfrio_size = -1;
376         if (ioctl(dev, DIOCRDELADDRS, &io) == 0)
377                 atf_tc_fail("Request with size -1 succeeded");
378
379         /* Overly large size. */
380         io.pfrio_size = 1 << 28;
381         if (ioctl(dev, DIOCRDELADDRS, &io) == 0)
382                 atf_tc_fail("Reuqest with size 1 << 28 failed");
383 }
384
385 ATF_TC_CLEANUP(deladdrs, tc)
386 {
387         COMMON_CLEANUP();
388 }
389
390 ATF_TC_WITH_CLEANUP(setaddrs);
391 ATF_TC_HEAD(setaddrs, tc)
392 {
393         atf_tc_set_md_var(tc, "require.user", "root");
394 }
395
396 ATF_TC_BODY(setaddrs, tc)
397 {
398         struct pfioc_table io;
399         struct pfr_addr addr;
400
401         COMMON_HEAD();
402
403         bzero(&addr, sizeof(addr));
404         bzero(&io, sizeof(io));
405         io.pfrio_flags = 0;
406         io.pfrio_buffer = &addr;
407         io.pfrio_esize = sizeof(addr);
408
409         /* Negative size. */
410         io.pfrio_size = -1;
411         if (ioctl(dev, DIOCRSETADDRS, &io) == 0)
412                 atf_tc_fail("Request with size -1 succeeded");
413
414         /* Overly large size. */
415         io.pfrio_size = 1 << 28;
416         if (ioctl(dev, DIOCRSETADDRS, &io) == 0)
417                 atf_tc_fail("Reuqest with size 1 << 28 failed");
418 }
419
420 ATF_TC_CLEANUP(setaddrs, tc)
421 {
422         COMMON_CLEANUP();
423 }
424
425 ATF_TC_WITH_CLEANUP(getaddrs);
426 ATF_TC_HEAD(getaddrs, tc)
427 {
428         atf_tc_set_md_var(tc, "require.user", "root");
429 }
430
431 ATF_TC_BODY(getaddrs, tc)
432 {
433         struct pfioc_table io;
434         struct pfr_addr addr;
435
436         COMMON_HEAD();
437
438         bzero(&addr, sizeof(addr));
439         bzero(&io, sizeof(io));
440         io.pfrio_flags = 0;
441         io.pfrio_buffer = &addr;
442         io.pfrio_esize = sizeof(addr);
443
444         common_init_tbl(&io.pfrio_table);
445
446         /* Negative size. */
447         io.pfrio_size = -1;
448         if (ioctl(dev, DIOCRGETADDRS, &io) == 0)
449                 atf_tc_fail("Request with size -1 succeeded");
450
451         /* Overly large size. */
452         io.pfrio_size = 1 << 24;
453         if (ioctl(dev, DIOCRGETADDRS, &io) == 0)
454                 atf_tc_fail("Request with size 1 << 24 failed");
455 }
456
457 ATF_TC_CLEANUP(getaddrs, tc)
458 {
459         COMMON_CLEANUP();
460 }
461
462 ATF_TC_WITH_CLEANUP(getastats);
463 ATF_TC_HEAD(getastats, tc)
464 {
465         atf_tc_set_md_var(tc, "require.user", "root");
466 }
467
468 ATF_TC_BODY(getastats, tc)
469 {
470         struct pfioc_table io;
471         struct pfr_astats astats;
472
473         COMMON_HEAD();
474
475         bzero(&astats, sizeof(astats));
476         bzero(&io, sizeof(io));
477         io.pfrio_flags = 0;
478         io.pfrio_buffer = &astats;
479         io.pfrio_esize = sizeof(astats);
480
481         common_init_tbl(&io.pfrio_table);
482
483         /* Negative size. */
484         io.pfrio_size = -1;
485         if (ioctl(dev, DIOCRGETASTATS, &io) == 0)
486                 atf_tc_fail("Request with size -1 succeeded");
487
488         /* Overly large size. */
489         io.pfrio_size = 1 << 24;
490         if (ioctl(dev, DIOCRGETASTATS, &io) == 0)
491                 atf_tc_fail("Request with size 1 << 24 failed");
492 }
493
494 ATF_TC_CLEANUP(getastats, tc)
495 {
496         COMMON_CLEANUP();
497 }
498
499 ATF_TC_WITH_CLEANUP(clrastats);
500 ATF_TC_HEAD(clrastats, tc)
501 {
502         atf_tc_set_md_var(tc, "require.user", "root");
503 }
504
505 ATF_TC_BODY(clrastats, tc)
506 {
507         struct pfioc_table io;
508         struct pfr_addr addr;
509
510         COMMON_HEAD();
511
512         bzero(&addr, sizeof(addr));
513         bzero(&io, sizeof(io));
514         io.pfrio_flags = 0;
515         io.pfrio_buffer = &addr;
516         io.pfrio_esize = sizeof(addr);
517
518         common_init_tbl(&io.pfrio_table);
519
520         /* Negative size. */
521         io.pfrio_size = -1;
522         if (ioctl(dev, DIOCRCLRASTATS, &io) == 0)
523                 atf_tc_fail("Request with size -1 succeeded");
524
525         /* Overly large size. */
526         io.pfrio_size = 1 << 24;
527         if (ioctl(dev, DIOCRCLRASTATS, &io) == 0)
528                 atf_tc_fail("Request with size 1 << 24 failed");
529 }
530
531 ATF_TC_CLEANUP(clrastats, tc)
532 {
533         COMMON_CLEANUP();
534 }
535
536 ATF_TC_WITH_CLEANUP(tstaddrs);
537 ATF_TC_HEAD(tstaddrs, tc)
538 {
539         atf_tc_set_md_var(tc, "require.user", "root");
540 }
541
542 ATF_TC_BODY(tstaddrs, tc)
543 {
544         struct pfioc_table io;
545         struct pfr_addr addr;
546
547         COMMON_HEAD();
548
549         bzero(&addr, sizeof(addr));
550         bzero(&io, sizeof(io));
551         io.pfrio_flags = 0;
552         io.pfrio_buffer = &addr;
553         io.pfrio_esize = sizeof(addr);
554
555         common_init_tbl(&io.pfrio_table);
556
557         /* Negative size. */
558         io.pfrio_size = -1;
559         if (ioctl(dev, DIOCRTSTADDRS, &io) == 0)
560                 atf_tc_fail("Request with size -1 succeeded");
561
562         /* Overly large size. */
563         io.pfrio_size = 1 << 24;
564         if (ioctl(dev, DIOCRTSTADDRS, &io) == 0)
565                 atf_tc_fail("Request with size 1 << 24 failed");
566 }
567
568 ATF_TC_CLEANUP(tstaddrs, tc)
569 {
570         COMMON_CLEANUP();
571 }
572
573 ATF_TC_WITH_CLEANUP(inadefine);
574 ATF_TC_HEAD(inadefine, tc)
575 {
576         atf_tc_set_md_var(tc, "require.user", "root");
577 }
578
579 ATF_TC_BODY(inadefine, tc)
580 {
581         struct pfioc_table io;
582         struct pfr_addr addr;
583
584         COMMON_HEAD();
585
586         bzero(&addr, sizeof(addr));
587         bzero(&io, sizeof(io));
588         io.pfrio_flags = 0;
589         io.pfrio_buffer = &addr;
590         io.pfrio_esize = sizeof(addr);
591
592         common_init_tbl(&io.pfrio_table);
593
594         /* Negative size. */
595         io.pfrio_size = -1;
596         if (ioctl(dev, DIOCRINADEFINE, &io) == 0)
597                 atf_tc_fail("Request with size -1 succeeded");
598
599         /* Overly large size. */
600         io.pfrio_size = 1 << 24;
601         if (ioctl(dev, DIOCRINADEFINE, &io) == 0)
602                 atf_tc_fail("Request with size 1 << 24 failed");
603 }
604
605 ATF_TC_CLEANUP(inadefine, tc)
606 {
607         COMMON_CLEANUP();
608 }
609
610 ATF_TC_WITH_CLEANUP(igetifaces);
611 ATF_TC_HEAD(igetifaces, tc)
612 {
613         atf_tc_set_md_var(tc, "require.user", "root");
614 }
615
616 ATF_TC_BODY(igetifaces, tc)
617 {
618         struct pfioc_iface io;
619         struct pfi_kif kif;
620
621         COMMON_HEAD();
622
623         bzero(&io, sizeof(io));
624         io.pfiio_flags = 0;
625         io.pfiio_buffer = &kif;
626         io.pfiio_esize = sizeof(kif);
627
628         /* Negative size */
629         io.pfiio_size = -1;
630         if (ioctl(dev, DIOCIGETIFACES, &io) == 0)
631                 atf_tc_fail("request with size -1 succeeded");
632
633         /* Overflow size */
634         io.pfiio_size = 1 << 31;
635         if (ioctl(dev, DIOCIGETIFACES, &io) == 0)
636                 atf_tc_fail("request with size 1 << 31 succeeded");
637 }
638
639 ATF_TC_CLEANUP(igetifaces, tc)
640 {
641         COMMON_CLEANUP();
642 }
643
644 ATF_TC_WITH_CLEANUP(cxbegin);
645 ATF_TC_HEAD(cxbegin, tc)
646 {
647         atf_tc_set_md_var(tc, "require.user", "root");
648 }
649
650 ATF_TC_BODY(cxbegin, tc)
651 {
652         struct pfioc_trans io;
653         struct pfioc_trans_e ioe;
654
655         COMMON_HEAD();
656
657         bzero(&io, sizeof(io));
658         io.esize = sizeof(ioe);
659         io.array = &ioe;
660
661         /* Negative size */
662         io.size = -1;
663         if (ioctl(dev, DIOCXBEGIN, &io) == 0)
664                 atf_tc_fail("request with size -1 succeeded");
665
666         /* Overflow size */
667         io.size = 1 << 30;
668         if (ioctl(dev, DIOCXBEGIN, &io) == 0)
669                 atf_tc_fail("request with size 1 << 30 succeeded");
670
671         /* NULL buffer */
672         io.size = 1;
673         io.array = NULL;
674         if (ioctl(dev, DIOCXBEGIN, &io) == 0)
675                 atf_tc_fail("request with size -1 succeeded");
676 }
677
678 ATF_TC_CLEANUP(cxbegin, tc)
679 {
680         COMMON_CLEANUP();
681 }
682
683 ATF_TC_WITH_CLEANUP(cxrollback);
684 ATF_TC_HEAD(cxrollback, tc)
685 {
686         atf_tc_set_md_var(tc, "require.user", "root");
687 }
688
689 ATF_TC_BODY(cxrollback, tc)
690 {
691         struct pfioc_trans io;
692         struct pfioc_trans_e ioe;
693
694         COMMON_HEAD();
695
696         bzero(&io, sizeof(io));
697         io.esize = sizeof(ioe);
698         io.array = &ioe;
699
700         /* Negative size */
701         io.size = -1;
702         if (ioctl(dev, DIOCXROLLBACK, &io) == 0)
703                 atf_tc_fail("request with size -1 succeeded");
704
705         /* Overflow size */
706         io.size = 1 << 30;
707         if (ioctl(dev, DIOCXROLLBACK, &io) == 0)
708                 atf_tc_fail("request with size 1 << 30 succeeded");
709
710         /* NULL buffer */
711         io.size = 1;
712         io.array = NULL;
713         if (ioctl(dev, DIOCXROLLBACK, &io) == 0)
714                 atf_tc_fail("request with size -1 succeeded");
715 }
716
717 ATF_TC_CLEANUP(cxrollback, tc)
718 {
719         COMMON_CLEANUP();
720 }
721
722 ATF_TC_WITH_CLEANUP(commit);
723 ATF_TC_HEAD(commit, tc)
724 {
725         atf_tc_set_md_var(tc, "require.user", "root");
726 }
727
728 ATF_TC_BODY(commit, tc)
729 {
730         struct pfioc_trans io;
731         struct pfioc_trans_e ioe;
732
733         COMMON_HEAD();
734
735         bzero(&io, sizeof(io));
736         io.esize = sizeof(ioe);
737         io.array = &ioe;
738
739         /* Negative size */
740         io.size = -1;
741         if (ioctl(dev, DIOCXCOMMIT, &io) == 0)
742                 atf_tc_fail("request with size -1 succeeded");
743
744         /* Overflow size */
745         io.size = 1 << 30;
746         if (ioctl(dev, DIOCXCOMMIT, &io) == 0)
747                 atf_tc_fail("request with size 1 << 30 succeeded");
748
749         /* NULL buffer */
750         io.size = 1;
751         io.array = NULL;
752         if (ioctl(dev, DIOCXCOMMIT, &io) == 0)
753                 atf_tc_fail("request with size -1 succeeded");
754 }
755
756 ATF_TC_CLEANUP(commit, tc)
757 {
758         COMMON_CLEANUP();
759 }
760
761 ATF_TC_WITH_CLEANUP(getsrcnodes);
762 ATF_TC_HEAD(getsrcnodes, tc)
763 {
764         atf_tc_set_md_var(tc, "require.user", "root");
765 }
766
767 ATF_TC_BODY(getsrcnodes, tc)
768 {
769         struct pfioc_src_nodes psn;
770
771         COMMON_HEAD();
772
773         bzero(&psn, sizeof(psn));
774
775         psn.psn_len = -1;
776         if (ioctl(dev, DIOCGETSRCNODES, &psn) != 0)
777                 atf_tc_fail("request with size -1 failed");
778
779         psn.psn_len = 1 << 30;
780         if (ioctl(dev, DIOCGETSRCNODES, &psn) != 0)
781                 atf_tc_fail("request with size << 30 failed");
782
783         psn.psn_len = 1 << 31;
784         if (ioctl(dev, DIOCGETSRCNODES, &psn) != 0)
785                 atf_tc_fail("request with size << 30 failed");
786 }
787
788 ATF_TC_CLEANUP(getsrcnodes, tc)
789 {
790         COMMON_CLEANUP();
791 }
792
793 ATF_TP_ADD_TCS(tp)
794 {
795         ATF_TP_ADD_TC(tp, addtables);
796         ATF_TP_ADD_TC(tp, deltables);
797         ATF_TP_ADD_TC(tp, gettables);
798         ATF_TP_ADD_TC(tp, getastats);
799         ATF_TP_ADD_TC(tp, gettstats);
800         ATF_TP_ADD_TC(tp, clrtstats);
801         ATF_TP_ADD_TC(tp, settflags);
802         ATF_TP_ADD_TC(tp, addaddrs);
803         ATF_TP_ADD_TC(tp, deladdrs);
804         ATF_TP_ADD_TC(tp, setaddrs);
805         ATF_TP_ADD_TC(tp, getaddrs);
806         ATF_TP_ADD_TC(tp, clrastats);
807         ATF_TP_ADD_TC(tp, tstaddrs);
808         ATF_TP_ADD_TC(tp, inadefine);
809         ATF_TP_ADD_TC(tp, igetifaces);
810         ATF_TP_ADD_TC(tp, cxbegin);
811         ATF_TP_ADD_TC(tp, cxrollback);
812         ATF_TP_ADD_TC(tp, commit);
813         ATF_TP_ADD_TC(tp, getsrcnodes);
814
815         return (atf_no_error());
816 }