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