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