]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - tests/sys/audit/file-attribute-access.c
Update to bmake-20200704
[FreeBSD/FreeBSD.git] / tests / sys / audit / file-attribute-access.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  * $FreeBSD$
26  */
27
28 #include <sys/param.h>
29 #include <sys/extattr.h>
30 #include <sys/ucred.h>
31 #include <sys/mount.h>
32 #include <sys/stat.h>
33 #include <sys/syscall.h>
34
35 #include <atf-c.h>
36 #include <fcntl.h>
37 #include <unistd.h>
38
39 #include "utils.h"
40
41 static struct pollfd fds[1];
42 static mode_t mode = 0777;
43 static pid_t pid;
44 static fhandle_t fht;
45 static int filedesc, fhdesc;
46 static char extregex[80];
47 static char buff[] = "ezio";
48 static struct stat statbuff;
49 static struct statfs statfsbuff;
50 static const char *auclass = "fa";
51 static const char *name = "authorname";
52 static const char *path = "fileforaudit";
53 static const char *errpath = "dirdoesnotexist/fileforaudit";
54 static const char *successreg = "fileforaudit.*return,success";
55 static const char *failurereg = "fileforaudit.*return,failure";
56
57
58 ATF_TC_WITH_CLEANUP(stat_success);
59 ATF_TC_HEAD(stat_success, tc)
60 {
61         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
62                                         "stat(2) call");
63 }
64
65 ATF_TC_BODY(stat_success, tc)
66 {
67         /* File needs to exist to call stat(2) */
68         ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
69         FILE *pipefd = setup(fds, auclass);
70         ATF_REQUIRE_EQ(0, stat(path, &statbuff));
71         check_audit(fds, successreg, pipefd);
72         close(filedesc);
73 }
74
75 ATF_TC_CLEANUP(stat_success, tc)
76 {
77         cleanup();
78 }
79
80
81 ATF_TC_WITH_CLEANUP(stat_failure);
82 ATF_TC_HEAD(stat_failure, tc)
83 {
84         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
85                                         "stat(2) call");
86 }
87
88 ATF_TC_BODY(stat_failure, tc)
89 {
90         FILE *pipefd = setup(fds, auclass);
91         /* Failure reason: file does not exist */
92         ATF_REQUIRE_EQ(-1, stat(errpath, &statbuff));
93         check_audit(fds, failurereg, pipefd);
94 }
95
96 ATF_TC_CLEANUP(stat_failure, tc)
97 {
98         cleanup();
99 }
100
101
102 ATF_TC_WITH_CLEANUP(lstat_success);
103 ATF_TC_HEAD(lstat_success, tc)
104 {
105         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
106                                         "lstat(2) call");
107 }
108
109 ATF_TC_BODY(lstat_success, tc)
110 {
111         /* Symbolic link needs to exist to call lstat(2) */
112         ATF_REQUIRE_EQ(0, symlink("symlink", path));
113         FILE *pipefd = setup(fds, auclass);
114         ATF_REQUIRE_EQ(0, lstat(path, &statbuff));
115         check_audit(fds, successreg, pipefd);
116 }
117
118 ATF_TC_CLEANUP(lstat_success, tc)
119 {
120         cleanup();
121 }
122
123
124 ATF_TC_WITH_CLEANUP(lstat_failure);
125 ATF_TC_HEAD(lstat_failure, tc)
126 {
127         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
128                                         "lstat(2) call");
129 }
130
131 ATF_TC_BODY(lstat_failure, tc)
132 {
133         FILE *pipefd = setup(fds, auclass);
134         /* Failure reason: symbolic link does not exist */
135         ATF_REQUIRE_EQ(-1, lstat(errpath, &statbuff));
136         check_audit(fds, failurereg, pipefd);
137 }
138
139 ATF_TC_CLEANUP(lstat_failure, tc)
140 {
141         cleanup();
142 }
143
144
145 ATF_TC_WITH_CLEANUP(fstat_success);
146 ATF_TC_HEAD(fstat_success, tc)
147 {
148         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
149                                         "fstat(2) call");
150 }
151
152 ATF_TC_BODY(fstat_success, tc)
153 {
154         /* File needs to exist to call fstat(2) */
155         ATF_REQUIRE((filedesc = open(path, O_CREAT | O_RDWR, mode)) != -1);
156         FILE *pipefd = setup(fds, auclass);
157         ATF_REQUIRE_EQ(0, fstat(filedesc, &statbuff));
158
159         snprintf(extregex, sizeof(extregex),
160                 "fstat.*%jd.*return,success", (intmax_t)statbuff.st_ino);
161         check_audit(fds, extregex, pipefd);
162         close(filedesc);
163 }
164
165 ATF_TC_CLEANUP(fstat_success, tc)
166 {
167         cleanup();
168 }
169
170
171 ATF_TC_WITH_CLEANUP(fstat_failure);
172 ATF_TC_HEAD(fstat_failure, tc)
173 {
174         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
175                                         "fstat(2) call");
176 }
177
178 ATF_TC_BODY(fstat_failure, tc)
179 {
180         FILE *pipefd = setup(fds, auclass);
181         const char *regex = "fstat.*return,failure : Bad file descriptor";
182         /* Failure reason: bad file descriptor */
183         ATF_REQUIRE_EQ(-1, fstat(-1, &statbuff));
184         check_audit(fds, regex, pipefd);
185 }
186
187 ATF_TC_CLEANUP(fstat_failure, tc)
188 {
189         cleanup();
190 }
191
192
193 ATF_TC_WITH_CLEANUP(fstatat_success);
194 ATF_TC_HEAD(fstatat_success, tc)
195 {
196         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
197                                         "fstatat(2) call");
198 }
199
200 ATF_TC_BODY(fstatat_success, tc)
201 {
202         /* File or Symbolic link needs to exist to call lstat(2) */
203         ATF_REQUIRE_EQ(0, symlink("symlink", path));
204         FILE *pipefd = setup(fds, auclass);
205         ATF_REQUIRE_EQ(0, fstatat(AT_FDCWD, path, &statbuff,
206                 AT_SYMLINK_NOFOLLOW));
207         check_audit(fds, successreg, pipefd);
208 }
209
210 ATF_TC_CLEANUP(fstatat_success, tc)
211 {
212         cleanup();
213 }
214
215
216 ATF_TC_WITH_CLEANUP(fstatat_failure);
217 ATF_TC_HEAD(fstatat_failure, tc)
218 {
219         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
220                                         "fstatat(2) call");
221 }
222
223 ATF_TC_BODY(fstatat_failure, tc)
224 {
225         FILE *pipefd = setup(fds, auclass);
226         /* Failure reason: symbolic link does not exist */
227         ATF_REQUIRE_EQ(-1, fstatat(AT_FDCWD, path, &statbuff,
228                 AT_SYMLINK_NOFOLLOW));
229         check_audit(fds, failurereg, pipefd);
230 }
231
232 ATF_TC_CLEANUP(fstatat_failure, tc)
233 {
234         cleanup();
235 }
236
237
238 ATF_TC_WITH_CLEANUP(statfs_success);
239 ATF_TC_HEAD(statfs_success, tc)
240 {
241         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
242                                         "statfs(2) call");
243 }
244
245 ATF_TC_BODY(statfs_success, tc)
246 {
247         /* File needs to exist to call statfs(2) */
248         ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
249         FILE *pipefd = setup(fds, auclass);
250         ATF_REQUIRE_EQ(0, statfs(path, &statfsbuff));
251         check_audit(fds, successreg, pipefd);
252         close(filedesc);
253 }
254
255 ATF_TC_CLEANUP(statfs_success, tc)
256 {
257         cleanup();
258 }
259
260
261 ATF_TC_WITH_CLEANUP(statfs_failure);
262 ATF_TC_HEAD(statfs_failure, tc)
263 {
264         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
265                                         "statfs(2) call");
266 }
267
268 ATF_TC_BODY(statfs_failure, tc)
269 {
270         FILE *pipefd = setup(fds, auclass);
271         /* Failure reason: file does not exist */
272         ATF_REQUIRE_EQ(-1, statfs(errpath, &statfsbuff));
273         check_audit(fds, failurereg, pipefd);
274 }
275
276 ATF_TC_CLEANUP(statfs_failure, tc)
277 {
278         cleanup();
279 }
280
281
282 ATF_TC_WITH_CLEANUP(fstatfs_success);
283 ATF_TC_HEAD(fstatfs_success, tc)
284 {
285         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
286                                         "fstatfs(2) call");
287 }
288
289 ATF_TC_BODY(fstatfs_success, tc)
290 {
291         /* File needs to exist to call fstat(2) */
292         ATF_REQUIRE((filedesc = open(path, O_CREAT | O_RDWR, mode)) != -1);
293         /* Call stat(2) to store the Inode number of 'path' */
294         ATF_REQUIRE_EQ(0, stat(path, &statbuff));
295         FILE *pipefd = setup(fds, auclass);
296         ATF_REQUIRE_EQ(0, fstatfs(filedesc, &statfsbuff));
297
298         snprintf(extregex, sizeof(extregex), "fstatfs.*%jd.*return,success",
299                         (intmax_t)statbuff.st_ino);
300         check_audit(fds, extregex, pipefd);
301         close(filedesc);
302 }
303
304 ATF_TC_CLEANUP(fstatfs_success, tc)
305 {
306         cleanup();
307 }
308
309
310 ATF_TC_WITH_CLEANUP(fstatfs_failure);
311 ATF_TC_HEAD(fstatfs_failure, tc)
312 {
313         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
314                                         "fstatfs(2) call");
315 }
316
317 ATF_TC_BODY(fstatfs_failure, tc)
318 {
319         FILE *pipefd = setup(fds, auclass);
320         const char *regex = "fstatfs.*return,failure : Bad file descriptor";
321         /* Failure reason: bad file descriptor */
322         ATF_REQUIRE_EQ(-1, fstatfs(-1, &statfsbuff));
323         check_audit(fds, regex, pipefd);
324 }
325
326 ATF_TC_CLEANUP(fstatfs_failure, tc)
327 {
328         cleanup();
329 }
330
331
332 ATF_TC_WITH_CLEANUP(getfsstat_success);
333 ATF_TC_HEAD(getfsstat_success, tc)
334 {
335         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
336                                         "getfsstat(2) call");
337 }
338
339 ATF_TC_BODY(getfsstat_success, tc)
340 {
341         pid = getpid();
342         snprintf(extregex, sizeof(extregex), "getfsstat.*%d.*success", pid);
343
344         FILE *pipefd = setup(fds, auclass);
345         ATF_REQUIRE(getfsstat(NULL, 0, MNT_NOWAIT) != -1);
346         check_audit(fds, extregex, pipefd);
347 }
348
349 ATF_TC_CLEANUP(getfsstat_success, tc)
350 {
351         cleanup();
352 }
353
354
355 ATF_TC_WITH_CLEANUP(getfsstat_failure);
356 ATF_TC_HEAD(getfsstat_failure, tc)
357 {
358         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
359                                         "getfsstat(2) call");
360 }
361
362 ATF_TC_BODY(getfsstat_failure, tc)
363 {
364         const char *regex = "getfsstat.*return,failure : Invalid argument";
365         FILE *pipefd = setup(fds, auclass);
366         /* Failure reason: Invalid value for mode */
367         ATF_REQUIRE_EQ(-1, getfsstat(NULL, 0, -1));
368         check_audit(fds, regex, pipefd);
369 }
370
371 ATF_TC_CLEANUP(getfsstat_failure, tc)
372 {
373         cleanup();
374 }
375
376
377 ATF_TC_WITH_CLEANUP(lgetfh_success);
378 ATF_TC_HEAD(lgetfh_success, tc)
379 {
380         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
381                                         "lgetfh(2) call");
382 }
383
384 ATF_TC_BODY(lgetfh_success, tc)
385 {
386         /* Symbolic link needs to exist to get a file-handle */
387         ATF_REQUIRE_EQ(0, symlink("symlink", path));
388         const char *regex = "lgetfh.*return,success";
389         FILE *pipefd = setup(fds, "fa");
390         ATF_REQUIRE_EQ(0, lgetfh(path, &fht));
391         check_audit(fds, regex, pipefd);
392 }
393
394 ATF_TC_CLEANUP(lgetfh_success, tc)
395 {
396         cleanup();
397 }
398
399
400 ATF_TC_WITH_CLEANUP(lgetfh_failure);
401 ATF_TC_HEAD(lgetfh_failure, tc)
402 {
403         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
404                                         "lgetfh(2) call");
405 }
406
407 ATF_TC_BODY(lgetfh_failure, tc)
408 {
409         const char *regex = "lgetfh.*return,failure";
410         FILE *pipefd = setup(fds, "fa");
411         /* Failure reason: symbolic link does not exist */
412         ATF_REQUIRE_EQ(-1, lgetfh(errpath, &fht));
413         check_audit(fds, regex, pipefd);
414 }
415
416 ATF_TC_CLEANUP(lgetfh_failure, tc)
417 {
418         cleanup();
419 }
420
421
422 ATF_TC_WITH_CLEANUP(fhopen_success);
423 ATF_TC_HEAD(fhopen_success, tc)
424 {
425         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
426                                         "fhopen(2) call");
427 }
428
429 ATF_TC_BODY(fhopen_success, tc)
430 {
431         pid = getpid();
432         snprintf(extregex, sizeof(extregex), "fhopen.*%d.*return,success", pid);
433
434         /* File needs to exist to get a file-handle */
435         ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
436         /* Get the file handle to be passed to fhopen(2) */
437         ATF_REQUIRE_EQ(0, getfh(path, &fht));
438
439         FILE *pipefd = setup(fds, auclass);
440         ATF_REQUIRE((fhdesc = fhopen(&fht, O_RDWR)) != -1);
441         check_audit(fds, extregex, pipefd);
442
443         close(fhdesc);
444         close(filedesc);
445 }
446
447 ATF_TC_CLEANUP(fhopen_success, tc)
448 {
449         cleanup();
450 }
451
452
453 ATF_TC_WITH_CLEANUP(fhopen_failure);
454 ATF_TC_HEAD(fhopen_failure, tc)
455 {
456         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
457                                         "fhopen(2) call");
458 }
459
460 ATF_TC_BODY(fhopen_failure, tc)
461 {
462         const char *regex = "fhopen.*return,failure : Invalid argument";
463         FILE *pipefd = setup(fds, auclass);
464         /*
465          * Failure reason: NULL does not represent any file handle
466          * and O_CREAT is not allowed as the flag for fhopen(2)
467          */
468         ATF_REQUIRE_EQ(-1, fhopen(NULL, O_CREAT));
469         check_audit(fds, regex, pipefd);
470 }
471
472 ATF_TC_CLEANUP(fhopen_failure, tc)
473 {
474         cleanup();
475 }
476
477
478 ATF_TC_WITH_CLEANUP(fhstat_success);
479 ATF_TC_HEAD(fhstat_success, tc)
480 {
481         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
482                                         "fstat(2) call");
483 }
484
485 ATF_TC_BODY(fhstat_success, tc)
486 {
487         pid = getpid();
488         snprintf(extregex, sizeof(extregex), "fhstat.*%d.*return,success", pid);
489
490         /* File needs to exist to get a file-handle */
491         ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
492         /* Get the file handle to be passed to fhstat(2) */
493         ATF_REQUIRE_EQ(0, getfh(path, &fht));
494
495         FILE *pipefd = setup(fds, auclass);
496         ATF_REQUIRE_EQ(0, fhstat(&fht, &statbuff));
497         check_audit(fds, extregex, pipefd);
498         close(filedesc);
499 }
500
501 ATF_TC_CLEANUP(fhstat_success, tc)
502 {
503         cleanup();
504 }
505
506
507 ATF_TC_WITH_CLEANUP(fhstat_failure);
508 ATF_TC_HEAD(fhstat_failure, tc)
509 {
510         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
511                                         "fhstat(2) call");
512 }
513
514 ATF_TC_BODY(fhstat_failure, tc)
515 {
516         const char *regex = "fhstat.*return,failure : Bad address";
517         FILE *pipefd = setup(fds, auclass);
518         /* Failure reason: NULL does not represent any file handle */
519         ATF_REQUIRE_EQ(-1, fhstat(NULL, NULL));
520         check_audit(fds, regex, pipefd);
521 }
522
523 ATF_TC_CLEANUP(fhstat_failure, tc)
524 {
525         cleanup();
526 }
527
528
529 ATF_TC_WITH_CLEANUP(fhstatfs_success);
530 ATF_TC_HEAD(fhstatfs_success, tc)
531 {
532         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
533                                         "fstatfs(2) call");
534 }
535
536 ATF_TC_BODY(fhstatfs_success, tc)
537 {
538         pid = getpid();
539         snprintf(extregex, sizeof(extregex), "fhstatfs.*%d.*success", pid);
540
541         /* File needs to exist to get a file-handle */
542         ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
543         /* Get the file handle to be passed to fhstatfs(2) */
544         ATF_REQUIRE_EQ(0, getfh(path, &fht));
545
546         FILE *pipefd = setup(fds, auclass);
547         ATF_REQUIRE_EQ(0, fhstatfs(&fht, &statfsbuff));
548         check_audit(fds, extregex, pipefd);
549         close(filedesc);
550 }
551
552 ATF_TC_CLEANUP(fhstatfs_success, tc)
553 {
554         cleanup();
555 }
556
557
558 ATF_TC_WITH_CLEANUP(fhstatfs_failure);
559 ATF_TC_HEAD(fhstatfs_failure, tc)
560 {
561         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
562                                         "fhstatfs(2) call");
563 }
564
565 ATF_TC_BODY(fhstatfs_failure, tc)
566 {
567         const char *regex = "fhstatfs.*return,failure : Bad address";
568         FILE *pipefd = setup(fds, auclass);
569         /* Failure reason: NULL does not represent any file handle */
570         ATF_REQUIRE_EQ(-1, fhstatfs(NULL, NULL));
571         check_audit(fds, regex, pipefd);
572 }
573
574 ATF_TC_CLEANUP(fhstatfs_failure, tc)
575 {
576         cleanup();
577 }
578
579
580 ATF_TC_WITH_CLEANUP(access_success);
581 ATF_TC_HEAD(access_success, tc)
582 {
583         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
584                                         "access(2) call");
585 }
586
587 ATF_TC_BODY(access_success, tc)
588 {
589         /* File needs to exist to call access(2) */
590         ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
591         FILE *pipefd = setup(fds, auclass);
592         ATF_REQUIRE_EQ(0, access(path, F_OK));
593         check_audit(fds, successreg, pipefd);
594         close(filedesc);
595 }
596
597 ATF_TC_CLEANUP(access_success, tc)
598 {
599         cleanup();
600 }
601
602
603 ATF_TC_WITH_CLEANUP(access_failure);
604 ATF_TC_HEAD(access_failure, tc)
605 {
606         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
607                                         "access(2) call");
608 }
609
610 ATF_TC_BODY(access_failure, tc)
611 {
612         FILE *pipefd = setup(fds, auclass);
613         /* Failure reason: file does not exist */
614         ATF_REQUIRE_EQ(-1, access(errpath, F_OK));
615         check_audit(fds, failurereg, pipefd);
616 }
617
618 ATF_TC_CLEANUP(access_failure, tc)
619 {
620         cleanup();
621 }
622
623
624 ATF_TC_WITH_CLEANUP(eaccess_success);
625 ATF_TC_HEAD(eaccess_success, tc)
626 {
627         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
628                                         "eaccess(2) call");
629 }
630
631 ATF_TC_BODY(eaccess_success, tc)
632 {
633         /* File needs to exist to call eaccess(2) */
634         ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
635         FILE *pipefd = setup(fds, auclass);
636         ATF_REQUIRE_EQ(0, eaccess(path, F_OK));
637         check_audit(fds, successreg, pipefd);
638         close(filedesc);
639 }
640
641 ATF_TC_CLEANUP(eaccess_success, tc)
642 {
643         cleanup();
644 }
645
646
647 ATF_TC_WITH_CLEANUP(eaccess_failure);
648 ATF_TC_HEAD(eaccess_failure, tc)
649 {
650         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
651                                         "eaccess(2) call");
652 }
653
654 ATF_TC_BODY(eaccess_failure, tc)
655 {
656         FILE *pipefd = setup(fds, auclass);
657         /* Failure reason: file does not exist */
658         ATF_REQUIRE_EQ(-1, eaccess(errpath, F_OK));
659         check_audit(fds, failurereg, pipefd);
660 }
661
662 ATF_TC_CLEANUP(eaccess_failure, tc)
663 {
664         cleanup();
665 }
666
667
668 ATF_TC_WITH_CLEANUP(faccessat_success);
669 ATF_TC_HEAD(faccessat_success, tc)
670 {
671         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
672                                         "faccessat(2) call");
673 }
674
675 ATF_TC_BODY(faccessat_success, tc)
676 {
677         /* File needs to exist to call faccessat(2) */
678         ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
679         FILE *pipefd = setup(fds, auclass);
680         ATF_REQUIRE_EQ(0, faccessat(AT_FDCWD, path, F_OK, AT_EACCESS));
681         check_audit(fds, successreg, pipefd);
682         close(filedesc);
683 }
684
685 ATF_TC_CLEANUP(faccessat_success, tc)
686 {
687         cleanup();
688 }
689
690
691 ATF_TC_WITH_CLEANUP(faccessat_failure);
692 ATF_TC_HEAD(faccessat_failure, tc)
693 {
694         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
695                                         "faccessat(2) call");
696 }
697
698 ATF_TC_BODY(faccessat_failure, tc)
699 {
700         FILE *pipefd = setup(fds, auclass);
701         /* Failure reason: file does not exist */
702         ATF_REQUIRE_EQ(-1, faccessat(AT_FDCWD, errpath, F_OK, AT_EACCESS));
703         check_audit(fds, failurereg, pipefd);
704 }
705
706 ATF_TC_CLEANUP(faccessat_failure, tc)
707 {
708         cleanup();
709 }
710
711
712 ATF_TC_WITH_CLEANUP(pathconf_success);
713 ATF_TC_HEAD(pathconf_success, tc)
714 {
715         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
716                                         "pathconf(2) call");
717 }
718
719 ATF_TC_BODY(pathconf_success, tc)
720 {
721         /* File needs to exist to call pathconf(2) */
722         ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
723         FILE *pipefd = setup(fds, auclass);
724         /* Get the maximum number of bytes of filename */
725         ATF_REQUIRE(pathconf(path, _PC_NAME_MAX) != -1);
726         check_audit(fds, successreg, pipefd);
727         close(filedesc);
728 }
729
730 ATF_TC_CLEANUP(pathconf_success, tc)
731 {
732         cleanup();
733 }
734
735
736 ATF_TC_WITH_CLEANUP(pathconf_failure);
737 ATF_TC_HEAD(pathconf_failure, tc)
738 {
739         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
740                                         "pathconf(2) call");
741 }
742
743 ATF_TC_BODY(pathconf_failure, tc)
744 {
745         FILE *pipefd = setup(fds, auclass);
746         /* Failure reason: file does not exist */
747         ATF_REQUIRE_EQ(-1, pathconf(errpath, _PC_NAME_MAX));
748         check_audit(fds, failurereg, pipefd);
749 }
750
751 ATF_TC_CLEANUP(pathconf_failure, tc)
752 {
753         cleanup();
754 }
755
756
757 ATF_TC_WITH_CLEANUP(lpathconf_success);
758 ATF_TC_HEAD(lpathconf_success, tc)
759 {
760         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
761                                         "lpathconf(2) call");
762 }
763
764 ATF_TC_BODY(lpathconf_success, tc)
765 {
766         /* Symbolic link needs to exist to call lpathconf(2) */
767         ATF_REQUIRE_EQ(0, symlink("symlink", path));
768         FILE *pipefd = setup(fds, auclass);
769         /* Get the maximum number of bytes of symlink's name */
770         ATF_REQUIRE(lpathconf(path, _PC_SYMLINK_MAX) != -1);
771         check_audit(fds, successreg, pipefd);
772 }
773
774 ATF_TC_CLEANUP(lpathconf_success, tc)
775 {
776         cleanup();
777 }
778
779
780 ATF_TC_WITH_CLEANUP(lpathconf_failure);
781 ATF_TC_HEAD(lpathconf_failure, tc)
782 {
783         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
784                                         "lpathconf(2) call");
785 }
786
787 ATF_TC_BODY(lpathconf_failure, tc)
788 {
789         FILE *pipefd = setup(fds, auclass);
790         /* Failure reason: symbolic link does not exist */
791         ATF_REQUIRE_EQ(-1, lpathconf(errpath, _PC_SYMLINK_MAX));
792         check_audit(fds, failurereg, pipefd);
793 }
794
795 ATF_TC_CLEANUP(lpathconf_failure, tc)
796 {
797         cleanup();
798 }
799
800
801 ATF_TC_WITH_CLEANUP(fpathconf_success);
802 ATF_TC_HEAD(fpathconf_success, tc)
803 {
804         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
805                                         "fpathconf(2) call");
806 }
807
808 ATF_TC_BODY(fpathconf_success, tc)
809 {
810         pid = getpid();
811         snprintf(extregex, sizeof(extregex), "fpathconf.*%d.*success", pid);
812
813         /* File needs to exist to call fpathconf(2) */
814         ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
815         FILE *pipefd = setup(fds, auclass);
816         /* Get the maximum number of bytes of filename */
817         ATF_REQUIRE(fpathconf(filedesc, _PC_NAME_MAX) != -1);
818         check_audit(fds, extregex, pipefd);
819         close(filedesc);
820 }
821
822 ATF_TC_CLEANUP(fpathconf_success, tc)
823 {
824         cleanup();
825 }
826
827
828 ATF_TC_WITH_CLEANUP(fpathconf_failure);
829 ATF_TC_HEAD(fpathconf_failure, tc)
830 {
831         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
832                                         "fpathconf(2) call");
833 }
834
835 ATF_TC_BODY(fpathconf_failure, tc)
836 {
837         FILE *pipefd = setup(fds, auclass);
838         const char *regex = "fpathconf.*return,failure : Bad file descriptor";
839         /* Failure reason: Bad file descriptor */
840         ATF_REQUIRE_EQ(-1, fpathconf(-1, _PC_NAME_MAX));
841         check_audit(fds, regex, pipefd);
842 }
843
844 ATF_TC_CLEANUP(fpathconf_failure, tc)
845 {
846         cleanup();
847 }
848
849
850 ATF_TC_WITH_CLEANUP(extattr_get_file_success);
851 ATF_TC_HEAD(extattr_get_file_success, tc)
852 {
853         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
854                                         "extattr_get_file(2) call");
855 }
856
857 ATF_TC_BODY(extattr_get_file_success, tc)
858 {
859         /* File needs to exist to call extattr_get_file(2) */
860         ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
861         /* Set an extended attribute to be retrieved later on */
862         ATF_REQUIRE_EQ(sizeof(buff), extattr_set_file(path,
863                 EXTATTR_NAMESPACE_USER, name, buff, sizeof(buff)));
864
865         /* Prepare the regex to be checked in the audit record */
866         snprintf(extregex, sizeof(extregex),
867                 "extattr_get_file.*%s.*%s.*return,success", path, name);
868
869         FILE *pipefd = setup(fds, auclass);
870         ATF_REQUIRE_EQ(sizeof(buff), extattr_get_file(path,
871                 EXTATTR_NAMESPACE_USER, name, NULL, 0));
872         check_audit(fds, extregex, pipefd);
873         close(filedesc);
874 }
875
876 ATF_TC_CLEANUP(extattr_get_file_success, tc)
877 {
878         cleanup();
879 }
880
881
882 ATF_TC_WITH_CLEANUP(extattr_get_file_failure);
883 ATF_TC_HEAD(extattr_get_file_failure, tc)
884 {
885         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
886                                         "extattr_get_file(2) call");
887 }
888
889 ATF_TC_BODY(extattr_get_file_failure, tc)
890 {
891         /* Prepare the regex to be checked in the audit record */
892         snprintf(extregex, sizeof(extregex),
893                 "extattr_get_file.*%s.*%s.*failure", path, name);
894
895         FILE *pipefd = setup(fds, auclass);
896         /* Failure reason: file does not exist */
897         ATF_REQUIRE_EQ(-1, extattr_get_file(path,
898                 EXTATTR_NAMESPACE_USER, name, NULL, 0));
899         check_audit(fds, extregex, pipefd);
900 }
901
902 ATF_TC_CLEANUP(extattr_get_file_failure, tc)
903 {
904         cleanup();
905 }
906
907
908 ATF_TC_WITH_CLEANUP(extattr_get_fd_success);
909 ATF_TC_HEAD(extattr_get_fd_success, tc)
910 {
911         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
912                                         "extattr_get_fd(2) call");
913 }
914
915 ATF_TC_BODY(extattr_get_fd_success, tc)
916 {
917         /* File needs to exist to call extattr_get_fd(2) */
918         ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
919         /* Set an extended attribute to be retrieved later on */
920         ATF_REQUIRE_EQ(sizeof(buff), extattr_set_file(path,
921                 EXTATTR_NAMESPACE_USER, name, buff, sizeof(buff)));
922
923         /* Prepare the regex to be checked in the audit record */
924         snprintf(extregex, sizeof(extregex),
925                 "extattr_get_fd.*%s.*return,success", name);
926
927         FILE *pipefd = setup(fds, auclass);
928         ATF_REQUIRE_EQ(sizeof(buff), extattr_get_fd(filedesc,
929                 EXTATTR_NAMESPACE_USER, name, NULL, 0));
930         check_audit(fds, extregex, pipefd);
931         close(filedesc);
932 }
933
934 ATF_TC_CLEANUP(extattr_get_fd_success, tc)
935 {
936         cleanup();
937 }
938
939
940 ATF_TC_WITH_CLEANUP(extattr_get_fd_failure);
941 ATF_TC_HEAD(extattr_get_fd_failure, tc)
942 {
943         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
944                                         "extattr_get_fd(2) call");
945 }
946
947 ATF_TC_BODY(extattr_get_fd_failure, tc)
948 {
949         /* Prepare the regex to be checked in the audit record */
950         snprintf(extregex, sizeof(extregex),
951         "extattr_get_fd.*%s.*return,failure : Bad file descriptor", name);
952
953         FILE *pipefd = setup(fds, auclass);
954         /* Failure reason: Invalid file descriptor */
955         ATF_REQUIRE_EQ(-1, extattr_get_fd(-1,
956                 EXTATTR_NAMESPACE_USER, name, NULL, 0));
957         check_audit(fds, extregex, pipefd);
958 }
959
960 ATF_TC_CLEANUP(extattr_get_fd_failure, tc)
961 {
962         cleanup();
963 }
964
965
966 ATF_TC_WITH_CLEANUP(extattr_get_link_success);
967 ATF_TC_HEAD(extattr_get_link_success, tc)
968 {
969         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
970                                         "extattr_get_link(2) call");
971 }
972
973 ATF_TC_BODY(extattr_get_link_success, tc)
974 {
975         /* Symbolic link needs to exist to call extattr_get_link(2) */
976         ATF_REQUIRE_EQ(0, symlink("symlink", path));
977         /* Set an extended attribute to be retrieved later on */
978         ATF_REQUIRE_EQ(sizeof(buff), extattr_set_link(path,
979                 EXTATTR_NAMESPACE_USER, name, buff, sizeof(buff)));
980
981         /* Prepare the regex to be checked in the audit record */
982         snprintf(extregex, sizeof(extregex),
983                 "extattr_get_link.*%s.*%s.*return,success", path, name);
984
985         FILE *pipefd = setup(fds, auclass);
986         ATF_REQUIRE_EQ(sizeof(buff), extattr_get_link(path,
987                 EXTATTR_NAMESPACE_USER, name, NULL, 0));
988         check_audit(fds, extregex, pipefd);
989 }
990
991 ATF_TC_CLEANUP(extattr_get_link_success, tc)
992 {
993         cleanup();
994 }
995
996
997 ATF_TC_WITH_CLEANUP(extattr_get_link_failure);
998 ATF_TC_HEAD(extattr_get_link_failure, tc)
999 {
1000         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1001                                         "extattr_get_link(2) call");
1002 }
1003
1004 ATF_TC_BODY(extattr_get_link_failure, tc)
1005 {
1006         /* Prepare the regex to be checked in the audit record */
1007         snprintf(extregex, sizeof(extregex),
1008                 "extattr_get_link.*%s.*%s.*failure", path, name);
1009         FILE *pipefd = setup(fds, auclass);
1010         /* Failure reason: symbolic link does not exist */
1011         ATF_REQUIRE_EQ(-1, extattr_get_link(path,
1012                 EXTATTR_NAMESPACE_USER, name, NULL, 0));
1013         check_audit(fds, extregex, pipefd);
1014 }
1015
1016 ATF_TC_CLEANUP(extattr_get_link_failure, tc)
1017 {
1018         cleanup();
1019 }
1020
1021
1022 ATF_TC_WITH_CLEANUP(extattr_list_file_success);
1023 ATF_TC_HEAD(extattr_list_file_success, tc)
1024 {
1025         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1026                                         "extattr_list_file(2) call");
1027 }
1028
1029 ATF_TC_BODY(extattr_list_file_success, tc)
1030 {
1031         int readbuff;
1032         /* File needs to exist to call extattr_list_file(2) */
1033         ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
1034
1035         FILE *pipefd = setup(fds, auclass);
1036         ATF_REQUIRE((readbuff = extattr_list_file(path,
1037                 EXTATTR_NAMESPACE_USER, NULL, 0)) != -1);
1038         /* Prepare the regex to be checked in the audit record */
1039         snprintf(extregex, sizeof(extregex),
1040                 "extattr_list_file.*%s.*return,success,%d", path, readbuff);
1041         check_audit(fds, extregex, pipefd);
1042 }
1043
1044 ATF_TC_CLEANUP(extattr_list_file_success, tc)
1045 {
1046         cleanup();
1047 }
1048
1049
1050 ATF_TC_WITH_CLEANUP(extattr_list_file_failure);
1051 ATF_TC_HEAD(extattr_list_file_failure, tc)
1052 {
1053         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1054                                         "extattr_list_file(2) call");
1055 }
1056
1057 ATF_TC_BODY(extattr_list_file_failure, tc)
1058 {
1059         /* Prepare the regex to be checked in the audit record */
1060         snprintf(extregex, sizeof(extregex),
1061                 "extattr_list_file.*%s.*return,failure", path);
1062
1063         FILE *pipefd = setup(fds, auclass);
1064         /* Failure reason: file does not exist */
1065         ATF_REQUIRE_EQ(-1, extattr_list_file(path,
1066                 EXTATTR_NAMESPACE_USER, NULL, 0));
1067         check_audit(fds, extregex, pipefd);
1068 }
1069
1070 ATF_TC_CLEANUP(extattr_list_file_failure, tc)
1071 {
1072         cleanup();
1073 }
1074
1075
1076 ATF_TC_WITH_CLEANUP(extattr_list_fd_success);
1077 ATF_TC_HEAD(extattr_list_fd_success, tc)
1078 {
1079         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1080                                         "extattr_list_fd(2) call");
1081 }
1082
1083 ATF_TC_BODY(extattr_list_fd_success, tc)
1084 {
1085         int readbuff;
1086         /* File needs to exist to call extattr_list_fd(2) */
1087         ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
1088
1089         FILE *pipefd = setup(fds, auclass);
1090         ATF_REQUIRE((readbuff = extattr_list_fd(filedesc,
1091                 EXTATTR_NAMESPACE_USER, NULL, 0)) != -1);
1092         /* Prepare the regex to be checked in the audit record */
1093         snprintf(extregex, sizeof(extregex),
1094                 "extattr_list_fd.*return,success,%d", readbuff);
1095         check_audit(fds, extregex, pipefd);
1096         close(filedesc);
1097 }
1098
1099 ATF_TC_CLEANUP(extattr_list_fd_success, tc)
1100 {
1101         cleanup();
1102 }
1103
1104
1105 ATF_TC_WITH_CLEANUP(extattr_list_fd_failure);
1106 ATF_TC_HEAD(extattr_list_fd_failure, tc)
1107 {
1108         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1109                                         "extattr_list_fd(2) call");
1110 }
1111
1112 ATF_TC_BODY(extattr_list_fd_failure, tc)
1113 {
1114         /* Prepare the regex to be checked in the audit record */
1115         snprintf(extregex, sizeof(extregex),
1116                 "extattr_list_fd.*return,failure : Bad file descriptor");
1117
1118         FILE *pipefd = setup(fds, auclass);
1119         /* Failure reason: Invalid file descriptor */
1120         ATF_REQUIRE_EQ(-1,
1121                 extattr_list_fd(-1, EXTATTR_NAMESPACE_USER, NULL, 0));
1122         check_audit(fds, extregex, pipefd);
1123 }
1124
1125 ATF_TC_CLEANUP(extattr_list_fd_failure, tc)
1126 {
1127         cleanup();
1128 }
1129
1130
1131 ATF_TC_WITH_CLEANUP(extattr_list_link_success);
1132 ATF_TC_HEAD(extattr_list_link_success, tc)
1133 {
1134         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1135                                         "extattr_list_link(2) call");
1136 }
1137
1138 ATF_TC_BODY(extattr_list_link_success, tc)
1139 {
1140         int readbuff;
1141         /* Symbolic link needs to exist to call extattr_list_link(2) */
1142         ATF_REQUIRE_EQ(0, symlink("symlink", path));
1143         FILE *pipefd = setup(fds, auclass);
1144
1145         ATF_REQUIRE((readbuff = extattr_list_link(path,
1146                 EXTATTR_NAMESPACE_USER, NULL, 0)) != -1);
1147         /* Prepare the regex to be checked in the audit record */
1148         snprintf(extregex, sizeof(extregex),
1149                 "extattr_list_link.*%s.*return,success,%d", path, readbuff);
1150         check_audit(fds, extregex, pipefd);
1151 }
1152
1153 ATF_TC_CLEANUP(extattr_list_link_success, tc)
1154 {
1155         cleanup();
1156 }
1157
1158
1159 ATF_TC_WITH_CLEANUP(extattr_list_link_failure);
1160 ATF_TC_HEAD(extattr_list_link_failure, tc)
1161 {
1162         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1163                                         "extattr_list_link(2) call");
1164 }
1165
1166 ATF_TC_BODY(extattr_list_link_failure, tc)
1167 {
1168         /* Prepare the regex to be checked in the audit record */
1169         snprintf(extregex, sizeof(extregex),
1170                 "extattr_list_link.*%s.*failure", path);
1171         FILE *pipefd = setup(fds, auclass);
1172         /* Failure reason: symbolic link does not exist */
1173         ATF_REQUIRE_EQ(-1, extattr_list_link(path,
1174                 EXTATTR_NAMESPACE_USER, NULL, 0));
1175         check_audit(fds, extregex, pipefd);
1176 }
1177
1178 ATF_TC_CLEANUP(extattr_list_link_failure, tc)
1179 {
1180         cleanup();
1181 }
1182
1183
1184 ATF_TP_ADD_TCS(tp)
1185 {
1186         ATF_TP_ADD_TC(tp, stat_success);
1187         ATF_TP_ADD_TC(tp, stat_failure);
1188         ATF_TP_ADD_TC(tp, lstat_success);
1189         ATF_TP_ADD_TC(tp, lstat_failure);
1190         ATF_TP_ADD_TC(tp, fstat_success);
1191         ATF_TP_ADD_TC(tp, fstat_failure);
1192         ATF_TP_ADD_TC(tp, fstatat_success);
1193         ATF_TP_ADD_TC(tp, fstatat_failure);
1194
1195         ATF_TP_ADD_TC(tp, statfs_success);
1196         ATF_TP_ADD_TC(tp, statfs_failure);
1197         ATF_TP_ADD_TC(tp, fstatfs_success);
1198         ATF_TP_ADD_TC(tp, fstatfs_failure);
1199
1200         ATF_TP_ADD_TC(tp, getfsstat_success);
1201         ATF_TP_ADD_TC(tp, getfsstat_failure);
1202
1203         ATF_TP_ADD_TC(tp, lgetfh_success);
1204         ATF_TP_ADD_TC(tp, lgetfh_failure);
1205         ATF_TP_ADD_TC(tp, fhopen_success);
1206         ATF_TP_ADD_TC(tp, fhopen_failure);
1207         ATF_TP_ADD_TC(tp, fhstat_success);
1208         ATF_TP_ADD_TC(tp, fhstat_failure);
1209         ATF_TP_ADD_TC(tp, fhstatfs_success);
1210         ATF_TP_ADD_TC(tp, fhstatfs_failure);
1211
1212         ATF_TP_ADD_TC(tp, access_success);
1213         ATF_TP_ADD_TC(tp, access_failure);
1214         ATF_TP_ADD_TC(tp, eaccess_success);
1215         ATF_TP_ADD_TC(tp, eaccess_failure);
1216         ATF_TP_ADD_TC(tp, faccessat_success);
1217         ATF_TP_ADD_TC(tp, faccessat_failure);
1218
1219         ATF_TP_ADD_TC(tp, pathconf_success);
1220         ATF_TP_ADD_TC(tp, pathconf_failure);
1221         ATF_TP_ADD_TC(tp, lpathconf_success);
1222         ATF_TP_ADD_TC(tp, lpathconf_failure);
1223         ATF_TP_ADD_TC(tp, fpathconf_success);
1224         ATF_TP_ADD_TC(tp, fpathconf_failure);
1225
1226         ATF_TP_ADD_TC(tp, extattr_get_file_success);
1227         ATF_TP_ADD_TC(tp, extattr_get_file_failure);
1228         ATF_TP_ADD_TC(tp, extattr_get_fd_success);
1229         ATF_TP_ADD_TC(tp, extattr_get_fd_failure);
1230         ATF_TP_ADD_TC(tp, extattr_get_link_success);
1231         ATF_TP_ADD_TC(tp, extattr_get_link_failure);
1232
1233         ATF_TP_ADD_TC(tp, extattr_list_file_success);
1234         ATF_TP_ADD_TC(tp, extattr_list_file_failure);
1235         ATF_TP_ADD_TC(tp, extattr_list_fd_success);
1236         ATF_TP_ADD_TC(tp, extattr_list_fd_failure);
1237         ATF_TP_ADD_TC(tp, extattr_list_link_success);
1238         ATF_TP_ADD_TC(tp, extattr_list_link_failure);
1239
1240         return (atf_no_error());
1241 }