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/extattr.h>
28 #include <sys/mount.h>
29 #include <sys/stat.h>
30 #include <sys/syscall.h>
31 #include <sys/ucred.h>
32
33 #include <atf-c.h>
34 #include <errno.h>
35 #include <fcntl.h>
36 #include <string.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);
ATF_TC_HEAD(stat_success,tc)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
ATF_TC_BODY(stat_success,tc)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
ATF_TC_CLEANUP(stat_success,tc)75 ATF_TC_CLEANUP(stat_success, tc)
76 {
77 cleanup();
78 }
79
80
81 ATF_TC_WITH_CLEANUP(stat_failure);
ATF_TC_HEAD(stat_failure,tc)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
ATF_TC_BODY(stat_failure,tc)88 ATF_TC_BODY(stat_failure, tc)
89 {
90 FILE *pipefd = setup(fds, auclass);
91 /* Failure reason: file does not exist */
92 ATF_REQUIRE_ERRNO(ENOENT, stat(errpath, &statbuff) == -1);
93 check_audit(fds, failurereg, pipefd);
94 }
95
ATF_TC_CLEANUP(stat_failure,tc)96 ATF_TC_CLEANUP(stat_failure, tc)
97 {
98 cleanup();
99 }
100
101
102 ATF_TC_WITH_CLEANUP(lstat_success);
ATF_TC_HEAD(lstat_success,tc)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
ATF_TC_BODY(lstat_success,tc)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
ATF_TC_CLEANUP(lstat_success,tc)118 ATF_TC_CLEANUP(lstat_success, tc)
119 {
120 cleanup();
121 }
122
123
124 ATF_TC_WITH_CLEANUP(lstat_failure);
ATF_TC_HEAD(lstat_failure,tc)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
ATF_TC_BODY(lstat_failure,tc)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_ERRNO(ENOENT, lstat(errpath, &statbuff) == -1);
136 check_audit(fds, failurereg, pipefd);
137 }
138
ATF_TC_CLEANUP(lstat_failure,tc)139 ATF_TC_CLEANUP(lstat_failure, tc)
140 {
141 cleanup();
142 }
143
144
145 ATF_TC_WITH_CLEANUP(fstat_success);
ATF_TC_HEAD(fstat_success,tc)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
ATF_TC_BODY(fstat_success,tc)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
ATF_TC_CLEANUP(fstat_success,tc)165 ATF_TC_CLEANUP(fstat_success, tc)
166 {
167 cleanup();
168 }
169
170
171 ATF_TC_WITH_CLEANUP(fstat_failure);
ATF_TC_HEAD(fstat_failure,tc)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
ATF_TC_BODY(fstat_failure,tc)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_ERRNO(EBADF, fstat(-1, &statbuff) == -1);
184 check_audit(fds, regex, pipefd);
185 }
186
ATF_TC_CLEANUP(fstat_failure,tc)187 ATF_TC_CLEANUP(fstat_failure, tc)
188 {
189 cleanup();
190 }
191
192
193 ATF_TC_WITH_CLEANUP(fstatat_success);
ATF_TC_HEAD(fstatat_success,tc)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
ATF_TC_BODY(fstatat_success,tc)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
ATF_TC_CLEANUP(fstatat_success,tc)210 ATF_TC_CLEANUP(fstatat_success, tc)
211 {
212 cleanup();
213 }
214
215
216 ATF_TC_WITH_CLEANUP(fstatat_failure);
ATF_TC_HEAD(fstatat_failure,tc)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
ATF_TC_BODY(fstatat_failure,tc)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_ERRNO(ENOENT,
228 fstatat(AT_FDCWD, path, &statbuff, AT_SYMLINK_NOFOLLOW) == -1);
229 check_audit(fds, failurereg, pipefd);
230 }
231
ATF_TC_CLEANUP(fstatat_failure,tc)232 ATF_TC_CLEANUP(fstatat_failure, tc)
233 {
234 cleanup();
235 }
236
237
238 ATF_TC_WITH_CLEANUP(statfs_success);
ATF_TC_HEAD(statfs_success,tc)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
ATF_TC_BODY(statfs_success,tc)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
ATF_TC_CLEANUP(statfs_success,tc)255 ATF_TC_CLEANUP(statfs_success, tc)
256 {
257 cleanup();
258 }
259
260
261 ATF_TC_WITH_CLEANUP(statfs_failure);
ATF_TC_HEAD(statfs_failure,tc)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
ATF_TC_BODY(statfs_failure,tc)268 ATF_TC_BODY(statfs_failure, tc)
269 {
270 FILE *pipefd = setup(fds, auclass);
271 /* Failure reason: file does not exist */
272 ATF_REQUIRE_ERRNO(ENOENT, statfs(errpath, &statfsbuff) == -1);
273 check_audit(fds, failurereg, pipefd);
274 }
275
ATF_TC_CLEANUP(statfs_failure,tc)276 ATF_TC_CLEANUP(statfs_failure, tc)
277 {
278 cleanup();
279 }
280
281
282 ATF_TC_WITH_CLEANUP(fstatfs_success);
ATF_TC_HEAD(fstatfs_success,tc)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
ATF_TC_BODY(fstatfs_success,tc)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
ATF_TC_CLEANUP(fstatfs_success,tc)304 ATF_TC_CLEANUP(fstatfs_success, tc)
305 {
306 cleanup();
307 }
308
309
310 ATF_TC_WITH_CLEANUP(fstatfs_failure);
ATF_TC_HEAD(fstatfs_failure,tc)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
ATF_TC_BODY(fstatfs_failure,tc)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_ERRNO(EBADF, fstatfs(-1, &statfsbuff) == -1);
323 check_audit(fds, regex, pipefd);
324 }
325
ATF_TC_CLEANUP(fstatfs_failure,tc)326 ATF_TC_CLEANUP(fstatfs_failure, tc)
327 {
328 cleanup();
329 }
330
331
332 ATF_TC_WITH_CLEANUP(getfsstat_success);
ATF_TC_HEAD(getfsstat_success,tc)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
ATF_TC_BODY(getfsstat_success,tc)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
ATF_TC_CLEANUP(getfsstat_success,tc)349 ATF_TC_CLEANUP(getfsstat_success, tc)
350 {
351 cleanup();
352 }
353
354
355 ATF_TC_WITH_CLEANUP(getfsstat_failure);
ATF_TC_HEAD(getfsstat_failure,tc)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
ATF_TC_BODY(getfsstat_failure,tc)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_ERRNO(EINVAL, getfsstat(NULL, 0, -1) == -1);
368 check_audit(fds, regex, pipefd);
369 }
370
ATF_TC_CLEANUP(getfsstat_failure,tc)371 ATF_TC_CLEANUP(getfsstat_failure, tc)
372 {
373 cleanup();
374 }
375
376
377 ATF_TC_WITH_CLEANUP(lgetfh_success);
ATF_TC_HEAD(lgetfh_success,tc)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
ATF_TC_BODY(lgetfh_success,tc)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
ATF_TC_CLEANUP(lgetfh_success,tc)394 ATF_TC_CLEANUP(lgetfh_success, tc)
395 {
396 cleanup();
397 }
398
399
400 ATF_TC_WITH_CLEANUP(lgetfh_failure);
ATF_TC_HEAD(lgetfh_failure,tc)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
ATF_TC_BODY(lgetfh_failure,tc)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_ERRNO(ENOENT, lgetfh(errpath, &fht) == -1);
413 check_audit(fds, regex, pipefd);
414 }
415
ATF_TC_CLEANUP(lgetfh_failure,tc)416 ATF_TC_CLEANUP(lgetfh_failure, tc)
417 {
418 cleanup();
419 }
420
421
422 ATF_TC_WITH_CLEANUP(fhopen_success);
ATF_TC_HEAD(fhopen_success,tc)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
ATF_TC_BODY(fhopen_success,tc)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
ATF_TC_CLEANUP(fhopen_success,tc)447 ATF_TC_CLEANUP(fhopen_success, tc)
448 {
449 cleanup();
450 }
451
452
453 ATF_TC_WITH_CLEANUP(fhopen_failure);
ATF_TC_HEAD(fhopen_failure,tc)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
ATF_TC_BODY(fhopen_failure,tc)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_ERRNO(EINVAL, fhopen(NULL, O_CREAT) == -1);
469 check_audit(fds, regex, pipefd);
470 }
471
ATF_TC_CLEANUP(fhopen_failure,tc)472 ATF_TC_CLEANUP(fhopen_failure, tc)
473 {
474 cleanup();
475 }
476
477
478 ATF_TC_WITH_CLEANUP(fhstat_success);
ATF_TC_HEAD(fhstat_success,tc)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
ATF_TC_BODY(fhstat_success,tc)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
ATF_TC_CLEANUP(fhstat_success,tc)501 ATF_TC_CLEANUP(fhstat_success, tc)
502 {
503 cleanup();
504 }
505
506
507 ATF_TC_WITH_CLEANUP(fhstat_failure);
ATF_TC_HEAD(fhstat_failure,tc)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
ATF_TC_BODY(fhstat_failure,tc)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_ERRNO(EFAULT, fhstat(NULL, NULL) == -1);
520 check_audit(fds, regex, pipefd);
521 }
522
ATF_TC_CLEANUP(fhstat_failure,tc)523 ATF_TC_CLEANUP(fhstat_failure, tc)
524 {
525 cleanup();
526 }
527
528
529 ATF_TC_WITH_CLEANUP(fhstatfs_success);
ATF_TC_HEAD(fhstatfs_success,tc)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
ATF_TC_BODY(fhstatfs_success,tc)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
ATF_TC_CLEANUP(fhstatfs_success,tc)552 ATF_TC_CLEANUP(fhstatfs_success, tc)
553 {
554 cleanup();
555 }
556
557
558 ATF_TC_WITH_CLEANUP(fhstatfs_failure);
ATF_TC_HEAD(fhstatfs_failure,tc)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
ATF_TC_BODY(fhstatfs_failure,tc)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_ERRNO(EFAULT, fhstatfs(NULL, NULL) == -1);
571 check_audit(fds, regex, pipefd);
572 }
573
ATF_TC_CLEANUP(fhstatfs_failure,tc)574 ATF_TC_CLEANUP(fhstatfs_failure, tc)
575 {
576 cleanup();
577 }
578
579
580 ATF_TC_WITH_CLEANUP(access_success);
ATF_TC_HEAD(access_success,tc)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
ATF_TC_BODY(access_success,tc)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
ATF_TC_CLEANUP(access_success,tc)597 ATF_TC_CLEANUP(access_success, tc)
598 {
599 cleanup();
600 }
601
602
603 ATF_TC_WITH_CLEANUP(access_failure);
ATF_TC_HEAD(access_failure,tc)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
ATF_TC_BODY(access_failure,tc)610 ATF_TC_BODY(access_failure, tc)
611 {
612 FILE *pipefd = setup(fds, auclass);
613 /* Failure reason: file does not exist */
614 ATF_REQUIRE_ERRNO(ENOENT, access(errpath, F_OK) == -1);
615 check_audit(fds, failurereg, pipefd);
616 }
617
ATF_TC_CLEANUP(access_failure,tc)618 ATF_TC_CLEANUP(access_failure, tc)
619 {
620 cleanup();
621 }
622
623
624 ATF_TC_WITH_CLEANUP(eaccess_success);
ATF_TC_HEAD(eaccess_success,tc)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
ATF_TC_BODY(eaccess_success,tc)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
ATF_TC_CLEANUP(eaccess_success,tc)641 ATF_TC_CLEANUP(eaccess_success, tc)
642 {
643 cleanup();
644 }
645
646
647 ATF_TC_WITH_CLEANUP(eaccess_failure);
ATF_TC_HEAD(eaccess_failure,tc)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
ATF_TC_BODY(eaccess_failure,tc)654 ATF_TC_BODY(eaccess_failure, tc)
655 {
656 FILE *pipefd = setup(fds, auclass);
657 /* Failure reason: file does not exist */
658 ATF_REQUIRE_ERRNO(ENOENT, eaccess(errpath, F_OK) == -1);
659 check_audit(fds, failurereg, pipefd);
660 }
661
ATF_TC_CLEANUP(eaccess_failure,tc)662 ATF_TC_CLEANUP(eaccess_failure, tc)
663 {
664 cleanup();
665 }
666
667
668 ATF_TC_WITH_CLEANUP(faccessat_success);
ATF_TC_HEAD(faccessat_success,tc)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
ATF_TC_BODY(faccessat_success,tc)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
ATF_TC_CLEANUP(faccessat_success,tc)685 ATF_TC_CLEANUP(faccessat_success, tc)
686 {
687 cleanup();
688 }
689
690
691 ATF_TC_WITH_CLEANUP(faccessat_failure);
ATF_TC_HEAD(faccessat_failure,tc)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
ATF_TC_BODY(faccessat_failure,tc)698 ATF_TC_BODY(faccessat_failure, tc)
699 {
700 FILE *pipefd = setup(fds, auclass);
701 /* Failure reason: file does not exist */
702 ATF_REQUIRE_ERRNO(ENOENT,
703 faccessat(AT_FDCWD, errpath, F_OK, AT_EACCESS) == -1);
704 check_audit(fds, failurereg, pipefd);
705 }
706
ATF_TC_CLEANUP(faccessat_failure,tc)707 ATF_TC_CLEANUP(faccessat_failure, tc)
708 {
709 cleanup();
710 }
711
712
713 ATF_TC_WITH_CLEANUP(pathconf_success);
ATF_TC_HEAD(pathconf_success,tc)714 ATF_TC_HEAD(pathconf_success, tc)
715 {
716 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
717 "pathconf(2) call");
718 }
719
ATF_TC_BODY(pathconf_success,tc)720 ATF_TC_BODY(pathconf_success, tc)
721 {
722 /* File needs to exist to call pathconf(2) */
723 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
724 FILE *pipefd = setup(fds, auclass);
725 /* Get the maximum number of bytes of filename */
726 ATF_REQUIRE(pathconf(path, _PC_NAME_MAX) != -1);
727 check_audit(fds, successreg, pipefd);
728 close(filedesc);
729 }
730
ATF_TC_CLEANUP(pathconf_success,tc)731 ATF_TC_CLEANUP(pathconf_success, tc)
732 {
733 cleanup();
734 }
735
736
737 ATF_TC_WITH_CLEANUP(pathconf_failure);
ATF_TC_HEAD(pathconf_failure,tc)738 ATF_TC_HEAD(pathconf_failure, tc)
739 {
740 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
741 "pathconf(2) call");
742 }
743
ATF_TC_BODY(pathconf_failure,tc)744 ATF_TC_BODY(pathconf_failure, tc)
745 {
746 FILE *pipefd = setup(fds, auclass);
747 /* Failure reason: file does not exist */
748 ATF_REQUIRE_ERRNO(ENOENT, pathconf(errpath, _PC_NAME_MAX) == -1);
749 check_audit(fds, failurereg, pipefd);
750 }
751
ATF_TC_CLEANUP(pathconf_failure,tc)752 ATF_TC_CLEANUP(pathconf_failure, tc)
753 {
754 cleanup();
755 }
756
757
758 ATF_TC_WITH_CLEANUP(lpathconf_success);
ATF_TC_HEAD(lpathconf_success,tc)759 ATF_TC_HEAD(lpathconf_success, tc)
760 {
761 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
762 "lpathconf(2) call");
763 }
764
ATF_TC_BODY(lpathconf_success,tc)765 ATF_TC_BODY(lpathconf_success, tc)
766 {
767 /* Symbolic link needs to exist to call lpathconf(2) */
768 ATF_REQUIRE_EQ(0, symlink("symlink", path));
769 FILE *pipefd = setup(fds, auclass);
770 /* Get the maximum number of bytes of symlink's name */
771 ATF_REQUIRE(lpathconf(path, _PC_SYMLINK_MAX) != -1);
772 check_audit(fds, successreg, pipefd);
773 }
774
ATF_TC_CLEANUP(lpathconf_success,tc)775 ATF_TC_CLEANUP(lpathconf_success, tc)
776 {
777 cleanup();
778 }
779
780
781 ATF_TC_WITH_CLEANUP(lpathconf_failure);
ATF_TC_HEAD(lpathconf_failure,tc)782 ATF_TC_HEAD(lpathconf_failure, tc)
783 {
784 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
785 "lpathconf(2) call");
786 }
787
ATF_TC_BODY(lpathconf_failure,tc)788 ATF_TC_BODY(lpathconf_failure, tc)
789 {
790 FILE *pipefd = setup(fds, auclass);
791 /* Failure reason: symbolic link does not exist */
792 ATF_REQUIRE_ERRNO(ENOENT, lpathconf(errpath, _PC_SYMLINK_MAX) == -1);
793 check_audit(fds, failurereg, pipefd);
794 }
795
ATF_TC_CLEANUP(lpathconf_failure,tc)796 ATF_TC_CLEANUP(lpathconf_failure, tc)
797 {
798 cleanup();
799 }
800
801
802 ATF_TC_WITH_CLEANUP(fpathconf_success);
ATF_TC_HEAD(fpathconf_success,tc)803 ATF_TC_HEAD(fpathconf_success, tc)
804 {
805 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
806 "fpathconf(2) call");
807 }
808
ATF_TC_BODY(fpathconf_success,tc)809 ATF_TC_BODY(fpathconf_success, tc)
810 {
811 pid = getpid();
812 snprintf(extregex, sizeof(extregex), "fpathconf.*%d.*success", pid);
813
814 /* File needs to exist to call fpathconf(2) */
815 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
816 FILE *pipefd = setup(fds, auclass);
817 /* Get the maximum number of bytes of filename */
818 ATF_REQUIRE(fpathconf(filedesc, _PC_NAME_MAX) != -1);
819 check_audit(fds, extregex, pipefd);
820 close(filedesc);
821 }
822
ATF_TC_CLEANUP(fpathconf_success,tc)823 ATF_TC_CLEANUP(fpathconf_success, tc)
824 {
825 cleanup();
826 }
827
828
829 ATF_TC_WITH_CLEANUP(fpathconf_failure);
ATF_TC_HEAD(fpathconf_failure,tc)830 ATF_TC_HEAD(fpathconf_failure, tc)
831 {
832 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
833 "fpathconf(2) call");
834 }
835
ATF_TC_BODY(fpathconf_failure,tc)836 ATF_TC_BODY(fpathconf_failure, tc)
837 {
838 FILE *pipefd = setup(fds, auclass);
839 const char *regex = "fpathconf.*return,failure : Bad file descriptor";
840 /* Failure reason: Bad file descriptor */
841 ATF_REQUIRE_ERRNO(EBADF, fpathconf(-1, _PC_NAME_MAX) == -1);
842 check_audit(fds, regex, pipefd);
843 }
844
ATF_TC_CLEANUP(fpathconf_failure,tc)845 ATF_TC_CLEANUP(fpathconf_failure, tc)
846 {
847 cleanup();
848 }
849
850
851 ATF_TC_WITH_CLEANUP(extattr_get_file_success);
ATF_TC_HEAD(extattr_get_file_success,tc)852 ATF_TC_HEAD(extattr_get_file_success, tc)
853 {
854 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
855 "extattr_get_file(2) call");
856 }
857
ATF_TC_BODY(extattr_get_file_success,tc)858 ATF_TC_BODY(extattr_get_file_success, tc)
859 {
860 /* File needs to exist to call extattr_get_file(2) */
861 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
862 skip_if_extattr_not_supported(path);
863
864 /* Set an extended attribute to be retrieved later on */
865 REQUIRE_EXTATTR_RESULT(sizeof(buff),
866 extattr_set_file(path, EXTATTR_NAMESPACE_USER, name, buff,
867 sizeof(buff)));
868
869 /* Prepare the regex to be checked in the audit record */
870 snprintf(extregex, sizeof(extregex),
871 "extattr_get_file.*%s.*%s.*return,success", path, name);
872
873 FILE *pipefd = setup(fds, auclass);
874 REQUIRE_EXTATTR_RESULT(sizeof(buff),
875 extattr_get_file(path, EXTATTR_NAMESPACE_USER, name, NULL, 0));
876 check_audit(fds, extregex, pipefd);
877 close(filedesc);
878 }
879
ATF_TC_CLEANUP(extattr_get_file_success,tc)880 ATF_TC_CLEANUP(extattr_get_file_success, tc)
881 {
882 cleanup();
883 }
884
885
886 ATF_TC_WITH_CLEANUP(extattr_get_file_failure);
ATF_TC_HEAD(extattr_get_file_failure,tc)887 ATF_TC_HEAD(extattr_get_file_failure, tc)
888 {
889 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
890 "extattr_get_file(2) call");
891 }
892
ATF_TC_BODY(extattr_get_file_failure,tc)893 ATF_TC_BODY(extattr_get_file_failure, tc)
894 {
895 /* Prepare the regex to be checked in the audit record */
896 snprintf(extregex, sizeof(extregex),
897 "extattr_get_file.*%s.*%s.*failure", path, name);
898
899 FILE *pipefd = setup(fds, auclass);
900 /* Failure reason: file does not exist */
901 ATF_REQUIRE_ERRNO(ENOENT,
902 extattr_get_file(path, EXTATTR_NAMESPACE_USER, name, NULL, 0) ==
903 -1);
904 check_audit(fds, extregex, pipefd);
905 }
906
ATF_TC_CLEANUP(extattr_get_file_failure,tc)907 ATF_TC_CLEANUP(extattr_get_file_failure, tc)
908 {
909 cleanup();
910 }
911
912
913 ATF_TC_WITH_CLEANUP(extattr_get_fd_success);
ATF_TC_HEAD(extattr_get_fd_success,tc)914 ATF_TC_HEAD(extattr_get_fd_success, tc)
915 {
916 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
917 "extattr_get_fd(2) call");
918 }
919
ATF_TC_BODY(extattr_get_fd_success,tc)920 ATF_TC_BODY(extattr_get_fd_success, tc)
921 {
922 /* File needs to exist to call extattr_get_fd(2) */
923 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
924 skip_if_extattr_not_supported(path);
925
926 /* Set an extended attribute to be retrieved later on */
927 REQUIRE_EXTATTR_RESULT(sizeof(buff),
928 extattr_set_file(path, EXTATTR_NAMESPACE_USER, name, buff,
929 sizeof(buff)));
930
931 /* Prepare the regex to be checked in the audit record */
932 snprintf(extregex, sizeof(extregex),
933 "extattr_get_fd.*%s.*return,success", name);
934
935 FILE *pipefd = setup(fds, auclass);
936 REQUIRE_EXTATTR_RESULT(sizeof(buff),
937 extattr_get_fd(filedesc, EXTATTR_NAMESPACE_USER, name, NULL, 0));
938 check_audit(fds, extregex, pipefd);
939 close(filedesc);
940 }
941
ATF_TC_CLEANUP(extattr_get_fd_success,tc)942 ATF_TC_CLEANUP(extattr_get_fd_success, tc)
943 {
944 cleanup();
945 }
946
947
948 ATF_TC_WITH_CLEANUP(extattr_get_fd_failure);
ATF_TC_HEAD(extattr_get_fd_failure,tc)949 ATF_TC_HEAD(extattr_get_fd_failure, tc)
950 {
951 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
952 "extattr_get_fd(2) call");
953 }
954
ATF_TC_BODY(extattr_get_fd_failure,tc)955 ATF_TC_BODY(extattr_get_fd_failure, tc)
956 {
957 /* Prepare the regex to be checked in the audit record */
958 snprintf(extregex, sizeof(extregex),
959 "extattr_get_fd.*%s.*return,failure : Bad file descriptor", name);
960
961 FILE *pipefd = setup(fds, auclass);
962 /* Failure reason: Invalid file descriptor */
963 ATF_REQUIRE_ERRNO(EBADF,
964 extattr_get_fd(-1, EXTATTR_NAMESPACE_USER, name, NULL, 0) == -1);
965 check_audit(fds, extregex, pipefd);
966 }
967
ATF_TC_CLEANUP(extattr_get_fd_failure,tc)968 ATF_TC_CLEANUP(extattr_get_fd_failure, tc)
969 {
970 cleanup();
971 }
972
973
974 ATF_TC_WITH_CLEANUP(extattr_get_link_success);
ATF_TC_HEAD(extattr_get_link_success,tc)975 ATF_TC_HEAD(extattr_get_link_success, tc)
976 {
977 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
978 "extattr_get_link(2) call");
979 }
980
ATF_TC_BODY(extattr_get_link_success,tc)981 ATF_TC_BODY(extattr_get_link_success, tc)
982 {
983 /* Symbolic link needs to exist to call extattr_get_link(2) */
984 ATF_REQUIRE_EQ(0, symlink("symlink", path));
985 skip_if_extattr_not_supported(".");
986
987 /* Set an extended attribute to be retrieved later on */
988 REQUIRE_EXTATTR_RESULT(sizeof(buff),
989 extattr_set_link(path, EXTATTR_NAMESPACE_USER, name, buff,
990 sizeof(buff)));
991
992 /* Prepare the regex to be checked in the audit record */
993 snprintf(extregex, sizeof(extregex),
994 "extattr_get_link.*%s.*%s.*return,success", path, name);
995
996 FILE *pipefd = setup(fds, auclass);
997 REQUIRE_EXTATTR_RESULT(sizeof(buff),
998 extattr_get_link(path, EXTATTR_NAMESPACE_USER, name, NULL, 0));
999 check_audit(fds, extregex, pipefd);
1000 }
1001
ATF_TC_CLEANUP(extattr_get_link_success,tc)1002 ATF_TC_CLEANUP(extattr_get_link_success, tc)
1003 {
1004 cleanup();
1005 }
1006
1007
1008 ATF_TC_WITH_CLEANUP(extattr_get_link_failure);
ATF_TC_HEAD(extattr_get_link_failure,tc)1009 ATF_TC_HEAD(extattr_get_link_failure, tc)
1010 {
1011 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1012 "extattr_get_link(2) call");
1013 }
1014
ATF_TC_BODY(extattr_get_link_failure,tc)1015 ATF_TC_BODY(extattr_get_link_failure, tc)
1016 {
1017 /* Prepare the regex to be checked in the audit record */
1018 snprintf(extregex, sizeof(extregex),
1019 "extattr_get_link.*%s.*%s.*failure", path, name);
1020 FILE *pipefd = setup(fds, auclass);
1021 /* Failure reason: symbolic link does not exist */
1022 ATF_REQUIRE_ERRNO(ENOENT,
1023 extattr_get_link(path, EXTATTR_NAMESPACE_USER, name, NULL, 0));
1024 check_audit(fds, extregex, pipefd);
1025 }
1026
ATF_TC_CLEANUP(extattr_get_link_failure,tc)1027 ATF_TC_CLEANUP(extattr_get_link_failure, tc)
1028 {
1029 cleanup();
1030 }
1031
1032
1033 ATF_TC_WITH_CLEANUP(extattr_list_file_success);
ATF_TC_HEAD(extattr_list_file_success,tc)1034 ATF_TC_HEAD(extattr_list_file_success, tc)
1035 {
1036 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1037 "extattr_list_file(2) call");
1038 }
1039
ATF_TC_BODY(extattr_list_file_success,tc)1040 ATF_TC_BODY(extattr_list_file_success, tc)
1041 {
1042 ssize_t readbuff;
1043 /* File needs to exist to call extattr_list_file(2) */
1044 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
1045 skip_if_extattr_not_supported(path);
1046
1047 FILE *pipefd = setup(fds, auclass);
1048 readbuff = REQUIRE_EXTATTR_SUCCESS(
1049 extattr_list_file(path, EXTATTR_NAMESPACE_USER, NULL, 0));
1050 /* Prepare the regex to be checked in the audit record */
1051 snprintf(extregex, sizeof(extregex),
1052 "extattr_list_file.*%s.*return,success,%zd", path, readbuff);
1053 check_audit(fds, extregex, pipefd);
1054 }
1055
ATF_TC_CLEANUP(extattr_list_file_success,tc)1056 ATF_TC_CLEANUP(extattr_list_file_success, tc)
1057 {
1058 cleanup();
1059 }
1060
1061
1062 ATF_TC_WITH_CLEANUP(extattr_list_file_failure);
ATF_TC_HEAD(extattr_list_file_failure,tc)1063 ATF_TC_HEAD(extattr_list_file_failure, tc)
1064 {
1065 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1066 "extattr_list_file(2) call");
1067 }
1068
ATF_TC_BODY(extattr_list_file_failure,tc)1069 ATF_TC_BODY(extattr_list_file_failure, tc)
1070 {
1071 /* Prepare the regex to be checked in the audit record */
1072 snprintf(extregex, sizeof(extregex),
1073 "extattr_list_file.*%s.*return,failure", path);
1074
1075 FILE *pipefd = setup(fds, auclass);
1076 /* Failure reason: file does not exist */
1077 ATF_REQUIRE_ERRNO(ENOENT,
1078 extattr_list_file(path, EXTATTR_NAMESPACE_USER, NULL, 0));
1079 check_audit(fds, extregex, pipefd);
1080 }
1081
ATF_TC_CLEANUP(extattr_list_file_failure,tc)1082 ATF_TC_CLEANUP(extattr_list_file_failure, tc)
1083 {
1084 cleanup();
1085 }
1086
1087
1088 ATF_TC_WITH_CLEANUP(extattr_list_fd_success);
ATF_TC_HEAD(extattr_list_fd_success,tc)1089 ATF_TC_HEAD(extattr_list_fd_success, tc)
1090 {
1091 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1092 "extattr_list_fd(2) call");
1093 }
1094
ATF_TC_BODY(extattr_list_fd_success,tc)1095 ATF_TC_BODY(extattr_list_fd_success, tc)
1096 {
1097 ssize_t readbuff;
1098 /* File needs to exist to call extattr_list_fd(2) */
1099 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
1100 skip_if_extattr_not_supported(path);
1101
1102 FILE *pipefd = setup(fds, auclass);
1103 readbuff = REQUIRE_EXTATTR_SUCCESS(
1104 extattr_list_fd(filedesc, EXTATTR_NAMESPACE_USER, NULL, 0));
1105 /* Prepare the regex to be checked in the audit record */
1106 snprintf(extregex, sizeof(extregex),
1107 "extattr_list_fd.*return,success,%zd", readbuff);
1108 check_audit(fds, extregex, pipefd);
1109 close(filedesc);
1110 }
1111
ATF_TC_CLEANUP(extattr_list_fd_success,tc)1112 ATF_TC_CLEANUP(extattr_list_fd_success, tc)
1113 {
1114 cleanup();
1115 }
1116
1117
1118 ATF_TC_WITH_CLEANUP(extattr_list_fd_failure);
ATF_TC_HEAD(extattr_list_fd_failure,tc)1119 ATF_TC_HEAD(extattr_list_fd_failure, tc)
1120 {
1121 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1122 "extattr_list_fd(2) call");
1123 }
1124
ATF_TC_BODY(extattr_list_fd_failure,tc)1125 ATF_TC_BODY(extattr_list_fd_failure, tc)
1126 {
1127 /* Prepare the regex to be checked in the audit record */
1128 snprintf(extregex, sizeof(extregex),
1129 "extattr_list_fd.*return,failure : Bad file descriptor");
1130
1131 FILE *pipefd = setup(fds, auclass);
1132 /* Failure reason: Invalid file descriptor */
1133 ATF_REQUIRE_ERRNO(EBADF,
1134 extattr_list_fd(-1, EXTATTR_NAMESPACE_USER, NULL, 0) == -1);
1135 check_audit(fds, extregex, pipefd);
1136 }
1137
ATF_TC_CLEANUP(extattr_list_fd_failure,tc)1138 ATF_TC_CLEANUP(extattr_list_fd_failure, tc)
1139 {
1140 cleanup();
1141 }
1142
1143
1144 ATF_TC_WITH_CLEANUP(extattr_list_link_success);
ATF_TC_HEAD(extattr_list_link_success,tc)1145 ATF_TC_HEAD(extattr_list_link_success, tc)
1146 {
1147 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1148 "extattr_list_link(2) call");
1149 }
1150
ATF_TC_BODY(extattr_list_link_success,tc)1151 ATF_TC_BODY(extattr_list_link_success, tc)
1152 {
1153 ssize_t readbuff;
1154 /* Symbolic link needs to exist to call extattr_list_link(2) */
1155 ATF_REQUIRE_EQ(0, symlink("symlink", path));
1156 skip_if_extattr_not_supported(".");
1157
1158 FILE *pipefd = setup(fds, auclass);
1159 readbuff = REQUIRE_EXTATTR_SUCCESS(
1160 extattr_list_link(path, EXTATTR_NAMESPACE_USER, NULL, 0));
1161 /* Prepare the regex to be checked in the audit record */
1162 snprintf(extregex, sizeof(extregex),
1163 "extattr_list_link.*%s.*return,success,%zd", path, readbuff);
1164 check_audit(fds, extregex, pipefd);
1165 }
1166
ATF_TC_CLEANUP(extattr_list_link_success,tc)1167 ATF_TC_CLEANUP(extattr_list_link_success, tc)
1168 {
1169 cleanup();
1170 }
1171
1172
1173 ATF_TC_WITH_CLEANUP(extattr_list_link_failure);
ATF_TC_HEAD(extattr_list_link_failure,tc)1174 ATF_TC_HEAD(extattr_list_link_failure, tc)
1175 {
1176 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1177 "extattr_list_link(2) call");
1178 }
1179
ATF_TC_BODY(extattr_list_link_failure,tc)1180 ATF_TC_BODY(extattr_list_link_failure, tc)
1181 {
1182 /* Prepare the regex to be checked in the audit record */
1183 snprintf(extregex, sizeof(extregex),
1184 "extattr_list_link.*%s.*failure", path);
1185 FILE *pipefd = setup(fds, auclass);
1186 /* Failure reason: symbolic link does not exist */
1187 ATF_REQUIRE_ERRNO(ENOENT,
1188 extattr_list_link(path, EXTATTR_NAMESPACE_USER, NULL, 0) == -1);
1189 check_audit(fds, extregex, pipefd);
1190 }
1191
ATF_TC_CLEANUP(extattr_list_link_failure,tc)1192 ATF_TC_CLEANUP(extattr_list_link_failure, tc)
1193 {
1194 cleanup();
1195 }
1196
1197
ATF_TP_ADD_TCS(tp)1198 ATF_TP_ADD_TCS(tp)
1199 {
1200 ATF_TP_ADD_TC(tp, stat_success);
1201 ATF_TP_ADD_TC(tp, stat_failure);
1202 ATF_TP_ADD_TC(tp, lstat_success);
1203 ATF_TP_ADD_TC(tp, lstat_failure);
1204 ATF_TP_ADD_TC(tp, fstat_success);
1205 ATF_TP_ADD_TC(tp, fstat_failure);
1206 ATF_TP_ADD_TC(tp, fstatat_success);
1207 ATF_TP_ADD_TC(tp, fstatat_failure);
1208
1209 ATF_TP_ADD_TC(tp, statfs_success);
1210 ATF_TP_ADD_TC(tp, statfs_failure);
1211 ATF_TP_ADD_TC(tp, fstatfs_success);
1212 ATF_TP_ADD_TC(tp, fstatfs_failure);
1213
1214 ATF_TP_ADD_TC(tp, getfsstat_success);
1215 ATF_TP_ADD_TC(tp, getfsstat_failure);
1216
1217 ATF_TP_ADD_TC(tp, lgetfh_success);
1218 ATF_TP_ADD_TC(tp, lgetfh_failure);
1219 ATF_TP_ADD_TC(tp, fhopen_success);
1220 ATF_TP_ADD_TC(tp, fhopen_failure);
1221 ATF_TP_ADD_TC(tp, fhstat_success);
1222 ATF_TP_ADD_TC(tp, fhstat_failure);
1223 ATF_TP_ADD_TC(tp, fhstatfs_success);
1224 ATF_TP_ADD_TC(tp, fhstatfs_failure);
1225
1226 ATF_TP_ADD_TC(tp, access_success);
1227 ATF_TP_ADD_TC(tp, access_failure);
1228 ATF_TP_ADD_TC(tp, eaccess_success);
1229 ATF_TP_ADD_TC(tp, eaccess_failure);
1230 ATF_TP_ADD_TC(tp, faccessat_success);
1231 ATF_TP_ADD_TC(tp, faccessat_failure);
1232
1233 ATF_TP_ADD_TC(tp, pathconf_success);
1234 ATF_TP_ADD_TC(tp, pathconf_failure);
1235 ATF_TP_ADD_TC(tp, lpathconf_success);
1236 ATF_TP_ADD_TC(tp, lpathconf_failure);
1237 ATF_TP_ADD_TC(tp, fpathconf_success);
1238 ATF_TP_ADD_TC(tp, fpathconf_failure);
1239
1240 ATF_TP_ADD_TC(tp, extattr_get_file_success);
1241 ATF_TP_ADD_TC(tp, extattr_get_file_failure);
1242 ATF_TP_ADD_TC(tp, extattr_get_fd_success);
1243 ATF_TP_ADD_TC(tp, extattr_get_fd_failure);
1244 ATF_TP_ADD_TC(tp, extattr_get_link_success);
1245 ATF_TP_ADD_TC(tp, extattr_get_link_failure);
1246
1247 ATF_TP_ADD_TC(tp, extattr_list_file_success);
1248 ATF_TP_ADD_TC(tp, extattr_list_file_failure);
1249 ATF_TP_ADD_TC(tp, extattr_list_fd_success);
1250 ATF_TP_ADD_TC(tp, extattr_list_fd_failure);
1251 ATF_TP_ADD_TC(tp, extattr_list_link_success);
1252 ATF_TP_ADD_TC(tp, extattr_list_link_failure);
1253 return (atf_no_error());
1254 }
1255