xref: /freebsd/tests/sys/audit/process-control.c (revision b3e7694832e81d7a904a10f525f8797b753bf0d3)
1c907f24eSAlan Somers /*-
2c907f24eSAlan Somers  * Copyright (c) 2018 Aniket Pandey
3c907f24eSAlan Somers  *
4c907f24eSAlan Somers  * Redistribution and use in source and binary forms, with or without
5c907f24eSAlan Somers  * modification, are permitted provided that the following conditions
6c907f24eSAlan Somers  * are met:
7c907f24eSAlan Somers  * 1. Redistributions of source code must retain the above copyright
8c907f24eSAlan Somers  *    notice, this list of conditions and the following disclaimer.
9c907f24eSAlan Somers  * 2. Redistributions in binary form must reproduce the above copyright
10c907f24eSAlan Somers  *    notice, this list of conditions and the following disclaimer in the
11c907f24eSAlan Somers  *    documentation and/or other materials provided with the distribution.
12c907f24eSAlan Somers  *
13c907f24eSAlan Somers  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14c907f24eSAlan Somers  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15c907f24eSAlan Somers  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16c907f24eSAlan Somers  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17c907f24eSAlan Somers  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18c907f24eSAlan Somers  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19c907f24eSAlan Somers  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
20c907f24eSAlan Somers  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21c907f24eSAlan Somers  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22c907f24eSAlan Somers  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23c907f24eSAlan Somers  * SUCH DAMAGE.
24c907f24eSAlan Somers  */
25c907f24eSAlan Somers 
26c907f24eSAlan Somers #include <sys/param.h>
27405f0931SAlan Somers #include <sys/capsicum.h>
28c907f24eSAlan Somers #include <sys/uio.h>
29c907f24eSAlan Somers #include <sys/ktrace.h>
30c907f24eSAlan Somers #include <sys/mman.h>
31b1b5f04dSAlan Somers #include <sys/procctl.h>
32c907f24eSAlan Somers #include <sys/ptrace.h>
33c907f24eSAlan Somers #include <sys/resource.h>
34c907f24eSAlan Somers #include <sys/rtprio.h>
35c907f24eSAlan Somers #include <sys/stat.h>
36405f0931SAlan Somers #include <sys/sysctl.h>
37c907f24eSAlan Somers #include <sys/time.h>
38c907f24eSAlan Somers #include <sys/wait.h>
39c907f24eSAlan Somers 
40c907f24eSAlan Somers #include <atf-c.h>
41c907f24eSAlan Somers #include <fcntl.h>
4218ba95c2SAlan Somers #include <signal.h>
43c907f24eSAlan Somers #include <stdint.h>
44c907f24eSAlan Somers #include <stdlib.h>
45c907f24eSAlan Somers #include <unistd.h>
46c907f24eSAlan Somers 
47c907f24eSAlan Somers #include "utils.h"
48c907f24eSAlan Somers 
49*8f462da4SOlivier Cochard #include "freebsd_test_suite/macros.h"
50*8f462da4SOlivier Cochard 
51c907f24eSAlan Somers static pid_t pid;
52c907f24eSAlan Somers static int filedesc, status;
53c907f24eSAlan Somers static struct pollfd fds[1];
54c907f24eSAlan Somers static char pcregex[80];
55c907f24eSAlan Somers static const char *auclass = "pc";
56c907f24eSAlan Somers 
57c907f24eSAlan Somers 
58c907f24eSAlan Somers ATF_TC_WITH_CLEANUP(fork_success);
ATF_TC_HEAD(fork_success,tc)59c907f24eSAlan Somers ATF_TC_HEAD(fork_success, tc)
60c907f24eSAlan Somers {
61c907f24eSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
62c907f24eSAlan Somers 					"fork(2) call");
63c907f24eSAlan Somers }
64c907f24eSAlan Somers 
ATF_TC_BODY(fork_success,tc)65c907f24eSAlan Somers ATF_TC_BODY(fork_success, tc)
66c907f24eSAlan Somers {
67c907f24eSAlan Somers 	pid = getpid();
68c907f24eSAlan Somers 	snprintf(pcregex, sizeof(pcregex), "fork.*%d.*return,success", pid);
69c907f24eSAlan Somers 
70c907f24eSAlan Somers 	FILE *pipefd = setup(fds, auclass);
71c907f24eSAlan Somers 	/* Check if fork(2) succeded. If so, exit from the child process */
72c907f24eSAlan Somers 	ATF_REQUIRE((pid = fork()) != -1);
73c907f24eSAlan Somers 	if (pid)
74c907f24eSAlan Somers 		check_audit(fds, pcregex, pipefd);
75c907f24eSAlan Somers 	else
76c907f24eSAlan Somers 		_exit(0);
77c907f24eSAlan Somers }
78c907f24eSAlan Somers 
ATF_TC_CLEANUP(fork_success,tc)79c907f24eSAlan Somers ATF_TC_CLEANUP(fork_success, tc)
80c907f24eSAlan Somers {
81c907f24eSAlan Somers 	cleanup();
82c907f24eSAlan Somers }
83c907f24eSAlan Somers 
84c907f24eSAlan Somers /*
85c907f24eSAlan Somers  * No fork(2) in failure mode since possibilities for failure are only when
86c907f24eSAlan Somers  * user is not privileged or when the number of processes exceed KERN_MAXPROC.
87c907f24eSAlan Somers  */
88c907f24eSAlan Somers 
89c907f24eSAlan Somers 
90405f0931SAlan Somers ATF_TC_WITH_CLEANUP(_exit_success);
ATF_TC_HEAD(_exit_success,tc)91405f0931SAlan Somers ATF_TC_HEAD(_exit_success, tc)
92405f0931SAlan Somers {
93405f0931SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
94405f0931SAlan Somers 					"_exit(2) call");
95405f0931SAlan Somers }
96405f0931SAlan Somers 
ATF_TC_BODY(_exit_success,tc)97405f0931SAlan Somers ATF_TC_BODY(_exit_success, tc)
98405f0931SAlan Somers {
99405f0931SAlan Somers 	FILE *pipefd = setup(fds, auclass);
100405f0931SAlan Somers 	ATF_REQUIRE((pid = fork()) != -1);
101405f0931SAlan Somers 	if (pid) {
102405f0931SAlan Somers 		snprintf(pcregex, sizeof(pcregex), "exit.*%d.*success", pid);
103405f0931SAlan Somers 		check_audit(fds, pcregex, pipefd);
104405f0931SAlan Somers 	}
105405f0931SAlan Somers 	else
106405f0931SAlan Somers 		_exit(0);
107405f0931SAlan Somers }
108405f0931SAlan Somers 
ATF_TC_CLEANUP(_exit_success,tc)109405f0931SAlan Somers ATF_TC_CLEANUP(_exit_success, tc)
110405f0931SAlan Somers {
111405f0931SAlan Somers 	cleanup();
112405f0931SAlan Somers }
113405f0931SAlan Somers 
114405f0931SAlan Somers /*
115405f0931SAlan Somers  * _exit(2) never returns, hence the auditing by default is always successful
116405f0931SAlan Somers  */
117405f0931SAlan Somers 
118405f0931SAlan Somers 
119c907f24eSAlan Somers ATF_TC_WITH_CLEANUP(rfork_success);
ATF_TC_HEAD(rfork_success,tc)120c907f24eSAlan Somers ATF_TC_HEAD(rfork_success, tc)
121c907f24eSAlan Somers {
122c907f24eSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
123c907f24eSAlan Somers 					"rfork(2) call");
124c907f24eSAlan Somers }
125c907f24eSAlan Somers 
ATF_TC_BODY(rfork_success,tc)126c907f24eSAlan Somers ATF_TC_BODY(rfork_success, tc)
127c907f24eSAlan Somers {
128c907f24eSAlan Somers 	pid = getpid();
129c907f24eSAlan Somers 	snprintf(pcregex, sizeof(pcregex), "rfork.*%d.*return,success", pid);
130c907f24eSAlan Somers 
131c907f24eSAlan Somers 	FILE *pipefd = setup(fds, auclass);
132c907f24eSAlan Somers 	ATF_REQUIRE((pid = rfork(RFPROC)) != -1);
133c907f24eSAlan Somers 	if (pid)
134c907f24eSAlan Somers 		check_audit(fds, pcregex, pipefd);
135c907f24eSAlan Somers 	else
136c907f24eSAlan Somers 		_exit(0);
137c907f24eSAlan Somers }
138c907f24eSAlan Somers 
ATF_TC_CLEANUP(rfork_success,tc)139c907f24eSAlan Somers ATF_TC_CLEANUP(rfork_success, tc)
140c907f24eSAlan Somers {
141c907f24eSAlan Somers 	cleanup();
142c907f24eSAlan Somers }
143c907f24eSAlan Somers 
144c907f24eSAlan Somers 
145c907f24eSAlan Somers ATF_TC_WITH_CLEANUP(rfork_failure);
ATF_TC_HEAD(rfork_failure,tc)146c907f24eSAlan Somers ATF_TC_HEAD(rfork_failure, tc)
147c907f24eSAlan Somers {
148c907f24eSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
149c907f24eSAlan Somers 					"rfork(2) call");
150c907f24eSAlan Somers }
151c907f24eSAlan Somers 
ATF_TC_BODY(rfork_failure,tc)152c907f24eSAlan Somers ATF_TC_BODY(rfork_failure, tc)
153c907f24eSAlan Somers {
154c907f24eSAlan Somers 	pid = getpid();
155c907f24eSAlan Somers 	snprintf(pcregex, sizeof(pcregex), "rfork.*%d.*return,failure", pid);
156c907f24eSAlan Somers 
157c907f24eSAlan Somers 	FILE *pipefd = setup(fds, auclass);
158c907f24eSAlan Somers 	/* Failure reason: Invalid argument */
159c907f24eSAlan Somers 	ATF_REQUIRE_EQ(-1, rfork(-1));
160c907f24eSAlan Somers 	check_audit(fds, pcregex, pipefd);
161c907f24eSAlan Somers }
162c907f24eSAlan Somers 
ATF_TC_CLEANUP(rfork_failure,tc)163c907f24eSAlan Somers ATF_TC_CLEANUP(rfork_failure, tc)
164c907f24eSAlan Somers {
165c907f24eSAlan Somers 	cleanup();
166c907f24eSAlan Somers }
167c907f24eSAlan Somers 
168c907f24eSAlan Somers 
16918ba95c2SAlan Somers ATF_TC_WITH_CLEANUP(wait4_success);
ATF_TC_HEAD(wait4_success,tc)17018ba95c2SAlan Somers ATF_TC_HEAD(wait4_success, tc)
17118ba95c2SAlan Somers {
17218ba95c2SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
17318ba95c2SAlan Somers 					"wait4(2) call");
17418ba95c2SAlan Somers }
17518ba95c2SAlan Somers 
ATF_TC_BODY(wait4_success,tc)17618ba95c2SAlan Somers ATF_TC_BODY(wait4_success, tc)
17718ba95c2SAlan Somers {
17818ba95c2SAlan Somers 	pid = getpid();
17918ba95c2SAlan Somers 	snprintf(pcregex, sizeof(pcregex), "wait4.*%d.*return,success", pid);
18018ba95c2SAlan Somers 
18118ba95c2SAlan Somers 	ATF_REQUIRE((pid = fork()) != -1);
18218ba95c2SAlan Somers 	if (pid) {
18318ba95c2SAlan Somers 		FILE *pipefd = setup(fds, auclass);
18418ba95c2SAlan Somers 		/* wpid = -1 : Wait for any child process */
18518ba95c2SAlan Somers 		ATF_REQUIRE(wait4(-1, &status, 0, NULL) != -1);
18618ba95c2SAlan Somers 		check_audit(fds, pcregex, pipefd);
18718ba95c2SAlan Somers 	}
18818ba95c2SAlan Somers 	else
18918ba95c2SAlan Somers 		_exit(0);
19018ba95c2SAlan Somers }
19118ba95c2SAlan Somers 
ATF_TC_CLEANUP(wait4_success,tc)19218ba95c2SAlan Somers ATF_TC_CLEANUP(wait4_success, tc)
19318ba95c2SAlan Somers {
19418ba95c2SAlan Somers 	cleanup();
19518ba95c2SAlan Somers }
19618ba95c2SAlan Somers 
19718ba95c2SAlan Somers 
19818ba95c2SAlan Somers ATF_TC_WITH_CLEANUP(wait4_failure);
ATF_TC_HEAD(wait4_failure,tc)19918ba95c2SAlan Somers ATF_TC_HEAD(wait4_failure, tc)
20018ba95c2SAlan Somers {
20118ba95c2SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
20218ba95c2SAlan Somers 					"wait4(2) call");
20318ba95c2SAlan Somers }
20418ba95c2SAlan Somers 
ATF_TC_BODY(wait4_failure,tc)20518ba95c2SAlan Somers ATF_TC_BODY(wait4_failure, tc)
20618ba95c2SAlan Somers {
20718ba95c2SAlan Somers 	pid = getpid();
20818ba95c2SAlan Somers 	snprintf(pcregex, sizeof(pcregex), "wait4.*%d.*return,failure", pid);
20918ba95c2SAlan Somers 
21018ba95c2SAlan Somers 	FILE *pipefd = setup(fds, auclass);
21118ba95c2SAlan Somers 	/* Failure reason: No child process to wait for */
21218ba95c2SAlan Somers 	ATF_REQUIRE_EQ(-1, wait4(-1, NULL, 0, NULL));
21318ba95c2SAlan Somers 	check_audit(fds, pcregex, pipefd);
21418ba95c2SAlan Somers }
21518ba95c2SAlan Somers 
ATF_TC_CLEANUP(wait4_failure,tc)21618ba95c2SAlan Somers ATF_TC_CLEANUP(wait4_failure, tc)
21718ba95c2SAlan Somers {
21818ba95c2SAlan Somers 	cleanup();
21918ba95c2SAlan Somers }
22018ba95c2SAlan Somers 
22118ba95c2SAlan Somers 
22218ba95c2SAlan Somers ATF_TC_WITH_CLEANUP(wait6_success);
ATF_TC_HEAD(wait6_success,tc)22318ba95c2SAlan Somers ATF_TC_HEAD(wait6_success, tc)
22418ba95c2SAlan Somers {
22518ba95c2SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
22618ba95c2SAlan Somers 					"wait6(2) call");
22718ba95c2SAlan Somers }
22818ba95c2SAlan Somers 
ATF_TC_BODY(wait6_success,tc)22918ba95c2SAlan Somers ATF_TC_BODY(wait6_success, tc)
23018ba95c2SAlan Somers {
23118ba95c2SAlan Somers 	pid = getpid();
23218ba95c2SAlan Somers 	snprintf(pcregex, sizeof(pcregex), "wait6.*%d.*return,success", pid);
23318ba95c2SAlan Somers 
23418ba95c2SAlan Somers 	ATF_REQUIRE((pid = fork()) != -1);
23518ba95c2SAlan Somers 	if (pid) {
23618ba95c2SAlan Somers 		FILE *pipefd = setup(fds, auclass);
23718ba95c2SAlan Somers 		ATF_REQUIRE(wait6(P_ALL, 0, &status, WEXITED, NULL,NULL) != -1);
23818ba95c2SAlan Somers 		check_audit(fds, pcregex, pipefd);
23918ba95c2SAlan Somers 	}
24018ba95c2SAlan Somers 	else
24118ba95c2SAlan Somers 		_exit(0);
24218ba95c2SAlan Somers }
24318ba95c2SAlan Somers 
ATF_TC_CLEANUP(wait6_success,tc)24418ba95c2SAlan Somers ATF_TC_CLEANUP(wait6_success, tc)
24518ba95c2SAlan Somers {
24618ba95c2SAlan Somers 	cleanup();
24718ba95c2SAlan Somers }
24818ba95c2SAlan Somers 
24918ba95c2SAlan Somers 
25018ba95c2SAlan Somers ATF_TC_WITH_CLEANUP(wait6_failure);
ATF_TC_HEAD(wait6_failure,tc)25118ba95c2SAlan Somers ATF_TC_HEAD(wait6_failure, tc)
25218ba95c2SAlan Somers {
25318ba95c2SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
25418ba95c2SAlan Somers 					"wait6(2) call");
25518ba95c2SAlan Somers }
25618ba95c2SAlan Somers 
ATF_TC_BODY(wait6_failure,tc)25718ba95c2SAlan Somers ATF_TC_BODY(wait6_failure, tc)
25818ba95c2SAlan Somers {
25918ba95c2SAlan Somers 	pid = getpid();
26018ba95c2SAlan Somers 	snprintf(pcregex, sizeof(pcregex), "wait6.*%d.*return,failure", pid);
26118ba95c2SAlan Somers 
26218ba95c2SAlan Somers 	FILE *pipefd = setup(fds, auclass);
26318ba95c2SAlan Somers 	/* Failure reason: Invalid argument */
26418ba95c2SAlan Somers 	ATF_REQUIRE_EQ(-1, wait6(0, 0, NULL, 0, NULL, NULL));
26518ba95c2SAlan Somers 	check_audit(fds, pcregex, pipefd);
26618ba95c2SAlan Somers }
26718ba95c2SAlan Somers 
ATF_TC_CLEANUP(wait6_failure,tc)26818ba95c2SAlan Somers ATF_TC_CLEANUP(wait6_failure, tc)
26918ba95c2SAlan Somers {
27018ba95c2SAlan Somers 	cleanup();
27118ba95c2SAlan Somers }
27218ba95c2SAlan Somers 
27318ba95c2SAlan Somers 
27418ba95c2SAlan Somers ATF_TC_WITH_CLEANUP(kill_success);
ATF_TC_HEAD(kill_success,tc)27518ba95c2SAlan Somers ATF_TC_HEAD(kill_success, tc)
27618ba95c2SAlan Somers {
27718ba95c2SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
27818ba95c2SAlan Somers 					"kill(2) call");
27918ba95c2SAlan Somers }
28018ba95c2SAlan Somers 
ATF_TC_BODY(kill_success,tc)28118ba95c2SAlan Somers ATF_TC_BODY(kill_success, tc)
28218ba95c2SAlan Somers {
28318ba95c2SAlan Somers 	pid = getpid();
28418ba95c2SAlan Somers 	snprintf(pcregex, sizeof(pcregex), "kill.*%d.*return,success", pid);
28518ba95c2SAlan Somers 
28618ba95c2SAlan Somers 	FILE *pipefd = setup(fds, auclass);
28718ba95c2SAlan Somers 	/* Don't send any signal to anyone, live in peace! */
28818ba95c2SAlan Somers 	ATF_REQUIRE_EQ(0, kill(0, 0));
28918ba95c2SAlan Somers 	check_audit(fds, pcregex, pipefd);
29018ba95c2SAlan Somers }
29118ba95c2SAlan Somers 
ATF_TC_CLEANUP(kill_success,tc)29218ba95c2SAlan Somers ATF_TC_CLEANUP(kill_success, tc)
29318ba95c2SAlan Somers {
29418ba95c2SAlan Somers 	cleanup();
29518ba95c2SAlan Somers }
29618ba95c2SAlan Somers 
29718ba95c2SAlan Somers 
29818ba95c2SAlan Somers ATF_TC_WITH_CLEANUP(kill_failure);
ATF_TC_HEAD(kill_failure,tc)29918ba95c2SAlan Somers ATF_TC_HEAD(kill_failure, tc)
30018ba95c2SAlan Somers {
30118ba95c2SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
30218ba95c2SAlan Somers 					"kill(2) call");
30318ba95c2SAlan Somers }
30418ba95c2SAlan Somers 
ATF_TC_BODY(kill_failure,tc)30518ba95c2SAlan Somers ATF_TC_BODY(kill_failure, tc)
30618ba95c2SAlan Somers {
30718ba95c2SAlan Somers 	pid = getpid();
30818ba95c2SAlan Somers 	snprintf(pcregex, sizeof(pcregex), "kill.*%d.*return,failure", pid);
30918ba95c2SAlan Somers 
31018ba95c2SAlan Somers 	FILE *pipefd = setup(fds, auclass);
31118ba95c2SAlan Somers 	/*
31218ba95c2SAlan Somers 	 * Failure reason: Non existent process with PID '-2'
31318ba95c2SAlan Somers 	 * Note: '-1' is not used as it means sending no signal to
31418ba95c2SAlan Somers 	 * all non-system processes: A successful invocation
31518ba95c2SAlan Somers 	 */
31618ba95c2SAlan Somers 	ATF_REQUIRE_EQ(-1, kill(0, -2));
31718ba95c2SAlan Somers 	check_audit(fds, pcregex, pipefd);
31818ba95c2SAlan Somers }
31918ba95c2SAlan Somers 
ATF_TC_CLEANUP(kill_failure,tc)32018ba95c2SAlan Somers ATF_TC_CLEANUP(kill_failure, tc)
32118ba95c2SAlan Somers {
32218ba95c2SAlan Somers 	cleanup();
32318ba95c2SAlan Somers }
32418ba95c2SAlan Somers 
32518ba95c2SAlan Somers 
326c907f24eSAlan Somers ATF_TC_WITH_CLEANUP(chdir_success);
ATF_TC_HEAD(chdir_success,tc)327c907f24eSAlan Somers ATF_TC_HEAD(chdir_success, tc)
328c907f24eSAlan Somers {
329c907f24eSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
330c907f24eSAlan Somers 					"chdir(2) call");
331c907f24eSAlan Somers }
332c907f24eSAlan Somers 
ATF_TC_BODY(chdir_success,tc)333c907f24eSAlan Somers ATF_TC_BODY(chdir_success, tc)
334c907f24eSAlan Somers {
335c907f24eSAlan Somers 	pid = getpid();
336c907f24eSAlan Somers 	snprintf(pcregex, sizeof(pcregex), "chdir.*/.*%d.*return,success", pid);
337c907f24eSAlan Somers 
338c907f24eSAlan Somers 	FILE *pipefd = setup(fds, auclass);
339c907f24eSAlan Somers 	ATF_REQUIRE_EQ(0, chdir("/"));
340c907f24eSAlan Somers 	check_audit(fds, pcregex, pipefd);
341c907f24eSAlan Somers }
342c907f24eSAlan Somers 
ATF_TC_CLEANUP(chdir_success,tc)343c907f24eSAlan Somers ATF_TC_CLEANUP(chdir_success, tc)
344c907f24eSAlan Somers {
345c907f24eSAlan Somers 	cleanup();
346c907f24eSAlan Somers }
347c907f24eSAlan Somers 
348c907f24eSAlan Somers 
349c907f24eSAlan Somers ATF_TC_WITH_CLEANUP(chdir_failure);
ATF_TC_HEAD(chdir_failure,tc)350c907f24eSAlan Somers ATF_TC_HEAD(chdir_failure, tc)
351c907f24eSAlan Somers {
352c907f24eSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
353c907f24eSAlan Somers 					"chdir(2) call");
354c907f24eSAlan Somers }
355c907f24eSAlan Somers 
ATF_TC_BODY(chdir_failure,tc)356c907f24eSAlan Somers ATF_TC_BODY(chdir_failure, tc)
357c907f24eSAlan Somers {
358c907f24eSAlan Somers 	pid = getpid();
359c907f24eSAlan Somers 	snprintf(pcregex, sizeof(pcregex), "chdir.*%d.*return,failure", pid);
360c907f24eSAlan Somers 
361c907f24eSAlan Somers 	FILE *pipefd = setup(fds, auclass);
362c907f24eSAlan Somers 	/* Failure reason: Bad address */
363c907f24eSAlan Somers 	ATF_REQUIRE_EQ(-1, chdir(NULL));
364c907f24eSAlan Somers 	check_audit(fds, pcregex, pipefd);
365c907f24eSAlan Somers }
366c907f24eSAlan Somers 
ATF_TC_CLEANUP(chdir_failure,tc)367c907f24eSAlan Somers ATF_TC_CLEANUP(chdir_failure, tc)
368c907f24eSAlan Somers {
369c907f24eSAlan Somers 	cleanup();
370c907f24eSAlan Somers }
371c907f24eSAlan Somers 
372c907f24eSAlan Somers 
373c907f24eSAlan Somers ATF_TC_WITH_CLEANUP(fchdir_success);
ATF_TC_HEAD(fchdir_success,tc)374c907f24eSAlan Somers ATF_TC_HEAD(fchdir_success, tc)
375c907f24eSAlan Somers {
376c907f24eSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
377c907f24eSAlan Somers 					"fchdir(2) call");
378c907f24eSAlan Somers }
379c907f24eSAlan Somers 
ATF_TC_BODY(fchdir_success,tc)380c907f24eSAlan Somers ATF_TC_BODY(fchdir_success, tc)
381c907f24eSAlan Somers {
382c907f24eSAlan Somers 	/* Build an absolute path to the test-case directory */
383c907f24eSAlan Somers 	char dirpath[50];
384c907f24eSAlan Somers 	ATF_REQUIRE(getcwd(dirpath, sizeof(dirpath)) != NULL);
385c907f24eSAlan Somers 	ATF_REQUIRE((filedesc = open(dirpath, O_RDONLY)) != -1);
386c907f24eSAlan Somers 
387c907f24eSAlan Somers 	/* Audit record generated by fchdir(2) does not contain filedesc */
388c907f24eSAlan Somers 	pid = getpid();
389c907f24eSAlan Somers 	snprintf(pcregex, sizeof(pcregex), "fchdir.*%d.*return,success", pid);
390c907f24eSAlan Somers 
391c907f24eSAlan Somers 	FILE *pipefd = setup(fds, auclass);
392c907f24eSAlan Somers 	ATF_REQUIRE_EQ(0, fchdir(filedesc));
393c907f24eSAlan Somers 	check_audit(fds, pcregex, pipefd);
394c907f24eSAlan Somers 	close(filedesc);
395c907f24eSAlan Somers }
396c907f24eSAlan Somers 
ATF_TC_CLEANUP(fchdir_success,tc)397c907f24eSAlan Somers ATF_TC_CLEANUP(fchdir_success, tc)
398c907f24eSAlan Somers {
399c907f24eSAlan Somers 	cleanup();
400c907f24eSAlan Somers }
401c907f24eSAlan Somers 
402c907f24eSAlan Somers 
403c907f24eSAlan Somers ATF_TC_WITH_CLEANUP(fchdir_failure);
ATF_TC_HEAD(fchdir_failure,tc)404c907f24eSAlan Somers ATF_TC_HEAD(fchdir_failure, tc)
405c907f24eSAlan Somers {
406c907f24eSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
407c907f24eSAlan Somers 					"fchdir(2) call");
408c907f24eSAlan Somers }
409c907f24eSAlan Somers 
ATF_TC_BODY(fchdir_failure,tc)410c907f24eSAlan Somers ATF_TC_BODY(fchdir_failure, tc)
411c907f24eSAlan Somers {
412c907f24eSAlan Somers 	pid = getpid();
413c907f24eSAlan Somers 	snprintf(pcregex, sizeof(pcregex), "fchdir.*%d.*return,failure", pid);
414c907f24eSAlan Somers 
415c907f24eSAlan Somers 	FILE *pipefd = setup(fds, auclass);
416c907f24eSAlan Somers 	/* Failure reason: Bad directory address */
417c907f24eSAlan Somers 	ATF_REQUIRE_EQ(-1, fchdir(-1));
418c907f24eSAlan Somers 	check_audit(fds, pcregex, pipefd);
419c907f24eSAlan Somers }
420c907f24eSAlan Somers 
ATF_TC_CLEANUP(fchdir_failure,tc)421c907f24eSAlan Somers ATF_TC_CLEANUP(fchdir_failure, tc)
422c907f24eSAlan Somers {
423c907f24eSAlan Somers 	cleanup();
424c907f24eSAlan Somers }
425c907f24eSAlan Somers 
426c907f24eSAlan Somers 
427c907f24eSAlan Somers ATF_TC_WITH_CLEANUP(chroot_success);
ATF_TC_HEAD(chroot_success,tc)428c907f24eSAlan Somers ATF_TC_HEAD(chroot_success, tc)
429c907f24eSAlan Somers {
430c907f24eSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
431c907f24eSAlan Somers 					"chroot(2) call");
432c907f24eSAlan Somers }
433c907f24eSAlan Somers 
ATF_TC_BODY(chroot_success,tc)434c907f24eSAlan Somers ATF_TC_BODY(chroot_success, tc)
435c907f24eSAlan Somers {
436c907f24eSAlan Somers 	pid = getpid();
437c907f24eSAlan Somers 	snprintf(pcregex, sizeof(pcregex), "chroot.*%d.*return,success", pid);
438c907f24eSAlan Somers 
439c907f24eSAlan Somers 	FILE *pipefd = setup(fds, auclass);
440c907f24eSAlan Somers 	/* We don't want to change the root directory, hence '/' */
441c907f24eSAlan Somers 	ATF_REQUIRE_EQ(0, chroot("/"));
442c907f24eSAlan Somers 	check_audit(fds, pcregex, pipefd);
443c907f24eSAlan Somers }
444c907f24eSAlan Somers 
ATF_TC_CLEANUP(chroot_success,tc)445c907f24eSAlan Somers ATF_TC_CLEANUP(chroot_success, tc)
446c907f24eSAlan Somers {
447c907f24eSAlan Somers 	cleanup();
448c907f24eSAlan Somers }
449c907f24eSAlan Somers 
450c907f24eSAlan Somers 
451c907f24eSAlan Somers ATF_TC_WITH_CLEANUP(chroot_failure);
ATF_TC_HEAD(chroot_failure,tc)452c907f24eSAlan Somers ATF_TC_HEAD(chroot_failure, tc)
453c907f24eSAlan Somers {
454c907f24eSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
455c907f24eSAlan Somers 					"chroot(2) call");
456c907f24eSAlan Somers }
457c907f24eSAlan Somers 
ATF_TC_BODY(chroot_failure,tc)458c907f24eSAlan Somers ATF_TC_BODY(chroot_failure, tc)
459c907f24eSAlan Somers {
460c907f24eSAlan Somers 	pid = getpid();
461c907f24eSAlan Somers 	snprintf(pcregex, sizeof(pcregex), "chroot.*%d.*return,failure", pid);
462c907f24eSAlan Somers 
463c907f24eSAlan Somers 	FILE *pipefd = setup(fds, auclass);
464c907f24eSAlan Somers 	ATF_REQUIRE_EQ(-1, chroot(NULL));
465c907f24eSAlan Somers 	check_audit(fds, pcregex, pipefd);
466c907f24eSAlan Somers }
467c907f24eSAlan Somers 
ATF_TC_CLEANUP(chroot_failure,tc)468c907f24eSAlan Somers ATF_TC_CLEANUP(chroot_failure, tc)
469c907f24eSAlan Somers {
470c907f24eSAlan Somers 	cleanup();
471c907f24eSAlan Somers }
472c907f24eSAlan Somers 
473c907f24eSAlan Somers 
474c907f24eSAlan Somers ATF_TC_WITH_CLEANUP(umask_success);
ATF_TC_HEAD(umask_success,tc)475c907f24eSAlan Somers ATF_TC_HEAD(umask_success, tc)
476c907f24eSAlan Somers {
477c907f24eSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
478c907f24eSAlan Somers 					"umask(2) call");
479c907f24eSAlan Somers }
480c907f24eSAlan Somers 
ATF_TC_BODY(umask_success,tc)481c907f24eSAlan Somers ATF_TC_BODY(umask_success, tc)
482c907f24eSAlan Somers {
483c907f24eSAlan Somers 	pid = getpid();
484c907f24eSAlan Somers 	snprintf(pcregex, sizeof(pcregex), "umask.*%d.*return,success", pid);
485c907f24eSAlan Somers 
486c907f24eSAlan Somers 	FILE *pipefd = setup(fds, auclass);
487c907f24eSAlan Somers 	umask(0);
488c907f24eSAlan Somers 	check_audit(fds, pcregex, pipefd);
489c907f24eSAlan Somers }
490c907f24eSAlan Somers 
ATF_TC_CLEANUP(umask_success,tc)491c907f24eSAlan Somers ATF_TC_CLEANUP(umask_success, tc)
492c907f24eSAlan Somers {
493c907f24eSAlan Somers 	cleanup();
494c907f24eSAlan Somers }
495c907f24eSAlan Somers 
496c907f24eSAlan Somers /*
497c907f24eSAlan Somers  * umask(2) system call never fails. Hence, no test case for failure mode
498c907f24eSAlan Somers  */
499c907f24eSAlan Somers 
500c907f24eSAlan Somers 
501c907f24eSAlan Somers ATF_TC_WITH_CLEANUP(setuid_success);
ATF_TC_HEAD(setuid_success,tc)502c907f24eSAlan Somers ATF_TC_HEAD(setuid_success, tc)
503c907f24eSAlan Somers {
504c907f24eSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
505c907f24eSAlan Somers 					"setuid(2) call");
506c907f24eSAlan Somers }
507c907f24eSAlan Somers 
ATF_TC_BODY(setuid_success,tc)508c907f24eSAlan Somers ATF_TC_BODY(setuid_success, tc)
509c907f24eSAlan Somers {
510c907f24eSAlan Somers 	pid = getpid();
511c907f24eSAlan Somers 	snprintf(pcregex, sizeof(pcregex), "setuid.*%d.*return,success", pid);
512c907f24eSAlan Somers 
513c907f24eSAlan Somers 	FILE *pipefd = setup(fds, auclass);
514c907f24eSAlan Somers 	/* Since we're privileged, we'll let ourselves be privileged! */
515c907f24eSAlan Somers 	ATF_REQUIRE_EQ(0, setuid(0));
516c907f24eSAlan Somers 	check_audit(fds, pcregex, pipefd);
517c907f24eSAlan Somers }
518c907f24eSAlan Somers 
ATF_TC_CLEANUP(setuid_success,tc)519c907f24eSAlan Somers ATF_TC_CLEANUP(setuid_success, tc)
520c907f24eSAlan Somers {
521c907f24eSAlan Somers 	cleanup();
522c907f24eSAlan Somers }
523c907f24eSAlan Somers 
524c907f24eSAlan Somers /*
525c907f24eSAlan Somers  * setuid(2) fails only when the current user is not root. So no test case for
526c907f24eSAlan Somers  * failure mode since the required_user="root"
527c907f24eSAlan Somers  */
528c907f24eSAlan Somers 
529c907f24eSAlan Somers 
530c907f24eSAlan Somers ATF_TC_WITH_CLEANUP(seteuid_success);
ATF_TC_HEAD(seteuid_success,tc)531c907f24eSAlan Somers ATF_TC_HEAD(seteuid_success, tc)
532c907f24eSAlan Somers {
533c907f24eSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
534c907f24eSAlan Somers 					"seteuid(2) call");
535c907f24eSAlan Somers }
536c907f24eSAlan Somers 
ATF_TC_BODY(seteuid_success,tc)537c907f24eSAlan Somers ATF_TC_BODY(seteuid_success, tc)
538c907f24eSAlan Somers {
539c907f24eSAlan Somers 	pid = getpid();
540c907f24eSAlan Somers 	snprintf(pcregex, sizeof(pcregex), "seteuid.*%d.*return,success", pid);
541c907f24eSAlan Somers 
542c907f24eSAlan Somers 	FILE *pipefd = setup(fds, auclass);
543c907f24eSAlan Somers 	/* This time, we'll let ourselves be 'effectively' privileged! */
544c907f24eSAlan Somers 	ATF_REQUIRE_EQ(0, seteuid(0));
545c907f24eSAlan Somers 	check_audit(fds, pcregex, pipefd);
546c907f24eSAlan Somers }
547c907f24eSAlan Somers 
ATF_TC_CLEANUP(seteuid_success,tc)548c907f24eSAlan Somers ATF_TC_CLEANUP(seteuid_success, tc)
549c907f24eSAlan Somers {
550c907f24eSAlan Somers 	cleanup();
551c907f24eSAlan Somers }
552c907f24eSAlan Somers 
553c907f24eSAlan Somers /*
554c907f24eSAlan Somers  * seteuid(2) fails only when the current user is not root. So no test case for
555c907f24eSAlan Somers  * failure mode since the required_user="root"
556c907f24eSAlan Somers  */
557c907f24eSAlan Somers 
558c907f24eSAlan Somers 
559c907f24eSAlan Somers ATF_TC_WITH_CLEANUP(setgid_success);
ATF_TC_HEAD(setgid_success,tc)560c907f24eSAlan Somers ATF_TC_HEAD(setgid_success, tc)
561c907f24eSAlan Somers {
562c907f24eSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
563c907f24eSAlan Somers 					"setgid(2) call");
564c907f24eSAlan Somers }
565c907f24eSAlan Somers 
ATF_TC_BODY(setgid_success,tc)566c907f24eSAlan Somers ATF_TC_BODY(setgid_success, tc)
567c907f24eSAlan Somers {
568c907f24eSAlan Somers 	pid = getpid();
569c907f24eSAlan Somers 	snprintf(pcregex, sizeof(pcregex), "setgid.*%d.*return,success", pid);
570c907f24eSAlan Somers 
571c907f24eSAlan Somers 	FILE *pipefd = setup(fds, auclass);
572c907f24eSAlan Somers 	ATF_REQUIRE_EQ(0, setgid(0));
573c907f24eSAlan Somers 	check_audit(fds, pcregex, pipefd);
574c907f24eSAlan Somers }
575c907f24eSAlan Somers 
ATF_TC_CLEANUP(setgid_success,tc)576c907f24eSAlan Somers ATF_TC_CLEANUP(setgid_success, tc)
577c907f24eSAlan Somers {
578c907f24eSAlan Somers 	cleanup();
579c907f24eSAlan Somers }
580c907f24eSAlan Somers 
581c907f24eSAlan Somers /*
582c907f24eSAlan Somers  * setgid(2) fails only when the current user is not root. So no test case for
583c907f24eSAlan Somers  * failure mode since the required_user="root"
584c907f24eSAlan Somers  */
585c907f24eSAlan Somers 
586c907f24eSAlan Somers 
587c907f24eSAlan Somers ATF_TC_WITH_CLEANUP(setegid_success);
ATF_TC_HEAD(setegid_success,tc)588c907f24eSAlan Somers ATF_TC_HEAD(setegid_success, tc)
589c907f24eSAlan Somers {
590c907f24eSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
591c907f24eSAlan Somers 					"setegid(2) call");
592c907f24eSAlan Somers }
593c907f24eSAlan Somers 
ATF_TC_BODY(setegid_success,tc)594c907f24eSAlan Somers ATF_TC_BODY(setegid_success, tc)
595c907f24eSAlan Somers {
596c907f24eSAlan Somers 	pid = getpid();
597c907f24eSAlan Somers 	snprintf(pcregex, sizeof(pcregex), "setegid.*%d.*return,success", pid);
598c907f24eSAlan Somers 
599c907f24eSAlan Somers 	FILE *pipefd = setup(fds, auclass);
600c907f24eSAlan Somers 	ATF_REQUIRE_EQ(0, setegid(0));
601c907f24eSAlan Somers 	check_audit(fds, pcregex, pipefd);
602c907f24eSAlan Somers }
603c907f24eSAlan Somers 
ATF_TC_CLEANUP(setegid_success,tc)604c907f24eSAlan Somers ATF_TC_CLEANUP(setegid_success, tc)
605c907f24eSAlan Somers {
606c907f24eSAlan Somers 	cleanup();
607c907f24eSAlan Somers }
608c907f24eSAlan Somers 
609c907f24eSAlan Somers /*
610c907f24eSAlan Somers  * setegid(2) fails only when the current user is not root. So no test case for
611c907f24eSAlan Somers  * failure mode since the required_user="root"
612c907f24eSAlan Somers  */
613c907f24eSAlan Somers 
614c907f24eSAlan Somers 
615c907f24eSAlan Somers ATF_TC_WITH_CLEANUP(setregid_success);
ATF_TC_HEAD(setregid_success,tc)616c907f24eSAlan Somers ATF_TC_HEAD(setregid_success, tc)
617c907f24eSAlan Somers {
618c907f24eSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
619c907f24eSAlan Somers 					"setregid(2) call");
620c907f24eSAlan Somers }
621c907f24eSAlan Somers 
ATF_TC_BODY(setregid_success,tc)622c907f24eSAlan Somers ATF_TC_BODY(setregid_success, tc)
623c907f24eSAlan Somers {
624c907f24eSAlan Somers 	pid = getpid();
625c907f24eSAlan Somers 	snprintf(pcregex, sizeof(pcregex), "setregid.*%d.*return,success", pid);
626c907f24eSAlan Somers 
627c907f24eSAlan Somers 	FILE *pipefd = setup(fds, auclass);
628c907f24eSAlan Somers 	/* setregid(-1, -1) does not change any real or effective GIDs */
629c907f24eSAlan Somers 	ATF_REQUIRE_EQ(0, setregid(-1, -1));
630c907f24eSAlan Somers 	check_audit(fds, pcregex, pipefd);
631c907f24eSAlan Somers }
632c907f24eSAlan Somers 
ATF_TC_CLEANUP(setregid_success,tc)633c907f24eSAlan Somers ATF_TC_CLEANUP(setregid_success, tc)
634c907f24eSAlan Somers {
635c907f24eSAlan Somers 	cleanup();
636c907f24eSAlan Somers }
637c907f24eSAlan Somers 
638c907f24eSAlan Somers /*
639c907f24eSAlan Somers  * setregid(2) fails only when the current user is not root. So no test case for
640c907f24eSAlan Somers  * failure mode since the required_user="root"
641c907f24eSAlan Somers  */
642c907f24eSAlan Somers 
643c907f24eSAlan Somers 
644c907f24eSAlan Somers ATF_TC_WITH_CLEANUP(setreuid_success);
ATF_TC_HEAD(setreuid_success,tc)645c907f24eSAlan Somers ATF_TC_HEAD(setreuid_success, tc)
646c907f24eSAlan Somers {
647c907f24eSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
648c907f24eSAlan Somers 					"setreuid(2) call");
649c907f24eSAlan Somers }
650c907f24eSAlan Somers 
ATF_TC_BODY(setreuid_success,tc)651c907f24eSAlan Somers ATF_TC_BODY(setreuid_success, tc)
652c907f24eSAlan Somers {
653c907f24eSAlan Somers 	pid = getpid();
654c907f24eSAlan Somers 	snprintf(pcregex, sizeof(pcregex), "setreuid.*%d.*return,success", pid);
655c907f24eSAlan Somers 
656c907f24eSAlan Somers 	FILE *pipefd = setup(fds, auclass);
657c907f24eSAlan Somers 	/* setreuid(-1, -1) does not change any real or effective UIDs */
658c907f24eSAlan Somers 	ATF_REQUIRE_EQ(0, setreuid(-1, -1));
659c907f24eSAlan Somers 	check_audit(fds, pcregex, pipefd);
660c907f24eSAlan Somers }
661c907f24eSAlan Somers 
ATF_TC_CLEANUP(setreuid_success,tc)662c907f24eSAlan Somers ATF_TC_CLEANUP(setreuid_success, tc)
663c907f24eSAlan Somers {
664c907f24eSAlan Somers 	cleanup();
665c907f24eSAlan Somers }
666c907f24eSAlan Somers 
667c907f24eSAlan Somers /*
668c907f24eSAlan Somers  * setregid(2) fails only when the current user is not root. So no test case for
669c907f24eSAlan Somers  * failure mode since the required_user="root"
670c907f24eSAlan Somers  */
671c907f24eSAlan Somers 
672c907f24eSAlan Somers 
673c907f24eSAlan Somers ATF_TC_WITH_CLEANUP(setresuid_success);
ATF_TC_HEAD(setresuid_success,tc)674c907f24eSAlan Somers ATF_TC_HEAD(setresuid_success, tc)
675c907f24eSAlan Somers {
676c907f24eSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
677c907f24eSAlan Somers 					"setresuid(2) call");
678c907f24eSAlan Somers }
679c907f24eSAlan Somers 
ATF_TC_BODY(setresuid_success,tc)680c907f24eSAlan Somers ATF_TC_BODY(setresuid_success, tc)
681c907f24eSAlan Somers {
682c907f24eSAlan Somers 	pid = getpid();
683c907f24eSAlan Somers 	snprintf(pcregex, sizeof(pcregex), "setresuid.*%d.*return,success", pid);
684c907f24eSAlan Somers 
685c907f24eSAlan Somers 	FILE *pipefd = setup(fds, auclass);
686c907f24eSAlan Somers 	/* setresuid(-1, -1, -1) does not change real, effective & saved UIDs */
687c907f24eSAlan Somers 	ATF_REQUIRE_EQ(0, setresuid(-1, -1, -1));
688c907f24eSAlan Somers 	check_audit(fds, pcregex, pipefd);
689c907f24eSAlan Somers }
690c907f24eSAlan Somers 
ATF_TC_CLEANUP(setresuid_success,tc)691c907f24eSAlan Somers ATF_TC_CLEANUP(setresuid_success, tc)
692c907f24eSAlan Somers {
693c907f24eSAlan Somers 	cleanup();
694c907f24eSAlan Somers }
695c907f24eSAlan Somers 
696c907f24eSAlan Somers /*
697c907f24eSAlan Somers  * setresuid(2) fails only when the current user is not root. So no test case
698c907f24eSAlan Somers  * for failure mode since the required_user="root"
699c907f24eSAlan Somers  */
700c907f24eSAlan Somers 
701c907f24eSAlan Somers 
702c907f24eSAlan Somers ATF_TC_WITH_CLEANUP(setresgid_success);
ATF_TC_HEAD(setresgid_success,tc)703c907f24eSAlan Somers ATF_TC_HEAD(setresgid_success, tc)
704c907f24eSAlan Somers {
705c907f24eSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
706c907f24eSAlan Somers 					"setresgid(2) call");
707c907f24eSAlan Somers }
708c907f24eSAlan Somers 
ATF_TC_BODY(setresgid_success,tc)709c907f24eSAlan Somers ATF_TC_BODY(setresgid_success, tc)
710c907f24eSAlan Somers {
711c907f24eSAlan Somers 	pid = getpid();
712c907f24eSAlan Somers 	snprintf(pcregex, sizeof(pcregex), "setresgid.*%d.*ret.*success", pid);
713c907f24eSAlan Somers 
714c907f24eSAlan Somers 	FILE *pipefd = setup(fds, auclass);
715c907f24eSAlan Somers 	/* setresgid(-1, -1, -1) does not change real, effective & saved GIDs */
716c907f24eSAlan Somers 	ATF_REQUIRE_EQ(0, setresgid(-1, -1, -1));
717c907f24eSAlan Somers 	check_audit(fds, pcregex, pipefd);
718c907f24eSAlan Somers }
719c907f24eSAlan Somers 
ATF_TC_CLEANUP(setresgid_success,tc)720c907f24eSAlan Somers ATF_TC_CLEANUP(setresgid_success, tc)
721c907f24eSAlan Somers {
722c907f24eSAlan Somers 	cleanup();
723c907f24eSAlan Somers }
724c907f24eSAlan Somers 
725c907f24eSAlan Somers /*
726c907f24eSAlan Somers  * setresgid(2) fails only when the current user is not root. So no test case
727c907f24eSAlan Somers  * for failure mode since the required_user="root"
728c907f24eSAlan Somers  */
729c907f24eSAlan Somers 
730c907f24eSAlan Somers 
731c907f24eSAlan Somers ATF_TC_WITH_CLEANUP(getresuid_success);
ATF_TC_HEAD(getresuid_success,tc)732c907f24eSAlan Somers ATF_TC_HEAD(getresuid_success, tc)
733c907f24eSAlan Somers {
734c907f24eSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
735c907f24eSAlan Somers 					"getresuid(2) call");
736c907f24eSAlan Somers }
737c907f24eSAlan Somers 
ATF_TC_BODY(getresuid_success,tc)738c907f24eSAlan Somers ATF_TC_BODY(getresuid_success, tc)
739c907f24eSAlan Somers {
740c907f24eSAlan Somers 	pid = getpid();
741c907f24eSAlan Somers 	snprintf(pcregex, sizeof(pcregex), "getresuid.*%d.*ret.*success", pid);
742c907f24eSAlan Somers 
743c907f24eSAlan Somers 	FILE *pipefd = setup(fds, auclass);
744c907f24eSAlan Somers 	ATF_REQUIRE_EQ(0, getresuid(NULL, NULL, NULL));
745c907f24eSAlan Somers 	check_audit(fds, pcregex, pipefd);
746c907f24eSAlan Somers }
747c907f24eSAlan Somers 
ATF_TC_CLEANUP(getresuid_success,tc)748c907f24eSAlan Somers ATF_TC_CLEANUP(getresuid_success, tc)
749c907f24eSAlan Somers {
750c907f24eSAlan Somers 	cleanup();
751c907f24eSAlan Somers }
752c907f24eSAlan Somers 
753c907f24eSAlan Somers 
754c907f24eSAlan Somers ATF_TC_WITH_CLEANUP(getresuid_failure);
ATF_TC_HEAD(getresuid_failure,tc)755c907f24eSAlan Somers ATF_TC_HEAD(getresuid_failure, tc)
756c907f24eSAlan Somers {
757c907f24eSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
758c907f24eSAlan Somers 					"getresuid(2) call");
759c907f24eSAlan Somers }
760c907f24eSAlan Somers 
ATF_TC_BODY(getresuid_failure,tc)761c907f24eSAlan Somers ATF_TC_BODY(getresuid_failure, tc)
762c907f24eSAlan Somers {
763c907f24eSAlan Somers 	pid = getpid();
764c907f24eSAlan Somers 	snprintf(pcregex, sizeof(pcregex), "getresuid.*%d.*ret.*failure", pid);
765c907f24eSAlan Somers 
766c907f24eSAlan Somers 	FILE *pipefd = setup(fds, auclass);
767c907f24eSAlan Somers 	/* Failure reason: Invalid address "-1" */
768c907f24eSAlan Somers 	ATF_REQUIRE_EQ(-1, getresuid((uid_t *)-1, NULL, NULL));
769c907f24eSAlan Somers 	check_audit(fds, pcregex, pipefd);
770c907f24eSAlan Somers }
771c907f24eSAlan Somers 
ATF_TC_CLEANUP(getresuid_failure,tc)772c907f24eSAlan Somers ATF_TC_CLEANUP(getresuid_failure, tc)
773c907f24eSAlan Somers {
774c907f24eSAlan Somers 	cleanup();
775c907f24eSAlan Somers }
776c907f24eSAlan Somers 
777c907f24eSAlan Somers 
778c907f24eSAlan Somers ATF_TC_WITH_CLEANUP(getresgid_success);
ATF_TC_HEAD(getresgid_success,tc)779c907f24eSAlan Somers ATF_TC_HEAD(getresgid_success, tc)
780c907f24eSAlan Somers {
781c907f24eSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
782c907f24eSAlan Somers 					"getresgid(2) call");
783c907f24eSAlan Somers }
784c907f24eSAlan Somers 
ATF_TC_BODY(getresgid_success,tc)785c907f24eSAlan Somers ATF_TC_BODY(getresgid_success, tc)
786c907f24eSAlan Somers {
787c907f24eSAlan Somers 	pid = getpid();
788c907f24eSAlan Somers 	snprintf(pcregex, sizeof(pcregex), "getresgid.*%d.*ret.*success", pid);
789c907f24eSAlan Somers 
790c907f24eSAlan Somers 	FILE *pipefd = setup(fds, auclass);
791c907f24eSAlan Somers 	ATF_REQUIRE_EQ(0, getresgid(NULL, NULL, NULL));
792c907f24eSAlan Somers 	check_audit(fds, pcregex, pipefd);
793c907f24eSAlan Somers }
794c907f24eSAlan Somers 
ATF_TC_CLEANUP(getresgid_success,tc)795c907f24eSAlan Somers ATF_TC_CLEANUP(getresgid_success, tc)
796c907f24eSAlan Somers {
797c907f24eSAlan Somers 	cleanup();
798c907f24eSAlan Somers }
799c907f24eSAlan Somers 
800c907f24eSAlan Somers 
801c907f24eSAlan Somers ATF_TC_WITH_CLEANUP(getresgid_failure);
ATF_TC_HEAD(getresgid_failure,tc)802c907f24eSAlan Somers ATF_TC_HEAD(getresgid_failure, tc)
803c907f24eSAlan Somers {
804c907f24eSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
805c907f24eSAlan Somers 					"getresgid(2) call");
806c907f24eSAlan Somers }
807c907f24eSAlan Somers 
ATF_TC_BODY(getresgid_failure,tc)808c907f24eSAlan Somers ATF_TC_BODY(getresgid_failure, tc)
809c907f24eSAlan Somers {
810c907f24eSAlan Somers 	pid = getpid();
811c907f24eSAlan Somers 	snprintf(pcregex, sizeof(pcregex), "getresgid.*%d.*ret.*failure", pid);
812c907f24eSAlan Somers 
813c907f24eSAlan Somers 	FILE *pipefd = setup(fds, auclass);
814c907f24eSAlan Somers 	/* Failure reason: Invalid address "-1" */
815c907f24eSAlan Somers 	ATF_REQUIRE_EQ(-1, getresgid((gid_t *)-1, NULL, NULL));
816c907f24eSAlan Somers 	check_audit(fds, pcregex, pipefd);
817c907f24eSAlan Somers }
818c907f24eSAlan Somers 
ATF_TC_CLEANUP(getresgid_failure,tc)819c907f24eSAlan Somers ATF_TC_CLEANUP(getresgid_failure, tc)
820c907f24eSAlan Somers {
821c907f24eSAlan Somers 	cleanup();
822c907f24eSAlan Somers }
823c907f24eSAlan Somers 
824c907f24eSAlan Somers 
825c907f24eSAlan Somers ATF_TC_WITH_CLEANUP(setpriority_success);
ATF_TC_HEAD(setpriority_success,tc)826c907f24eSAlan Somers ATF_TC_HEAD(setpriority_success, tc)
827c907f24eSAlan Somers {
828c907f24eSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
829c907f24eSAlan Somers 					"setpriority(2) call");
830c907f24eSAlan Somers }
831c907f24eSAlan Somers 
ATF_TC_BODY(setpriority_success,tc)832c907f24eSAlan Somers ATF_TC_BODY(setpriority_success, tc)
833c907f24eSAlan Somers {
834c907f24eSAlan Somers 	pid = getpid();
835c907f24eSAlan Somers 	snprintf(pcregex, sizeof(pcregex), "setpriority.*%d.*success", pid);
836c907f24eSAlan Somers 
837c907f24eSAlan Somers 	FILE *pipefd = setup(fds, auclass);
838c907f24eSAlan Somers 	ATF_REQUIRE_EQ(0, setpriority(PRIO_PROCESS, 0, 0));
839c907f24eSAlan Somers 	check_audit(fds, pcregex, pipefd);
840c907f24eSAlan Somers }
841c907f24eSAlan Somers 
ATF_TC_CLEANUP(setpriority_success,tc)842c907f24eSAlan Somers ATF_TC_CLEANUP(setpriority_success, tc)
843c907f24eSAlan Somers {
844c907f24eSAlan Somers 	cleanup();
845c907f24eSAlan Somers }
846c907f24eSAlan Somers 
847c907f24eSAlan Somers 
848c907f24eSAlan Somers ATF_TC_WITH_CLEANUP(setpriority_failure);
ATF_TC_HEAD(setpriority_failure,tc)849c907f24eSAlan Somers ATF_TC_HEAD(setpriority_failure, tc)
850c907f24eSAlan Somers {
851c907f24eSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
852c907f24eSAlan Somers 					"setpriority(2) call");
853c907f24eSAlan Somers }
854c907f24eSAlan Somers 
ATF_TC_BODY(setpriority_failure,tc)855c907f24eSAlan Somers ATF_TC_BODY(setpriority_failure, tc)
856c907f24eSAlan Somers {
857c907f24eSAlan Somers 	pid = getpid();
858c907f24eSAlan Somers 	snprintf(pcregex, sizeof(pcregex), "setpriority.*%d.*failure", pid);
859c907f24eSAlan Somers 
860c907f24eSAlan Somers 	FILE *pipefd = setup(fds, auclass);
861c907f24eSAlan Somers 	ATF_REQUIRE_EQ(-1, setpriority(-1, -1, -1));
862c907f24eSAlan Somers 	check_audit(fds, pcregex, pipefd);
863c907f24eSAlan Somers }
864c907f24eSAlan Somers 
ATF_TC_CLEANUP(setpriority_failure,tc)865c907f24eSAlan Somers ATF_TC_CLEANUP(setpriority_failure, tc)
866c907f24eSAlan Somers {
867c907f24eSAlan Somers 	cleanup();
868c907f24eSAlan Somers }
869c907f24eSAlan Somers 
870c907f24eSAlan Somers 
871c907f24eSAlan Somers ATF_TC_WITH_CLEANUP(setgroups_success);
ATF_TC_HEAD(setgroups_success,tc)872c907f24eSAlan Somers ATF_TC_HEAD(setgroups_success, tc)
873c907f24eSAlan Somers {
874c907f24eSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
875c907f24eSAlan Somers 					"setgroups(2) call");
876c907f24eSAlan Somers }
877c907f24eSAlan Somers 
ATF_TC_BODY(setgroups_success,tc)878c907f24eSAlan Somers ATF_TC_BODY(setgroups_success, tc)
879c907f24eSAlan Somers {
880c907f24eSAlan Somers 	gid_t gids[5];
881c907f24eSAlan Somers 	pid = getpid();
882c907f24eSAlan Somers 	snprintf(pcregex, sizeof(pcregex), "setgroups.*%d.*ret.*success", pid);
883c907f24eSAlan Somers 	/* Retrieve the current group access list to be used with setgroups */
884c907f24eSAlan Somers 	ATF_REQUIRE(getgroups(sizeof(gids)/sizeof(gids[0]), gids) != -1);
885c907f24eSAlan Somers 
886c907f24eSAlan Somers 	FILE *pipefd = setup(fds, auclass);
887c907f24eSAlan Somers 	ATF_REQUIRE_EQ(0, setgroups(sizeof(gids)/sizeof(gids[0]), gids));
888c907f24eSAlan Somers 	check_audit(fds, pcregex, pipefd);
889c907f24eSAlan Somers }
890c907f24eSAlan Somers 
ATF_TC_CLEANUP(setgroups_success,tc)891c907f24eSAlan Somers ATF_TC_CLEANUP(setgroups_success, tc)
892c907f24eSAlan Somers {
893c907f24eSAlan Somers 	cleanup();
894c907f24eSAlan Somers }
895c907f24eSAlan Somers 
896c907f24eSAlan Somers 
897c907f24eSAlan Somers ATF_TC_WITH_CLEANUP(setgroups_failure);
ATF_TC_HEAD(setgroups_failure,tc)898c907f24eSAlan Somers ATF_TC_HEAD(setgroups_failure, tc)
899c907f24eSAlan Somers {
900c907f24eSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
901c907f24eSAlan Somers 					"setgroups(2) call");
902c907f24eSAlan Somers }
903c907f24eSAlan Somers 
ATF_TC_BODY(setgroups_failure,tc)904c907f24eSAlan Somers ATF_TC_BODY(setgroups_failure, tc)
905c907f24eSAlan Somers {
906c907f24eSAlan Somers 	pid = getpid();
907c907f24eSAlan Somers 	snprintf(pcregex, sizeof(pcregex), "setgroups.*%d.*ret.*failure", pid);
908c907f24eSAlan Somers 
909c907f24eSAlan Somers 	FILE *pipefd = setup(fds, auclass);
910c907f24eSAlan Somers 	ATF_REQUIRE_EQ(-1, setgroups(-1, NULL));
911c907f24eSAlan Somers 	check_audit(fds, pcregex, pipefd);
912c907f24eSAlan Somers }
913c907f24eSAlan Somers 
ATF_TC_CLEANUP(setgroups_failure,tc)914c907f24eSAlan Somers ATF_TC_CLEANUP(setgroups_failure, tc)
915c907f24eSAlan Somers {
916c907f24eSAlan Somers 	cleanup();
917c907f24eSAlan Somers }
918c907f24eSAlan Somers 
919c907f24eSAlan Somers 
920c907f24eSAlan Somers ATF_TC_WITH_CLEANUP(setpgrp_success);
ATF_TC_HEAD(setpgrp_success,tc)921c907f24eSAlan Somers ATF_TC_HEAD(setpgrp_success, tc)
922c907f24eSAlan Somers {
923c907f24eSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
924c907f24eSAlan Somers 					"setpgrp(2) call");
925c907f24eSAlan Somers }
926c907f24eSAlan Somers 
ATF_TC_BODY(setpgrp_success,tc)927c907f24eSAlan Somers ATF_TC_BODY(setpgrp_success, tc)
928c907f24eSAlan Somers {
929c907f24eSAlan Somers 	/* Main procedure is carried out from within the child process */
930c907f24eSAlan Somers 	ATF_REQUIRE((pid = fork()) != -1);
931c907f24eSAlan Somers 	if (pid) {
932c907f24eSAlan Somers 		ATF_REQUIRE(wait(&status) != -1);
933c907f24eSAlan Somers 	} else {
934c907f24eSAlan Somers 		pid = getpid();
935c907f24eSAlan Somers 		snprintf(pcregex, sizeof(pcregex), "setpgrp.*%d.*success", pid);
936c907f24eSAlan Somers 
937c907f24eSAlan Somers 		FILE *pipefd = setup(fds, auclass);
938c907f24eSAlan Somers 		ATF_REQUIRE_EQ(0, setpgrp(0, 0));
939c907f24eSAlan Somers 		check_audit(fds, pcregex, pipefd);
940c907f24eSAlan Somers 	}
941c907f24eSAlan Somers }
942c907f24eSAlan Somers 
ATF_TC_CLEANUP(setpgrp_success,tc)943c907f24eSAlan Somers ATF_TC_CLEANUP(setpgrp_success, tc)
944c907f24eSAlan Somers {
945c907f24eSAlan Somers 	cleanup();
946c907f24eSAlan Somers }
947c907f24eSAlan Somers 
948c907f24eSAlan Somers 
949c907f24eSAlan Somers ATF_TC_WITH_CLEANUP(setpgrp_failure);
ATF_TC_HEAD(setpgrp_failure,tc)950c907f24eSAlan Somers ATF_TC_HEAD(setpgrp_failure, tc)
951c907f24eSAlan Somers {
952c907f24eSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
953c907f24eSAlan Somers 					"setpgrp(2) call");
954c907f24eSAlan Somers }
955c907f24eSAlan Somers 
ATF_TC_BODY(setpgrp_failure,tc)956c907f24eSAlan Somers ATF_TC_BODY(setpgrp_failure, tc)
957c907f24eSAlan Somers {
958c907f24eSAlan Somers 	pid = getpid();
959c907f24eSAlan Somers 	snprintf(pcregex, sizeof(pcregex), "setpgrp.*%d.*return,failure", pid);
960c907f24eSAlan Somers 
961c907f24eSAlan Somers 	FILE *pipefd = setup(fds, auclass);
962c907f24eSAlan Somers 	ATF_REQUIRE_EQ(-1, setpgrp(-1, -1));
963c907f24eSAlan Somers 	check_audit(fds, pcregex, pipefd);
964c907f24eSAlan Somers }
965c907f24eSAlan Somers 
ATF_TC_CLEANUP(setpgrp_failure,tc)966c907f24eSAlan Somers ATF_TC_CLEANUP(setpgrp_failure, tc)
967c907f24eSAlan Somers {
968c907f24eSAlan Somers 	cleanup();
969c907f24eSAlan Somers }
970c907f24eSAlan Somers 
971c907f24eSAlan Somers 
97218ba95c2SAlan Somers ATF_TC_WITH_CLEANUP(setsid_success);
ATF_TC_HEAD(setsid_success,tc)97318ba95c2SAlan Somers ATF_TC_HEAD(setsid_success, tc)
97418ba95c2SAlan Somers {
97518ba95c2SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
97618ba95c2SAlan Somers 					"setsid(2) call");
97718ba95c2SAlan Somers }
97818ba95c2SAlan Somers 
ATF_TC_BODY(setsid_success,tc)97918ba95c2SAlan Somers ATF_TC_BODY(setsid_success, tc)
98018ba95c2SAlan Somers {
98118ba95c2SAlan Somers 	/* Main procedure is carried out from within the child process */
98218ba95c2SAlan Somers 	ATF_REQUIRE((pid = fork()) != -1);
98318ba95c2SAlan Somers 	if (pid) {
98418ba95c2SAlan Somers 		ATF_REQUIRE(wait(&status) != -1);
98518ba95c2SAlan Somers 	} else {
98618ba95c2SAlan Somers 		pid = getpid();
98718ba95c2SAlan Somers 		snprintf(pcregex, sizeof(pcregex), "setsid.*%d.*success", pid);
98818ba95c2SAlan Somers 
98918ba95c2SAlan Somers 		FILE *pipefd = setup(fds, auclass);
99018ba95c2SAlan Somers 		ATF_REQUIRE(setsid() != -1);
99118ba95c2SAlan Somers 		check_audit(fds, pcregex, pipefd);
99218ba95c2SAlan Somers 	}
99318ba95c2SAlan Somers }
99418ba95c2SAlan Somers 
ATF_TC_CLEANUP(setsid_success,tc)99518ba95c2SAlan Somers ATF_TC_CLEANUP(setsid_success, tc)
99618ba95c2SAlan Somers {
99718ba95c2SAlan Somers 	cleanup();
99818ba95c2SAlan Somers }
99918ba95c2SAlan Somers 
100018ba95c2SAlan Somers 
100118ba95c2SAlan Somers ATF_TC_WITH_CLEANUP(setsid_failure);
ATF_TC_HEAD(setsid_failure,tc)100218ba95c2SAlan Somers ATF_TC_HEAD(setsid_failure, tc)
100318ba95c2SAlan Somers {
100418ba95c2SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
100518ba95c2SAlan Somers 					"setsid(2) call");
100618ba95c2SAlan Somers }
100718ba95c2SAlan Somers 
ATF_TC_BODY(setsid_failure,tc)100818ba95c2SAlan Somers ATF_TC_BODY(setsid_failure, tc)
100918ba95c2SAlan Somers {
101018ba95c2SAlan Somers 	pid = getpid();
101118ba95c2SAlan Somers 	snprintf(pcregex, sizeof(pcregex), "setsid.*%d.*return,failure", pid);
101218ba95c2SAlan Somers 
101318ba95c2SAlan Somers 	/*
101418ba95c2SAlan Somers 	 * Here, we are intentionally ignoring the output of the setsid()
101518ba95c2SAlan Somers 	 * call because it may or may not be a process leader already. But it
101618ba95c2SAlan Somers 	 * ensures that the next invocation of setsid() will definitely fail.
101718ba95c2SAlan Somers 	 */
101818ba95c2SAlan Somers 	setsid();
101918ba95c2SAlan Somers 	FILE *pipefd = setup(fds, auclass);
102018ba95c2SAlan Somers 	/*
102118ba95c2SAlan Somers 	 * Failure reason: [EPERM] Creating a new session is not permitted
102218ba95c2SAlan Somers 	 * as the PID of calling process matches the PGID of a process group
102318ba95c2SAlan Somers 	 * created by premature setsid() call.
102418ba95c2SAlan Somers 	 */
102518ba95c2SAlan Somers 	ATF_REQUIRE_EQ(-1, setsid());
102618ba95c2SAlan Somers 	check_audit(fds, pcregex, pipefd);
102718ba95c2SAlan Somers }
102818ba95c2SAlan Somers 
ATF_TC_CLEANUP(setsid_failure,tc)102918ba95c2SAlan Somers ATF_TC_CLEANUP(setsid_failure, tc)
103018ba95c2SAlan Somers {
103118ba95c2SAlan Somers 	cleanup();
103218ba95c2SAlan Somers }
103318ba95c2SAlan Somers 
103418ba95c2SAlan Somers 
1035c907f24eSAlan Somers ATF_TC_WITH_CLEANUP(setrlimit_success);
ATF_TC_HEAD(setrlimit_success,tc)1036c907f24eSAlan Somers ATF_TC_HEAD(setrlimit_success, tc)
1037c907f24eSAlan Somers {
1038c907f24eSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1039c907f24eSAlan Somers 					"setrlimit(2) call");
1040c907f24eSAlan Somers }
1041c907f24eSAlan Somers 
ATF_TC_BODY(setrlimit_success,tc)1042c907f24eSAlan Somers ATF_TC_BODY(setrlimit_success, tc)
1043c907f24eSAlan Somers {
1044c907f24eSAlan Somers 	struct rlimit rlp;
1045c907f24eSAlan Somers 	pid = getpid();
1046c907f24eSAlan Somers 	snprintf(pcregex, sizeof(pcregex), "setrlimit.*%d.*ret.*success", pid);
1047c907f24eSAlan Somers 	/* Retrieve the system resource consumption limit to be used later on */
1048c907f24eSAlan Somers 	ATF_REQUIRE_EQ(0, getrlimit(RLIMIT_FSIZE, &rlp));
1049c907f24eSAlan Somers 
1050c907f24eSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1051c907f24eSAlan Somers 	ATF_REQUIRE_EQ(0, setrlimit(RLIMIT_FSIZE, &rlp));
1052c907f24eSAlan Somers 	check_audit(fds, pcregex, pipefd);
1053c907f24eSAlan Somers }
1054c907f24eSAlan Somers 
ATF_TC_CLEANUP(setrlimit_success,tc)1055c907f24eSAlan Somers ATF_TC_CLEANUP(setrlimit_success, tc)
1056c907f24eSAlan Somers {
1057c907f24eSAlan Somers 	cleanup();
1058c907f24eSAlan Somers }
1059c907f24eSAlan Somers 
1060c907f24eSAlan Somers 
1061c907f24eSAlan Somers ATF_TC_WITH_CLEANUP(setrlimit_failure);
ATF_TC_HEAD(setrlimit_failure,tc)1062c907f24eSAlan Somers ATF_TC_HEAD(setrlimit_failure, tc)
1063c907f24eSAlan Somers {
1064c907f24eSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1065c907f24eSAlan Somers 					"setrlimit(2) call");
1066c907f24eSAlan Somers }
1067c907f24eSAlan Somers 
ATF_TC_BODY(setrlimit_failure,tc)1068c907f24eSAlan Somers ATF_TC_BODY(setrlimit_failure, tc)
1069c907f24eSAlan Somers {
1070c907f24eSAlan Somers 	pid = getpid();
1071c907f24eSAlan Somers 	snprintf(pcregex, sizeof(pcregex), "setrlimit.*%d.*ret.*failure", pid);
1072c907f24eSAlan Somers 
1073c907f24eSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1074c907f24eSAlan Somers 	ATF_REQUIRE_EQ(-1, setrlimit(RLIMIT_FSIZE, NULL));
1075c907f24eSAlan Somers 	check_audit(fds, pcregex, pipefd);
1076c907f24eSAlan Somers }
1077c907f24eSAlan Somers 
ATF_TC_CLEANUP(setrlimit_failure,tc)1078c907f24eSAlan Somers ATF_TC_CLEANUP(setrlimit_failure, tc)
1079c907f24eSAlan Somers {
1080c907f24eSAlan Somers 	cleanup();
1081c907f24eSAlan Somers }
1082c907f24eSAlan Somers 
1083c907f24eSAlan Somers 
1084c907f24eSAlan Somers ATF_TC_WITH_CLEANUP(mlock_success);
ATF_TC_HEAD(mlock_success,tc)1085c907f24eSAlan Somers ATF_TC_HEAD(mlock_success, tc)
1086c907f24eSAlan Somers {
1087c907f24eSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1088c907f24eSAlan Somers 					"mlock(2) call");
1089c907f24eSAlan Somers }
1090c907f24eSAlan Somers 
ATF_TC_BODY(mlock_success,tc)1091c907f24eSAlan Somers ATF_TC_BODY(mlock_success, tc)
1092c907f24eSAlan Somers {
1093c907f24eSAlan Somers 	pid = getpid();
1094c907f24eSAlan Somers 	snprintf(pcregex, sizeof(pcregex), "mlock.*%d.*return,success", pid);
1095c907f24eSAlan Somers 
1096c907f24eSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1097c907f24eSAlan Somers 	ATF_REQUIRE_EQ(0, mlock(NULL, 0));
1098c907f24eSAlan Somers 	check_audit(fds, pcregex, pipefd);
1099c907f24eSAlan Somers }
1100c907f24eSAlan Somers 
ATF_TC_CLEANUP(mlock_success,tc)1101c907f24eSAlan Somers ATF_TC_CLEANUP(mlock_success, tc)
1102c907f24eSAlan Somers {
1103c907f24eSAlan Somers 	cleanup();
1104c907f24eSAlan Somers }
1105c907f24eSAlan Somers 
1106c907f24eSAlan Somers 
1107c907f24eSAlan Somers ATF_TC_WITH_CLEANUP(mlock_failure);
ATF_TC_HEAD(mlock_failure,tc)1108c907f24eSAlan Somers ATF_TC_HEAD(mlock_failure, tc)
1109c907f24eSAlan Somers {
1110c907f24eSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1111c907f24eSAlan Somers 					"mlock(2) call");
1112c907f24eSAlan Somers }
1113c907f24eSAlan Somers 
ATF_TC_BODY(mlock_failure,tc)1114c907f24eSAlan Somers ATF_TC_BODY(mlock_failure, tc)
1115c907f24eSAlan Somers {
1116c907f24eSAlan Somers 	pid = getpid();
1117c907f24eSAlan Somers 	snprintf(pcregex, sizeof(pcregex), "mlock.*%d.*return,failure", pid);
1118c907f24eSAlan Somers 
1119c907f24eSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1120c907f24eSAlan Somers 	ATF_REQUIRE_EQ(-1, mlock((void *)(-1), -1));
1121c907f24eSAlan Somers 	check_audit(fds, pcregex, pipefd);
1122c907f24eSAlan Somers }
1123c907f24eSAlan Somers 
ATF_TC_CLEANUP(mlock_failure,tc)1124c907f24eSAlan Somers ATF_TC_CLEANUP(mlock_failure, tc)
1125c907f24eSAlan Somers {
1126c907f24eSAlan Somers 	cleanup();
1127c907f24eSAlan Somers }
1128c907f24eSAlan Somers 
1129c907f24eSAlan Somers 
1130c907f24eSAlan Somers ATF_TC_WITH_CLEANUP(munlock_success);
ATF_TC_HEAD(munlock_success,tc)1131c907f24eSAlan Somers ATF_TC_HEAD(munlock_success, tc)
1132c907f24eSAlan Somers {
1133c907f24eSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1134c907f24eSAlan Somers 					"munlock(2) call");
1135c907f24eSAlan Somers }
1136c907f24eSAlan Somers 
ATF_TC_BODY(munlock_success,tc)1137c907f24eSAlan Somers ATF_TC_BODY(munlock_success, tc)
1138c907f24eSAlan Somers {
1139c907f24eSAlan Somers 	pid = getpid();
1140c907f24eSAlan Somers 	snprintf(pcregex, sizeof(pcregex), "munlock.*%d.*return,success", pid);
1141c907f24eSAlan Somers 
1142c907f24eSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1143c907f24eSAlan Somers 	ATF_REQUIRE_EQ(0, munlock(NULL, 0));
1144c907f24eSAlan Somers 	check_audit(fds, pcregex, pipefd);
1145c907f24eSAlan Somers }
1146c907f24eSAlan Somers 
ATF_TC_CLEANUP(munlock_success,tc)1147c907f24eSAlan Somers ATF_TC_CLEANUP(munlock_success, tc)
1148c907f24eSAlan Somers {
1149c907f24eSAlan Somers 	cleanup();
1150c907f24eSAlan Somers }
1151c907f24eSAlan Somers 
1152c907f24eSAlan Somers 
1153c907f24eSAlan Somers ATF_TC_WITH_CLEANUP(munlock_failure);
ATF_TC_HEAD(munlock_failure,tc)1154c907f24eSAlan Somers ATF_TC_HEAD(munlock_failure, tc)
1155c907f24eSAlan Somers {
1156c907f24eSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1157c907f24eSAlan Somers 					"munlock(2) call");
1158c907f24eSAlan Somers }
1159c907f24eSAlan Somers 
ATF_TC_BODY(munlock_failure,tc)1160c907f24eSAlan Somers ATF_TC_BODY(munlock_failure, tc)
1161c907f24eSAlan Somers {
1162c907f24eSAlan Somers 	pid = getpid();
1163c907f24eSAlan Somers 	snprintf(pcregex, sizeof(pcregex), "munlock.*%d.*return,failure", pid);
1164c907f24eSAlan Somers 
1165c907f24eSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1166c907f24eSAlan Somers 	ATF_REQUIRE_EQ(-1, munlock((void *)(-1), -1));
1167c907f24eSAlan Somers 	check_audit(fds, pcregex, pipefd);
1168c907f24eSAlan Somers }
1169c907f24eSAlan Somers 
ATF_TC_CLEANUP(munlock_failure,tc)1170c907f24eSAlan Somers ATF_TC_CLEANUP(munlock_failure, tc)
1171c907f24eSAlan Somers {
1172c907f24eSAlan Somers 	cleanup();
1173c907f24eSAlan Somers }
1174c907f24eSAlan Somers 
1175c907f24eSAlan Somers 
1176c907f24eSAlan Somers ATF_TC_WITH_CLEANUP(minherit_success);
ATF_TC_HEAD(minherit_success,tc)1177c907f24eSAlan Somers ATF_TC_HEAD(minherit_success, tc)
1178c907f24eSAlan Somers {
1179c907f24eSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1180c907f24eSAlan Somers 					"minherit(2) call");
1181c907f24eSAlan Somers }
1182c907f24eSAlan Somers 
ATF_TC_BODY(minherit_success,tc)1183c907f24eSAlan Somers ATF_TC_BODY(minherit_success, tc)
1184c907f24eSAlan Somers {
1185c907f24eSAlan Somers 	pid = getpid();
1186c907f24eSAlan Somers 	snprintf(pcregex, sizeof(pcregex), "minherit.*%d.*return,success", pid);
1187c907f24eSAlan Somers 
1188c907f24eSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1189c907f24eSAlan Somers 	ATF_REQUIRE_EQ(0, minherit(NULL, 0, INHERIT_ZERO));
1190c907f24eSAlan Somers 	check_audit(fds, pcregex, pipefd);
1191c907f24eSAlan Somers }
1192c907f24eSAlan Somers 
ATF_TC_CLEANUP(minherit_success,tc)1193c907f24eSAlan Somers ATF_TC_CLEANUP(minherit_success, tc)
1194c907f24eSAlan Somers {
1195c907f24eSAlan Somers 	cleanup();
1196c907f24eSAlan Somers }
1197c907f24eSAlan Somers 
1198c907f24eSAlan Somers 
1199c907f24eSAlan Somers ATF_TC_WITH_CLEANUP(minherit_failure);
ATF_TC_HEAD(minherit_failure,tc)1200c907f24eSAlan Somers ATF_TC_HEAD(minherit_failure, tc)
1201c907f24eSAlan Somers {
1202c907f24eSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1203c907f24eSAlan Somers 					"minherit(2) call");
1204c907f24eSAlan Somers }
1205c907f24eSAlan Somers 
ATF_TC_BODY(minherit_failure,tc)1206c907f24eSAlan Somers ATF_TC_BODY(minherit_failure, tc)
1207c907f24eSAlan Somers {
1208c907f24eSAlan Somers 	pid = getpid();
1209c907f24eSAlan Somers 	snprintf(pcregex, sizeof(pcregex), "minherit.*%d.*return,failure", pid);
1210c907f24eSAlan Somers 
1211c907f24eSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1212c907f24eSAlan Somers 	ATF_REQUIRE_EQ(-1, minherit((void *)(-1), -1, 0));
1213c907f24eSAlan Somers 	check_audit(fds, pcregex, pipefd);
1214c907f24eSAlan Somers }
1215c907f24eSAlan Somers 
ATF_TC_CLEANUP(minherit_failure,tc)1216c907f24eSAlan Somers ATF_TC_CLEANUP(minherit_failure, tc)
1217c907f24eSAlan Somers {
1218c907f24eSAlan Somers 	cleanup();
1219c907f24eSAlan Somers }
1220c907f24eSAlan Somers 
1221c907f24eSAlan Somers 
1222c907f24eSAlan Somers ATF_TC_WITH_CLEANUP(setlogin_success);
ATF_TC_HEAD(setlogin_success,tc)1223c907f24eSAlan Somers ATF_TC_HEAD(setlogin_success, tc)
1224c907f24eSAlan Somers {
1225c907f24eSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1226c907f24eSAlan Somers 					"setlogin(2) call");
1227c907f24eSAlan Somers }
1228c907f24eSAlan Somers 
ATF_TC_BODY(setlogin_success,tc)1229c907f24eSAlan Somers ATF_TC_BODY(setlogin_success, tc)
1230c907f24eSAlan Somers {
1231c907f24eSAlan Somers 	char *name;
1232c907f24eSAlan Somers 	pid = getpid();
1233c907f24eSAlan Somers 	snprintf(pcregex, sizeof(pcregex), "setlogin.*%d.*return,success", pid);
1234c907f24eSAlan Somers 
1235c907f24eSAlan Somers 	/* Retrieve the current user's login name to be used with setlogin(2) */
1236c907f24eSAlan Somers 	ATF_REQUIRE((name = getlogin()) != NULL);
1237c907f24eSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1238c907f24eSAlan Somers 	ATF_REQUIRE_EQ(0, setlogin(name));
1239c907f24eSAlan Somers 	check_audit(fds, pcregex, pipefd);
1240c907f24eSAlan Somers }
1241c907f24eSAlan Somers 
ATF_TC_CLEANUP(setlogin_success,tc)1242c907f24eSAlan Somers ATF_TC_CLEANUP(setlogin_success, tc)
1243c907f24eSAlan Somers {
1244c907f24eSAlan Somers 	cleanup();
1245c907f24eSAlan Somers }
1246c907f24eSAlan Somers 
1247c907f24eSAlan Somers 
1248c907f24eSAlan Somers ATF_TC_WITH_CLEANUP(setlogin_failure);
ATF_TC_HEAD(setlogin_failure,tc)1249c907f24eSAlan Somers ATF_TC_HEAD(setlogin_failure, tc)
1250c907f24eSAlan Somers {
1251c907f24eSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1252c907f24eSAlan Somers 					"setlogin(2) call");
1253c907f24eSAlan Somers }
1254c907f24eSAlan Somers 
ATF_TC_BODY(setlogin_failure,tc)1255c907f24eSAlan Somers ATF_TC_BODY(setlogin_failure, tc)
1256c907f24eSAlan Somers {
1257c907f24eSAlan Somers 	pid = getpid();
1258c907f24eSAlan Somers 	snprintf(pcregex, sizeof(pcregex), "setlogin.*%d.*return,failure", pid);
1259c907f24eSAlan Somers 
1260c907f24eSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1261c907f24eSAlan Somers 	ATF_REQUIRE_EQ(-1, setlogin(NULL));
1262c907f24eSAlan Somers 	check_audit(fds, pcregex, pipefd);
1263c907f24eSAlan Somers }
1264c907f24eSAlan Somers 
ATF_TC_CLEANUP(setlogin_failure,tc)1265c907f24eSAlan Somers ATF_TC_CLEANUP(setlogin_failure, tc)
1266c907f24eSAlan Somers {
1267c907f24eSAlan Somers 	cleanup();
1268c907f24eSAlan Somers }
1269c907f24eSAlan Somers 
1270c907f24eSAlan Somers 
1271c907f24eSAlan Somers ATF_TC_WITH_CLEANUP(rtprio_success);
ATF_TC_HEAD(rtprio_success,tc)1272c907f24eSAlan Somers ATF_TC_HEAD(rtprio_success, tc)
1273c907f24eSAlan Somers {
1274c907f24eSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1275c907f24eSAlan Somers 					"rtprio(2) call");
1276c907f24eSAlan Somers }
1277c907f24eSAlan Somers 
ATF_TC_BODY(rtprio_success,tc)1278c907f24eSAlan Somers ATF_TC_BODY(rtprio_success, tc)
1279c907f24eSAlan Somers {
1280c907f24eSAlan Somers 	struct rtprio rtp;
1281c907f24eSAlan Somers 	pid = getpid();
1282c907f24eSAlan Somers 	snprintf(pcregex, sizeof(pcregex), "rtprio.*%d.*return,success", pid);
1283c907f24eSAlan Somers 
1284c907f24eSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1285c907f24eSAlan Somers 	ATF_REQUIRE_EQ(0, rtprio(RTP_LOOKUP, 0, &rtp));
1286c907f24eSAlan Somers 	check_audit(fds, pcregex, pipefd);
1287c907f24eSAlan Somers }
1288c907f24eSAlan Somers 
ATF_TC_CLEANUP(rtprio_success,tc)1289c907f24eSAlan Somers ATF_TC_CLEANUP(rtprio_success, tc)
1290c907f24eSAlan Somers {
1291c907f24eSAlan Somers 	cleanup();
1292c907f24eSAlan Somers }
1293c907f24eSAlan Somers 
1294c907f24eSAlan Somers 
1295c907f24eSAlan Somers ATF_TC_WITH_CLEANUP(rtprio_failure);
ATF_TC_HEAD(rtprio_failure,tc)1296c907f24eSAlan Somers ATF_TC_HEAD(rtprio_failure, tc)
1297c907f24eSAlan Somers {
1298c907f24eSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1299c907f24eSAlan Somers 					"rtprio(2) call");
1300c907f24eSAlan Somers }
1301c907f24eSAlan Somers 
ATF_TC_BODY(rtprio_failure,tc)1302c907f24eSAlan Somers ATF_TC_BODY(rtprio_failure, tc)
1303c907f24eSAlan Somers {
1304c907f24eSAlan Somers 	pid = getpid();
1305c907f24eSAlan Somers 	snprintf(pcregex, sizeof(pcregex), "rtprio.*%d.*return,failure", pid);
1306c907f24eSAlan Somers 
1307c907f24eSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1308c907f24eSAlan Somers 	ATF_REQUIRE_EQ(-1, rtprio(-1, -1, NULL));
1309c907f24eSAlan Somers 	check_audit(fds, pcregex, pipefd);
1310c907f24eSAlan Somers }
1311c907f24eSAlan Somers 
ATF_TC_CLEANUP(rtprio_failure,tc)1312c907f24eSAlan Somers ATF_TC_CLEANUP(rtprio_failure, tc)
1313c907f24eSAlan Somers {
1314c907f24eSAlan Somers 	cleanup();
1315c907f24eSAlan Somers }
1316c907f24eSAlan Somers 
1317c907f24eSAlan Somers 
1318c907f24eSAlan Somers ATF_TC_WITH_CLEANUP(profil_success);
ATF_TC_HEAD(profil_success,tc)1319c907f24eSAlan Somers ATF_TC_HEAD(profil_success, tc)
1320c907f24eSAlan Somers {
1321c907f24eSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1322c907f24eSAlan Somers 					"profil(2) call");
1323c907f24eSAlan Somers }
1324c907f24eSAlan Somers 
ATF_TC_BODY(profil_success,tc)1325c907f24eSAlan Somers ATF_TC_BODY(profil_success, tc)
1326c907f24eSAlan Somers {
1327c907f24eSAlan Somers 	pid = getpid();
1328c907f24eSAlan Somers 	snprintf(pcregex, sizeof(pcregex), "profil.*%d.*return,success", pid);
1329c907f24eSAlan Somers 
1330c907f24eSAlan Somers 	char samples[20];
1331c907f24eSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1332c907f24eSAlan Somers 	/* Set scale argument as 0 to disable profiling of current process */
1333c907f24eSAlan Somers 	ATF_REQUIRE_EQ(0, profil(samples, sizeof(samples), 0, 0));
1334c907f24eSAlan Somers 	check_audit(fds, pcregex, pipefd);
1335c907f24eSAlan Somers }
1336c907f24eSAlan Somers 
ATF_TC_CLEANUP(profil_success,tc)1337c907f24eSAlan Somers ATF_TC_CLEANUP(profil_success, tc)
1338c907f24eSAlan Somers {
1339c907f24eSAlan Somers 	cleanup();
1340c907f24eSAlan Somers }
1341c907f24eSAlan Somers 
1342c907f24eSAlan Somers 
1343c907f24eSAlan Somers ATF_TC_WITH_CLEANUP(profil_failure);
ATF_TC_HEAD(profil_failure,tc)1344c907f24eSAlan Somers ATF_TC_HEAD(profil_failure, tc)
1345c907f24eSAlan Somers {
1346c907f24eSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1347c907f24eSAlan Somers 					"profil(2) call");
1348c907f24eSAlan Somers }
1349c907f24eSAlan Somers 
ATF_TC_BODY(profil_failure,tc)1350c907f24eSAlan Somers ATF_TC_BODY(profil_failure, tc)
1351c907f24eSAlan Somers {
1352c907f24eSAlan Somers 	pid = getpid();
1353c907f24eSAlan Somers 	snprintf(pcregex, sizeof(pcregex), "profil.*%d.*return,failure", pid);
1354c907f24eSAlan Somers 
1355c907f24eSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1356c907f24eSAlan Somers 	ATF_REQUIRE_EQ(-1, profil((char *)(SIZE_MAX), -1, -1, -1));
1357c907f24eSAlan Somers 	check_audit(fds, pcregex, pipefd);
1358c907f24eSAlan Somers }
1359c907f24eSAlan Somers 
ATF_TC_CLEANUP(profil_failure,tc)1360c907f24eSAlan Somers ATF_TC_CLEANUP(profil_failure, tc)
1361c907f24eSAlan Somers {
1362c907f24eSAlan Somers 	cleanup();
1363c907f24eSAlan Somers }
1364c907f24eSAlan Somers 
1365c907f24eSAlan Somers 
1366c907f24eSAlan Somers ATF_TC_WITH_CLEANUP(ptrace_success);
ATF_TC_HEAD(ptrace_success,tc)1367c907f24eSAlan Somers ATF_TC_HEAD(ptrace_success, tc)
1368c907f24eSAlan Somers {
1369c907f24eSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1370c907f24eSAlan Somers 					"ptrace(2) call");
1371c907f24eSAlan Somers }
1372c907f24eSAlan Somers 
ATF_TC_BODY(ptrace_success,tc)1373c907f24eSAlan Somers ATF_TC_BODY(ptrace_success, tc)
1374c907f24eSAlan Somers {
1375c907f24eSAlan Somers 	pid = getpid();
1376c907f24eSAlan Somers 	snprintf(pcregex, sizeof(pcregex), "ptrace.*%d.*return,success", pid);
1377c907f24eSAlan Somers 
1378c907f24eSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1379c907f24eSAlan Somers 	ATF_REQUIRE_EQ(0, ptrace(PT_TRACE_ME, 0, NULL, 0));
1380c907f24eSAlan Somers 	check_audit(fds, pcregex, pipefd);
1381c907f24eSAlan Somers }
1382c907f24eSAlan Somers 
ATF_TC_CLEANUP(ptrace_success,tc)1383c907f24eSAlan Somers ATF_TC_CLEANUP(ptrace_success, tc)
1384c907f24eSAlan Somers {
1385c907f24eSAlan Somers 	cleanup();
1386c907f24eSAlan Somers }
1387c907f24eSAlan Somers 
1388c907f24eSAlan Somers 
1389c907f24eSAlan Somers ATF_TC_WITH_CLEANUP(ptrace_failure);
ATF_TC_HEAD(ptrace_failure,tc)1390c907f24eSAlan Somers ATF_TC_HEAD(ptrace_failure, tc)
1391c907f24eSAlan Somers {
1392c907f24eSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1393c907f24eSAlan Somers 					"ptrace(2) call");
1394c907f24eSAlan Somers }
1395c907f24eSAlan Somers 
ATF_TC_BODY(ptrace_failure,tc)1396c907f24eSAlan Somers ATF_TC_BODY(ptrace_failure, tc)
1397c907f24eSAlan Somers {
1398c907f24eSAlan Somers 	pid = getpid();
1399c907f24eSAlan Somers 	snprintf(pcregex, sizeof(pcregex), "ptrace.*%d.*return,failure", pid);
1400c907f24eSAlan Somers 
1401c907f24eSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1402c907f24eSAlan Somers 	ATF_REQUIRE_EQ(-1, ptrace(-1, 0, NULL, 0));
1403c907f24eSAlan Somers 	check_audit(fds, pcregex, pipefd);
1404c907f24eSAlan Somers }
1405c907f24eSAlan Somers 
ATF_TC_CLEANUP(ptrace_failure,tc)1406c907f24eSAlan Somers ATF_TC_CLEANUP(ptrace_failure, tc)
1407c907f24eSAlan Somers {
1408c907f24eSAlan Somers 	cleanup();
1409c907f24eSAlan Somers }
1410c907f24eSAlan Somers 
1411c907f24eSAlan Somers 
1412c907f24eSAlan Somers ATF_TC_WITH_CLEANUP(ktrace_success);
ATF_TC_HEAD(ktrace_success,tc)1413c907f24eSAlan Somers ATF_TC_HEAD(ktrace_success, tc)
1414c907f24eSAlan Somers {
1415c907f24eSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1416c907f24eSAlan Somers 					"ktrace(2) call");
1417c907f24eSAlan Somers }
1418c907f24eSAlan Somers 
ATF_TC_BODY(ktrace_success,tc)1419c907f24eSAlan Somers ATF_TC_BODY(ktrace_success, tc)
1420c907f24eSAlan Somers {
1421c907f24eSAlan Somers 	pid = getpid();
1422c907f24eSAlan Somers 	snprintf(pcregex, sizeof(pcregex), "ktrace.*%d.*return,success", pid);
1423c907f24eSAlan Somers 
1424c907f24eSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1425c907f24eSAlan Somers 	ATF_REQUIRE_EQ(0, ktrace(NULL, KTROP_CLEAR, KTRFAC_SYSCALL, pid));
1426c907f24eSAlan Somers 	check_audit(fds, pcregex, pipefd);
1427c907f24eSAlan Somers }
1428c907f24eSAlan Somers 
ATF_TC_CLEANUP(ktrace_success,tc)1429c907f24eSAlan Somers ATF_TC_CLEANUP(ktrace_success, tc)
1430c907f24eSAlan Somers {
1431c907f24eSAlan Somers 	cleanup();
1432c907f24eSAlan Somers }
1433c907f24eSAlan Somers 
1434c907f24eSAlan Somers 
1435c907f24eSAlan Somers ATF_TC_WITH_CLEANUP(ktrace_failure);
ATF_TC_HEAD(ktrace_failure,tc)1436c907f24eSAlan Somers ATF_TC_HEAD(ktrace_failure, tc)
1437c907f24eSAlan Somers {
1438c907f24eSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1439c907f24eSAlan Somers 					"ktrace(2) call");
1440c907f24eSAlan Somers }
1441c907f24eSAlan Somers 
ATF_TC_BODY(ktrace_failure,tc)1442c907f24eSAlan Somers ATF_TC_BODY(ktrace_failure, tc)
1443c907f24eSAlan Somers {
1444c907f24eSAlan Somers 	pid = getpid();
1445c907f24eSAlan Somers 	snprintf(pcregex, sizeof(pcregex), "ktrace.*%d.*return,failure", pid);
1446c907f24eSAlan Somers 
1447c907f24eSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1448c907f24eSAlan Somers 	ATF_REQUIRE_EQ(-1, ktrace(NULL, -1, -1, 0));
1449c907f24eSAlan Somers 	check_audit(fds, pcregex, pipefd);
1450c907f24eSAlan Somers }
1451c907f24eSAlan Somers 
ATF_TC_CLEANUP(ktrace_failure,tc)1452c907f24eSAlan Somers ATF_TC_CLEANUP(ktrace_failure, tc)
1453c907f24eSAlan Somers {
1454c907f24eSAlan Somers 	cleanup();
1455c907f24eSAlan Somers }
1456c907f24eSAlan Somers 
1457c907f24eSAlan Somers 
1458b1b5f04dSAlan Somers ATF_TC_WITH_CLEANUP(procctl_success);
ATF_TC_HEAD(procctl_success,tc)1459b1b5f04dSAlan Somers ATF_TC_HEAD(procctl_success, tc)
1460b1b5f04dSAlan Somers {
1461b1b5f04dSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1462b1b5f04dSAlan Somers 					"procctl(2) call");
1463b1b5f04dSAlan Somers }
1464b1b5f04dSAlan Somers 
ATF_TC_BODY(procctl_success,tc)1465b1b5f04dSAlan Somers ATF_TC_BODY(procctl_success, tc)
1466b1b5f04dSAlan Somers {
1467b1b5f04dSAlan Somers 	pid = getpid();
1468b1b5f04dSAlan Somers 	snprintf(pcregex, sizeof(pcregex), "procctl.*%d.*return,success", pid);
1469b1b5f04dSAlan Somers 
1470b1b5f04dSAlan Somers 	struct procctl_reaper_status reapstat;
1471b1b5f04dSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1472b1b5f04dSAlan Somers 	/* Retrieve information about the reaper of current process (pid) */
1473b1b5f04dSAlan Somers 	ATF_REQUIRE_EQ(0, procctl(P_PID, pid, PROC_REAP_STATUS, &reapstat));
1474b1b5f04dSAlan Somers 	check_audit(fds, pcregex, pipefd);
1475b1b5f04dSAlan Somers }
1476b1b5f04dSAlan Somers 
ATF_TC_CLEANUP(procctl_success,tc)1477b1b5f04dSAlan Somers ATF_TC_CLEANUP(procctl_success, tc)
1478b1b5f04dSAlan Somers {
1479b1b5f04dSAlan Somers 	cleanup();
1480b1b5f04dSAlan Somers }
1481b1b5f04dSAlan Somers 
1482b1b5f04dSAlan Somers 
1483b1b5f04dSAlan Somers ATF_TC_WITH_CLEANUP(procctl_failure);
ATF_TC_HEAD(procctl_failure,tc)1484b1b5f04dSAlan Somers ATF_TC_HEAD(procctl_failure, tc)
1485b1b5f04dSAlan Somers {
1486b1b5f04dSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1487b1b5f04dSAlan Somers 					"procctl(2) call");
1488b1b5f04dSAlan Somers }
1489b1b5f04dSAlan Somers 
ATF_TC_BODY(procctl_failure,tc)1490b1b5f04dSAlan Somers ATF_TC_BODY(procctl_failure, tc)
1491b1b5f04dSAlan Somers {
1492b1b5f04dSAlan Somers 	pid = getpid();
1493b1b5f04dSAlan Somers 	snprintf(pcregex, sizeof(pcregex), "procctl.*%d.*return,failure", pid);
1494b1b5f04dSAlan Somers 
1495b1b5f04dSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1496b1b5f04dSAlan Somers 	ATF_REQUIRE_EQ(-1, procctl(-1, -1, -1, NULL));
1497b1b5f04dSAlan Somers 	check_audit(fds, pcregex, pipefd);
1498b1b5f04dSAlan Somers }
1499b1b5f04dSAlan Somers 
ATF_TC_CLEANUP(procctl_failure,tc)1500b1b5f04dSAlan Somers ATF_TC_CLEANUP(procctl_failure, tc)
1501b1b5f04dSAlan Somers {
1502b1b5f04dSAlan Somers 	cleanup();
1503b1b5f04dSAlan Somers }
1504b1b5f04dSAlan Somers 
1505b1b5f04dSAlan Somers 
1506405f0931SAlan Somers ATF_TC_WITH_CLEANUP(cap_enter_success);
ATF_TC_HEAD(cap_enter_success,tc)1507405f0931SAlan Somers ATF_TC_HEAD(cap_enter_success, tc)
1508405f0931SAlan Somers {
1509405f0931SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1510405f0931SAlan Somers 					"cap_enter(2) call");
1511405f0931SAlan Somers }
1512405f0931SAlan Somers 
ATF_TC_BODY(cap_enter_success,tc)1513405f0931SAlan Somers ATF_TC_BODY(cap_enter_success, tc)
1514405f0931SAlan Somers {
1515*8f462da4SOlivier Cochard 	ATF_REQUIRE_FEATURE("security_capability_mode");
1516405f0931SAlan Somers 
1517405f0931SAlan Somers 	FILE *pipefd = setup(fds, auclass);
1518405f0931SAlan Somers 	ATF_REQUIRE((pid = fork()) != -1);
1519405f0931SAlan Somers 	if (pid) {
1520405f0931SAlan Somers 		snprintf(pcregex, sizeof(pcregex),
1521405f0931SAlan Somers 			"cap_enter.*%d.*return,success", pid);
1522405f0931SAlan Somers 		ATF_REQUIRE(wait(&status) != -1);
1523405f0931SAlan Somers 		check_audit(fds, pcregex, pipefd);
1524405f0931SAlan Somers 	}
1525405f0931SAlan Somers 	else {
1526405f0931SAlan Somers 		ATF_REQUIRE_EQ(0, cap_enter());
1527405f0931SAlan Somers 		_exit(0);
1528405f0931SAlan Somers 	}
1529405f0931SAlan Somers }
1530405f0931SAlan Somers 
ATF_TC_CLEANUP(cap_enter_success,tc)1531405f0931SAlan Somers ATF_TC_CLEANUP(cap_enter_success, tc)
1532405f0931SAlan Somers {
1533405f0931SAlan Somers 	cleanup();
1534405f0931SAlan Somers }
1535405f0931SAlan Somers 
1536405f0931SAlan Somers 
1537405f0931SAlan Somers ATF_TC_WITH_CLEANUP(cap_getmode_success);
ATF_TC_HEAD(cap_getmode_success,tc)1538405f0931SAlan Somers ATF_TC_HEAD(cap_getmode_success, tc)
1539405f0931SAlan Somers {
1540405f0931SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1541405f0931SAlan Somers 					"cap_getmode(2) call");
1542405f0931SAlan Somers }
1543405f0931SAlan Somers 
ATF_TC_BODY(cap_getmode_success,tc)1544405f0931SAlan Somers ATF_TC_BODY(cap_getmode_success, tc)
1545405f0931SAlan Somers {
1546*8f462da4SOlivier Cochard 	int modep;
1547405f0931SAlan Somers 
1548*8f462da4SOlivier Cochard 	ATF_REQUIRE_FEATURE("security_capability_mode");
1549405f0931SAlan Somers 
1550405f0931SAlan Somers 	pid = getpid();
1551405f0931SAlan Somers 	snprintf(pcregex, sizeof(pcregex), "cap_getmode.*%d.*success", pid);
1552405f0931SAlan Somers 
1553405f0931SAlan Somers 	FILE *pipefd = setup(fds, auclass);
1554405f0931SAlan Somers 	ATF_REQUIRE_EQ(0, cap_getmode(&modep));
1555405f0931SAlan Somers 	check_audit(fds, pcregex, pipefd);
1556405f0931SAlan Somers }
1557405f0931SAlan Somers 
ATF_TC_CLEANUP(cap_getmode_success,tc)1558405f0931SAlan Somers ATF_TC_CLEANUP(cap_getmode_success, tc)
1559405f0931SAlan Somers {
1560405f0931SAlan Somers 	cleanup();
1561405f0931SAlan Somers }
1562405f0931SAlan Somers 
1563405f0931SAlan Somers 
1564405f0931SAlan Somers ATF_TC_WITH_CLEANUP(cap_getmode_failure);
ATF_TC_HEAD(cap_getmode_failure,tc)1565405f0931SAlan Somers ATF_TC_HEAD(cap_getmode_failure, tc)
1566405f0931SAlan Somers {
1567405f0931SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1568405f0931SAlan Somers 					"cap_getmode(2) call");
1569405f0931SAlan Somers }
1570405f0931SAlan Somers 
ATF_TC_BODY(cap_getmode_failure,tc)1571405f0931SAlan Somers ATF_TC_BODY(cap_getmode_failure, tc)
1572405f0931SAlan Somers {
1573405f0931SAlan Somers 	pid = getpid();
1574405f0931SAlan Somers 	snprintf(pcregex, sizeof(pcregex), "cap_getmode.*%d.*failure", pid);
1575405f0931SAlan Somers 
1576405f0931SAlan Somers 	FILE *pipefd = setup(fds, auclass);
1577405f0931SAlan Somers 	/* cap_getmode(2) can either fail with EFAULT or ENOSYS */
1578405f0931SAlan Somers 	ATF_REQUIRE_EQ(-1, cap_getmode(NULL));
1579405f0931SAlan Somers 	check_audit(fds, pcregex, pipefd);
1580405f0931SAlan Somers }
1581405f0931SAlan Somers 
ATF_TC_CLEANUP(cap_getmode_failure,tc)1582405f0931SAlan Somers ATF_TC_CLEANUP(cap_getmode_failure, tc)
1583405f0931SAlan Somers {
1584405f0931SAlan Somers 	cleanup();
1585405f0931SAlan Somers }
1586405f0931SAlan Somers 
1587405f0931SAlan Somers 
ATF_TP_ADD_TCS(tp)1588c907f24eSAlan Somers ATF_TP_ADD_TCS(tp)
1589c907f24eSAlan Somers {
1590c907f24eSAlan Somers 	ATF_TP_ADD_TC(tp, fork_success);
1591405f0931SAlan Somers 	ATF_TP_ADD_TC(tp, _exit_success);
1592c907f24eSAlan Somers 	ATF_TP_ADD_TC(tp, rfork_success);
1593c907f24eSAlan Somers 	ATF_TP_ADD_TC(tp, rfork_failure);
1594c907f24eSAlan Somers 
159518ba95c2SAlan Somers 	ATF_TP_ADD_TC(tp, wait4_success);
159618ba95c2SAlan Somers 	ATF_TP_ADD_TC(tp, wait4_failure);
159718ba95c2SAlan Somers 	ATF_TP_ADD_TC(tp, wait6_success);
159818ba95c2SAlan Somers 	ATF_TP_ADD_TC(tp, wait6_failure);
159918ba95c2SAlan Somers 	ATF_TP_ADD_TC(tp, kill_success);
160018ba95c2SAlan Somers 	ATF_TP_ADD_TC(tp, kill_failure);
160118ba95c2SAlan Somers 
1602c907f24eSAlan Somers 	ATF_TP_ADD_TC(tp, chdir_success);
1603c907f24eSAlan Somers 	ATF_TP_ADD_TC(tp, chdir_failure);
1604c907f24eSAlan Somers 	ATF_TP_ADD_TC(tp, fchdir_success);
1605c907f24eSAlan Somers 	ATF_TP_ADD_TC(tp, fchdir_failure);
1606c907f24eSAlan Somers 	ATF_TP_ADD_TC(tp, chroot_success);
1607c907f24eSAlan Somers 	ATF_TP_ADD_TC(tp, chroot_failure);
1608c907f24eSAlan Somers 
1609c907f24eSAlan Somers 	ATF_TP_ADD_TC(tp, umask_success);
1610c907f24eSAlan Somers 	ATF_TP_ADD_TC(tp, setuid_success);
1611c907f24eSAlan Somers 	ATF_TP_ADD_TC(tp, seteuid_success);
1612c907f24eSAlan Somers 	ATF_TP_ADD_TC(tp, setgid_success);
1613c907f24eSAlan Somers 	ATF_TP_ADD_TC(tp, setegid_success);
1614c907f24eSAlan Somers 
1615c907f24eSAlan Somers 	ATF_TP_ADD_TC(tp, setreuid_success);
1616c907f24eSAlan Somers 	ATF_TP_ADD_TC(tp, setregid_success);
1617c907f24eSAlan Somers 	ATF_TP_ADD_TC(tp, setresuid_success);
1618c907f24eSAlan Somers 	ATF_TP_ADD_TC(tp, setresgid_success);
1619c907f24eSAlan Somers 
1620c907f24eSAlan Somers 	ATF_TP_ADD_TC(tp, getresuid_success);
1621c907f24eSAlan Somers 	ATF_TP_ADD_TC(tp, getresuid_failure);
1622c907f24eSAlan Somers 	ATF_TP_ADD_TC(tp, getresgid_success);
1623c907f24eSAlan Somers 	ATF_TP_ADD_TC(tp, getresgid_failure);
1624c907f24eSAlan Somers 
1625c907f24eSAlan Somers 	ATF_TP_ADD_TC(tp, setpriority_success);
1626c907f24eSAlan Somers 	ATF_TP_ADD_TC(tp, setpriority_failure);
1627c907f24eSAlan Somers 	ATF_TP_ADD_TC(tp, setgroups_success);
1628c907f24eSAlan Somers 	ATF_TP_ADD_TC(tp, setgroups_failure);
1629c907f24eSAlan Somers 	ATF_TP_ADD_TC(tp, setpgrp_success);
1630c907f24eSAlan Somers 	ATF_TP_ADD_TC(tp, setpgrp_failure);
163118ba95c2SAlan Somers 	ATF_TP_ADD_TC(tp, setsid_success);
163218ba95c2SAlan Somers 	ATF_TP_ADD_TC(tp, setsid_failure);
1633c907f24eSAlan Somers 	ATF_TP_ADD_TC(tp, setrlimit_success);
1634c907f24eSAlan Somers 	ATF_TP_ADD_TC(tp, setrlimit_failure);
1635c907f24eSAlan Somers 
1636c907f24eSAlan Somers 	ATF_TP_ADD_TC(tp, mlock_success);
1637c907f24eSAlan Somers 	ATF_TP_ADD_TC(tp, mlock_failure);
1638c907f24eSAlan Somers 	ATF_TP_ADD_TC(tp, munlock_success);
1639c907f24eSAlan Somers 	ATF_TP_ADD_TC(tp, munlock_failure);
1640c907f24eSAlan Somers 	ATF_TP_ADD_TC(tp, minherit_success);
1641c907f24eSAlan Somers 	ATF_TP_ADD_TC(tp, minherit_failure);
1642c907f24eSAlan Somers 
1643c907f24eSAlan Somers 	ATF_TP_ADD_TC(tp, setlogin_success);
1644c907f24eSAlan Somers 	ATF_TP_ADD_TC(tp, setlogin_failure);
1645c907f24eSAlan Somers 	ATF_TP_ADD_TC(tp, rtprio_success);
1646c907f24eSAlan Somers 	ATF_TP_ADD_TC(tp, rtprio_failure);
1647c907f24eSAlan Somers 
1648c907f24eSAlan Somers 	ATF_TP_ADD_TC(tp, profil_success);
1649c907f24eSAlan Somers 	ATF_TP_ADD_TC(tp, profil_failure);
1650c907f24eSAlan Somers 	ATF_TP_ADD_TC(tp, ptrace_success);
1651c907f24eSAlan Somers 	ATF_TP_ADD_TC(tp, ptrace_failure);
1652c907f24eSAlan Somers 	ATF_TP_ADD_TC(tp, ktrace_success);
1653c907f24eSAlan Somers 	ATF_TP_ADD_TC(tp, ktrace_failure);
1654b1b5f04dSAlan Somers 	ATF_TP_ADD_TC(tp, procctl_success);
1655b1b5f04dSAlan Somers 	ATF_TP_ADD_TC(tp, procctl_failure);
1656c907f24eSAlan Somers 
1657405f0931SAlan Somers 	ATF_TP_ADD_TC(tp, cap_enter_success);
1658405f0931SAlan Somers 	ATF_TP_ADD_TC(tp, cap_getmode_success);
1659405f0931SAlan Somers 	ATF_TP_ADD_TC(tp, cap_getmode_failure);
1660405f0931SAlan Somers 
1661c907f24eSAlan Somers 	return (atf_no_error());
1662c907f24eSAlan Somers }
1663