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/types.h>
29 #include <sys/extattr.h>
30 #include <sys/file.h>
31 #include <sys/mman.h>
32 #include <sys/stat.h>
33 #include <sys/time.h>
34
35 #include <atf-c.h>
36 #include <errno.h>
37 #include <fcntl.h>
38 #include <stdint.h>
39 #include <unistd.h>
40
41 #include "utils.h"
42
43 static pid_t pid;
44 static uid_t uid = -1;
45 static gid_t gid = -1;
46 static int filedesc, retval;
47 static struct pollfd fds[1];
48 static mode_t mode = 0777;
49 static char extregex[80];
50 static char buff[] = "ezio";
51 static const char *auclass = "fm";
52 static const char *name = "authorname";
53 static const char *path = "fileforaudit";
54 static const char *errpath = "adirhasnoname/fileforaudit";
55 static const char *successreg = "fileforaudit.*return,success";
56 static const char *failurereg = "fileforaudit.*return,failure";
57
58
59 ATF_TC_WITH_CLEANUP(flock_success);
ATF_TC_HEAD(flock_success,tc)60 ATF_TC_HEAD(flock_success, tc)
61 {
62 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
63 "flock(2) call");
64 }
65
ATF_TC_BODY(flock_success,tc)66 ATF_TC_BODY(flock_success, tc)
67 {
68 pid = getpid();
69 snprintf(extregex, sizeof(extregex), "flock.*%d.*return,success", pid);
70
71 /* File needs to exist to call flock(2) */
72 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
73 FILE *pipefd = setup(fds, auclass);
74 ATF_REQUIRE_EQ(0, flock(filedesc, LOCK_SH));
75 check_audit(fds, extregex, pipefd);
76 close(filedesc);
77 }
78
ATF_TC_CLEANUP(flock_success,tc)79 ATF_TC_CLEANUP(flock_success, tc)
80 {
81 cleanup();
82 }
83
84
85 ATF_TC_WITH_CLEANUP(flock_failure);
ATF_TC_HEAD(flock_failure,tc)86 ATF_TC_HEAD(flock_failure, tc)
87 {
88 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
89 "flock(2) call");
90 }
91
ATF_TC_BODY(flock_failure,tc)92 ATF_TC_BODY(flock_failure, tc)
93 {
94 const char *regex = "flock.*return,failure : Bad file descriptor";
95 FILE *pipefd = setup(fds, auclass);
96 ATF_REQUIRE_ERRNO(EBADF, flock(-1, LOCK_SH) == -1);
97 check_audit(fds, regex, pipefd);
98 }
99
ATF_TC_CLEANUP(flock_failure,tc)100 ATF_TC_CLEANUP(flock_failure, tc)
101 {
102 cleanup();
103 }
104
105
106 ATF_TC_WITH_CLEANUP(fcntl_success);
ATF_TC_HEAD(fcntl_success,tc)107 ATF_TC_HEAD(fcntl_success, tc)
108 {
109 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
110 "fcntl(2) call");
111 }
112
ATF_TC_BODY(fcntl_success,tc)113 ATF_TC_BODY(fcntl_success, tc)
114 {
115 int flagstatus;
116 /* File needs to exist to call fcntl(2) */
117 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
118 FILE *pipefd = setup(fds, auclass);
119
120 /* Retrieve the status flags of 'filedesc' and store it in flagstatus */
121 ATF_REQUIRE((flagstatus = fcntl(filedesc, F_GETFL, 0)) != -1);
122 snprintf(extregex, sizeof(extregex),
123 "fcntl.*return,success,%d", flagstatus);
124 check_audit(fds, extregex, pipefd);
125 close(filedesc);
126 }
127
ATF_TC_CLEANUP(fcntl_success,tc)128 ATF_TC_CLEANUP(fcntl_success, tc)
129 {
130 cleanup();
131 }
132
133
134 ATF_TC_WITH_CLEANUP(fcntl_failure);
ATF_TC_HEAD(fcntl_failure,tc)135 ATF_TC_HEAD(fcntl_failure, tc)
136 {
137 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
138 "fcntl(2) call");
139 }
140
ATF_TC_BODY(fcntl_failure,tc)141 ATF_TC_BODY(fcntl_failure, tc)
142 {
143 const char *regex = "fcntl.*return,failure : Bad file descriptor";
144 FILE *pipefd = setup(fds, auclass);
145 ATF_REQUIRE_ERRNO(EBADF, fcntl(-1, F_GETFL, 0) == -1);
146 check_audit(fds, regex, pipefd);
147 }
148
ATF_TC_CLEANUP(fcntl_failure,tc)149 ATF_TC_CLEANUP(fcntl_failure, tc)
150 {
151 cleanup();
152 }
153
154
155 ATF_TC_WITH_CLEANUP(fsync_success);
ATF_TC_HEAD(fsync_success,tc)156 ATF_TC_HEAD(fsync_success, tc)
157 {
158 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
159 "fsync(2) call");
160 }
161
ATF_TC_BODY(fsync_success,tc)162 ATF_TC_BODY(fsync_success, tc)
163 {
164 pid = getpid();
165 snprintf(extregex, sizeof(extregex), "fsync.*%d.*return,success", pid);
166
167 /* File needs to exist to call fsync(2) */
168 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
169 FILE *pipefd = setup(fds, auclass);
170 ATF_REQUIRE_EQ(0, fsync(filedesc));
171 check_audit(fds, extregex, pipefd);
172 close(filedesc);
173 }
174
ATF_TC_CLEANUP(fsync_success,tc)175 ATF_TC_CLEANUP(fsync_success, tc)
176 {
177 cleanup();
178 }
179
180
181 ATF_TC_WITH_CLEANUP(fsync_failure);
ATF_TC_HEAD(fsync_failure,tc)182 ATF_TC_HEAD(fsync_failure, tc)
183 {
184 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
185 "fsync(2) call");
186 }
187
ATF_TC_BODY(fsync_failure,tc)188 ATF_TC_BODY(fsync_failure, tc)
189 {
190 const char *regex = "fsync.*return,failure : Bad file descriptor";
191 FILE *pipefd = setup(fds, auclass);
192 /* Failure reason: Invalid file descriptor */
193 ATF_REQUIRE_ERRNO(EBADF, fsync(-1) == -1);
194 check_audit(fds, regex, pipefd);
195 }
196
ATF_TC_CLEANUP(fsync_failure,tc)197 ATF_TC_CLEANUP(fsync_failure, tc)
198 {
199 cleanup();
200 }
201
202
203 ATF_TC_WITH_CLEANUP(chmod_success);
ATF_TC_HEAD(chmod_success,tc)204 ATF_TC_HEAD(chmod_success, tc)
205 {
206 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
207 "chmod(2) call");
208 }
209
ATF_TC_BODY(chmod_success,tc)210 ATF_TC_BODY(chmod_success, tc)
211 {
212 /* File needs to exist to call chmod(2) */
213 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
214 FILE *pipefd = setup(fds, auclass);
215 ATF_REQUIRE_EQ(0, chmod(path, mode));
216 check_audit(fds, successreg, pipefd);
217 close(filedesc);
218 }
219
ATF_TC_CLEANUP(chmod_success,tc)220 ATF_TC_CLEANUP(chmod_success, tc)
221 {
222 cleanup();
223 }
224
225
226 ATF_TC_WITH_CLEANUP(chmod_failure);
ATF_TC_HEAD(chmod_failure,tc)227 ATF_TC_HEAD(chmod_failure, tc)
228 {
229 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
230 "chmod(2) call");
231 }
232
ATF_TC_BODY(chmod_failure,tc)233 ATF_TC_BODY(chmod_failure, tc)
234 {
235 FILE *pipefd = setup(fds, auclass);
236 /* Failure reason: file does not exist */
237 ATF_REQUIRE_ERRNO(ENOENT, chmod(errpath, mode) == -1);
238 check_audit(fds, failurereg, pipefd);
239 }
240
ATF_TC_CLEANUP(chmod_failure,tc)241 ATF_TC_CLEANUP(chmod_failure, tc)
242 {
243 cleanup();
244 }
245
246
247 ATF_TC_WITH_CLEANUP(fchmod_success);
ATF_TC_HEAD(fchmod_success,tc)248 ATF_TC_HEAD(fchmod_success, tc)
249 {
250 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
251 "fchmod(2) call");
252 }
253
ATF_TC_BODY(fchmod_success,tc)254 ATF_TC_BODY(fchmod_success, tc)
255 {
256 pid = getpid();
257 snprintf(extregex, sizeof(extregex), "fchmod.*%d.*return,success", pid);
258
259 /* File needs to exist to call fchmod(2) */
260 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
261 FILE *pipefd = setup(fds, auclass);
262 ATF_REQUIRE_EQ(0, fchmod(filedesc, mode));
263 check_audit(fds, extregex, pipefd);
264 close(filedesc);
265 }
266
ATF_TC_CLEANUP(fchmod_success,tc)267 ATF_TC_CLEANUP(fchmod_success, tc)
268 {
269 cleanup();
270 }
271
272
273 ATF_TC_WITH_CLEANUP(fchmod_failure);
ATF_TC_HEAD(fchmod_failure,tc)274 ATF_TC_HEAD(fchmod_failure, tc)
275 {
276 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
277 "fchmod(2) call");
278 }
279
ATF_TC_BODY(fchmod_failure,tc)280 ATF_TC_BODY(fchmod_failure, tc)
281 {
282 const char *regex = "fchmod.*return,failure : Bad file descriptor";
283 FILE *pipefd = setup(fds, auclass);
284 /* Failure reason: Invalid file descriptor */
285 ATF_REQUIRE_ERRNO(EBADF, fchmod(-1, mode) == -1);
286 check_audit(fds, regex, pipefd);
287 }
288
ATF_TC_CLEANUP(fchmod_failure,tc)289 ATF_TC_CLEANUP(fchmod_failure, tc)
290 {
291 cleanup();
292 }
293
294
295 ATF_TC_WITH_CLEANUP(lchmod_success);
ATF_TC_HEAD(lchmod_success,tc)296 ATF_TC_HEAD(lchmod_success, tc)
297 {
298 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
299 "lchmod(2) call");
300 }
301
ATF_TC_BODY(lchmod_success,tc)302 ATF_TC_BODY(lchmod_success, tc)
303 {
304 /* Symbolic link needs to exist to call lchmod(2) */
305 ATF_REQUIRE_EQ(0, symlink("symlink", path));
306 FILE *pipefd = setup(fds, auclass);
307 ATF_REQUIRE_EQ(0, lchmod(path, mode));
308 check_audit(fds, successreg, pipefd);
309 }
310
ATF_TC_CLEANUP(lchmod_success,tc)311 ATF_TC_CLEANUP(lchmod_success, tc)
312 {
313 cleanup();
314 }
315
316
317 ATF_TC_WITH_CLEANUP(lchmod_failure);
ATF_TC_HEAD(lchmod_failure,tc)318 ATF_TC_HEAD(lchmod_failure, tc)
319 {
320 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
321 "lchmod(2) call");
322 }
323
ATF_TC_BODY(lchmod_failure,tc)324 ATF_TC_BODY(lchmod_failure, tc)
325 {
326 FILE *pipefd = setup(fds, auclass);
327 /* Failure reason: file does not exist */
328 ATF_REQUIRE_ERRNO(ENOENT, lchmod(errpath, mode) == -1);
329 check_audit(fds, failurereg, pipefd);
330 }
331
ATF_TC_CLEANUP(lchmod_failure,tc)332 ATF_TC_CLEANUP(lchmod_failure, tc)
333 {
334 cleanup();
335 }
336
337
338 ATF_TC_WITH_CLEANUP(fchmodat_success);
ATF_TC_HEAD(fchmodat_success,tc)339 ATF_TC_HEAD(fchmodat_success, tc)
340 {
341 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
342 "fchmodat(2) call");
343 }
344
ATF_TC_BODY(fchmodat_success,tc)345 ATF_TC_BODY(fchmodat_success, tc)
346 {
347 /* File needs to exist to call fchmodat(2) */
348 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
349 FILE *pipefd = setup(fds, auclass);
350 ATF_REQUIRE_EQ(0, fchmodat(AT_FDCWD, path, mode, 0));
351 check_audit(fds, successreg, pipefd);
352 close(filedesc);
353 }
354
ATF_TC_CLEANUP(fchmodat_success,tc)355 ATF_TC_CLEANUP(fchmodat_success, tc)
356 {
357 cleanup();
358 }
359
360
361 ATF_TC_WITH_CLEANUP(fchmodat_failure);
ATF_TC_HEAD(fchmodat_failure,tc)362 ATF_TC_HEAD(fchmodat_failure, tc)
363 {
364 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
365 "fchmodat(2) call");
366 }
367
ATF_TC_BODY(fchmodat_failure,tc)368 ATF_TC_BODY(fchmodat_failure, tc)
369 {
370 FILE *pipefd = setup(fds, auclass);
371 /* Failure reason: file does not exist */
372 ATF_REQUIRE_ERRNO(ENOENT, fchmodat(AT_FDCWD, errpath, mode, 0) == -1);
373 check_audit(fds, failurereg, pipefd);
374 }
375
ATF_TC_CLEANUP(fchmodat_failure,tc)376 ATF_TC_CLEANUP(fchmodat_failure, tc)
377 {
378 cleanup();
379 }
380
381
382 ATF_TC_WITH_CLEANUP(chown_success);
ATF_TC_HEAD(chown_success,tc)383 ATF_TC_HEAD(chown_success, tc)
384 {
385 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
386 "chown(2) call");
387 }
388
ATF_TC_BODY(chown_success,tc)389 ATF_TC_BODY(chown_success, tc)
390 {
391 /* File needs to exist to call chown(2) */
392 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
393 FILE *pipefd = setup(fds, auclass);
394 ATF_REQUIRE_EQ(0, chown(path, uid, gid));
395 check_audit(fds, successreg, pipefd);
396 close(filedesc);
397 }
398
ATF_TC_CLEANUP(chown_success,tc)399 ATF_TC_CLEANUP(chown_success, tc)
400 {
401 cleanup();
402 }
403
404
405 ATF_TC_WITH_CLEANUP(chown_failure);
ATF_TC_HEAD(chown_failure,tc)406 ATF_TC_HEAD(chown_failure, tc)
407 {
408 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
409 "chown(2) call");
410 }
411
ATF_TC_BODY(chown_failure,tc)412 ATF_TC_BODY(chown_failure, tc)
413 {
414 FILE *pipefd = setup(fds, auclass);
415 /* Failure reason: file does not exist */
416 ATF_REQUIRE_ERRNO(ENOENT, chown(errpath, uid, gid) == -1);
417 check_audit(fds, failurereg, pipefd);
418 }
419
ATF_TC_CLEANUP(chown_failure,tc)420 ATF_TC_CLEANUP(chown_failure, tc)
421 {
422 cleanup();
423 }
424
425
426 ATF_TC_WITH_CLEANUP(fchown_success);
ATF_TC_HEAD(fchown_success,tc)427 ATF_TC_HEAD(fchown_success, tc)
428 {
429 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
430 "fchown(2) call");
431 }
432
ATF_TC_BODY(fchown_success,tc)433 ATF_TC_BODY(fchown_success, tc)
434 {
435 pid = getpid();
436 snprintf(extregex, sizeof(extregex), "fchown.*%d.*return,success", pid);
437
438 /* File needs to exist to call fchown(2) */
439 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
440 FILE *pipefd = setup(fds, auclass);
441 ATF_REQUIRE_EQ(0, fchown(filedesc, uid, gid));
442 check_audit(fds, extregex, pipefd);
443 close(filedesc);
444 }
445
ATF_TC_CLEANUP(fchown_success,tc)446 ATF_TC_CLEANUP(fchown_success, tc)
447 {
448 cleanup();
449 }
450
451
452 ATF_TC_WITH_CLEANUP(fchown_failure);
ATF_TC_HEAD(fchown_failure,tc)453 ATF_TC_HEAD(fchown_failure, tc)
454 {
455 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
456 "fchown(2) call");
457 }
458
ATF_TC_BODY(fchown_failure,tc)459 ATF_TC_BODY(fchown_failure, tc)
460 {
461 const char *regex = "fchown.*return,failure : Bad file descriptor";
462 FILE *pipefd = setup(fds, auclass);
463 /* Failure reason: Invalid file descriptor */
464 ATF_REQUIRE_ERRNO(EBADF, fchown(-1, uid, gid) == -1);
465 check_audit(fds, regex, pipefd);
466 }
467
ATF_TC_CLEANUP(fchown_failure,tc)468 ATF_TC_CLEANUP(fchown_failure, tc)
469 {
470 cleanup();
471 }
472
473
474 ATF_TC_WITH_CLEANUP(lchown_success);
ATF_TC_HEAD(lchown_success,tc)475 ATF_TC_HEAD(lchown_success, tc)
476 {
477 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
478 "lchown(2) call");
479 }
480
ATF_TC_BODY(lchown_success,tc)481 ATF_TC_BODY(lchown_success, tc)
482 {
483 /* Symbolic link needs to exist to call lchown(2) */
484 ATF_REQUIRE_EQ(0, symlink("symlink", path));
485 FILE *pipefd = setup(fds, auclass);
486 ATF_REQUIRE_EQ(0, lchown(path, uid, gid));
487 check_audit(fds, successreg, pipefd);
488 }
489
ATF_TC_CLEANUP(lchown_success,tc)490 ATF_TC_CLEANUP(lchown_success, tc)
491 {
492 cleanup();
493 }
494
495
496 ATF_TC_WITH_CLEANUP(lchown_failure);
ATF_TC_HEAD(lchown_failure,tc)497 ATF_TC_HEAD(lchown_failure, tc)
498 {
499 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
500 "lchown(2) call");
501 }
502
ATF_TC_BODY(lchown_failure,tc)503 ATF_TC_BODY(lchown_failure, tc)
504 {
505 FILE *pipefd = setup(fds, auclass);
506 /* Failure reason: Symbolic link does not exist */
507 ATF_REQUIRE_ERRNO(ENOENT, lchown(errpath, uid, gid) == -1);
508 check_audit(fds, failurereg, pipefd);
509 }
510
ATF_TC_CLEANUP(lchown_failure,tc)511 ATF_TC_CLEANUP(lchown_failure, tc)
512 {
513 cleanup();
514 }
515
516
517 ATF_TC_WITH_CLEANUP(fchownat_success);
ATF_TC_HEAD(fchownat_success,tc)518 ATF_TC_HEAD(fchownat_success, tc)
519 {
520 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
521 "fchownat(2) call");
522 }
523
ATF_TC_BODY(fchownat_success,tc)524 ATF_TC_BODY(fchownat_success, tc)
525 {
526 /* File needs to exist to call fchownat(2) */
527 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
528 FILE *pipefd = setup(fds, auclass);
529 ATF_REQUIRE_EQ(0, fchownat(AT_FDCWD, path, uid, gid, 0));
530 check_audit(fds, successreg, pipefd);
531 close(filedesc);
532 }
533
ATF_TC_CLEANUP(fchownat_success,tc)534 ATF_TC_CLEANUP(fchownat_success, tc)
535 {
536 cleanup();
537 }
538
539
540 ATF_TC_WITH_CLEANUP(fchownat_failure);
ATF_TC_HEAD(fchownat_failure,tc)541 ATF_TC_HEAD(fchownat_failure, tc)
542 {
543 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
544 "fchownat(2) call");
545 }
546
ATF_TC_BODY(fchownat_failure,tc)547 ATF_TC_BODY(fchownat_failure, tc)
548 {
549 FILE *pipefd = setup(fds, auclass);
550 /* Failure reason: file does not exist */
551 ATF_REQUIRE_ERRNO(ENOENT,
552 fchownat(AT_FDCWD, errpath, uid, gid, 0) == -1);
553 check_audit(fds, failurereg, pipefd);
554 }
555
ATF_TC_CLEANUP(fchownat_failure,tc)556 ATF_TC_CLEANUP(fchownat_failure, tc)
557 {
558 cleanup();
559 }
560
561
562 ATF_TC_WITH_CLEANUP(chflags_success);
ATF_TC_HEAD(chflags_success,tc)563 ATF_TC_HEAD(chflags_success, tc)
564 {
565 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
566 "chflags(2) call");
567 }
568
ATF_TC_BODY(chflags_success,tc)569 ATF_TC_BODY(chflags_success, tc)
570 {
571 /* File needs to exist to call chflags(2) */
572 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
573 FILE *pipefd = setup(fds, auclass);
574 ATF_REQUIRE_EQ(0, chflags(path, UF_OFFLINE));
575 check_audit(fds, successreg, pipefd);
576 close(filedesc);
577 }
578
ATF_TC_CLEANUP(chflags_success,tc)579 ATF_TC_CLEANUP(chflags_success, tc)
580 {
581 cleanup();
582 }
583
584
585 ATF_TC_WITH_CLEANUP(chflags_failure);
ATF_TC_HEAD(chflags_failure,tc)586 ATF_TC_HEAD(chflags_failure, tc)
587 {
588 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
589 "chflags(2) call");
590 }
591
ATF_TC_BODY(chflags_failure,tc)592 ATF_TC_BODY(chflags_failure, tc)
593 {
594 FILE *pipefd = setup(fds, auclass);
595 /* Failure reason: file does not exist */
596 ATF_REQUIRE_ERRNO(ENOENT, chflags(errpath, UF_OFFLINE) == -1);
597 check_audit(fds, failurereg, pipefd);
598 }
599
ATF_TC_CLEANUP(chflags_failure,tc)600 ATF_TC_CLEANUP(chflags_failure, tc)
601 {
602 cleanup();
603 }
604
605
606 ATF_TC_WITH_CLEANUP(fchflags_success);
ATF_TC_HEAD(fchflags_success,tc)607 ATF_TC_HEAD(fchflags_success, tc)
608 {
609 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
610 "fchflags(2) call");
611 }
612
ATF_TC_BODY(fchflags_success,tc)613 ATF_TC_BODY(fchflags_success, tc)
614 {
615 pid = getpid();
616 snprintf(extregex, sizeof(extregex), "fchflags.*%d.*ret.*success", pid);
617 /* File needs to exist to call fchflags(2) */
618 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
619
620 FILE *pipefd = setup(fds, auclass);
621 ATF_REQUIRE_EQ(0, fchflags(filedesc, UF_OFFLINE));
622 check_audit(fds, extregex, pipefd);
623 close(filedesc);
624 }
625
ATF_TC_CLEANUP(fchflags_success,tc)626 ATF_TC_CLEANUP(fchflags_success, tc)
627 {
628 cleanup();
629 }
630
631
632 ATF_TC_WITH_CLEANUP(fchflags_failure);
ATF_TC_HEAD(fchflags_failure,tc)633 ATF_TC_HEAD(fchflags_failure, tc)
634 {
635 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
636 "fchflags(2) call");
637 }
638
ATF_TC_BODY(fchflags_failure,tc)639 ATF_TC_BODY(fchflags_failure, tc)
640 {
641 const char *regex = "fchflags.*return,failure : Bad file descriptor";
642 FILE *pipefd = setup(fds, auclass);
643 /* Failure reason: Invalid file descriptor */
644 ATF_REQUIRE_ERRNO(EBADF, fchflags(-1, UF_OFFLINE) == -1);
645 check_audit(fds, regex, pipefd);
646 }
647
ATF_TC_CLEANUP(fchflags_failure,tc)648 ATF_TC_CLEANUP(fchflags_failure, tc)
649 {
650 cleanup();
651 }
652
653
654 ATF_TC_WITH_CLEANUP(lchflags_success);
ATF_TC_HEAD(lchflags_success,tc)655 ATF_TC_HEAD(lchflags_success, tc)
656 {
657 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
658 "lchflags(2) call");
659 }
660
ATF_TC_BODY(lchflags_success,tc)661 ATF_TC_BODY(lchflags_success, tc)
662 {
663 /* Symbolic link needs to exist to call lchflags(2) */
664 ATF_REQUIRE_EQ(0, symlink("symlink", path));
665 FILE *pipefd = setup(fds, auclass);
666 ATF_REQUIRE_EQ(0, lchflags(path, UF_OFFLINE));
667 check_audit(fds, successreg, pipefd);
668 }
669
ATF_TC_CLEANUP(lchflags_success,tc)670 ATF_TC_CLEANUP(lchflags_success, tc)
671 {
672 cleanup();
673 }
674
675
676 ATF_TC_WITH_CLEANUP(lchflags_failure);
ATF_TC_HEAD(lchflags_failure,tc)677 ATF_TC_HEAD(lchflags_failure, tc)
678 {
679 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
680 "lchflags(2) call");
681 }
682
ATF_TC_BODY(lchflags_failure,tc)683 ATF_TC_BODY(lchflags_failure, tc)
684 {
685 FILE *pipefd = setup(fds, auclass);
686 /* Failure reason: Symbolic link does not exist */
687 ATF_REQUIRE_ERRNO(ENOENT, lchflags(errpath, UF_OFFLINE) == -1);
688 check_audit(fds, failurereg, pipefd);
689 }
690
ATF_TC_CLEANUP(lchflags_failure,tc)691 ATF_TC_CLEANUP(lchflags_failure, tc)
692 {
693 cleanup();
694 }
695
696
697 ATF_TC_WITH_CLEANUP(chflagsat_success);
ATF_TC_HEAD(chflagsat_success,tc)698 ATF_TC_HEAD(chflagsat_success, tc)
699 {
700 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
701 "chflagsat(2) call");
702 }
703
ATF_TC_BODY(chflagsat_success,tc)704 ATF_TC_BODY(chflagsat_success, tc)
705 {
706 /* File needs to exist to call chflagsat(2) */
707 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
708 FILE *pipefd = setup(fds, auclass);
709 ATF_REQUIRE_EQ(0, chflagsat(AT_FDCWD, path, UF_OFFLINE, 0));
710 check_audit(fds, successreg, pipefd);
711 close(filedesc);
712 }
713
ATF_TC_CLEANUP(chflagsat_success,tc)714 ATF_TC_CLEANUP(chflagsat_success, tc)
715 {
716 cleanup();
717 }
718
719
720 ATF_TC_WITH_CLEANUP(chflagsat_failure);
ATF_TC_HEAD(chflagsat_failure,tc)721 ATF_TC_HEAD(chflagsat_failure, tc)
722 {
723 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
724 "chflagsat(2) call");
725 }
726
ATF_TC_BODY(chflagsat_failure,tc)727 ATF_TC_BODY(chflagsat_failure, tc)
728 {
729 FILE *pipefd = setup(fds, auclass);
730 /* Failure reason: file does not exist */
731 ATF_REQUIRE_ERRNO(ENOENT,
732 chflagsat(AT_FDCWD, errpath, UF_OFFLINE, 0) == -1);
733 check_audit(fds, failurereg, pipefd);
734 }
735
ATF_TC_CLEANUP(chflagsat_failure,tc)736 ATF_TC_CLEANUP(chflagsat_failure, tc)
737 {
738 cleanup();
739 }
740
741
742 ATF_TC_WITH_CLEANUP(utimes_success);
ATF_TC_HEAD(utimes_success,tc)743 ATF_TC_HEAD(utimes_success, tc)
744 {
745 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
746 "utimes(2) call");
747 }
748
ATF_TC_BODY(utimes_success,tc)749 ATF_TC_BODY(utimes_success, tc)
750 {
751 /* File needs to exist to call utimes(2) */
752 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
753 FILE *pipefd = setup(fds, auclass);
754 ATF_REQUIRE_EQ(0, utimes(path, NULL));
755 check_audit(fds, successreg, pipefd);
756 close(filedesc);
757 }
758
ATF_TC_CLEANUP(utimes_success,tc)759 ATF_TC_CLEANUP(utimes_success, tc)
760 {
761 cleanup();
762 }
763
764
765 ATF_TC_WITH_CLEANUP(utimes_failure);
ATF_TC_HEAD(utimes_failure,tc)766 ATF_TC_HEAD(utimes_failure, tc)
767 {
768 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
769 "utimes(2) call");
770 }
771
ATF_TC_BODY(utimes_failure,tc)772 ATF_TC_BODY(utimes_failure, tc)
773 {
774 FILE *pipefd = setup(fds, auclass);
775 /* Failure reason: file does not exist */
776 ATF_REQUIRE_ERRNO(ENOENT, utimes(errpath, NULL) == -1);
777 check_audit(fds, failurereg, pipefd);
778 }
779
ATF_TC_CLEANUP(utimes_failure,tc)780 ATF_TC_CLEANUP(utimes_failure, tc)
781 {
782 cleanup();
783 }
784
785
786 ATF_TC_WITH_CLEANUP(futimes_success);
ATF_TC_HEAD(futimes_success,tc)787 ATF_TC_HEAD(futimes_success, tc)
788 {
789 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
790 "futimes(2) call");
791 }
792
ATF_TC_BODY(futimes_success,tc)793 ATF_TC_BODY(futimes_success, tc)
794 {
795 pid = getpid();
796 snprintf(extregex, sizeof(extregex), "futimes.*%d.*ret.*success", pid);
797
798 /* File needs to exist to call futimes(2) */
799 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
800 FILE *pipefd = setup(fds, auclass);
801 ATF_REQUIRE_EQ(0, futimes(filedesc, NULL));
802 check_audit(fds, extregex, pipefd);
803 close(filedesc);
804 }
805
ATF_TC_CLEANUP(futimes_success,tc)806 ATF_TC_CLEANUP(futimes_success, tc)
807 {
808 cleanup();
809 }
810
811
812 ATF_TC_WITH_CLEANUP(futimes_failure);
ATF_TC_HEAD(futimes_failure,tc)813 ATF_TC_HEAD(futimes_failure, tc)
814 {
815 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
816 "futimes(2) call");
817 }
818
ATF_TC_BODY(futimes_failure,tc)819 ATF_TC_BODY(futimes_failure, tc)
820 {
821 const char *regex = "futimes.*return,failure : Bad file descriptor";
822 FILE *pipefd = setup(fds, auclass);
823 /* Failure reason: Invalid file descriptor */
824 ATF_REQUIRE_ERRNO(EBADF, futimes(-1, NULL) == -1);
825 check_audit(fds, regex, pipefd);
826 }
827
ATF_TC_CLEANUP(futimes_failure,tc)828 ATF_TC_CLEANUP(futimes_failure, tc)
829 {
830 cleanup();
831 }
832
833
834 ATF_TC_WITH_CLEANUP(lutimes_success);
ATF_TC_HEAD(lutimes_success,tc)835 ATF_TC_HEAD(lutimes_success, tc)
836 {
837 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
838 "lutimes(2) call");
839 }
840
ATF_TC_BODY(lutimes_success,tc)841 ATF_TC_BODY(lutimes_success, tc)
842 {
843 /* Symbolic link needs to exist to call lutimes(2) */
844 ATF_REQUIRE_EQ(0, symlink("symlink", path));
845 FILE *pipefd = setup(fds, auclass);
846 ATF_REQUIRE_EQ(0, lutimes(path, NULL));
847 check_audit(fds, successreg, pipefd);
848 }
849
ATF_TC_CLEANUP(lutimes_success,tc)850 ATF_TC_CLEANUP(lutimes_success, tc)
851 {
852 cleanup();
853 }
854
855
856 ATF_TC_WITH_CLEANUP(lutimes_failure);
ATF_TC_HEAD(lutimes_failure,tc)857 ATF_TC_HEAD(lutimes_failure, tc)
858 {
859 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
860 "lutimes(2) call");
861 }
862
ATF_TC_BODY(lutimes_failure,tc)863 ATF_TC_BODY(lutimes_failure, tc)
864 {
865 FILE *pipefd = setup(fds, auclass);
866 /* Failure reason: symbolic link does not exist */
867 ATF_REQUIRE_ERRNO(ENOENT, lutimes(errpath, NULL) == -1);
868 check_audit(fds, failurereg, pipefd);
869 }
870
ATF_TC_CLEANUP(lutimes_failure,tc)871 ATF_TC_CLEANUP(lutimes_failure, tc)
872 {
873 cleanup();
874 }
875
876
877 ATF_TC_WITH_CLEANUP(futimesat_success);
ATF_TC_HEAD(futimesat_success,tc)878 ATF_TC_HEAD(futimesat_success, tc)
879 {
880 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
881 "futimesat(2) call");
882 }
883
ATF_TC_BODY(futimesat_success,tc)884 ATF_TC_BODY(futimesat_success, tc)
885 {
886 /* File needs to exist to call futimesat(2) */
887 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
888 FILE *pipefd = setup(fds, auclass);
889 ATF_REQUIRE_EQ(0, futimesat(AT_FDCWD, path, NULL));
890 check_audit(fds, successreg, pipefd);
891 close(filedesc);
892 }
893
ATF_TC_CLEANUP(futimesat_success,tc)894 ATF_TC_CLEANUP(futimesat_success, tc)
895 {
896 cleanup();
897 }
898
899
900 ATF_TC_WITH_CLEANUP(futimesat_failure);
ATF_TC_HEAD(futimesat_failure,tc)901 ATF_TC_HEAD(futimesat_failure, tc)
902 {
903 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
904 "futimesat(2) call");
905 }
906
ATF_TC_BODY(futimesat_failure,tc)907 ATF_TC_BODY(futimesat_failure, tc)
908 {
909 FILE *pipefd = setup(fds, auclass);
910 /* Failure reason: file does not exist */
911 ATF_REQUIRE_ERRNO(ENOENT, futimesat(AT_FDCWD, errpath, NULL) == -1);
912 check_audit(fds, failurereg, pipefd);
913 }
914
ATF_TC_CLEANUP(futimesat_failure,tc)915 ATF_TC_CLEANUP(futimesat_failure, tc)
916 {
917 cleanup();
918 }
919
920
921 ATF_TC_WITH_CLEANUP(mprotect_success);
ATF_TC_HEAD(mprotect_success,tc)922 ATF_TC_HEAD(mprotect_success, tc)
923 {
924 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
925 "mprotect(2) call");
926 }
927
ATF_TC_BODY(mprotect_success,tc)928 ATF_TC_BODY(mprotect_success, tc)
929 {
930 pid = getpid();
931 snprintf(extregex, sizeof(extregex), "mprotect.*%d.*ret.*success", pid);
932
933 FILE *pipefd = setup(fds, auclass);
934 ATF_REQUIRE_EQ(0, mprotect(NULL, 0, PROT_NONE));
935 check_audit(fds, extregex, pipefd);
936 }
937
ATF_TC_CLEANUP(mprotect_success,tc)938 ATF_TC_CLEANUP(mprotect_success, tc)
939 {
940 cleanup();
941 }
942
943
944 ATF_TC_WITH_CLEANUP(mprotect_failure);
ATF_TC_HEAD(mprotect_failure,tc)945 ATF_TC_HEAD(mprotect_failure, tc)
946 {
947 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
948 "mprotect(2) call");
949 }
950
ATF_TC_BODY(mprotect_failure,tc)951 ATF_TC_BODY(mprotect_failure, tc)
952 {
953 const char *regex = "mprotect.*return,failure : Invalid argument";
954 FILE *pipefd = setup(fds, auclass);
955 ATF_REQUIRE_ERRNO(EINVAL,
956 mprotect((void *)SIZE_MAX, -1, PROT_NONE) == -1);
957 check_audit(fds, regex, pipefd);
958 }
959
ATF_TC_CLEANUP(mprotect_failure,tc)960 ATF_TC_CLEANUP(mprotect_failure, tc)
961 {
962 cleanup();
963 }
964
965 /*
966 * undelete(2) only works on whiteout files in union file system. Hence, no
967 * test case for successful invocation.
968 */
969
970 ATF_TC_WITH_CLEANUP(undelete_failure);
ATF_TC_HEAD(undelete_failure,tc)971 ATF_TC_HEAD(undelete_failure, tc)
972 {
973 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
974 "undelete(2) call");
975 }
976
ATF_TC_BODY(undelete_failure,tc)977 ATF_TC_BODY(undelete_failure, tc)
978 {
979 pid = getpid();
980 snprintf(extregex, sizeof(extregex), "undelete.*%d.*ret.*failure", pid);
981
982 FILE *pipefd = setup(fds, auclass);
983 /* Failure reason: File does not exist */
984 ATF_REQUIRE_ERRNO(ENOENT, undelete(errpath) == -1);
985 check_audit(fds, extregex, pipefd);
986 }
987
ATF_TC_CLEANUP(undelete_failure,tc)988 ATF_TC_CLEANUP(undelete_failure, tc)
989 {
990 cleanup();
991 }
992
993
994 ATF_TC_WITH_CLEANUP(extattr_set_file_success);
ATF_TC_HEAD(extattr_set_file_success,tc)995 ATF_TC_HEAD(extattr_set_file_success, tc)
996 {
997 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
998 "extattr_set_file(2) call");
999 }
1000
ATF_TC_BODY(extattr_set_file_success,tc)1001 ATF_TC_BODY(extattr_set_file_success, tc)
1002 {
1003 /* File needs to exist to call extattr_set_file(2) */
1004 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
1005 skip_if_extattr_not_supported(path);
1006
1007 /* Prepare the regex to be checked in the audit record */
1008 snprintf(extregex, sizeof(extregex),
1009 "extattr_set_file.*%s.*%s.*return,success", path, name);
1010
1011 FILE *pipefd = setup(fds, auclass);
1012 REQUIRE_EXTATTR_RESULT(sizeof(buff), extattr_set_file(path,
1013 EXTATTR_NAMESPACE_USER, name, buff, sizeof(buff)));
1014 check_audit(fds, extregex, pipefd);
1015 close(filedesc);
1016 }
1017
ATF_TC_CLEANUP(extattr_set_file_success,tc)1018 ATF_TC_CLEANUP(extattr_set_file_success, tc)
1019 {
1020 cleanup();
1021 }
1022
1023
1024 ATF_TC_WITH_CLEANUP(extattr_set_file_failure);
ATF_TC_HEAD(extattr_set_file_failure,tc)1025 ATF_TC_HEAD(extattr_set_file_failure, tc)
1026 {
1027 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1028 "extattr_set_file(2) call");
1029 }
1030
ATF_TC_BODY(extattr_set_file_failure,tc)1031 ATF_TC_BODY(extattr_set_file_failure, tc)
1032 {
1033 /* Prepare the regex to be checked in the audit record */
1034 snprintf(extregex, sizeof(extregex),
1035 "extattr_set_file.*%s.*%s.*failure", path, name);
1036
1037 FILE *pipefd = setup(fds, auclass);
1038 /* Failure reason: file does not exist */
1039 ATF_REQUIRE_ERRNO(ENOENT,
1040 extattr_set_file(path, EXTATTR_NAMESPACE_USER, name, NULL, 0) ==
1041 -1);
1042 check_audit(fds, extregex, pipefd);
1043 }
1044
ATF_TC_CLEANUP(extattr_set_file_failure,tc)1045 ATF_TC_CLEANUP(extattr_set_file_failure, tc)
1046 {
1047 cleanup();
1048 }
1049
1050
1051 ATF_TC_WITH_CLEANUP(extattr_set_fd_success);
ATF_TC_HEAD(extattr_set_fd_success,tc)1052 ATF_TC_HEAD(extattr_set_fd_success, tc)
1053 {
1054 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1055 "extattr_set_fd(2) call");
1056 }
1057
ATF_TC_BODY(extattr_set_fd_success,tc)1058 ATF_TC_BODY(extattr_set_fd_success, tc)
1059 {
1060 /* File needs to exist to call extattr_set_fd(2) */
1061 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
1062 skip_if_extattr_not_supported(path);
1063
1064 /* Prepare the regex to be checked in the audit record */
1065 snprintf(extregex, sizeof(extregex),
1066 "extattr_set_fd.*%s.*return,success", name);
1067
1068 FILE *pipefd = setup(fds, auclass);
1069 REQUIRE_EXTATTR_RESULT(sizeof(buff), extattr_set_fd(filedesc,
1070 EXTATTR_NAMESPACE_USER, name, buff, sizeof(buff)));
1071 check_audit(fds, extregex, pipefd);
1072 close(filedesc);
1073 }
1074
ATF_TC_CLEANUP(extattr_set_fd_success,tc)1075 ATF_TC_CLEANUP(extattr_set_fd_success, tc)
1076 {
1077 cleanup();
1078 }
1079
1080
1081 ATF_TC_WITH_CLEANUP(extattr_set_fd_failure);
ATF_TC_HEAD(extattr_set_fd_failure,tc)1082 ATF_TC_HEAD(extattr_set_fd_failure, tc)
1083 {
1084 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1085 "extattr_set_fd(2) call");
1086 }
1087
ATF_TC_BODY(extattr_set_fd_failure,tc)1088 ATF_TC_BODY(extattr_set_fd_failure, tc)
1089 {
1090 /* Prepare the regex to be checked in the audit record */
1091 snprintf(extregex, sizeof(extregex),
1092 "extattr_set_fd.*%s.*return,failure : Bad file descriptor", name);
1093
1094 FILE *pipefd = setup(fds, auclass);
1095 /* Failure reason: Invalid file descriptor */
1096 ATF_REQUIRE_ERRNO(EBADF,
1097 extattr_set_fd(-1, EXTATTR_NAMESPACE_USER, name, NULL, 0) == -1);
1098 check_audit(fds, extregex, pipefd);
1099 }
1100
ATF_TC_CLEANUP(extattr_set_fd_failure,tc)1101 ATF_TC_CLEANUP(extattr_set_fd_failure, tc)
1102 {
1103 cleanup();
1104 }
1105
1106
1107 ATF_TC_WITH_CLEANUP(extattr_set_link_success);
ATF_TC_HEAD(extattr_set_link_success,tc)1108 ATF_TC_HEAD(extattr_set_link_success, tc)
1109 {
1110 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1111 "extattr_set_link(2) call");
1112 }
1113
ATF_TC_BODY(extattr_set_link_success,tc)1114 ATF_TC_BODY(extattr_set_link_success, tc)
1115 {
1116 /* Symbolic link needs to exist to call extattr_set_link(2) */
1117 ATF_REQUIRE_EQ(0, symlink("symlink", path));
1118 skip_if_extattr_not_supported(".");
1119
1120 /* Prepare the regex to be checked in the audit record */
1121 snprintf(extregex, sizeof(extregex),
1122 "extattr_set_link.*%s.*%s.*return,success", path, name);
1123
1124 FILE *pipefd = setup(fds, auclass);
1125 REQUIRE_EXTATTR_RESULT(sizeof(buff), extattr_set_link(path,
1126 EXTATTR_NAMESPACE_USER, name, buff, sizeof(buff)));
1127
1128 check_audit(fds, extregex, pipefd);
1129 }
1130
ATF_TC_CLEANUP(extattr_set_link_success,tc)1131 ATF_TC_CLEANUP(extattr_set_link_success, tc)
1132 {
1133 cleanup();
1134 }
1135
1136
1137 ATF_TC_WITH_CLEANUP(extattr_set_link_failure);
ATF_TC_HEAD(extattr_set_link_failure,tc)1138 ATF_TC_HEAD(extattr_set_link_failure, tc)
1139 {
1140 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1141 "extattr_set_link(2) call");
1142 }
1143
ATF_TC_BODY(extattr_set_link_failure,tc)1144 ATF_TC_BODY(extattr_set_link_failure, tc)
1145 {
1146 /* Prepare the regex to be checked in the audit record */
1147 snprintf(extregex, sizeof(extregex),
1148 "extattr_set_link.*%s.*%s.*failure", path, name);
1149 FILE *pipefd = setup(fds, auclass);
1150 /* Failure reason: symbolic link does not exist */
1151 ATF_REQUIRE_ERRNO(ENOENT,
1152 extattr_set_link(path, EXTATTR_NAMESPACE_USER, name, NULL, 0) ==
1153 -1);
1154 check_audit(fds, extregex, pipefd);
1155 }
1156
ATF_TC_CLEANUP(extattr_set_link_failure,tc)1157 ATF_TC_CLEANUP(extattr_set_link_failure, tc)
1158 {
1159 cleanup();
1160 }
1161
1162
1163 ATF_TC_WITH_CLEANUP(extattr_delete_file_success);
ATF_TC_HEAD(extattr_delete_file_success,tc)1164 ATF_TC_HEAD(extattr_delete_file_success, tc)
1165 {
1166 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1167 "extattr_delete_file(2) call");
1168 }
1169
ATF_TC_BODY(extattr_delete_file_success,tc)1170 ATF_TC_BODY(extattr_delete_file_success, tc)
1171 {
1172 /* File needs to exist to call extattr_delete_file(2) */
1173 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
1174 skip_if_extattr_not_supported(path);
1175
1176 REQUIRE_EXTATTR_RESULT(sizeof(buff), extattr_set_file(path,
1177 EXTATTR_NAMESPACE_USER, name, buff, sizeof(buff)));
1178
1179 FILE *pipefd = setup(fds, auclass);
1180 retval = REQUIRE_EXTATTR_SUCCESS(
1181 extattr_delete_file(path, EXTATTR_NAMESPACE_USER, name));
1182 /* Prepare the regex to be checked in the audit record */
1183 snprintf(extregex, sizeof(extregex),
1184 "extattr_delete_file.*%s.*return,success,%d", path, retval);
1185 check_audit(fds, extregex, pipefd);
1186 close(filedesc);
1187 }
1188
ATF_TC_CLEANUP(extattr_delete_file_success,tc)1189 ATF_TC_CLEANUP(extattr_delete_file_success, tc)
1190 {
1191 cleanup();
1192 }
1193
1194
1195 ATF_TC_WITH_CLEANUP(extattr_delete_file_failure);
ATF_TC_HEAD(extattr_delete_file_failure,tc)1196 ATF_TC_HEAD(extattr_delete_file_failure, tc)
1197 {
1198 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1199 "extattr_delete_file(2) call");
1200 }
1201
ATF_TC_BODY(extattr_delete_file_failure,tc)1202 ATF_TC_BODY(extattr_delete_file_failure, tc)
1203 {
1204 /* Prepare the regex to be checked in the audit record */
1205 snprintf(extregex, sizeof(extregex),
1206 "extattr_delete_file.*%s.*return,failure", path);
1207
1208 FILE *pipefd = setup(fds, auclass);
1209 /* Failure reason: file does not exist */
1210 ATF_REQUIRE_ERRNO(ENOENT,
1211 extattr_delete_file(path, EXTATTR_NAMESPACE_USER, name) == -1);
1212 check_audit(fds, extregex, pipefd);
1213 }
1214
ATF_TC_CLEANUP(extattr_delete_file_failure,tc)1215 ATF_TC_CLEANUP(extattr_delete_file_failure, tc)
1216 {
1217 cleanup();
1218 }
1219
1220
1221 ATF_TC_WITH_CLEANUP(extattr_delete_fd_success);
ATF_TC_HEAD(extattr_delete_fd_success,tc)1222 ATF_TC_HEAD(extattr_delete_fd_success, tc)
1223 {
1224 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1225 "extattr_delete_fd(2) call");
1226 }
1227
ATF_TC_BODY(extattr_delete_fd_success,tc)1228 ATF_TC_BODY(extattr_delete_fd_success, tc)
1229 {
1230 /* File needs to exist to call extattr_delete_fd(2) */
1231 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
1232 skip_if_extattr_not_supported(path);
1233
1234 REQUIRE_EXTATTR_RESULT(sizeof(buff), extattr_set_file(path,
1235 EXTATTR_NAMESPACE_USER, name, buff, sizeof(buff)));
1236
1237 FILE *pipefd = setup(fds, auclass);
1238 retval = REQUIRE_EXTATTR_SUCCESS(extattr_delete_fd(filedesc,
1239 EXTATTR_NAMESPACE_USER, name));
1240 /* Prepare the regex to be checked in the audit record */
1241 snprintf(extregex, sizeof(extregex),
1242 "extattr_delete_fd.*return,success,%d", retval);
1243 check_audit(fds, extregex, pipefd);
1244 close(filedesc);
1245 }
1246
ATF_TC_CLEANUP(extattr_delete_fd_success,tc)1247 ATF_TC_CLEANUP(extattr_delete_fd_success, tc)
1248 {
1249 cleanup();
1250 }
1251
1252
1253 ATF_TC_WITH_CLEANUP(extattr_delete_fd_failure);
ATF_TC_HEAD(extattr_delete_fd_failure,tc)1254 ATF_TC_HEAD(extattr_delete_fd_failure, tc)
1255 {
1256 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1257 "extattr_delete_fd(2) call");
1258 }
1259
ATF_TC_BODY(extattr_delete_fd_failure,tc)1260 ATF_TC_BODY(extattr_delete_fd_failure, tc)
1261 {
1262 /* Prepare the regex to be checked in the audit record */
1263 snprintf(extregex, sizeof(extregex),
1264 "extattr_delete_fd.*return,failure : Bad file descriptor");
1265
1266 FILE *pipefd = setup(fds, auclass);
1267 /* Failure reason: Invalid file descriptor */
1268 ATF_REQUIRE_ERRNO(EBADF,
1269 extattr_delete_fd(-1, EXTATTR_NAMESPACE_USER, name) == -1);
1270 check_audit(fds, extregex, pipefd);
1271 }
1272
ATF_TC_CLEANUP(extattr_delete_fd_failure,tc)1273 ATF_TC_CLEANUP(extattr_delete_fd_failure, tc)
1274 {
1275 cleanup();
1276 }
1277
1278
1279 ATF_TC_WITH_CLEANUP(extattr_delete_link_success);
ATF_TC_HEAD(extattr_delete_link_success,tc)1280 ATF_TC_HEAD(extattr_delete_link_success, tc)
1281 {
1282 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1283 "extattr_delete_link(2) call");
1284 }
1285
ATF_TC_BODY(extattr_delete_link_success,tc)1286 ATF_TC_BODY(extattr_delete_link_success, tc)
1287 {
1288 /* Symbolic link needs to exist to call extattr_delete_link(2) */
1289 ATF_REQUIRE_EQ(0, symlink("symlink", path));
1290 skip_if_extattr_not_supported(".");
1291
1292 REQUIRE_EXTATTR_RESULT(sizeof(buff), extattr_set_link(path,
1293 EXTATTR_NAMESPACE_USER, name, buff, sizeof(buff)));
1294
1295 FILE *pipefd = setup(fds, auclass);
1296 retval = REQUIRE_EXTATTR_SUCCESS(extattr_delete_link(path,
1297 EXTATTR_NAMESPACE_USER, name));
1298 /* Prepare the regex to be checked in the audit record */
1299 snprintf(extregex, sizeof(extregex),
1300 "extattr_delete_link.*%s.*return,success,%d", path, retval);
1301 check_audit(fds, extregex, pipefd);
1302 }
1303
ATF_TC_CLEANUP(extattr_delete_link_success,tc)1304 ATF_TC_CLEANUP(extattr_delete_link_success, tc)
1305 {
1306 cleanup();
1307 }
1308
1309
1310 ATF_TC_WITH_CLEANUP(extattr_delete_link_failure);
ATF_TC_HEAD(extattr_delete_link_failure,tc)1311 ATF_TC_HEAD(extattr_delete_link_failure, tc)
1312 {
1313 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1314 "extattr_delete_link(2) call");
1315 }
1316
ATF_TC_BODY(extattr_delete_link_failure,tc)1317 ATF_TC_BODY(extattr_delete_link_failure, tc)
1318 {
1319 /* Prepare the regex to be checked in the audit record */
1320 snprintf(extregex, sizeof(extregex),
1321 "extattr_delete_link.*%s.*failure", path);
1322 FILE *pipefd = setup(fds, auclass);
1323 /* Failure reason: symbolic link does not exist */
1324 ATF_REQUIRE_ERRNO(ENOENT,
1325 extattr_delete_link(path, EXTATTR_NAMESPACE_USER, name) == -1);
1326 check_audit(fds, extregex, pipefd);
1327 }
1328
ATF_TC_CLEANUP(extattr_delete_link_failure,tc)1329 ATF_TC_CLEANUP(extattr_delete_link_failure, tc)
1330 {
1331 cleanup();
1332 }
1333
1334
ATF_TP_ADD_TCS(tp)1335 ATF_TP_ADD_TCS(tp)
1336 {
1337 ATF_TP_ADD_TC(tp, flock_success);
1338 ATF_TP_ADD_TC(tp, flock_failure);
1339 ATF_TP_ADD_TC(tp, fcntl_success);
1340 ATF_TP_ADD_TC(tp, fcntl_failure);
1341 ATF_TP_ADD_TC(tp, fsync_success);
1342 ATF_TP_ADD_TC(tp, fsync_failure);
1343
1344 ATF_TP_ADD_TC(tp, chmod_success);
1345 ATF_TP_ADD_TC(tp, chmod_failure);
1346 ATF_TP_ADD_TC(tp, fchmod_success);
1347 ATF_TP_ADD_TC(tp, fchmod_failure);
1348 ATF_TP_ADD_TC(tp, lchmod_success);
1349 ATF_TP_ADD_TC(tp, lchmod_failure);
1350 ATF_TP_ADD_TC(tp, fchmodat_success);
1351 ATF_TP_ADD_TC(tp, fchmodat_failure);
1352
1353 ATF_TP_ADD_TC(tp, chown_success);
1354 ATF_TP_ADD_TC(tp, chown_failure);
1355 ATF_TP_ADD_TC(tp, fchown_success);
1356 ATF_TP_ADD_TC(tp, fchown_failure);
1357 ATF_TP_ADD_TC(tp, lchown_success);
1358 ATF_TP_ADD_TC(tp, lchown_failure);
1359 ATF_TP_ADD_TC(tp, fchownat_success);
1360 ATF_TP_ADD_TC(tp, fchownat_failure);
1361
1362 ATF_TP_ADD_TC(tp, chflags_success);
1363 ATF_TP_ADD_TC(tp, chflags_failure);
1364 ATF_TP_ADD_TC(tp, fchflags_success);
1365 ATF_TP_ADD_TC(tp, fchflags_failure);
1366 ATF_TP_ADD_TC(tp, lchflags_success);
1367 ATF_TP_ADD_TC(tp, lchflags_failure);
1368 ATF_TP_ADD_TC(tp, chflagsat_success);
1369 ATF_TP_ADD_TC(tp, chflagsat_failure);
1370
1371 ATF_TP_ADD_TC(tp, utimes_success);
1372 ATF_TP_ADD_TC(tp, utimes_failure);
1373 ATF_TP_ADD_TC(tp, futimes_success);
1374 ATF_TP_ADD_TC(tp, futimes_failure);
1375 ATF_TP_ADD_TC(tp, lutimes_success);
1376 ATF_TP_ADD_TC(tp, lutimes_failure);
1377 ATF_TP_ADD_TC(tp, futimesat_success);
1378 ATF_TP_ADD_TC(tp, futimesat_failure);
1379
1380 ATF_TP_ADD_TC(tp, mprotect_success);
1381 ATF_TP_ADD_TC(tp, mprotect_failure);
1382 ATF_TP_ADD_TC(tp, undelete_failure);
1383
1384 ATF_TP_ADD_TC(tp, extattr_set_file_success);
1385 ATF_TP_ADD_TC(tp, extattr_set_file_failure);
1386 ATF_TP_ADD_TC(tp, extattr_set_fd_success);
1387 ATF_TP_ADD_TC(tp, extattr_set_fd_failure);
1388 ATF_TP_ADD_TC(tp, extattr_set_link_success);
1389 ATF_TP_ADD_TC(tp, extattr_set_link_failure);
1390
1391 ATF_TP_ADD_TC(tp, extattr_delete_file_success);
1392 ATF_TP_ADD_TC(tp, extattr_delete_file_failure);
1393 ATF_TP_ADD_TC(tp, extattr_delete_fd_success);
1394 ATF_TP_ADD_TC(tp, extattr_delete_fd_failure);
1395 ATF_TP_ADD_TC(tp, extattr_delete_link_success);
1396 ATF_TP_ADD_TC(tp, extattr_delete_link_failure);
1397
1398 return (atf_no_error());
1399 }
1400