xref: /freebsd/tests/sys/audit/file-delete.c (revision b3e7694832e81d7a904a10f525f8797b753bf0d3)
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 
26a19dca2dSAlan Somers #include <sys/stat.h>
27a19dca2dSAlan Somers 
28a19dca2dSAlan Somers #include <atf-c.h>
29a19dca2dSAlan Somers #include <fcntl.h>
30a19dca2dSAlan Somers #include <unistd.h>
31a19dca2dSAlan Somers 
32a19dca2dSAlan Somers #include "utils.h"
33a19dca2dSAlan Somers 
34a19dca2dSAlan Somers static struct pollfd fds[1];
35a19dca2dSAlan Somers static mode_t mode = 0777;
36*b13a70d5SAlan Somers static int filedesc;
37a19dca2dSAlan Somers static const char *path = "fileforaudit";
38a19dca2dSAlan Somers static const char *errpath = "dirdoesnotexist/fileforaudit";
39a19dca2dSAlan Somers static const char *successreg = "fileforaudit.*return,success";
40a19dca2dSAlan Somers static const char *failurereg = "fileforaudit.*return,failure";
41a19dca2dSAlan Somers 
42a19dca2dSAlan Somers 
43a19dca2dSAlan Somers ATF_TC_WITH_CLEANUP(rmdir_success);
ATF_TC_HEAD(rmdir_success,tc)44a19dca2dSAlan Somers ATF_TC_HEAD(rmdir_success, tc)
45a19dca2dSAlan Somers {
46a19dca2dSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
47a19dca2dSAlan Somers 					"rmdir(2) call");
48a19dca2dSAlan Somers }
49a19dca2dSAlan Somers 
ATF_TC_BODY(rmdir_success,tc)50a19dca2dSAlan Somers ATF_TC_BODY(rmdir_success, tc)
51a19dca2dSAlan Somers {
52a19dca2dSAlan Somers 	ATF_REQUIRE_EQ(0, mkdir(path, mode));
53a19dca2dSAlan Somers 	FILE *pipefd = setup(fds, "fd");
54a19dca2dSAlan Somers 	ATF_REQUIRE_EQ(0, rmdir(path));
55a19dca2dSAlan Somers 	check_audit(fds, successreg, pipefd);
56a19dca2dSAlan Somers }
57a19dca2dSAlan Somers 
ATF_TC_CLEANUP(rmdir_success,tc)58a19dca2dSAlan Somers ATF_TC_CLEANUP(rmdir_success, tc)
59a19dca2dSAlan Somers {
60a19dca2dSAlan Somers 	cleanup();
61a19dca2dSAlan Somers }
62a19dca2dSAlan Somers 
63a19dca2dSAlan Somers 
64a19dca2dSAlan Somers ATF_TC_WITH_CLEANUP(rmdir_failure);
ATF_TC_HEAD(rmdir_failure,tc)65a19dca2dSAlan Somers ATF_TC_HEAD(rmdir_failure, tc)
66a19dca2dSAlan Somers {
67a19dca2dSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
68a19dca2dSAlan Somers 					"rmdir(2) call");
69a19dca2dSAlan Somers }
70a19dca2dSAlan Somers 
ATF_TC_BODY(rmdir_failure,tc)71a19dca2dSAlan Somers ATF_TC_BODY(rmdir_failure, tc)
72a19dca2dSAlan Somers {
73a19dca2dSAlan Somers 	FILE *pipefd = setup(fds, "fd");
74a19dca2dSAlan Somers 	/* Failure reason: directory does not exist */
75a19dca2dSAlan Somers 	ATF_REQUIRE_EQ(-1, rmdir(errpath));
76a19dca2dSAlan Somers 	check_audit(fds, failurereg, pipefd);
77a19dca2dSAlan Somers }
78a19dca2dSAlan Somers 
ATF_TC_CLEANUP(rmdir_failure,tc)79a19dca2dSAlan Somers ATF_TC_CLEANUP(rmdir_failure, tc)
80a19dca2dSAlan Somers {
81a19dca2dSAlan Somers 	cleanup();
82a19dca2dSAlan Somers }
83a19dca2dSAlan Somers 
84a19dca2dSAlan Somers 
85a19dca2dSAlan Somers ATF_TC_WITH_CLEANUP(rename_success);
ATF_TC_HEAD(rename_success,tc)86a19dca2dSAlan Somers ATF_TC_HEAD(rename_success, tc)
87a19dca2dSAlan Somers {
88a19dca2dSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
89a19dca2dSAlan Somers 					"rename(2) call");
90a19dca2dSAlan Somers }
91a19dca2dSAlan Somers 
ATF_TC_BODY(rename_success,tc)92a19dca2dSAlan Somers ATF_TC_BODY(rename_success, tc)
93a19dca2dSAlan Somers {
94*b13a70d5SAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
95a19dca2dSAlan Somers 	FILE *pipefd = setup(fds, "fd");
96a19dca2dSAlan Somers 	ATF_REQUIRE_EQ(0, rename(path, "renamed"));
97a19dca2dSAlan Somers 	check_audit(fds, successreg, pipefd);
98*b13a70d5SAlan Somers 	close(filedesc);
99a19dca2dSAlan Somers }
100a19dca2dSAlan Somers 
ATF_TC_CLEANUP(rename_success,tc)101a19dca2dSAlan Somers ATF_TC_CLEANUP(rename_success, tc)
102a19dca2dSAlan Somers {
103a19dca2dSAlan Somers 	cleanup();
104a19dca2dSAlan Somers }
105a19dca2dSAlan Somers 
106a19dca2dSAlan Somers 
107a19dca2dSAlan Somers ATF_TC_WITH_CLEANUP(rename_failure);
ATF_TC_HEAD(rename_failure,tc)108a19dca2dSAlan Somers ATF_TC_HEAD(rename_failure, tc)
109a19dca2dSAlan Somers {
110a19dca2dSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
111a19dca2dSAlan Somers 					"rename(2) call");
112a19dca2dSAlan Somers }
113a19dca2dSAlan Somers 
ATF_TC_BODY(rename_failure,tc)114a19dca2dSAlan Somers ATF_TC_BODY(rename_failure, tc)
115a19dca2dSAlan Somers {
116a19dca2dSAlan Somers 	FILE *pipefd = setup(fds, "fd");
117a19dca2dSAlan Somers 	/* Failure reason: file does not exist */
118a19dca2dSAlan Somers 	ATF_REQUIRE_EQ(-1, rename(path, "renamed"));
119a19dca2dSAlan Somers 	check_audit(fds, failurereg, pipefd);
120a19dca2dSAlan Somers }
121a19dca2dSAlan Somers 
ATF_TC_CLEANUP(rename_failure,tc)122a19dca2dSAlan Somers ATF_TC_CLEANUP(rename_failure, tc)
123a19dca2dSAlan Somers {
124a19dca2dSAlan Somers 	cleanup();
125a19dca2dSAlan Somers }
126a19dca2dSAlan Somers 
127a19dca2dSAlan Somers 
128a19dca2dSAlan Somers ATF_TC_WITH_CLEANUP(renameat_success);
ATF_TC_HEAD(renameat_success,tc)129a19dca2dSAlan Somers ATF_TC_HEAD(renameat_success, tc)
130a19dca2dSAlan Somers {
131a19dca2dSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
132a19dca2dSAlan Somers 					"renameat(2) call");
133a19dca2dSAlan Somers }
134a19dca2dSAlan Somers 
ATF_TC_BODY(renameat_success,tc)135a19dca2dSAlan Somers ATF_TC_BODY(renameat_success, tc)
136a19dca2dSAlan Somers {
137*b13a70d5SAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
138a19dca2dSAlan Somers 	FILE *pipefd = setup(fds, "fd");
139a19dca2dSAlan Somers 	ATF_REQUIRE_EQ(0, renameat(AT_FDCWD, path, AT_FDCWD, "renamed"));
140a19dca2dSAlan Somers 	check_audit(fds, successreg, pipefd);
141*b13a70d5SAlan Somers 	close(filedesc);
142a19dca2dSAlan Somers }
143a19dca2dSAlan Somers 
ATF_TC_CLEANUP(renameat_success,tc)144a19dca2dSAlan Somers ATF_TC_CLEANUP(renameat_success, tc)
145a19dca2dSAlan Somers {
146a19dca2dSAlan Somers 	cleanup();
147a19dca2dSAlan Somers }
148a19dca2dSAlan Somers 
149a19dca2dSAlan Somers 
150a19dca2dSAlan Somers ATF_TC_WITH_CLEANUP(renameat_failure);
ATF_TC_HEAD(renameat_failure,tc)151a19dca2dSAlan Somers ATF_TC_HEAD(renameat_failure, tc)
152a19dca2dSAlan Somers {
153a19dca2dSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
154a19dca2dSAlan Somers 					"renameat(2) call");
155a19dca2dSAlan Somers }
156a19dca2dSAlan Somers 
ATF_TC_BODY(renameat_failure,tc)157a19dca2dSAlan Somers ATF_TC_BODY(renameat_failure, tc)
158a19dca2dSAlan Somers {
159a19dca2dSAlan Somers 	FILE *pipefd = setup(fds, "fd");
160a19dca2dSAlan Somers 	/* Failure reason: file does not exist */
161a19dca2dSAlan Somers 	ATF_REQUIRE_EQ(-1, renameat(AT_FDCWD, path, AT_FDCWD, "renamed"));
162a19dca2dSAlan Somers 	check_audit(fds, failurereg, pipefd);
163a19dca2dSAlan Somers }
164a19dca2dSAlan Somers 
ATF_TC_CLEANUP(renameat_failure,tc)165a19dca2dSAlan Somers ATF_TC_CLEANUP(renameat_failure, tc)
166a19dca2dSAlan Somers {
167a19dca2dSAlan Somers 	cleanup();
168a19dca2dSAlan Somers }
169a19dca2dSAlan Somers 
170a19dca2dSAlan Somers 
171a19dca2dSAlan Somers ATF_TC_WITH_CLEANUP(unlink_success);
ATF_TC_HEAD(unlink_success,tc)172a19dca2dSAlan Somers ATF_TC_HEAD(unlink_success, tc)
173a19dca2dSAlan Somers {
174a19dca2dSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
175a19dca2dSAlan Somers 					"unlink(2) call");
176a19dca2dSAlan Somers }
177a19dca2dSAlan Somers 
ATF_TC_BODY(unlink_success,tc)178a19dca2dSAlan Somers ATF_TC_BODY(unlink_success, tc)
179a19dca2dSAlan Somers {
180*b13a70d5SAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
181a19dca2dSAlan Somers 	FILE *pipefd = setup(fds, "fd");
182a19dca2dSAlan Somers 	ATF_REQUIRE_EQ(0, unlink(path));
183a19dca2dSAlan Somers 	check_audit(fds, successreg, pipefd);
184*b13a70d5SAlan Somers 	close(filedesc);
185a19dca2dSAlan Somers }
186a19dca2dSAlan Somers 
ATF_TC_CLEANUP(unlink_success,tc)187a19dca2dSAlan Somers ATF_TC_CLEANUP(unlink_success, tc)
188a19dca2dSAlan Somers {
189a19dca2dSAlan Somers 	cleanup();
190a19dca2dSAlan Somers }
191a19dca2dSAlan Somers 
192a19dca2dSAlan Somers 
193a19dca2dSAlan Somers ATF_TC_WITH_CLEANUP(unlink_failure);
ATF_TC_HEAD(unlink_failure,tc)194a19dca2dSAlan Somers ATF_TC_HEAD(unlink_failure, tc)
195a19dca2dSAlan Somers {
196a19dca2dSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
197a19dca2dSAlan Somers 					"unlink(2) call");
198a19dca2dSAlan Somers }
199a19dca2dSAlan Somers 
ATF_TC_BODY(unlink_failure,tc)200a19dca2dSAlan Somers ATF_TC_BODY(unlink_failure, tc)
201a19dca2dSAlan Somers {
202a19dca2dSAlan Somers 	FILE *pipefd = setup(fds, "fd");
203a19dca2dSAlan Somers 	/* Failure reason: file does not exist */
204a19dca2dSAlan Somers 	ATF_REQUIRE_EQ(-1, unlink(errpath));
205a19dca2dSAlan Somers 	check_audit(fds, failurereg, pipefd);
206a19dca2dSAlan Somers }
207a19dca2dSAlan Somers 
ATF_TC_CLEANUP(unlink_failure,tc)208a19dca2dSAlan Somers ATF_TC_CLEANUP(unlink_failure, tc)
209a19dca2dSAlan Somers {
210a19dca2dSAlan Somers 	cleanup();
211a19dca2dSAlan Somers }
212a19dca2dSAlan Somers 
213a19dca2dSAlan Somers 
214a19dca2dSAlan Somers ATF_TC_WITH_CLEANUP(unlinkat_success);
ATF_TC_HEAD(unlinkat_success,tc)215a19dca2dSAlan Somers ATF_TC_HEAD(unlinkat_success, tc)
216a19dca2dSAlan Somers {
217a19dca2dSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
218a19dca2dSAlan Somers 					"unlinkat(2) call");
219a19dca2dSAlan Somers }
220a19dca2dSAlan Somers 
ATF_TC_BODY(unlinkat_success,tc)221a19dca2dSAlan Somers ATF_TC_BODY(unlinkat_success, tc)
222a19dca2dSAlan Somers {
223a19dca2dSAlan Somers 	ATF_REQUIRE_EQ(0, mkdir(path, mode));
224a19dca2dSAlan Somers 	FILE *pipefd = setup(fds, "fd");
225a19dca2dSAlan Somers 	ATF_REQUIRE_EQ(0, unlinkat(AT_FDCWD, path, AT_REMOVEDIR));
226a19dca2dSAlan Somers 	check_audit(fds, successreg, pipefd);
227a19dca2dSAlan Somers }
228a19dca2dSAlan Somers 
ATF_TC_CLEANUP(unlinkat_success,tc)229a19dca2dSAlan Somers ATF_TC_CLEANUP(unlinkat_success, tc)
230a19dca2dSAlan Somers {
231a19dca2dSAlan Somers 	cleanup();
232a19dca2dSAlan Somers }
233a19dca2dSAlan Somers 
234a19dca2dSAlan Somers 
235a19dca2dSAlan Somers ATF_TC_WITH_CLEANUP(unlinkat_failure);
ATF_TC_HEAD(unlinkat_failure,tc)236a19dca2dSAlan Somers ATF_TC_HEAD(unlinkat_failure, tc)
237a19dca2dSAlan Somers {
238a19dca2dSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
239a19dca2dSAlan Somers 					"unlinkat(2) call");
240a19dca2dSAlan Somers }
241a19dca2dSAlan Somers 
ATF_TC_BODY(unlinkat_failure,tc)242a19dca2dSAlan Somers ATF_TC_BODY(unlinkat_failure, tc)
243a19dca2dSAlan Somers {
244a19dca2dSAlan Somers 	FILE *pipefd = setup(fds, "fd");
245a19dca2dSAlan Somers 	/* Failure reason: directory does not exist */
246a19dca2dSAlan Somers 	ATF_REQUIRE_EQ(-1, unlinkat(AT_FDCWD, errpath, AT_REMOVEDIR));
247a19dca2dSAlan Somers 	check_audit(fds, failurereg, pipefd);
248a19dca2dSAlan Somers }
249a19dca2dSAlan Somers 
ATF_TC_CLEANUP(unlinkat_failure,tc)250a19dca2dSAlan Somers ATF_TC_CLEANUP(unlinkat_failure, tc)
251a19dca2dSAlan Somers {
252a19dca2dSAlan Somers 	cleanup();
253a19dca2dSAlan Somers }
254a19dca2dSAlan Somers 
255a19dca2dSAlan Somers 
ATF_TP_ADD_TCS(tp)256a19dca2dSAlan Somers ATF_TP_ADD_TCS(tp)
257a19dca2dSAlan Somers {
258a19dca2dSAlan Somers 	ATF_TP_ADD_TC(tp, rmdir_success);
259a19dca2dSAlan Somers 	ATF_TP_ADD_TC(tp, rmdir_failure);
260a19dca2dSAlan Somers 
261a19dca2dSAlan Somers 	ATF_TP_ADD_TC(tp, rename_success);
262a19dca2dSAlan Somers 	ATF_TP_ADD_TC(tp, rename_failure);
263a19dca2dSAlan Somers 	ATF_TP_ADD_TC(tp, renameat_success);
264a19dca2dSAlan Somers 	ATF_TP_ADD_TC(tp, renameat_failure);
265a19dca2dSAlan Somers 
266a19dca2dSAlan Somers 	ATF_TP_ADD_TC(tp, unlink_success);
267a19dca2dSAlan Somers 	ATF_TP_ADD_TC(tp, unlink_failure);
268a19dca2dSAlan Somers 	ATF_TP_ADD_TC(tp, unlinkat_success);
269a19dca2dSAlan Somers 	ATF_TP_ADD_TC(tp, unlinkat_failure);
270a19dca2dSAlan Somers 
271a19dca2dSAlan Somers 	return (atf_no_error());
272a19dca2dSAlan Somers }
273