xref: /freebsd/tests/sys/audit/file-attribute-modify.c (revision 5c9a4738884eed4c95638dfc8ad1636dc5474148)
16d203d2dSAlan Somers /*-
26d203d2dSAlan Somers  * Copyright (c) 2018 Aniket Pandey
36d203d2dSAlan Somers  *
46d203d2dSAlan Somers  * Redistribution and use in source and binary forms, with or without
56d203d2dSAlan Somers  * modification, are permitted provided that the following conditions
66d203d2dSAlan Somers  * are met:
76d203d2dSAlan Somers  * 1. Redistributions of source code must retain the above copyright
86d203d2dSAlan Somers  *    notice, this list of conditions and the following disclaimer.
96d203d2dSAlan Somers  * 2. Redistributions in binary form must reproduce the above copyright
106d203d2dSAlan Somers  *    notice, this list of conditions and the following disclaimer in the
116d203d2dSAlan Somers  *    documentation and/or other materials provided with the distribution.
126d203d2dSAlan Somers  *
136d203d2dSAlan Somers  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
146d203d2dSAlan Somers  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
156d203d2dSAlan Somers  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
166d203d2dSAlan Somers  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
176d203d2dSAlan Somers  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
186d203d2dSAlan Somers  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
196d203d2dSAlan Somers  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
206d203d2dSAlan Somers  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
216d203d2dSAlan Somers  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
226d203d2dSAlan Somers  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
236d203d2dSAlan Somers  * SUCH DAMAGE.
246d203d2dSAlan Somers  *
256d203d2dSAlan Somers  * $FreeBSD$
266d203d2dSAlan Somers  */
276d203d2dSAlan Somers 
286d203d2dSAlan Somers #include <sys/file.h>
2928845213SAlan Somers #include <sys/stat.h>
306d203d2dSAlan Somers 
316d203d2dSAlan Somers #include <atf-c.h>
326d203d2dSAlan Somers #include <fcntl.h>
336d203d2dSAlan Somers #include <unistd.h>
346d203d2dSAlan Somers 
356d203d2dSAlan Somers #include "utils.h"
366d203d2dSAlan Somers 
376d203d2dSAlan Somers static pid_t pid;
38*5c9a4738SAlan Somers static uid_t uid = -1;
39*5c9a4738SAlan Somers static gid_t gid = -1;
406d203d2dSAlan Somers static int filedesc;
416d203d2dSAlan Somers static struct pollfd fds[1];
426d203d2dSAlan Somers static mode_t mode = 0777;
436d203d2dSAlan Somers static char extregex[80];
446d203d2dSAlan Somers static const char *auclass = "fm";
456d203d2dSAlan Somers static const char *path = "fileforaudit";
4628845213SAlan Somers static const char *errpath = "adirhasnoname/fileforaudit";
4728845213SAlan Somers static const char *successreg = "fileforaudit.*return,success";
4828845213SAlan Somers static const char *failurereg = "fileforaudit.*return,failure";
496d203d2dSAlan Somers 
506d203d2dSAlan Somers 
516d203d2dSAlan Somers ATF_TC_WITH_CLEANUP(flock_success);
526d203d2dSAlan Somers ATF_TC_HEAD(flock_success, tc)
536d203d2dSAlan Somers {
546d203d2dSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
556d203d2dSAlan Somers 					"flock(2) call");
566d203d2dSAlan Somers }
576d203d2dSAlan Somers 
586d203d2dSAlan Somers ATF_TC_BODY(flock_success, tc)
596d203d2dSAlan Somers {
606d203d2dSAlan Somers 	pid = getpid();
616d203d2dSAlan Somers 	snprintf(extregex, sizeof(extregex), "flock.*%d.*return,success", pid);
626d203d2dSAlan Somers 
636d203d2dSAlan Somers 	/* File needs to exist to call flock(2) */
646d203d2dSAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
656d203d2dSAlan Somers 	FILE *pipefd = setup(fds, auclass);
666d203d2dSAlan Somers 	ATF_REQUIRE_EQ(0, flock(filedesc, LOCK_SH));
676d203d2dSAlan Somers 	check_audit(fds, extregex, pipefd);
686d203d2dSAlan Somers 	close(filedesc);
696d203d2dSAlan Somers }
706d203d2dSAlan Somers 
716d203d2dSAlan Somers ATF_TC_CLEANUP(flock_success, tc)
726d203d2dSAlan Somers {
736d203d2dSAlan Somers 	cleanup();
746d203d2dSAlan Somers }
756d203d2dSAlan Somers 
766d203d2dSAlan Somers 
776d203d2dSAlan Somers ATF_TC_WITH_CLEANUP(flock_failure);
786d203d2dSAlan Somers ATF_TC_HEAD(flock_failure, tc)
796d203d2dSAlan Somers {
806d203d2dSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
816d203d2dSAlan Somers 					"flock(2) call");
826d203d2dSAlan Somers }
836d203d2dSAlan Somers 
846d203d2dSAlan Somers ATF_TC_BODY(flock_failure, tc)
856d203d2dSAlan Somers {
866d203d2dSAlan Somers 	const char *regex = "flock.*return,failure : Bad file descriptor";
876d203d2dSAlan Somers 	FILE *pipefd = setup(fds, auclass);
886d203d2dSAlan Somers 	ATF_REQUIRE_EQ(-1, flock(-1, LOCK_SH));
896d203d2dSAlan Somers 	check_audit(fds, regex, pipefd);
906d203d2dSAlan Somers }
916d203d2dSAlan Somers 
926d203d2dSAlan Somers ATF_TC_CLEANUP(flock_failure, tc)
936d203d2dSAlan Somers {
946d203d2dSAlan Somers 	cleanup();
956d203d2dSAlan Somers }
966d203d2dSAlan Somers 
976d203d2dSAlan Somers 
986d203d2dSAlan Somers ATF_TC_WITH_CLEANUP(fcntl_success);
996d203d2dSAlan Somers ATF_TC_HEAD(fcntl_success, tc)
1006d203d2dSAlan Somers {
1016d203d2dSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1026d203d2dSAlan Somers 					"fcntl(2) call");
1036d203d2dSAlan Somers }
1046d203d2dSAlan Somers 
1056d203d2dSAlan Somers ATF_TC_BODY(fcntl_success, tc)
1066d203d2dSAlan Somers {
1076d203d2dSAlan Somers 	int flagstatus;
1086d203d2dSAlan Somers 	/* File needs to exist to call fcntl(2) */
1096d203d2dSAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
1106d203d2dSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1116d203d2dSAlan Somers 
1126d203d2dSAlan Somers 	/* Retrieve the status flags of 'filedesc' and store it in flagstatus */
1136d203d2dSAlan Somers 	ATF_REQUIRE((flagstatus = fcntl(filedesc, F_GETFL, 0)) != -1);
1146d203d2dSAlan Somers 	snprintf(extregex, sizeof(extregex),
1156d203d2dSAlan Somers 			"fcntl.*return,success,%d", flagstatus);
1166d203d2dSAlan Somers 	check_audit(fds, extregex, pipefd);
1176d203d2dSAlan Somers 	close(filedesc);
1186d203d2dSAlan Somers }
1196d203d2dSAlan Somers 
1206d203d2dSAlan Somers ATF_TC_CLEANUP(fcntl_success, tc)
1216d203d2dSAlan Somers {
1226d203d2dSAlan Somers 	cleanup();
1236d203d2dSAlan Somers }
1246d203d2dSAlan Somers 
1256d203d2dSAlan Somers 
1266d203d2dSAlan Somers ATF_TC_WITH_CLEANUP(fcntl_failure);
1276d203d2dSAlan Somers ATF_TC_HEAD(fcntl_failure, tc)
1286d203d2dSAlan Somers {
1296d203d2dSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1306d203d2dSAlan Somers 					"fcntl(2) call");
1316d203d2dSAlan Somers }
1326d203d2dSAlan Somers 
1336d203d2dSAlan Somers ATF_TC_BODY(fcntl_failure, tc)
1346d203d2dSAlan Somers {
1356d203d2dSAlan Somers 	const char *regex = "fcntl.*return,failure : Bad file descriptor";
1366d203d2dSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1376d203d2dSAlan Somers 	ATF_REQUIRE_EQ(-1, fcntl(-1, F_GETFL, 0));
1386d203d2dSAlan Somers 	check_audit(fds, regex, pipefd);
1396d203d2dSAlan Somers }
1406d203d2dSAlan Somers 
1416d203d2dSAlan Somers ATF_TC_CLEANUP(fcntl_failure, tc)
1426d203d2dSAlan Somers {
1436d203d2dSAlan Somers 	cleanup();
1446d203d2dSAlan Somers }
1456d203d2dSAlan Somers 
1466d203d2dSAlan Somers 
1476d203d2dSAlan Somers ATF_TC_WITH_CLEANUP(fsync_success);
1486d203d2dSAlan Somers ATF_TC_HEAD(fsync_success, tc)
1496d203d2dSAlan Somers {
1506d203d2dSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1516d203d2dSAlan Somers 					"fsync(2) call");
1526d203d2dSAlan Somers }
1536d203d2dSAlan Somers 
1546d203d2dSAlan Somers ATF_TC_BODY(fsync_success, tc)
1556d203d2dSAlan Somers {
1566d203d2dSAlan Somers 	pid = getpid();
1576d203d2dSAlan Somers 	snprintf(extregex, sizeof(extregex), "fsync.*%d.*return,success", pid);
1586d203d2dSAlan Somers 
1596d203d2dSAlan Somers 	/* File needs to exist to call fsync(2) */
1606d203d2dSAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
1616d203d2dSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1626d203d2dSAlan Somers 	ATF_REQUIRE_EQ(0, fsync(filedesc));
1636d203d2dSAlan Somers 	check_audit(fds, extregex, pipefd);
1646d203d2dSAlan Somers 	close(filedesc);
1656d203d2dSAlan Somers }
1666d203d2dSAlan Somers 
1676d203d2dSAlan Somers ATF_TC_CLEANUP(fsync_success, tc)
1686d203d2dSAlan Somers {
1696d203d2dSAlan Somers 	cleanup();
1706d203d2dSAlan Somers }
1716d203d2dSAlan Somers 
1726d203d2dSAlan Somers 
1736d203d2dSAlan Somers ATF_TC_WITH_CLEANUP(fsync_failure);
1746d203d2dSAlan Somers ATF_TC_HEAD(fsync_failure, tc)
1756d203d2dSAlan Somers {
1766d203d2dSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1776d203d2dSAlan Somers 					"fsync(2) call");
1786d203d2dSAlan Somers }
1796d203d2dSAlan Somers 
1806d203d2dSAlan Somers ATF_TC_BODY(fsync_failure, tc)
1816d203d2dSAlan Somers {
1826d203d2dSAlan Somers 	const char *regex = "fsync.*return,failure : Bad file descriptor";
1836d203d2dSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1846d203d2dSAlan Somers 	/* Failure reason: Invalid file descriptor */
1856d203d2dSAlan Somers 	ATF_REQUIRE_EQ(-1, fsync(-1));
1866d203d2dSAlan Somers 	check_audit(fds, regex, pipefd);
1876d203d2dSAlan Somers }
1886d203d2dSAlan Somers 
1896d203d2dSAlan Somers ATF_TC_CLEANUP(fsync_failure, tc)
1906d203d2dSAlan Somers {
1916d203d2dSAlan Somers 	cleanup();
1926d203d2dSAlan Somers }
1936d203d2dSAlan Somers 
1946d203d2dSAlan Somers 
19528845213SAlan Somers ATF_TC_WITH_CLEANUP(chmod_success);
19628845213SAlan Somers ATF_TC_HEAD(chmod_success, tc)
19728845213SAlan Somers {
19828845213SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
19928845213SAlan Somers 					"chmod(2) call");
20028845213SAlan Somers }
20128845213SAlan Somers 
20228845213SAlan Somers ATF_TC_BODY(chmod_success, tc)
20328845213SAlan Somers {
20428845213SAlan Somers 	/* File needs to exist to call chmod(2) */
20528845213SAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
20628845213SAlan Somers 	FILE *pipefd = setup(fds, auclass);
20728845213SAlan Somers 	ATF_REQUIRE_EQ(0, chmod(path, mode));
20828845213SAlan Somers 	check_audit(fds, successreg, pipefd);
20928845213SAlan Somers 	close(filedesc);
21028845213SAlan Somers }
21128845213SAlan Somers 
21228845213SAlan Somers ATF_TC_CLEANUP(chmod_success, tc)
21328845213SAlan Somers {
21428845213SAlan Somers 	cleanup();
21528845213SAlan Somers }
21628845213SAlan Somers 
21728845213SAlan Somers 
21828845213SAlan Somers ATF_TC_WITH_CLEANUP(chmod_failure);
21928845213SAlan Somers ATF_TC_HEAD(chmod_failure, tc)
22028845213SAlan Somers {
22128845213SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
22228845213SAlan Somers 					"chmod(2) call");
22328845213SAlan Somers }
22428845213SAlan Somers 
22528845213SAlan Somers ATF_TC_BODY(chmod_failure, tc)
22628845213SAlan Somers {
22728845213SAlan Somers 	FILE *pipefd = setup(fds, auclass);
22828845213SAlan Somers 	/* Failure reason: file does not exist */
22928845213SAlan Somers 	ATF_REQUIRE_EQ(-1, chmod(errpath, mode));
23028845213SAlan Somers 	check_audit(fds, failurereg, pipefd);
23128845213SAlan Somers }
23228845213SAlan Somers 
23328845213SAlan Somers ATF_TC_CLEANUP(chmod_failure, tc)
23428845213SAlan Somers {
23528845213SAlan Somers 	cleanup();
23628845213SAlan Somers }
23728845213SAlan Somers 
23828845213SAlan Somers 
23928845213SAlan Somers ATF_TC_WITH_CLEANUP(fchmod_success);
24028845213SAlan Somers ATF_TC_HEAD(fchmod_success, tc)
24128845213SAlan Somers {
24228845213SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
24328845213SAlan Somers 					"fchmod(2) call");
24428845213SAlan Somers }
24528845213SAlan Somers 
24628845213SAlan Somers ATF_TC_BODY(fchmod_success, tc)
24728845213SAlan Somers {
24828845213SAlan Somers 	pid = getpid();
24928845213SAlan Somers 	snprintf(extregex, sizeof(extregex), "fchmod.*%d.*return,success", pid);
25028845213SAlan Somers 
25128845213SAlan Somers 	/* File needs to exist to call fchmod(2) */
25228845213SAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
25328845213SAlan Somers 	FILE *pipefd = setup(fds, auclass);
25428845213SAlan Somers 	ATF_REQUIRE_EQ(0, fchmod(filedesc, mode));
25528845213SAlan Somers 	check_audit(fds, extregex, pipefd);
25628845213SAlan Somers 	close(filedesc);
25728845213SAlan Somers }
25828845213SAlan Somers 
25928845213SAlan Somers ATF_TC_CLEANUP(fchmod_success, tc)
26028845213SAlan Somers {
26128845213SAlan Somers 	cleanup();
26228845213SAlan Somers }
26328845213SAlan Somers 
26428845213SAlan Somers 
26528845213SAlan Somers ATF_TC_WITH_CLEANUP(fchmod_failure);
26628845213SAlan Somers ATF_TC_HEAD(fchmod_failure, tc)
26728845213SAlan Somers {
26828845213SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
26928845213SAlan Somers 					"fchmod(2) call");
27028845213SAlan Somers }
27128845213SAlan Somers 
27228845213SAlan Somers ATF_TC_BODY(fchmod_failure, tc)
27328845213SAlan Somers {
27428845213SAlan Somers 	const char *regex = "fchmod.*return,failure : Bad file descriptor";
27528845213SAlan Somers 	FILE *pipefd = setup(fds, auclass);
27628845213SAlan Somers 	/* Failure reason: Invalid file descriptor */
27728845213SAlan Somers 	ATF_REQUIRE_EQ(-1, fchmod(-1, mode));
27828845213SAlan Somers 	check_audit(fds, regex, pipefd);
27928845213SAlan Somers }
28028845213SAlan Somers 
28128845213SAlan Somers ATF_TC_CLEANUP(fchmod_failure, tc)
28228845213SAlan Somers {
28328845213SAlan Somers 	cleanup();
28428845213SAlan Somers }
28528845213SAlan Somers 
28628845213SAlan Somers 
28728845213SAlan Somers ATF_TC_WITH_CLEANUP(lchmod_success);
28828845213SAlan Somers ATF_TC_HEAD(lchmod_success, tc)
28928845213SAlan Somers {
29028845213SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
29128845213SAlan Somers 					"lchmod(2) call");
29228845213SAlan Somers }
29328845213SAlan Somers 
29428845213SAlan Somers ATF_TC_BODY(lchmod_success, tc)
29528845213SAlan Somers {
29628845213SAlan Somers 	/* Symbolic link needs to exist to call lchmod(2) */
29728845213SAlan Somers 	ATF_REQUIRE_EQ(0, symlink("symlink", path));
29828845213SAlan Somers 	FILE *pipefd = setup(fds, auclass);
29928845213SAlan Somers 	ATF_REQUIRE_EQ(0, lchmod(path, mode));
30028845213SAlan Somers 	check_audit(fds, successreg, pipefd);
30128845213SAlan Somers }
30228845213SAlan Somers 
30328845213SAlan Somers ATF_TC_CLEANUP(lchmod_success, tc)
30428845213SAlan Somers {
30528845213SAlan Somers 	cleanup();
30628845213SAlan Somers }
30728845213SAlan Somers 
30828845213SAlan Somers 
30928845213SAlan Somers ATF_TC_WITH_CLEANUP(lchmod_failure);
31028845213SAlan Somers ATF_TC_HEAD(lchmod_failure, tc)
31128845213SAlan Somers {
31228845213SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
31328845213SAlan Somers 					"lchmod(2) call");
31428845213SAlan Somers }
31528845213SAlan Somers 
31628845213SAlan Somers ATF_TC_BODY(lchmod_failure, tc)
31728845213SAlan Somers {
31828845213SAlan Somers 	FILE *pipefd = setup(fds, auclass);
31928845213SAlan Somers 	/* Failure reason: file does not exist */
32028845213SAlan Somers 	ATF_REQUIRE_EQ(-1, lchmod(errpath, mode));
32128845213SAlan Somers 	check_audit(fds, failurereg, pipefd);
32228845213SAlan Somers }
32328845213SAlan Somers 
32428845213SAlan Somers ATF_TC_CLEANUP(lchmod_failure, tc)
32528845213SAlan Somers {
32628845213SAlan Somers 	cleanup();
32728845213SAlan Somers }
32828845213SAlan Somers 
32928845213SAlan Somers 
33028845213SAlan Somers ATF_TC_WITH_CLEANUP(fchmodat_success);
33128845213SAlan Somers ATF_TC_HEAD(fchmodat_success, tc)
33228845213SAlan Somers {
33328845213SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
33428845213SAlan Somers 					"fchmodat(2) call");
33528845213SAlan Somers }
33628845213SAlan Somers 
33728845213SAlan Somers ATF_TC_BODY(fchmodat_success, tc)
33828845213SAlan Somers {
33928845213SAlan Somers 	/* File needs to exist to call fchmodat(2) */
34028845213SAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
34128845213SAlan Somers 	FILE *pipefd = setup(fds, auclass);
34228845213SAlan Somers 	ATF_REQUIRE_EQ(0, fchmodat(AT_FDCWD, path, mode, 0));
34328845213SAlan Somers 	check_audit(fds, successreg, pipefd);
34428845213SAlan Somers 	close(filedesc);
34528845213SAlan Somers }
34628845213SAlan Somers 
34728845213SAlan Somers ATF_TC_CLEANUP(fchmodat_success, tc)
34828845213SAlan Somers {
34928845213SAlan Somers 	cleanup();
35028845213SAlan Somers }
35128845213SAlan Somers 
35228845213SAlan Somers 
35328845213SAlan Somers ATF_TC_WITH_CLEANUP(fchmodat_failure);
35428845213SAlan Somers ATF_TC_HEAD(fchmodat_failure, tc)
35528845213SAlan Somers {
35628845213SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
35728845213SAlan Somers 					"fchmodat(2) call");
35828845213SAlan Somers }
35928845213SAlan Somers 
36028845213SAlan Somers ATF_TC_BODY(fchmodat_failure, tc)
36128845213SAlan Somers {
36228845213SAlan Somers 	FILE *pipefd = setup(fds, auclass);
36328845213SAlan Somers 	/* Failure reason: file does not exist */
36428845213SAlan Somers 	ATF_REQUIRE_EQ(-1, fchmodat(AT_FDCWD, errpath, mode, 0));
36528845213SAlan Somers 	check_audit(fds, failurereg, pipefd);
36628845213SAlan Somers }
36728845213SAlan Somers 
36828845213SAlan Somers ATF_TC_CLEANUP(fchmodat_failure, tc)
36928845213SAlan Somers {
37028845213SAlan Somers 	cleanup();
37128845213SAlan Somers }
37228845213SAlan Somers 
37328845213SAlan Somers 
374*5c9a4738SAlan Somers ATF_TC_WITH_CLEANUP(chown_success);
375*5c9a4738SAlan Somers ATF_TC_HEAD(chown_success, tc)
376*5c9a4738SAlan Somers {
377*5c9a4738SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
378*5c9a4738SAlan Somers 					"chown(2) call");
379*5c9a4738SAlan Somers }
380*5c9a4738SAlan Somers 
381*5c9a4738SAlan Somers ATF_TC_BODY(chown_success, tc)
382*5c9a4738SAlan Somers {
383*5c9a4738SAlan Somers 	/* File needs to exist to call chown(2) */
384*5c9a4738SAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
385*5c9a4738SAlan Somers 	FILE *pipefd = setup(fds, auclass);
386*5c9a4738SAlan Somers 	ATF_REQUIRE_EQ(0, chown(path, uid, gid));
387*5c9a4738SAlan Somers 	check_audit(fds, successreg, pipefd);
388*5c9a4738SAlan Somers 	close(filedesc);
389*5c9a4738SAlan Somers }
390*5c9a4738SAlan Somers 
391*5c9a4738SAlan Somers ATF_TC_CLEANUP(chown_success, tc)
392*5c9a4738SAlan Somers {
393*5c9a4738SAlan Somers 	cleanup();
394*5c9a4738SAlan Somers }
395*5c9a4738SAlan Somers 
396*5c9a4738SAlan Somers 
397*5c9a4738SAlan Somers ATF_TC_WITH_CLEANUP(chown_failure);
398*5c9a4738SAlan Somers ATF_TC_HEAD(chown_failure, tc)
399*5c9a4738SAlan Somers {
400*5c9a4738SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
401*5c9a4738SAlan Somers 					"chown(2) call");
402*5c9a4738SAlan Somers }
403*5c9a4738SAlan Somers 
404*5c9a4738SAlan Somers ATF_TC_BODY(chown_failure, tc)
405*5c9a4738SAlan Somers {
406*5c9a4738SAlan Somers 	FILE *pipefd = setup(fds, auclass);
407*5c9a4738SAlan Somers 	/* Failure reason: file does not exist */
408*5c9a4738SAlan Somers 	ATF_REQUIRE_EQ(-1, chown(errpath, uid, gid));
409*5c9a4738SAlan Somers 	check_audit(fds, failurereg, pipefd);
410*5c9a4738SAlan Somers }
411*5c9a4738SAlan Somers 
412*5c9a4738SAlan Somers ATF_TC_CLEANUP(chown_failure, tc)
413*5c9a4738SAlan Somers {
414*5c9a4738SAlan Somers 	cleanup();
415*5c9a4738SAlan Somers }
416*5c9a4738SAlan Somers 
417*5c9a4738SAlan Somers 
418*5c9a4738SAlan Somers ATF_TC_WITH_CLEANUP(fchown_success);
419*5c9a4738SAlan Somers ATF_TC_HEAD(fchown_success, tc)
420*5c9a4738SAlan Somers {
421*5c9a4738SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
422*5c9a4738SAlan Somers 					"fchown(2) call");
423*5c9a4738SAlan Somers }
424*5c9a4738SAlan Somers 
425*5c9a4738SAlan Somers ATF_TC_BODY(fchown_success, tc)
426*5c9a4738SAlan Somers {
427*5c9a4738SAlan Somers 	pid = getpid();
428*5c9a4738SAlan Somers 	snprintf(extregex, sizeof(extregex), "fchown.*%d.*return,success", pid);
429*5c9a4738SAlan Somers 
430*5c9a4738SAlan Somers 	/* File needs to exist to call fchown(2) */
431*5c9a4738SAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
432*5c9a4738SAlan Somers 	FILE *pipefd = setup(fds, auclass);
433*5c9a4738SAlan Somers 	ATF_REQUIRE_EQ(0, fchown(filedesc, uid, gid));
434*5c9a4738SAlan Somers 	check_audit(fds, extregex, pipefd);
435*5c9a4738SAlan Somers 	close(filedesc);
436*5c9a4738SAlan Somers }
437*5c9a4738SAlan Somers 
438*5c9a4738SAlan Somers ATF_TC_CLEANUP(fchown_success, tc)
439*5c9a4738SAlan Somers {
440*5c9a4738SAlan Somers 	cleanup();
441*5c9a4738SAlan Somers }
442*5c9a4738SAlan Somers 
443*5c9a4738SAlan Somers 
444*5c9a4738SAlan Somers ATF_TC_WITH_CLEANUP(fchown_failure);
445*5c9a4738SAlan Somers ATF_TC_HEAD(fchown_failure, tc)
446*5c9a4738SAlan Somers {
447*5c9a4738SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
448*5c9a4738SAlan Somers 					"fchown(2) call");
449*5c9a4738SAlan Somers }
450*5c9a4738SAlan Somers 
451*5c9a4738SAlan Somers ATF_TC_BODY(fchown_failure, tc)
452*5c9a4738SAlan Somers {
453*5c9a4738SAlan Somers 	const char *regex = "fchown.*return,failure : Bad file descriptor";
454*5c9a4738SAlan Somers 	FILE *pipefd = setup(fds, auclass);
455*5c9a4738SAlan Somers 	/* Failure reason: Invalid file descriptor */
456*5c9a4738SAlan Somers 	ATF_REQUIRE_EQ(-1, fchown(-1, uid, gid));
457*5c9a4738SAlan Somers 	check_audit(fds, regex, pipefd);
458*5c9a4738SAlan Somers }
459*5c9a4738SAlan Somers 
460*5c9a4738SAlan Somers ATF_TC_CLEANUP(fchown_failure, tc)
461*5c9a4738SAlan Somers {
462*5c9a4738SAlan Somers 	cleanup();
463*5c9a4738SAlan Somers }
464*5c9a4738SAlan Somers 
465*5c9a4738SAlan Somers 
466*5c9a4738SAlan Somers ATF_TC_WITH_CLEANUP(lchown_success);
467*5c9a4738SAlan Somers ATF_TC_HEAD(lchown_success, tc)
468*5c9a4738SAlan Somers {
469*5c9a4738SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
470*5c9a4738SAlan Somers 					"lchown(2) call");
471*5c9a4738SAlan Somers }
472*5c9a4738SAlan Somers 
473*5c9a4738SAlan Somers ATF_TC_BODY(lchown_success, tc)
474*5c9a4738SAlan Somers {
475*5c9a4738SAlan Somers 	/* Symbolic link needs to exist to call lchown(2) */
476*5c9a4738SAlan Somers 	ATF_REQUIRE_EQ(0, symlink("symlink", path));
477*5c9a4738SAlan Somers 	FILE *pipefd = setup(fds, auclass);
478*5c9a4738SAlan Somers 	ATF_REQUIRE_EQ(0, lchown(path, uid, gid));
479*5c9a4738SAlan Somers 	check_audit(fds, successreg, pipefd);
480*5c9a4738SAlan Somers }
481*5c9a4738SAlan Somers 
482*5c9a4738SAlan Somers ATF_TC_CLEANUP(lchown_success, tc)
483*5c9a4738SAlan Somers {
484*5c9a4738SAlan Somers 	cleanup();
485*5c9a4738SAlan Somers }
486*5c9a4738SAlan Somers 
487*5c9a4738SAlan Somers 
488*5c9a4738SAlan Somers ATF_TC_WITH_CLEANUP(lchown_failure);
489*5c9a4738SAlan Somers ATF_TC_HEAD(lchown_failure, tc)
490*5c9a4738SAlan Somers {
491*5c9a4738SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
492*5c9a4738SAlan Somers 					"lchown(2) call");
493*5c9a4738SAlan Somers }
494*5c9a4738SAlan Somers 
495*5c9a4738SAlan Somers ATF_TC_BODY(lchown_failure, tc)
496*5c9a4738SAlan Somers {
497*5c9a4738SAlan Somers 	FILE *pipefd = setup(fds, auclass);
498*5c9a4738SAlan Somers 	/* Failure reason: Symbolic link does not exist */
499*5c9a4738SAlan Somers 	ATF_REQUIRE_EQ(-1, lchown(errpath, uid, gid));
500*5c9a4738SAlan Somers 	check_audit(fds, failurereg, pipefd);
501*5c9a4738SAlan Somers }
502*5c9a4738SAlan Somers 
503*5c9a4738SAlan Somers ATF_TC_CLEANUP(lchown_failure, tc)
504*5c9a4738SAlan Somers {
505*5c9a4738SAlan Somers 	cleanup();
506*5c9a4738SAlan Somers }
507*5c9a4738SAlan Somers 
508*5c9a4738SAlan Somers 
509*5c9a4738SAlan Somers ATF_TC_WITH_CLEANUP(fchownat_success);
510*5c9a4738SAlan Somers ATF_TC_HEAD(fchownat_success, tc)
511*5c9a4738SAlan Somers {
512*5c9a4738SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
513*5c9a4738SAlan Somers 					"fchownat(2) call");
514*5c9a4738SAlan Somers }
515*5c9a4738SAlan Somers 
516*5c9a4738SAlan Somers ATF_TC_BODY(fchownat_success, tc)
517*5c9a4738SAlan Somers {
518*5c9a4738SAlan Somers 	/* File needs to exist to call fchownat(2) */
519*5c9a4738SAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
520*5c9a4738SAlan Somers 	FILE *pipefd = setup(fds, auclass);
521*5c9a4738SAlan Somers 	ATF_REQUIRE_EQ(0, fchownat(AT_FDCWD, path, uid, gid, 0));
522*5c9a4738SAlan Somers 	check_audit(fds, successreg, pipefd);
523*5c9a4738SAlan Somers 	close(filedesc);
524*5c9a4738SAlan Somers }
525*5c9a4738SAlan Somers 
526*5c9a4738SAlan Somers ATF_TC_CLEANUP(fchownat_success, tc)
527*5c9a4738SAlan Somers {
528*5c9a4738SAlan Somers 	cleanup();
529*5c9a4738SAlan Somers }
530*5c9a4738SAlan Somers 
531*5c9a4738SAlan Somers 
532*5c9a4738SAlan Somers ATF_TC_WITH_CLEANUP(fchownat_failure);
533*5c9a4738SAlan Somers ATF_TC_HEAD(fchownat_failure, tc)
534*5c9a4738SAlan Somers {
535*5c9a4738SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
536*5c9a4738SAlan Somers 					"fchownat(2) call");
537*5c9a4738SAlan Somers }
538*5c9a4738SAlan Somers 
539*5c9a4738SAlan Somers ATF_TC_BODY(fchownat_failure, tc)
540*5c9a4738SAlan Somers {
541*5c9a4738SAlan Somers 	FILE *pipefd = setup(fds, auclass);
542*5c9a4738SAlan Somers 	/* Failure reason: file does not exist */
543*5c9a4738SAlan Somers 	ATF_REQUIRE_EQ(-1, fchownat(AT_FDCWD, errpath, uid, gid, 0));
544*5c9a4738SAlan Somers 	check_audit(fds, failurereg, pipefd);
545*5c9a4738SAlan Somers }
546*5c9a4738SAlan Somers 
547*5c9a4738SAlan Somers ATF_TC_CLEANUP(fchownat_failure, tc)
548*5c9a4738SAlan Somers {
549*5c9a4738SAlan Somers 	cleanup();
550*5c9a4738SAlan Somers }
551*5c9a4738SAlan Somers 
552*5c9a4738SAlan Somers 
5536d203d2dSAlan Somers ATF_TP_ADD_TCS(tp)
5546d203d2dSAlan Somers {
5556d203d2dSAlan Somers 	ATF_TP_ADD_TC(tp, flock_success);
5566d203d2dSAlan Somers 	ATF_TP_ADD_TC(tp, flock_failure);
5576d203d2dSAlan Somers 	ATF_TP_ADD_TC(tp, fcntl_success);
5586d203d2dSAlan Somers 	ATF_TP_ADD_TC(tp, fcntl_failure);
5596d203d2dSAlan Somers 	ATF_TP_ADD_TC(tp, fsync_success);
5606d203d2dSAlan Somers 	ATF_TP_ADD_TC(tp, fsync_failure);
5616d203d2dSAlan Somers 
56228845213SAlan Somers 	ATF_TP_ADD_TC(tp, chmod_success);
56328845213SAlan Somers 	ATF_TP_ADD_TC(tp, chmod_failure);
56428845213SAlan Somers 	ATF_TP_ADD_TC(tp, fchmod_success);
56528845213SAlan Somers 	ATF_TP_ADD_TC(tp, fchmod_failure);
56628845213SAlan Somers 	ATF_TP_ADD_TC(tp, lchmod_success);
56728845213SAlan Somers 	ATF_TP_ADD_TC(tp, lchmod_failure);
56828845213SAlan Somers 	ATF_TP_ADD_TC(tp, fchmodat_success);
56928845213SAlan Somers 	ATF_TP_ADD_TC(tp, fchmodat_failure);
57028845213SAlan Somers 
571*5c9a4738SAlan Somers 	ATF_TP_ADD_TC(tp, chown_success);
572*5c9a4738SAlan Somers 	ATF_TP_ADD_TC(tp, chown_failure);
573*5c9a4738SAlan Somers 	ATF_TP_ADD_TC(tp, fchown_success);
574*5c9a4738SAlan Somers 	ATF_TP_ADD_TC(tp, fchown_failure);
575*5c9a4738SAlan Somers 	ATF_TP_ADD_TC(tp, lchown_success);
576*5c9a4738SAlan Somers 	ATF_TP_ADD_TC(tp, lchown_failure);
577*5c9a4738SAlan Somers 	ATF_TP_ADD_TC(tp, fchownat_success);
578*5c9a4738SAlan Somers 	ATF_TP_ADD_TC(tp, fchownat_failure);
579*5c9a4738SAlan Somers 
5806d203d2dSAlan Somers 	return (atf_no_error());
5816d203d2dSAlan Somers }
582