Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/tests/sys/audit/file-delete.c
39562 views
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);
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
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
58
ATF_TC_CLEANUP(rmdir_success, tc)
59
{
60
cleanup();
61
}
62
63
64
ATF_TC_WITH_CLEANUP(rmdir_failure);
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
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
79
ATF_TC_CLEANUP(rmdir_failure, tc)
80
{
81
cleanup();
82
}
83
84
85
ATF_TC_WITH_CLEANUP(rename_success);
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
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
101
ATF_TC_CLEANUP(rename_success, tc)
102
{
103
cleanup();
104
}
105
106
107
ATF_TC_WITH_CLEANUP(rename_failure);
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
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
122
ATF_TC_CLEANUP(rename_failure, tc)
123
{
124
cleanup();
125
}
126
127
128
ATF_TC_WITH_CLEANUP(renameat_success);
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
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
144
ATF_TC_CLEANUP(renameat_success, tc)
145
{
146
cleanup();
147
}
148
149
150
ATF_TC_WITH_CLEANUP(renameat_failure);
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
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
165
ATF_TC_CLEANUP(renameat_failure, tc)
166
{
167
cleanup();
168
}
169
170
171
ATF_TC_WITH_CLEANUP(unlink_success);
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
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
187
ATF_TC_CLEANUP(unlink_success, tc)
188
{
189
cleanup();
190
}
191
192
193
ATF_TC_WITH_CLEANUP(unlink_failure);
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
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
208
ATF_TC_CLEANUP(unlink_failure, tc)
209
{
210
cleanup();
211
}
212
213
214
ATF_TC_WITH_CLEANUP(unlinkat_success);
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
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
229
ATF_TC_CLEANUP(unlinkat_success, tc)
230
{
231
cleanup();
232
}
233
234
235
ATF_TC_WITH_CLEANUP(unlinkat_failure);
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
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
250
ATF_TC_CLEANUP(unlinkat_failure, tc)
251
{
252
cleanup();
253
}
254
255
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
274