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