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