xref: /freebsd/tests/sys/audit/file-attribute-access.c (revision b13a70d5a4979997a0dbc0795d27bb7e22ec794b)
1f86d6517SAlan Somers /*-
2f86d6517SAlan Somers  * Copyright (c) 2018 Aniket Pandey
3f86d6517SAlan Somers  *
4f86d6517SAlan Somers  * Redistribution and use in source and binary forms, with or without
5f86d6517SAlan Somers  * modification, are permitted provided that the following conditions
6f86d6517SAlan Somers  * are met:
7f86d6517SAlan Somers  * 1. Redistributions of source code must retain the above copyright
8f86d6517SAlan Somers  *    notice, this list of conditions and the following disclaimer.
9f86d6517SAlan Somers  * 2. Redistributions in binary form must reproduce the above copyright
10f86d6517SAlan Somers  *    notice, this list of conditions and the following disclaimer in the
11f86d6517SAlan Somers  *    documentation and/or other materials provided with the distribution.
12f86d6517SAlan Somers  *
13f86d6517SAlan Somers  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14f86d6517SAlan Somers  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15f86d6517SAlan Somers  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16f86d6517SAlan Somers  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17f86d6517SAlan Somers  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18f86d6517SAlan Somers  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19f86d6517SAlan Somers  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
20f86d6517SAlan Somers  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21f86d6517SAlan Somers  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22f86d6517SAlan Somers  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23f86d6517SAlan Somers  * SUCH DAMAGE.
24f86d6517SAlan Somers  *
25f86d6517SAlan Somers  * $FreeBSD$
26f86d6517SAlan Somers  */
27f86d6517SAlan Somers 
28f86d6517SAlan Somers #include <sys/stat.h>
29f86d6517SAlan Somers #include <sys/syscall.h>
30f86d6517SAlan Somers 
31f86d6517SAlan Somers #include <atf-c.h>
32f86d6517SAlan Somers #include <fcntl.h>
33f86d6517SAlan Somers #include <unistd.h>
34f86d6517SAlan Somers 
35f86d6517SAlan Somers #include "utils.h"
36f86d6517SAlan Somers 
37f86d6517SAlan Somers static struct pollfd fds[1];
38f86d6517SAlan Somers static mode_t mode = 0777;
39*b13a70d5SAlan Somers static int filedesc;
40f86d6517SAlan Somers static char extregex[80];
41f86d6517SAlan Somers static struct stat statbuff;
42f86d6517SAlan Somers static const char *auclass = "fa";
43f86d6517SAlan Somers static const char *path = "fileforaudit";
44f86d6517SAlan Somers static const char *errpath = "dirdoesnotexist/fileforaudit";
45f86d6517SAlan Somers static const char *successreg = "fileforaudit.*return,success";
46f86d6517SAlan Somers static const char *failurereg = "fileforaudit.*return,failure";
47f86d6517SAlan Somers 
48f86d6517SAlan Somers 
49f86d6517SAlan Somers ATF_TC_WITH_CLEANUP(stat_success);
50f86d6517SAlan Somers ATF_TC_HEAD(stat_success, tc)
51f86d6517SAlan Somers {
52f86d6517SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
53f86d6517SAlan Somers 					"stat(2) call");
54f86d6517SAlan Somers }
55f86d6517SAlan Somers 
56f86d6517SAlan Somers ATF_TC_BODY(stat_success, tc)
57f86d6517SAlan Somers {
58f86d6517SAlan Somers 	/* File needs to exist to call stat(2) */
59*b13a70d5SAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
60f86d6517SAlan Somers 	FILE *pipefd = setup(fds, auclass);
61f86d6517SAlan Somers 	ATF_REQUIRE_EQ(0, stat(path, &statbuff));
62f86d6517SAlan Somers 	check_audit(fds, successreg, pipefd);
63*b13a70d5SAlan Somers 	close(filedesc);
64f86d6517SAlan Somers }
65f86d6517SAlan Somers 
66f86d6517SAlan Somers ATF_TC_CLEANUP(stat_success, tc)
67f86d6517SAlan Somers {
68f86d6517SAlan Somers 	cleanup();
69f86d6517SAlan Somers }
70f86d6517SAlan Somers 
71f86d6517SAlan Somers 
72f86d6517SAlan Somers ATF_TC_WITH_CLEANUP(stat_failure);
73f86d6517SAlan Somers ATF_TC_HEAD(stat_failure, tc)
74f86d6517SAlan Somers {
75f86d6517SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
76f86d6517SAlan Somers 					"stat(2) call");
77f86d6517SAlan Somers }
78f86d6517SAlan Somers 
79f86d6517SAlan Somers ATF_TC_BODY(stat_failure, tc)
80f86d6517SAlan Somers {
81f86d6517SAlan Somers 	FILE *pipefd = setup(fds, auclass);
82f86d6517SAlan Somers 	/* Failure reason: file does not exist */
83f86d6517SAlan Somers 	ATF_REQUIRE_EQ(-1, stat(errpath, &statbuff));
84f86d6517SAlan Somers 	check_audit(fds, failurereg, pipefd);
85f86d6517SAlan Somers }
86f86d6517SAlan Somers 
87f86d6517SAlan Somers ATF_TC_CLEANUP(stat_failure, tc)
88f86d6517SAlan Somers {
89f86d6517SAlan Somers 	cleanup();
90f86d6517SAlan Somers }
91f86d6517SAlan Somers 
92f86d6517SAlan Somers 
93f86d6517SAlan Somers ATF_TC_WITH_CLEANUP(lstat_success);
94f86d6517SAlan Somers ATF_TC_HEAD(lstat_success, tc)
95f86d6517SAlan Somers {
96f86d6517SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
97f86d6517SAlan Somers 					"lstat(2) call");
98f86d6517SAlan Somers }
99f86d6517SAlan Somers 
100f86d6517SAlan Somers ATF_TC_BODY(lstat_success, tc)
101f86d6517SAlan Somers {
102f86d6517SAlan Somers 	/* Symbolic link needs to exist to call lstat(2) */
103f86d6517SAlan Somers 	ATF_REQUIRE_EQ(0, symlink("symlink", path));
104f86d6517SAlan Somers 	FILE *pipefd = setup(fds, auclass);
105f86d6517SAlan Somers 	ATF_REQUIRE_EQ(0, lstat(path, &statbuff));
106f86d6517SAlan Somers 	check_audit(fds, successreg, pipefd);
107f86d6517SAlan Somers }
108f86d6517SAlan Somers 
109f86d6517SAlan Somers ATF_TC_CLEANUP(lstat_success, tc)
110f86d6517SAlan Somers {
111f86d6517SAlan Somers 	cleanup();
112f86d6517SAlan Somers }
113f86d6517SAlan Somers 
114f86d6517SAlan Somers 
115f86d6517SAlan Somers ATF_TC_WITH_CLEANUP(lstat_failure);
116f86d6517SAlan Somers ATF_TC_HEAD(lstat_failure, tc)
117f86d6517SAlan Somers {
118f86d6517SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
119f86d6517SAlan Somers 					"lstat(2) call");
120f86d6517SAlan Somers }
121f86d6517SAlan Somers 
122f86d6517SAlan Somers ATF_TC_BODY(lstat_failure, tc)
123f86d6517SAlan Somers {
124f86d6517SAlan Somers 	FILE *pipefd = setup(fds, auclass);
125f86d6517SAlan Somers 	/* Failure reason: symbolic link does not exist */
126f86d6517SAlan Somers 	ATF_REQUIRE_EQ(-1, lstat(errpath, &statbuff));
127f86d6517SAlan Somers 	check_audit(fds, failurereg, pipefd);
128f86d6517SAlan Somers }
129f86d6517SAlan Somers 
130f86d6517SAlan Somers ATF_TC_CLEANUP(lstat_failure, tc)
131f86d6517SAlan Somers {
132f86d6517SAlan Somers 	cleanup();
133f86d6517SAlan Somers }
134f86d6517SAlan Somers 
135f86d6517SAlan Somers 
136f86d6517SAlan Somers ATF_TC_WITH_CLEANUP(fstat_success);
137f86d6517SAlan Somers ATF_TC_HEAD(fstat_success, tc)
138f86d6517SAlan Somers {
139f86d6517SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
140f86d6517SAlan Somers 					"fstat(2) call");
141f86d6517SAlan Somers }
142f86d6517SAlan Somers 
143f86d6517SAlan Somers ATF_TC_BODY(fstat_success, tc)
144f86d6517SAlan Somers {
145f86d6517SAlan Somers 	/* File needs to exist to call fstat(2) */
146f86d6517SAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT | O_RDWR, mode)) != -1);
147f86d6517SAlan Somers 	FILE *pipefd = setup(fds, auclass);
148f86d6517SAlan Somers 	ATF_REQUIRE_EQ(0, fstat(filedesc, &statbuff));
149f86d6517SAlan Somers 
150f86d6517SAlan Somers 	snprintf(extregex, sizeof(extregex),
151f86d6517SAlan Somers 		"fstat.*%jd.*return,success", (intmax_t)statbuff.st_ino);
152f86d6517SAlan Somers 	check_audit(fds, extregex, pipefd);
153*b13a70d5SAlan Somers 	close(filedesc);
154f86d6517SAlan Somers }
155f86d6517SAlan Somers 
156f86d6517SAlan Somers ATF_TC_CLEANUP(fstat_success, tc)
157f86d6517SAlan Somers {
158f86d6517SAlan Somers 	cleanup();
159f86d6517SAlan Somers }
160f86d6517SAlan Somers 
161f86d6517SAlan Somers 
162f86d6517SAlan Somers ATF_TC_WITH_CLEANUP(fstat_failure);
163f86d6517SAlan Somers ATF_TC_HEAD(fstat_failure, tc)
164f86d6517SAlan Somers {
165f86d6517SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
166f86d6517SAlan Somers 					"fstat(2) call");
167f86d6517SAlan Somers }
168f86d6517SAlan Somers 
169f86d6517SAlan Somers ATF_TC_BODY(fstat_failure, tc)
170f86d6517SAlan Somers {
171f86d6517SAlan Somers 	FILE *pipefd = setup(fds, auclass);
172f86d6517SAlan Somers 	const char *regex = "fstat.*return,failure : Bad file descriptor";
173f86d6517SAlan Somers 	/* Failure reason: bad file descriptor */
174f86d6517SAlan Somers 	ATF_REQUIRE_EQ(-1, fstat(-1, &statbuff));
175f86d6517SAlan Somers 	check_audit(fds, regex, pipefd);
176f86d6517SAlan Somers }
177f86d6517SAlan Somers 
178f86d6517SAlan Somers ATF_TC_CLEANUP(fstat_failure, tc)
179f86d6517SAlan Somers {
180f86d6517SAlan Somers 	cleanup();
181f86d6517SAlan Somers }
182f86d6517SAlan Somers 
183f86d6517SAlan Somers 
184f86d6517SAlan Somers ATF_TC_WITH_CLEANUP(fstatat_success);
185f86d6517SAlan Somers ATF_TC_HEAD(fstatat_success, tc)
186f86d6517SAlan Somers {
187f86d6517SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
188f86d6517SAlan Somers 					"fstatat(2) call");
189f86d6517SAlan Somers }
190f86d6517SAlan Somers 
191f86d6517SAlan Somers ATF_TC_BODY(fstatat_success, tc)
192f86d6517SAlan Somers {
193f86d6517SAlan Somers 	/* File or Symbolic link needs to exist to call lstat(2) */
194f86d6517SAlan Somers 	ATF_REQUIRE_EQ(0, symlink("symlink", path));
195f86d6517SAlan Somers 	FILE *pipefd = setup(fds, auclass);
196f86d6517SAlan Somers 	ATF_REQUIRE_EQ(0, fstatat(AT_FDCWD, path, &statbuff,
197f86d6517SAlan Somers 		AT_SYMLINK_NOFOLLOW));
198f86d6517SAlan Somers 	check_audit(fds, successreg, pipefd);
199f86d6517SAlan Somers }
200f86d6517SAlan Somers 
201f86d6517SAlan Somers ATF_TC_CLEANUP(fstatat_success, tc)
202f86d6517SAlan Somers {
203f86d6517SAlan Somers 	cleanup();
204f86d6517SAlan Somers }
205f86d6517SAlan Somers 
206f86d6517SAlan Somers 
207f86d6517SAlan Somers ATF_TC_WITH_CLEANUP(fstatat_failure);
208f86d6517SAlan Somers ATF_TC_HEAD(fstatat_failure, tc)
209f86d6517SAlan Somers {
210f86d6517SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
211f86d6517SAlan Somers 					"fstatat(2) call");
212f86d6517SAlan Somers }
213f86d6517SAlan Somers 
214f86d6517SAlan Somers ATF_TC_BODY(fstatat_failure, tc)
215f86d6517SAlan Somers {
216f86d6517SAlan Somers 	FILE *pipefd = setup(fds, auclass);
217f86d6517SAlan Somers 	/* Failure reason: symbolic link does not exist */
218f86d6517SAlan Somers 	ATF_REQUIRE_EQ(-1, fstatat(AT_FDCWD, path, &statbuff,
219f86d6517SAlan Somers 		AT_SYMLINK_NOFOLLOW));
220f86d6517SAlan Somers 	check_audit(fds, failurereg, pipefd);
221f86d6517SAlan Somers }
222f86d6517SAlan Somers 
223f86d6517SAlan Somers ATF_TC_CLEANUP(fstatat_failure, tc)
224f86d6517SAlan Somers {
225f86d6517SAlan Somers 	cleanup();
226f86d6517SAlan Somers }
227f86d6517SAlan Somers 
228f86d6517SAlan Somers 
229f86d6517SAlan Somers ATF_TP_ADD_TCS(tp)
230f86d6517SAlan Somers {
231f86d6517SAlan Somers 	ATF_TP_ADD_TC(tp, stat_success);
232f86d6517SAlan Somers 	ATF_TP_ADD_TC(tp, stat_failure);
233f86d6517SAlan Somers 	ATF_TP_ADD_TC(tp, lstat_success);
234f86d6517SAlan Somers 	ATF_TP_ADD_TC(tp, lstat_failure);
235f86d6517SAlan Somers 	ATF_TP_ADD_TC(tp, fstat_success);
236f86d6517SAlan Somers 	ATF_TP_ADD_TC(tp, fstat_failure);
237f86d6517SAlan Somers 	ATF_TP_ADD_TC(tp, fstatat_success);
238f86d6517SAlan Somers 	ATF_TP_ADD_TC(tp, fstatat_failure);
239f86d6517SAlan Somers 
240f86d6517SAlan Somers 	return (atf_no_error());
241f86d6517SAlan Somers }
242