]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - tests/sys/audit/administrative.c
zfs: merge openzfs/zfs@804414aad
[FreeBSD/FreeBSD.git] / tests / sys / audit / administrative.c
1 /*-
2  * Copyright (c) 2018 Aniket Pandey
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  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * SUCH DAMAGE.
24  */
25
26 #include <sys/param.h>
27 #include <sys/mount.h>
28 #include <sys/reboot.h>
29 #include <sys/stat.h>
30 #include <sys/sysctl.h>
31 #include <sys/time.h>
32 #include <sys/timespec.h>
33 #include <sys/timex.h>
34
35 #include <bsm/audit.h>
36 #include <bsm/audit_kevents.h>
37 #include <ufs/ufs/quota.h>
38
39 #include <atf-c.h>
40 #include <errno.h>
41 #include <fcntl.h>
42 #include <stdlib.h>
43 #include <time.h>
44 #include <unistd.h>
45
46 #include "utils.h"
47
48 static pid_t pid;
49 static int filedesc;
50 /* Default argument for handling ENOSYS in auditon(2) functions */
51 static int auditon_def = 0;
52 static mode_t mode = 0777;
53 static struct pollfd fds[1];
54 static char adregex[80];
55 static const char *auclass = "ad";
56 static const char *path = "fileforaudit";
57 static const char *successreg = "fileforaudit.*return,success";
58
59
60 ATF_TC_WITH_CLEANUP(settimeofday_success);
61 ATF_TC_HEAD(settimeofday_success, tc)
62 {
63         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
64                                         "settimeofday(2) call");
65 }
66
67 ATF_TC_BODY(settimeofday_success, tc)
68 {
69         pid = getpid();
70         snprintf(adregex, sizeof(adregex), "settimeofday.*%d.*success", pid);
71
72         struct timeval tp;
73         struct timezone tzp;
74         ATF_REQUIRE_EQ(0, gettimeofday(&tp, &tzp));
75
76         FILE *pipefd = setup(fds, auclass);
77         /* Setting the same time as obtained by gettimeofday(2) */
78         ATF_REQUIRE_EQ(0, settimeofday(&tp, &tzp));
79         check_audit(fds, adregex, pipefd);
80 }
81
82 ATF_TC_CLEANUP(settimeofday_success, tc)
83 {
84         cleanup();
85 }
86
87
88 ATF_TC_WITH_CLEANUP(settimeofday_failure);
89 ATF_TC_HEAD(settimeofday_failure, tc)
90 {
91         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
92                                         "settimeofday(2) call");
93 }
94
95 ATF_TC_BODY(settimeofday_failure, tc)
96 {
97         pid = getpid();
98         snprintf(adregex, sizeof(adregex), "settimeofday.*%d.*failure", pid);
99
100         struct timeval tp;
101         struct timezone tzp;
102         ATF_REQUIRE_EQ(0, gettimeofday(&tp, &tzp));
103
104         FILE *pipefd = setup(fds, auclass);
105         tp.tv_sec = -1;
106         /* Failure reason: Invalid value for tp.tv_sec; */
107         ATF_REQUIRE_EQ(-1, settimeofday(&tp, &tzp));
108         check_audit(fds, adregex, pipefd);
109 }
110
111 ATF_TC_CLEANUP(settimeofday_failure, tc)
112 {
113         cleanup();
114 }
115
116
117 ATF_TC_WITH_CLEANUP(clock_settime_success);
118 ATF_TC_HEAD(clock_settime_success, tc)
119 {
120         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
121                                         "clock_settime(2) call");
122 }
123
124 ATF_TC_BODY(clock_settime_success, tc)
125 {
126         pid = getpid();
127         snprintf(adregex, sizeof(adregex), "clock_settime.*%d.*success", pid);
128
129         struct timespec tp;
130         ATF_REQUIRE_EQ(0, clock_gettime(CLOCK_REALTIME, &tp));
131
132         FILE *pipefd = setup(fds, auclass);
133         /* Setting the same time as obtained by clock_gettime(2) */
134         ATF_REQUIRE_EQ(0, clock_settime(CLOCK_REALTIME, &tp));
135         check_audit(fds, adregex, pipefd);
136 }
137
138 ATF_TC_CLEANUP(clock_settime_success, tc)
139 {
140         cleanup();
141 }
142
143
144 ATF_TC_WITH_CLEANUP(clock_settime_failure);
145 ATF_TC_HEAD(clock_settime_failure, tc)
146 {
147         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
148                                         "clock_settime(2) call");
149 }
150
151 ATF_TC_BODY(clock_settime_failure, tc)
152 {
153         pid = getpid();
154         snprintf(adregex, sizeof(adregex), "clock_settime.*%d.*failure", pid);
155
156         struct timespec tp;
157         ATF_REQUIRE_EQ(0, clock_gettime(CLOCK_MONOTONIC, &tp));
158
159         FILE *pipefd = setup(fds, auclass);
160         /* Failure reason: cannot use CLOCK_MONOTONIC to set the system time */
161         ATF_REQUIRE_EQ(-1, clock_settime(CLOCK_MONOTONIC, &tp));
162         check_audit(fds, adregex, pipefd);
163 }
164
165 ATF_TC_CLEANUP(clock_settime_failure, tc)
166 {
167         cleanup();
168 }
169
170
171 ATF_TC_WITH_CLEANUP(adjtime_success);
172 ATF_TC_HEAD(adjtime_success, tc)
173 {
174         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
175                                         "adjtime(2) call");
176 }
177
178 ATF_TC_BODY(adjtime_success, tc)
179 {
180         pid = getpid();
181         snprintf(adregex, sizeof(adregex), "adjtime.*%d.*return,success", pid);
182
183         FILE *pipefd = setup(fds, auclass);
184         /* We don't want to change the system time, hence NULL */
185         ATF_REQUIRE_EQ(0, adjtime(NULL, NULL));
186         check_audit(fds, adregex, pipefd);
187 }
188
189 ATF_TC_CLEANUP(adjtime_success, tc)
190 {
191         cleanup();
192 }
193
194
195 ATF_TC_WITH_CLEANUP(adjtime_failure);
196 ATF_TC_HEAD(adjtime_failure, tc)
197 {
198         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
199                                         "adjtime(2) call");
200 }
201
202 ATF_TC_BODY(adjtime_failure, tc)
203 {
204         pid = getpid();
205         snprintf(adregex, sizeof(adregex), "adjtime.*%d.*return,failure", pid);
206
207         FILE *pipefd = setup(fds, auclass);
208         ATF_REQUIRE_EQ(-1, adjtime((struct timeval *)(-1), NULL));
209         check_audit(fds, adregex, pipefd);
210 }
211
212 ATF_TC_CLEANUP(adjtime_failure, tc)
213 {
214         cleanup();
215 }
216
217
218 ATF_TC_WITH_CLEANUP(ntp_adjtime_success);
219 ATF_TC_HEAD(ntp_adjtime_success, tc)
220 {
221         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
222                                         "ntp_adjtime(2) call");
223 }
224
225 ATF_TC_BODY(ntp_adjtime_success, tc)
226 {
227         struct timex timebuff;
228         bzero(&timebuff, sizeof(timebuff));
229
230         pid = getpid();
231         snprintf(adregex, sizeof(adregex), "ntp_adjtime.*%d.*success", pid);
232
233         FILE *pipefd = setup(fds, auclass);
234         ATF_REQUIRE(ntp_adjtime(&timebuff) != -1);
235         check_audit(fds, adregex, pipefd);
236 }
237
238 ATF_TC_CLEANUP(ntp_adjtime_success, tc)
239 {
240         cleanup();
241 }
242
243
244 ATF_TC_WITH_CLEANUP(ntp_adjtime_failure);
245 ATF_TC_HEAD(ntp_adjtime_failure, tc)
246 {
247         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
248                                         "ntp_adjtime(2) call");
249 }
250
251 ATF_TC_BODY(ntp_adjtime_failure, tc)
252 {
253         pid = getpid();
254         snprintf(adregex, sizeof(adregex), "ntp_adjtime.*%d.*failure", pid);
255
256         FILE *pipefd = setup(fds, auclass);
257         ATF_REQUIRE_EQ(-1, ntp_adjtime(NULL));
258         check_audit(fds, adregex, pipefd);
259 }
260
261 ATF_TC_CLEANUP(ntp_adjtime_failure, tc)
262 {
263         cleanup();
264 }
265
266
267 ATF_TC_WITH_CLEANUP(nfs_getfh_success);
268 ATF_TC_HEAD(nfs_getfh_success, tc)
269 {
270         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
271                                         "getfh(2) call");
272 }
273
274 ATF_TC_BODY(nfs_getfh_success, tc)
275 {
276         fhandle_t fhp;
277         pid = getpid();
278         snprintf(adregex, sizeof(adregex), "nfs_getfh.*%d.*ret.*success", pid);
279
280         /* File needs to exist to call getfh(2) */
281         ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
282         FILE *pipefd = setup(fds, auclass);
283         ATF_REQUIRE_EQ(0, getfh(path, &fhp));
284         check_audit(fds, adregex, pipefd);
285         close(filedesc);
286 }
287
288 ATF_TC_CLEANUP(nfs_getfh_success, tc)
289 {
290         cleanup();
291 }
292
293
294 ATF_TC_WITH_CLEANUP(nfs_getfh_failure);
295 ATF_TC_HEAD(nfs_getfh_failure, tc)
296 {
297         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
298                                         "getfh(2) call");
299 }
300
301 ATF_TC_BODY(nfs_getfh_failure, tc)
302 {
303         pid = getpid();
304         snprintf(adregex, sizeof(adregex), "nfs_getfh.*%d.*ret.*failure", pid);
305
306         FILE *pipefd = setup(fds, auclass);
307         /* Failure reason: file does not exist */
308         ATF_REQUIRE_EQ(-1, getfh(path, NULL));
309         check_audit(fds, adregex, pipefd);
310 }
311
312 ATF_TC_CLEANUP(nfs_getfh_failure, tc)
313 {
314         cleanup();
315 }
316
317
318 ATF_TC_WITH_CLEANUP(auditctl_success);
319 ATF_TC_HEAD(auditctl_success, tc)
320 {
321         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
322                                         "auditctl(2) call");
323 }
324
325 ATF_TC_BODY(auditctl_success, tc)
326 {
327         /* File needs to exist in order to call auditctl(2) */
328         ATF_REQUIRE((filedesc = open(path, O_CREAT | O_WRONLY, mode)) != -1);
329         FILE *pipefd = setup(fds, auclass);
330         ATF_REQUIRE_EQ(0, auditctl(path));
331         check_audit(fds, successreg, pipefd);
332         close(filedesc);
333 }
334
335 ATF_TC_CLEANUP(auditctl_success, tc)
336 {
337         /*
338          * auditctl(2) disables audit log at /var/audit and initiates auditing
339          * at the configured path. To reset this, we need to stop and start the
340          * auditd(8) again. Here, we check if auditd(8) was running already
341          * before the test started. If so, we stop and start it again.
342          *
343          * TODO: should we skip this test if auditd(8) is already running to
344          * avoid restarting it?
345          */
346         if (!atf_utils_file_exists("started_fake_auditd")) {
347                 system("service auditd onestop > /dev/null 2>&1");
348                 system("service auditd onestart > /dev/null 2>&1");
349         } else {
350                 cleanup();
351         }
352 }
353
354
355 ATF_TC_WITH_CLEANUP(auditctl_failure);
356 ATF_TC_HEAD(auditctl_failure, tc)
357 {
358         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
359                                         "auditctl(2) call");
360 }
361
362 ATF_TC_BODY(auditctl_failure, tc)
363 {
364         pid = getpid();
365         snprintf(adregex, sizeof(adregex), "auditctl.*%d.*return,failure", pid);
366
367         FILE *pipefd = setup(fds, auclass);
368         /* Failure reason: file does not exist */
369         ATF_REQUIRE_EQ(-1, auditctl(NULL));
370         check_audit(fds, adregex, pipefd);
371 }
372
373 ATF_TC_CLEANUP(auditctl_failure, tc)
374 {
375         cleanup();
376 }
377
378
379 ATF_TC_WITH_CLEANUP(acct_success);
380 ATF_TC_HEAD(acct_success, tc)
381 {
382         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
383                                         "acct(2) call");
384         atf_tc_set_md_var(tc, "require.files",
385             "/etc/rc.d/accounting /etc/rc.d/auditd");
386 }
387
388 ATF_TC_BODY(acct_success, tc)
389 {
390         int acctinfo, filedesc2;
391         size_t len = sizeof(acctinfo);
392         const char *acctname = "kern.acct_configured";
393         ATF_REQUIRE_EQ(0, sysctlbyname(acctname, &acctinfo, &len, NULL, 0));
394
395         /* File needs to exist to start system accounting */
396         ATF_REQUIRE((filedesc = open(path, O_CREAT | O_RDWR, mode)) != -1);
397
398         /*
399          * acctinfo = 0: System accounting was disabled
400          * acctinfo = 1: System accounting was enabled
401          */
402         if (acctinfo) {
403                 ATF_REQUIRE((filedesc2 = open("acct_ok", O_CREAT, mode)) != -1);
404                 close(filedesc2);
405         }
406
407         pid = getpid();
408         snprintf(adregex, sizeof(adregex),
409                 "acct.*%s.*%d.*return,success", path, pid);
410
411         /*
412          * We temporarily switch the accounting record to a file at
413          * our own configured path in order to confirm acct(2)'s successful
414          * auditing. Then we set everything back to its original state.
415          */
416         FILE *pipefd = setup(fds, auclass);
417         ATF_REQUIRE_EQ(0, acct(path));
418         check_audit(fds, adregex, pipefd);
419         close(filedesc);
420 }
421
422 ATF_TC_CLEANUP(acct_success, tc)
423 {
424         /* Reset accounting configured path */
425         ATF_REQUIRE_EQ(0, system("service accounting onestop"));
426         if (atf_utils_file_exists("acct_ok")) {
427                 ATF_REQUIRE_EQ(0, system("service accounting onestart"));
428         }
429         cleanup();
430 }
431
432
433 ATF_TC_WITH_CLEANUP(acct_failure);
434 ATF_TC_HEAD(acct_failure, tc)
435 {
436         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
437                                         "acct(2) call");
438 }
439
440 ATF_TC_BODY(acct_failure, tc)
441 {
442         pid = getpid();
443         snprintf(adregex, sizeof(adregex), "acct.*%d.*return,failure", pid);
444
445         FILE *pipefd = setup(fds, auclass);
446         /* Failure reason: File does not exist */
447         ATF_REQUIRE_EQ(-1, acct(path));
448         check_audit(fds, adregex, pipefd);
449 }
450
451 ATF_TC_CLEANUP(acct_failure, tc)
452 {
453         cleanup();
454 }
455
456
457 ATF_TC_WITH_CLEANUP(getauid_success);
458 ATF_TC_HEAD(getauid_success, tc)
459 {
460         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
461                                         "getauid(2) call");
462 }
463
464 ATF_TC_BODY(getauid_success, tc)
465 {
466         au_id_t auid;
467         pid = getpid();
468         snprintf(adregex, sizeof(adregex), "getauid.*%d.*return,success", pid);
469
470         FILE *pipefd = setup(fds, auclass);
471         ATF_REQUIRE_EQ(0, getauid(&auid));
472         check_audit(fds, adregex, pipefd);
473 }
474
475 ATF_TC_CLEANUP(getauid_success, tc)
476 {
477         cleanup();
478 }
479
480
481 ATF_TC_WITH_CLEANUP(getauid_failure);
482 ATF_TC_HEAD(getauid_failure, tc)
483 {
484         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
485                                         "getauid(2) call");
486 }
487
488 ATF_TC_BODY(getauid_failure, tc)
489 {
490         pid = getpid();
491         snprintf(adregex, sizeof(adregex), "getauid.*%d.*return,failure", pid);
492
493         FILE *pipefd = setup(fds, auclass);
494         /* Failure reason: Bad address */
495         ATF_REQUIRE_EQ(-1, getauid(NULL));
496         check_audit(fds, adregex, pipefd);
497 }
498
499 ATF_TC_CLEANUP(getauid_failure, tc)
500 {
501         cleanup();
502 }
503
504
505 ATF_TC_WITH_CLEANUP(setauid_success);
506 ATF_TC_HEAD(setauid_success, tc)
507 {
508         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
509                                         "setauid(2) call");
510 }
511
512 ATF_TC_BODY(setauid_success, tc)
513 {
514         au_id_t auid;
515         pid = getpid();
516         snprintf(adregex, sizeof(adregex), "setauid.*%d.*return,success", pid);
517         ATF_REQUIRE_EQ(0, getauid(&auid));
518
519         FILE *pipefd = setup(fds, auclass);
520         ATF_REQUIRE_EQ(0, setauid(&auid));
521         check_audit(fds, adregex, pipefd);
522 }
523
524 ATF_TC_CLEANUP(setauid_success, tc)
525 {
526         cleanup();
527 }
528
529
530 ATF_TC_WITH_CLEANUP(setauid_failure);
531 ATF_TC_HEAD(setauid_failure, tc)
532 {
533         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
534                                         "setauid(2) call");
535 }
536
537 ATF_TC_BODY(setauid_failure, tc)
538 {
539         pid = getpid();
540         snprintf(adregex, sizeof(adregex), "setauid.*%d.*return,failure", pid);
541
542         FILE *pipefd = setup(fds, auclass);
543         /* Failure reason: Bad address */
544         ATF_REQUIRE_EQ(-1, setauid(NULL));
545         check_audit(fds, adregex, pipefd);
546 }
547
548 ATF_TC_CLEANUP(setauid_failure, tc)
549 {
550         cleanup();
551 }
552
553
554 ATF_TC_WITH_CLEANUP(getaudit_success);
555 ATF_TC_HEAD(getaudit_success, tc)
556 {
557         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
558                                         "getaudit(2) call");
559 }
560
561 ATF_TC_BODY(getaudit_success, tc)
562 {
563         pid = getpid();
564         auditinfo_t auditinfo;
565         snprintf(adregex, sizeof(adregex), "getaudit.*%d.*return,success", pid);
566
567         FILE *pipefd = setup(fds, auclass);
568         ATF_REQUIRE_EQ(0, getaudit(&auditinfo));
569         check_audit(fds, adregex, pipefd);
570 }
571
572 ATF_TC_CLEANUP(getaudit_success, tc)
573 {
574         cleanup();
575 }
576
577
578 ATF_TC_WITH_CLEANUP(getaudit_failure);
579 ATF_TC_HEAD(getaudit_failure, tc)
580 {
581         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
582                                         "getaudit(2) call");
583 }
584
585 ATF_TC_BODY(getaudit_failure, tc)
586 {
587         pid = getpid();
588         snprintf(adregex, sizeof(adregex), "getaudit.*%d.*return,failure", pid);
589
590         FILE *pipefd = setup(fds, auclass);
591         /* Failure reason: Bad address */
592         ATF_REQUIRE_EQ(-1, getaudit(NULL));
593         check_audit(fds, adregex, pipefd);
594 }
595
596 ATF_TC_CLEANUP(getaudit_failure, tc)
597 {
598         cleanup();
599 }
600
601
602 ATF_TC_WITH_CLEANUP(setaudit_success);
603 ATF_TC_HEAD(setaudit_success, tc)
604 {
605         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
606                                         "setaudit(2) call");
607 }
608
609 ATF_TC_BODY(setaudit_success, tc)
610 {
611         pid = getpid();
612         auditinfo_t auditinfo;
613         snprintf(adregex, sizeof(adregex), "setaudit.*%d.*return,success", pid);
614         ATF_REQUIRE_EQ(0, getaudit(&auditinfo));
615
616         FILE *pipefd = setup(fds, auclass);
617         ATF_REQUIRE_EQ(0, setaudit(&auditinfo));
618         check_audit(fds, adregex, pipefd);
619 }
620
621 ATF_TC_CLEANUP(setaudit_success, tc)
622 {
623         cleanup();
624 }
625
626
627 ATF_TC_WITH_CLEANUP(setaudit_failure);
628 ATF_TC_HEAD(setaudit_failure, tc)
629 {
630         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
631                                         "setaudit(2) call");
632 }
633
634 ATF_TC_BODY(setaudit_failure, tc)
635 {
636         pid = getpid();
637         snprintf(adregex, sizeof(adregex), "setaudit.*%d.*return,failure", pid);
638
639         FILE *pipefd = setup(fds, auclass);
640         /* Failure reason: Bad address */
641         ATF_REQUIRE_EQ(-1, setaudit(NULL));
642         check_audit(fds, adregex, pipefd);
643 }
644
645 ATF_TC_CLEANUP(setaudit_failure, tc)
646 {
647         cleanup();
648 }
649
650
651 ATF_TC_WITH_CLEANUP(getaudit_addr_success);
652 ATF_TC_HEAD(getaudit_addr_success, tc)
653 {
654         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
655                                         "getaudit_addr(2) call");
656 }
657
658 ATF_TC_BODY(getaudit_addr_success, tc)
659 {
660         pid = getpid();
661         auditinfo_addr_t auditinfo;
662         snprintf(adregex, sizeof(adregex),
663                 "getaudit_addr.*%d.*return,success", pid);
664
665         FILE *pipefd = setup(fds, auclass);
666         ATF_REQUIRE_EQ(0, getaudit_addr(&auditinfo, sizeof(auditinfo)));
667         check_audit(fds, adregex, pipefd);
668 }
669
670 ATF_TC_CLEANUP(getaudit_addr_success, tc)
671 {
672         cleanup();
673 }
674
675
676 ATF_TC_WITH_CLEANUP(getaudit_addr_failure);
677 ATF_TC_HEAD(getaudit_addr_failure, tc)
678 {
679         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
680                                         "getaudit_addr(2) call");
681 }
682
683 ATF_TC_BODY(getaudit_addr_failure, tc)
684 {
685         pid = getpid();
686         snprintf(adregex, sizeof(adregex),
687                 "getaudit_addr.*%d.*return,failure", pid);
688
689         FILE *pipefd = setup(fds, auclass);
690         /* Failure reason: Bad address */
691         ATF_REQUIRE_EQ(-1, getaudit_addr(NULL, 0));
692         check_audit(fds, adregex, pipefd);
693 }
694
695 ATF_TC_CLEANUP(getaudit_addr_failure, tc)
696 {
697         cleanup();
698 }
699
700
701 ATF_TC_WITH_CLEANUP(setaudit_addr_success);
702 ATF_TC_HEAD(setaudit_addr_success, tc)
703 {
704         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
705                                         "setaudit_addr(2) call");
706 }
707
708 ATF_TC_BODY(setaudit_addr_success, tc)
709 {
710         pid = getpid();
711         auditinfo_addr_t auditinfo;
712         snprintf(adregex, sizeof(adregex),
713                 "setaudit_addr.*%d.*return,success", pid);
714
715         ATF_REQUIRE_EQ(0, getaudit_addr(&auditinfo, sizeof(auditinfo)));
716         FILE *pipefd = setup(fds, auclass);
717         ATF_REQUIRE_EQ(0, setaudit_addr(&auditinfo, sizeof(auditinfo)));
718         check_audit(fds, adregex, pipefd);
719 }
720
721 ATF_TC_CLEANUP(setaudit_addr_success, tc)
722 {
723         cleanup();
724 }
725
726
727 ATF_TC_WITH_CLEANUP(setaudit_addr_failure);
728 ATF_TC_HEAD(setaudit_addr_failure, tc)
729 {
730         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
731                                         "setaudit_addr(2) call");
732 }
733
734 ATF_TC_BODY(setaudit_addr_failure, tc)
735 {
736         pid = getpid();
737         snprintf(adregex, sizeof(adregex),
738                 "setaudit_addr.*%d.*return,failure", pid);
739
740         FILE *pipefd = setup(fds, auclass);
741         /* Failure reason: Bad address */
742         ATF_REQUIRE_EQ(-1, setaudit_addr(NULL, 0));
743         check_audit(fds, adregex, pipefd);
744 }
745
746 ATF_TC_CLEANUP(setaudit_addr_failure, tc)
747 {
748         cleanup();
749 }
750
751 /*
752  * Note: The test-case uses A_GETFSIZE as the command argument but since it is
753  * not an independent audit event, it will be used to check the default mode
754  * auditing of auditon(2) system call.
755  *
756  * Please See: sys/security/audit/audit_bsm_klib.c
757  * function(): au_event_t auditon_command_event() :: case A_GETFSIZE:
758  */
759 ATF_TC_WITH_CLEANUP(auditon_default_success);
760 ATF_TC_HEAD(auditon_default_success, tc)
761 {
762         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
763                                         "auditon(2) call");
764 }
765
766 ATF_TC_BODY(auditon_default_success, tc)
767 {
768         au_fstat_t fsize_arg;
769         bzero(&fsize_arg, sizeof(au_fstat_t));
770
771         pid = getpid();
772         snprintf(adregex, sizeof(adregex), "auditon.*%d.*return,success", pid);
773
774         FILE *pipefd = setup(fds, auclass);
775         ATF_REQUIRE_EQ(0, auditon(A_GETFSIZE, &fsize_arg, sizeof(fsize_arg)));
776         check_audit(fds, adregex, pipefd);
777 }
778
779 ATF_TC_CLEANUP(auditon_default_success, tc)
780 {
781         cleanup();
782 }
783
784
785 ATF_TC_WITH_CLEANUP(auditon_default_failure);
786 ATF_TC_HEAD(auditon_default_failure, tc)
787 {
788         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
789                                         "auditon(2) call");
790 }
791
792 ATF_TC_BODY(auditon_default_failure, tc)
793 {
794         pid = getpid();
795         snprintf(adregex, sizeof(adregex), "auditon.*%d.*return,failure", pid);
796
797         FILE *pipefd = setup(fds, auclass);
798         /* Failure reason: Invalid argument */
799         ATF_REQUIRE_EQ(-1, auditon(A_GETFSIZE, NULL, 0));
800         check_audit(fds, adregex, pipefd);
801 }
802
803 ATF_TC_CLEANUP(auditon_default_failure, tc)
804 {
805         cleanup();
806 }
807
808
809 ATF_TC_WITH_CLEANUP(auditon_getpolicy_success);
810 ATF_TC_HEAD(auditon_getpolicy_success, tc)
811 {
812         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
813                                         "auditon(2) call for cmd: A_GETPOLICY");
814 }
815
816 ATF_TC_BODY(auditon_getpolicy_success, tc)
817 {
818         int aupolicy;
819         pid = getpid();
820         snprintf(adregex, sizeof(adregex), "GPOLICY command.*%d.*success", pid);
821
822         FILE *pipefd = setup(fds, auclass);
823         ATF_REQUIRE_EQ(0, auditon(A_GETPOLICY, &aupolicy, sizeof(aupolicy)));
824         check_audit(fds, adregex, pipefd);
825 }
826
827 ATF_TC_CLEANUP(auditon_getpolicy_success, tc)
828 {
829         cleanup();
830 }
831
832
833 ATF_TC_WITH_CLEANUP(auditon_getpolicy_failure);
834 ATF_TC_HEAD(auditon_getpolicy_failure, tc)
835 {
836         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
837                                         "auditon(2) call for cmd: A_GETPOLICY");
838 }
839
840 ATF_TC_BODY(auditon_getpolicy_failure, tc)
841 {
842         pid = getpid();
843         snprintf(adregex, sizeof(adregex), "GPOLICY command.*%d.*failure", pid);
844
845         FILE *pipefd = setup(fds, auclass);
846         /* Failure reason: Invalid argument */
847         ATF_REQUIRE_EQ(-1, auditon(A_GETPOLICY, NULL, 0));
848         check_audit(fds, adregex, pipefd);
849 }
850
851 ATF_TC_CLEANUP(auditon_getpolicy_failure, tc)
852 {
853         cleanup();
854 }
855
856
857 ATF_TC_WITH_CLEANUP(auditon_setpolicy_success);
858 ATF_TC_HEAD(auditon_setpolicy_success, tc)
859 {
860         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
861                                         "auditon(2) call for cmd: A_SETPOLICY");
862 }
863
864 ATF_TC_BODY(auditon_setpolicy_success, tc)
865 {
866         int aupolicy;
867         pid = getpid();
868         snprintf(adregex, sizeof(adregex), "SPOLICY command.*%d.*success", pid);
869
870         /* Retrieve the current auditing policy, to be used with A_SETPOLICY */
871         ATF_REQUIRE_EQ(0, auditon(A_GETPOLICY, &aupolicy, sizeof(aupolicy)));
872         FILE *pipefd = setup(fds, auclass);
873         ATF_REQUIRE_EQ(0, auditon(A_SETPOLICY, &aupolicy, sizeof(aupolicy)));
874         check_audit(fds, adregex, pipefd);
875 }
876
877 ATF_TC_CLEANUP(auditon_setpolicy_success, tc)
878 {
879         cleanup();
880 }
881
882
883 ATF_TC_WITH_CLEANUP(auditon_setpolicy_failure);
884 ATF_TC_HEAD(auditon_setpolicy_failure, tc)
885 {
886         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
887                                         "auditon(2) call for cmd: A_SETPOLICY");
888 }
889
890 ATF_TC_BODY(auditon_setpolicy_failure, tc)
891 {
892         pid = getpid();
893         snprintf(adregex, sizeof(adregex), "SPOLICY command.*%d.*failure", pid);
894
895         FILE *pipefd = setup(fds, auclass);
896         /* Failure reason: Invalid argument */
897         ATF_REQUIRE_EQ(-1, auditon(A_SETPOLICY, NULL, 0));
898         check_audit(fds, adregex, pipefd);
899 }
900
901 ATF_TC_CLEANUP(auditon_setpolicy_failure, tc)
902 {
903         cleanup();
904 }
905
906
907 ATF_TC_WITH_CLEANUP(auditon_getkmask_success);
908 ATF_TC_HEAD(auditon_getkmask_success, tc)
909 {
910         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
911                                         "auditon(2) call for cmd: A_GETKMASK");
912 }
913
914 ATF_TC_BODY(auditon_getkmask_success, tc)
915 {
916         pid = getpid();
917         au_mask_t evmask;
918         snprintf(adregex, sizeof(adregex), "get kernel mask.*%d.*success", pid);
919
920         bzero(&evmask, sizeof(evmask));
921         FILE *pipefd = setup(fds, auclass);
922         ATF_REQUIRE_EQ(0, auditon(A_GETKMASK, &evmask, sizeof(evmask)));
923         check_audit(fds, adregex, pipefd);
924 }
925
926 ATF_TC_CLEANUP(auditon_getkmask_success, tc)
927 {
928         cleanup();
929 }
930
931
932 ATF_TC_WITH_CLEANUP(auditon_getkmask_failure);
933 ATF_TC_HEAD(auditon_getkmask_failure, tc)
934 {
935         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
936                                         "auditon(2) call for cmd: A_GETKMASK");
937 }
938
939 ATF_TC_BODY(auditon_getkmask_failure, tc)
940 {
941         pid = getpid();
942         snprintf(adregex, sizeof(adregex), "get kernel mask.*%d.*failure", pid);
943
944         FILE *pipefd = setup(fds, auclass);
945         /* Failure reason: Invalid au_mask_t structure */
946         ATF_REQUIRE_EQ(-1, auditon(A_GETKMASK, NULL, 0));
947         check_audit(fds, adregex, pipefd);
948 }
949
950 ATF_TC_CLEANUP(auditon_getkmask_failure, tc)
951 {
952         cleanup();
953 }
954
955
956 ATF_TC_WITH_CLEANUP(auditon_setkmask_success);
957 ATF_TC_HEAD(auditon_setkmask_success, tc)
958 {
959         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
960                                         "auditon(2) call for cmd: A_SETKMASK");
961 }
962
963 ATF_TC_BODY(auditon_setkmask_success, tc)
964 {
965         pid = getpid();
966         au_mask_t evmask;
967         snprintf(adregex, sizeof(adregex), "set kernel mask.*%d.*success", pid);
968
969         /* Retrieve the current audit mask to be used with A_SETKMASK */
970         bzero(&evmask, sizeof(evmask));
971         ATF_REQUIRE_EQ(0, auditon(A_GETKMASK, &evmask, sizeof(evmask)));
972
973         FILE *pipefd = setup(fds, auclass);
974         ATF_REQUIRE_EQ(0, auditon(A_SETKMASK, &evmask, sizeof(evmask)));
975         check_audit(fds, adregex, pipefd);
976 }
977
978 ATF_TC_CLEANUP(auditon_setkmask_success, tc)
979 {
980         cleanup();
981 }
982
983
984 ATF_TC_WITH_CLEANUP(auditon_setkmask_failure);
985 ATF_TC_HEAD(auditon_setkmask_failure, tc)
986 {
987         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
988                                         "auditon(2) call for cmd: A_SETKMASK");
989 }
990
991 ATF_TC_BODY(auditon_setkmask_failure, tc)
992 {
993         pid = getpid();
994         snprintf(adregex, sizeof(adregex), "set kernel mask.*%d.*failure", pid);
995
996         FILE *pipefd = setup(fds, auclass);
997         /* Failure reason: Invalid au_mask_t structure */
998         ATF_REQUIRE_EQ(-1, auditon(A_SETKMASK, NULL, 0));
999         check_audit(fds, adregex, pipefd);
1000 }
1001
1002 ATF_TC_CLEANUP(auditon_setkmask_failure, tc)
1003 {
1004         cleanup();
1005 }
1006
1007
1008 ATF_TC_WITH_CLEANUP(auditon_getqctrl_success);
1009 ATF_TC_HEAD(auditon_getqctrl_success, tc)
1010 {
1011         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1012                                         "auditon(2) call for cmd: A_GETQCTRL");
1013 }
1014
1015 ATF_TC_BODY(auditon_getqctrl_success, tc)
1016 {
1017         pid = getpid();
1018         au_qctrl_t evqctrl;
1019         snprintf(adregex, sizeof(adregex), "GQCTRL command.*%d.*success", pid);
1020
1021         bzero(&evqctrl, sizeof(evqctrl));
1022         FILE *pipefd = setup(fds, auclass);
1023         ATF_REQUIRE_EQ(0, auditon(A_GETQCTRL, &evqctrl, sizeof(evqctrl)));
1024         check_audit(fds, adregex, pipefd);
1025 }
1026
1027 ATF_TC_CLEANUP(auditon_getqctrl_success, tc)
1028 {
1029         cleanup();
1030 }
1031
1032
1033 ATF_TC_WITH_CLEANUP(auditon_getqctrl_failure);
1034 ATF_TC_HEAD(auditon_getqctrl_failure, tc)
1035 {
1036         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1037                                         "auditon(2) call for cmd: A_GETQCTRL");
1038 }
1039
1040 ATF_TC_BODY(auditon_getqctrl_failure, tc)
1041 {
1042         pid = getpid();
1043         snprintf(adregex, sizeof(adregex), "GQCTRL command.*%d.*failure", pid);
1044
1045         FILE *pipefd = setup(fds, auclass);
1046         /* Failure reason: Invalid au_qctrl_t structure */
1047         ATF_REQUIRE_EQ(-1, auditon(A_GETQCTRL, NULL, 0));
1048         check_audit(fds, adregex, pipefd);
1049 }
1050
1051 ATF_TC_CLEANUP(auditon_getqctrl_failure, tc)
1052 {
1053         cleanup();
1054 }
1055
1056
1057 ATF_TC_WITH_CLEANUP(auditon_setqctrl_success);
1058 ATF_TC_HEAD(auditon_setqctrl_success, tc)
1059 {
1060         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1061                                         "auditon(2) call for cmd: A_SETKMASK");
1062 }
1063
1064 ATF_TC_BODY(auditon_setqctrl_success, tc)
1065 {
1066         pid = getpid();
1067         au_qctrl_t evqctrl;
1068         snprintf(adregex, sizeof(adregex), "SQCTRL command.*%d.*success", pid);
1069
1070         /* Retrieve the current audit mask to be used with A_SETQCTRL */
1071         bzero(&evqctrl, sizeof(evqctrl));
1072         ATF_REQUIRE_EQ(0, auditon(A_GETQCTRL, &evqctrl, sizeof(evqctrl)));
1073
1074         FILE *pipefd = setup(fds, auclass);
1075         ATF_REQUIRE_EQ(0, auditon(A_SETQCTRL, &evqctrl, sizeof(evqctrl)));
1076         check_audit(fds, adregex, pipefd);
1077 }
1078
1079 ATF_TC_CLEANUP(auditon_setqctrl_success, tc)
1080 {
1081         cleanup();
1082 }
1083
1084
1085 ATF_TC_WITH_CLEANUP(auditon_setqctrl_failure);
1086 ATF_TC_HEAD(auditon_setqctrl_failure, tc)
1087 {
1088         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1089                                         "auditon(2) call for cmd: A_SETKMASK");
1090 }
1091
1092 ATF_TC_BODY(auditon_setqctrl_failure, tc)
1093 {
1094         pid = getpid();
1095         snprintf(adregex, sizeof(adregex), "SQCTRL command.*%d.*failure", pid);
1096
1097         FILE *pipefd = setup(fds, auclass);
1098         /* Failure reason: Invalid au_qctrl_t structure */
1099         ATF_REQUIRE_EQ(-1, auditon(A_SETQCTRL, NULL, 0));
1100         check_audit(fds, adregex, pipefd);
1101 }
1102
1103 ATF_TC_CLEANUP(auditon_setqctrl_failure, tc)
1104 {
1105         cleanup();
1106 }
1107
1108
1109 ATF_TC_WITH_CLEANUP(auditon_getclass_success);
1110 ATF_TC_HEAD(auditon_getclass_success, tc)
1111 {
1112         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1113                                         "auditon(2) call for cmd: A_GETCLASS");
1114 }
1115
1116 ATF_TC_BODY(auditon_getclass_success, tc)
1117 {
1118         pid = getpid();
1119         au_evclass_map_t evclass;
1120         snprintf(adregex, sizeof(adregex), "get event class.*%d.*success", pid);
1121
1122         /* Initialize evclass to get the event-class mapping for auditon(2) */
1123         evclass.ec_number = AUE_AUDITON;
1124         evclass.ec_class = 0;
1125         FILE *pipefd = setup(fds, auclass);
1126         ATF_REQUIRE_EQ(0, auditon(A_GETCLASS, &evclass, sizeof(evclass)));
1127         check_audit(fds, adregex, pipefd);
1128 }
1129
1130 ATF_TC_CLEANUP(auditon_getclass_success, tc)
1131 {
1132         cleanup();
1133 }
1134
1135
1136 ATF_TC_WITH_CLEANUP(auditon_getclass_failure);
1137 ATF_TC_HEAD(auditon_getclass_failure, tc)
1138 {
1139         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1140                                         "auditon(2) call for cmd: A_GETCLASS");
1141 }
1142
1143 ATF_TC_BODY(auditon_getclass_failure, tc)
1144 {
1145         pid = getpid();
1146         snprintf(adregex, sizeof(adregex), "get event class.*%d.*failure", pid);
1147
1148         FILE *pipefd = setup(fds, auclass);
1149         /* Failure reason: Invalid au_evclass_map_t structure */
1150         ATF_REQUIRE_EQ(-1, auditon(A_GETCLASS, NULL, 0));
1151         check_audit(fds, adregex, pipefd);
1152 }
1153
1154 ATF_TC_CLEANUP(auditon_getclass_failure, tc)
1155 {
1156         cleanup();
1157 }
1158
1159
1160 ATF_TC_WITH_CLEANUP(auditon_setclass_success);
1161 ATF_TC_HEAD(auditon_setclass_success, tc)
1162 {
1163         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1164                                         "auditon(2) call for cmd: A_SETCLASS");
1165 }
1166
1167 ATF_TC_BODY(auditon_setclass_success, tc)
1168 {
1169         pid = getpid();
1170         au_evclass_map_t evclass;
1171         snprintf(adregex, sizeof(adregex), "set event class.*%d.*success", pid);
1172
1173         /* Initialize evclass and get the event-class mapping for auditon(2) */
1174         evclass.ec_number = AUE_AUDITON;
1175         evclass.ec_class = 0;
1176         ATF_REQUIRE_EQ(0, auditon(A_GETCLASS, &evclass, sizeof(evclass)));
1177
1178         FILE *pipefd = setup(fds, auclass);
1179         ATF_REQUIRE_EQ(0, auditon(A_SETCLASS, &evclass, sizeof(evclass)));
1180         check_audit(fds, adregex, pipefd);
1181 }
1182
1183 ATF_TC_CLEANUP(auditon_setclass_success, tc)
1184 {
1185         cleanup();
1186 }
1187
1188
1189 ATF_TC_WITH_CLEANUP(auditon_setclass_failure);
1190 ATF_TC_HEAD(auditon_setclass_failure, tc)
1191 {
1192         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1193                                         "auditon(2) call for cmd: A_SETCLASS");
1194 }
1195
1196 ATF_TC_BODY(auditon_setclass_failure, tc)
1197 {
1198         pid = getpid();
1199         snprintf(adregex, sizeof(adregex), "set event class.*%d.*failure", pid);
1200
1201         FILE *pipefd = setup(fds, auclass);
1202         /* Failure reason: Invalid au_evclass_map_t structure */
1203         ATF_REQUIRE_EQ(-1, auditon(A_SETCLASS, NULL, 0));
1204         check_audit(fds, adregex, pipefd);
1205 }
1206
1207 ATF_TC_CLEANUP(auditon_setclass_failure, tc)
1208 {
1209         cleanup();
1210 }
1211
1212
1213 ATF_TC_WITH_CLEANUP(auditon_getcond_success);
1214 ATF_TC_HEAD(auditon_getcond_success, tc)
1215 {
1216         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1217                                         "auditon(2) call for cmd: A_GETCOND");
1218 }
1219
1220 ATF_TC_BODY(auditon_getcond_success, tc)
1221 {
1222         int auditcond;
1223         pid = getpid();
1224         snprintf(adregex, sizeof(adregex), "get audit state.*%d.*success", pid);
1225
1226         FILE *pipefd = setup(fds, auclass);
1227         ATF_REQUIRE_EQ(0, auditon(A_GETCOND, &auditcond, sizeof(auditcond)));
1228         check_audit(fds, adregex, pipefd);
1229 }
1230
1231 ATF_TC_CLEANUP(auditon_getcond_success, tc)
1232 {
1233         cleanup();
1234 }
1235
1236
1237 ATF_TC_WITH_CLEANUP(auditon_getcond_failure);
1238 ATF_TC_HEAD(auditon_getcond_failure, tc)
1239 {
1240         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1241                                         "auditon(2) call for cmd: A_GETCOND");
1242 }
1243
1244 ATF_TC_BODY(auditon_getcond_failure, tc)
1245 {
1246         pid = getpid();
1247         snprintf(adregex, sizeof(adregex), "get audit state.*%d.*failure", pid);
1248
1249         FILE *pipefd = setup(fds, auclass);
1250         /* Failure reason: Invalid argument */
1251         ATF_REQUIRE_EQ(-1, auditon(A_GETCOND, NULL, 0));
1252         check_audit(fds, adregex, pipefd);
1253 }
1254
1255 ATF_TC_CLEANUP(auditon_getcond_failure, tc)
1256 {
1257         cleanup();
1258 }
1259
1260
1261 ATF_TC_WITH_CLEANUP(auditon_setcond_success);
1262 ATF_TC_HEAD(auditon_setcond_success, tc)
1263 {
1264         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1265                                         "auditon(2) call for cmd: A_SETCOND");
1266 }
1267
1268 ATF_TC_BODY(auditon_setcond_success, tc)
1269 {
1270         int auditcond = AUC_AUDITING;
1271         pid = getpid();
1272         snprintf(adregex, sizeof(adregex), "set audit state.*%d.*success", pid);
1273
1274         FILE *pipefd = setup(fds, auclass);
1275         /* At this point auditd is running, so the audit state is AUC_AUDITING */
1276         ATF_REQUIRE_EQ(0, auditon(A_SETCOND, &auditcond, sizeof(auditcond)));
1277         check_audit(fds, adregex, pipefd);
1278 }
1279
1280 ATF_TC_CLEANUP(auditon_setcond_success, tc)
1281 {
1282         cleanup();
1283 }
1284
1285
1286 ATF_TC_WITH_CLEANUP(auditon_setcond_failure);
1287 ATF_TC_HEAD(auditon_setcond_failure, tc)
1288 {
1289         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1290                                         "auditon(2) call for cmd: A_SETCOND");
1291 }
1292
1293 ATF_TC_BODY(auditon_setcond_failure, tc)
1294 {
1295         pid = getpid();
1296         snprintf(adregex, sizeof(adregex), "set audit state.*%d.*failure", pid);
1297
1298         FILE *pipefd = setup(fds, auclass);
1299         /* Failure reason: Invalid argument */
1300         ATF_REQUIRE_EQ(-1, auditon(A_SETCOND, NULL, 0));
1301         check_audit(fds, adregex, pipefd);
1302 }
1303
1304 ATF_TC_CLEANUP(auditon_setcond_failure, tc)
1305 {
1306         cleanup();
1307 }
1308
1309 /*
1310  * Following test-cases for auditon(2) are all in failure mode only as although
1311  * auditable, they have not been implemented and return ENOSYS whenever called.
1312  *
1313  * Commands: A_GETCWD  A_GETCAR  A_GETSTAT  A_SETSTAT  A_SETUMASK  A_SETSMASK
1314  */
1315
1316 ATF_TC_WITH_CLEANUP(auditon_getcwd_failure);
1317 ATF_TC_HEAD(auditon_getcwd_failure, tc)
1318 {
1319         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1320                                         "auditon(2) call for cmd: A_GETCWD");
1321 }
1322
1323 ATF_TC_BODY(auditon_getcwd_failure, tc)
1324 {
1325         pid = getpid();
1326         snprintf(adregex, sizeof(adregex), "get cwd.*%d.*failure", pid);
1327
1328         FILE *pipefd = setup(fds, auclass);
1329         ATF_REQUIRE_ERRNO(ENOSYS, auditon(A_GETCWD, &auditon_def,
1330                 sizeof(auditon_def)) == -1);
1331         check_audit(fds, adregex, pipefd);
1332 }
1333
1334 ATF_TC_CLEANUP(auditon_getcwd_failure, tc)
1335 {
1336         cleanup();
1337 }
1338
1339
1340 ATF_TC_WITH_CLEANUP(auditon_getcar_failure);
1341 ATF_TC_HEAD(auditon_getcar_failure, tc)
1342 {
1343         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1344                                         "auditon(2) call for cmd: A_GETCAR");
1345 }
1346
1347 ATF_TC_BODY(auditon_getcar_failure, tc)
1348 {
1349         pid = getpid();
1350         snprintf(adregex, sizeof(adregex), "get car.*%d.*failure", pid);
1351
1352         FILE *pipefd = setup(fds, auclass);
1353         ATF_REQUIRE_ERRNO(ENOSYS, auditon(A_GETCAR, &auditon_def,
1354                 sizeof(auditon_def)) == -1);
1355         check_audit(fds, adregex, pipefd);
1356 }
1357
1358 ATF_TC_CLEANUP(auditon_getcar_failure, tc)
1359 {
1360         cleanup();
1361 }
1362
1363
1364 ATF_TC_WITH_CLEANUP(auditon_getstat_failure);
1365 ATF_TC_HEAD(auditon_getstat_failure, tc)
1366 {
1367         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1368                                         "auditon(2) call for cmd: A_GETSTAT");
1369 }
1370
1371 ATF_TC_BODY(auditon_getstat_failure, tc)
1372 {
1373         pid = getpid();
1374         snprintf(adregex, sizeof(adregex),
1375                 "get audit statistics.*%d.*return,failure", pid);
1376
1377         FILE *pipefd = setup(fds, auclass);
1378         ATF_REQUIRE_ERRNO(ENOSYS, auditon(A_GETSTAT, &auditon_def,
1379                 sizeof(auditon_def)) == -1);
1380         check_audit(fds, adregex, pipefd);
1381 }
1382
1383 ATF_TC_CLEANUP(auditon_getstat_failure, tc)
1384 {
1385         cleanup();
1386 }
1387
1388
1389 ATF_TC_WITH_CLEANUP(auditon_setstat_failure);
1390 ATF_TC_HEAD(auditon_setstat_failure, tc)
1391 {
1392         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1393                                         "auditon(2) call for cmd: A_SETSTAT");
1394 }
1395
1396 ATF_TC_BODY(auditon_setstat_failure, tc)
1397 {
1398         pid = getpid();
1399         snprintf(adregex, sizeof(adregex),
1400                 "set audit statistics.*%d.*return,failure", pid);
1401
1402         FILE *pipefd = setup(fds, auclass);
1403         ATF_REQUIRE_ERRNO(ENOSYS, auditon(A_SETSTAT, &auditon_def,
1404                 sizeof(auditon_def)) == -1);
1405         check_audit(fds, adregex, pipefd);
1406 }
1407
1408 ATF_TC_CLEANUP(auditon_setstat_failure, tc)
1409 {
1410         cleanup();
1411 }
1412
1413
1414 ATF_TC_WITH_CLEANUP(auditon_setumask_failure);
1415 ATF_TC_HEAD(auditon_setumask_failure, tc)
1416 {
1417         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1418                                         "auditon(2) call for cmd: A_SETUMASK");
1419 }
1420
1421 ATF_TC_BODY(auditon_setumask_failure, tc)
1422 {
1423         pid = getpid();
1424         snprintf(adregex, sizeof(adregex),
1425                 "set mask per uid.*%d.*return,failure", pid);
1426
1427         FILE *pipefd = setup(fds, auclass);
1428         ATF_REQUIRE_ERRNO(ENOSYS, auditon(A_SETUMASK, &auditon_def,
1429                 sizeof(auditon_def)) == -1);
1430         check_audit(fds, adregex, pipefd);
1431 }
1432
1433 ATF_TC_CLEANUP(auditon_setumask_failure, tc)
1434 {
1435         cleanup();
1436 }
1437
1438
1439 ATF_TC_WITH_CLEANUP(auditon_setsmask_failure);
1440 ATF_TC_HEAD(auditon_setsmask_failure, tc)
1441 {
1442         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1443                                         "auditon(2) call for cmd: A_SETSMASK");
1444 }
1445
1446 ATF_TC_BODY(auditon_setsmask_failure, tc)
1447 {
1448         pid = getpid();
1449         snprintf(adregex, sizeof(adregex),
1450                 "set mask per session.*%d.*return,failure", pid);
1451
1452         FILE *pipefd = setup(fds, auclass);
1453         ATF_REQUIRE_ERRNO(ENOSYS, auditon(A_SETSMASK, &auditon_def,
1454                 sizeof(auditon_def)) == -1);
1455         check_audit(fds, adregex, pipefd);
1456 }
1457
1458 ATF_TC_CLEANUP(auditon_setsmask_failure, tc)
1459 {
1460         cleanup();
1461 }
1462
1463
1464 /*
1465  * Audit of reboot(2) cannot be tested in normal conditions as we don't want
1466  * to reboot the system while running the tests
1467  */
1468
1469
1470 ATF_TC_WITH_CLEANUP(reboot_failure);
1471 ATF_TC_HEAD(reboot_failure, tc)
1472 {
1473         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1474                                         "reboot(2) call");
1475 }
1476
1477 ATF_TC_BODY(reboot_failure, tc)
1478 {
1479         pid = getpid();
1480         snprintf(adregex, sizeof(adregex), "reboot.*%d.*return,failure", pid);
1481
1482         FILE *pipefd = setup(fds, auclass);
1483         ATF_REQUIRE_EQ(-1, reboot(-1));
1484         check_audit(fds, adregex, pipefd);
1485 }
1486
1487 ATF_TC_CLEANUP(reboot_failure, tc)
1488 {
1489         cleanup();
1490 }
1491
1492
1493 /*
1494  * Audit of quotactl(2) cannot be tested in normal conditions as we don't want
1495  * to tamper with filesystem quotas
1496  */
1497
1498
1499 ATF_TC_WITH_CLEANUP(quotactl_failure);
1500 ATF_TC_HEAD(quotactl_failure, tc)
1501 {
1502         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1503                                         "quotactl(2) call");
1504 }
1505
1506 ATF_TC_BODY(quotactl_failure, tc)
1507 {
1508         pid = getpid();
1509         snprintf(adregex, sizeof(adregex), "quotactl.*%d.*return,failure", pid);
1510
1511         FILE *pipefd = setup(fds, auclass);
1512         ATF_REQUIRE_EQ(-1, quotactl(NULL, 0, 0, NULL));
1513         check_audit(fds, adregex, pipefd);
1514 }
1515
1516 ATF_TC_CLEANUP(quotactl_failure, tc)
1517 {
1518         cleanup();
1519 }
1520
1521
1522 ATF_TC_WITH_CLEANUP(mount_failure);
1523 ATF_TC_HEAD(mount_failure, tc)
1524 {
1525         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1526                                         "mount(2) call");
1527 }
1528
1529 ATF_TC_BODY(mount_failure, tc)
1530 {
1531         pid = getpid();
1532         snprintf(adregex, sizeof(adregex), "mount.*%d.*return,failure", pid);
1533
1534         FILE *pipefd = setup(fds, auclass);
1535         ATF_REQUIRE_EQ(-1, mount(NULL, NULL, 0, NULL));
1536         check_audit(fds, adregex, pipefd);
1537 }
1538
1539 ATF_TC_CLEANUP(mount_failure, tc)
1540 {
1541         cleanup();
1542 }
1543
1544
1545 ATF_TC_WITH_CLEANUP(nmount_failure);
1546 ATF_TC_HEAD(nmount_failure, tc)
1547 {
1548         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1549                                         "nmount(2) call");
1550 }
1551
1552 ATF_TC_BODY(nmount_failure, tc)
1553 {
1554         pid = getpid();
1555         snprintf(adregex, sizeof(adregex), "nmount.*%d.*return,failure", pid);
1556
1557         FILE *pipefd = setup(fds, auclass);
1558         ATF_REQUIRE_EQ(-1, nmount(NULL, 0, 0));
1559         check_audit(fds, adregex, pipefd);
1560 }
1561
1562 ATF_TC_CLEANUP(nmount_failure, tc)
1563 {
1564         cleanup();
1565 }
1566
1567
1568 ATF_TC_WITH_CLEANUP(swapon_failure);
1569 ATF_TC_HEAD(swapon_failure, tc)
1570 {
1571         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1572                                         "swapon(2) call");
1573 }
1574
1575 ATF_TC_BODY(swapon_failure, tc)
1576 {
1577         pid = getpid();
1578         snprintf(adregex, sizeof(adregex), "swapon.*%d.*return,failure", pid);
1579
1580         FILE *pipefd = setup(fds, auclass);
1581         /* Failure reason: Block device required */
1582         ATF_REQUIRE_EQ(-1, swapon(path));
1583         check_audit(fds, adregex, pipefd);
1584 }
1585
1586 ATF_TC_CLEANUP(swapon_failure, tc)
1587 {
1588         cleanup();
1589 }
1590
1591
1592 ATF_TC_WITH_CLEANUP(swapoff_failure);
1593 ATF_TC_HEAD(swapoff_failure, tc)
1594 {
1595         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1596                                         "swapoff(2) call");
1597 }
1598
1599 ATF_TC_BODY(swapoff_failure, tc)
1600 {
1601         pid = getpid();
1602         snprintf(adregex, sizeof(adregex), "swapoff.*%d.*return,failure", pid);
1603
1604         FILE *pipefd = setup(fds, auclass);
1605         /* Failure reason: Block device required */
1606         ATF_REQUIRE_EQ(-1, swapoff(path, 0));
1607         check_audit(fds, adregex, pipefd);
1608 }
1609
1610 ATF_TC_CLEANUP(swapoff_failure, tc)
1611 {
1612         cleanup();
1613 }
1614
1615
1616 ATF_TP_ADD_TCS(tp)
1617 {
1618         ATF_TP_ADD_TC(tp, settimeofday_success);
1619         ATF_TP_ADD_TC(tp, settimeofday_failure);
1620         ATF_TP_ADD_TC(tp, clock_settime_success);
1621         ATF_TP_ADD_TC(tp, clock_settime_failure);
1622         ATF_TP_ADD_TC(tp, adjtime_success);
1623         ATF_TP_ADD_TC(tp, adjtime_failure);
1624         ATF_TP_ADD_TC(tp, ntp_adjtime_success);
1625         ATF_TP_ADD_TC(tp, ntp_adjtime_failure);
1626
1627         ATF_TP_ADD_TC(tp, nfs_getfh_success);
1628         ATF_TP_ADD_TC(tp, nfs_getfh_failure);
1629         ATF_TP_ADD_TC(tp, acct_success);
1630         ATF_TP_ADD_TC(tp, acct_failure);
1631         ATF_TP_ADD_TC(tp, auditctl_success);
1632         ATF_TP_ADD_TC(tp, auditctl_failure);
1633
1634         ATF_TP_ADD_TC(tp, getauid_success);
1635         ATF_TP_ADD_TC(tp, getauid_failure);
1636         ATF_TP_ADD_TC(tp, setauid_success);
1637         ATF_TP_ADD_TC(tp, setauid_failure);
1638
1639         ATF_TP_ADD_TC(tp, getaudit_success);
1640         ATF_TP_ADD_TC(tp, getaudit_failure);
1641         ATF_TP_ADD_TC(tp, setaudit_success);
1642         ATF_TP_ADD_TC(tp, setaudit_failure);
1643
1644         ATF_TP_ADD_TC(tp, getaudit_addr_success);
1645         ATF_TP_ADD_TC(tp, getaudit_addr_failure);
1646         ATF_TP_ADD_TC(tp, setaudit_addr_success);
1647         ATF_TP_ADD_TC(tp, setaudit_addr_failure);
1648
1649         ATF_TP_ADD_TC(tp, auditon_default_success);
1650         ATF_TP_ADD_TC(tp, auditon_default_failure);
1651
1652         ATF_TP_ADD_TC(tp, auditon_getpolicy_success);
1653         ATF_TP_ADD_TC(tp, auditon_getpolicy_failure);
1654         ATF_TP_ADD_TC(tp, auditon_setpolicy_success);
1655         ATF_TP_ADD_TC(tp, auditon_setpolicy_failure);
1656
1657         ATF_TP_ADD_TC(tp, auditon_getkmask_success);
1658         ATF_TP_ADD_TC(tp, auditon_getkmask_failure);
1659         ATF_TP_ADD_TC(tp, auditon_setkmask_success);
1660         ATF_TP_ADD_TC(tp, auditon_setkmask_failure);
1661
1662         ATF_TP_ADD_TC(tp, auditon_getqctrl_success);
1663         ATF_TP_ADD_TC(tp, auditon_getqctrl_failure);
1664         ATF_TP_ADD_TC(tp, auditon_setqctrl_success);
1665         ATF_TP_ADD_TC(tp, auditon_setqctrl_failure);
1666
1667         ATF_TP_ADD_TC(tp, auditon_getclass_success);
1668         ATF_TP_ADD_TC(tp, auditon_getclass_failure);
1669         ATF_TP_ADD_TC(tp, auditon_setclass_success);
1670         ATF_TP_ADD_TC(tp, auditon_setclass_failure);
1671
1672         ATF_TP_ADD_TC(tp, auditon_getcond_success);
1673         ATF_TP_ADD_TC(tp, auditon_getcond_failure);
1674         ATF_TP_ADD_TC(tp, auditon_setcond_success);
1675         ATF_TP_ADD_TC(tp, auditon_setcond_failure);
1676
1677         ATF_TP_ADD_TC(tp, auditon_getcwd_failure);
1678         ATF_TP_ADD_TC(tp, auditon_getcar_failure);
1679         ATF_TP_ADD_TC(tp, auditon_getstat_failure);
1680         ATF_TP_ADD_TC(tp, auditon_setstat_failure);
1681         ATF_TP_ADD_TC(tp, auditon_setumask_failure);
1682         ATF_TP_ADD_TC(tp, auditon_setsmask_failure);
1683
1684         ATF_TP_ADD_TC(tp, reboot_failure);
1685         ATF_TP_ADD_TC(tp, quotactl_failure);
1686         ATF_TP_ADD_TC(tp, mount_failure);
1687         ATF_TP_ADD_TC(tp, nmount_failure);
1688         ATF_TP_ADD_TC(tp, swapon_failure);
1689         ATF_TP_ADD_TC(tp, swapoff_failure);
1690
1691         return (atf_no_error());
1692 }