Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/tests/sys/audit/file-close.c
39507 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/mman.h>
27
#include <sys/stat.h>
28
29
#include <atf-c.h>
30
#include <fcntl.h>
31
#include <limits.h>
32
#include <stdint.h>
33
#include <stdlib.h>
34
#include <unistd.h>
35
36
#include "utils.h"
37
38
static pid_t pid;
39
static struct pollfd fds[1];
40
static mode_t mode = 0777;
41
static int filedesc;
42
static char extregex[80];
43
static struct stat statbuff;
44
static const char *auclass = "cl";
45
static const char *path = "fileforaudit";
46
static const char *errpath = "dirdoesnotexist/fileforaudit";
47
static const char *failurereg = "fileforaudit.*return,failure";
48
49
50
ATF_TC_WITH_CLEANUP(munmap_success);
51
ATF_TC_HEAD(munmap_success, tc)
52
{
53
atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
54
"munmap(2) call");
55
}
56
57
ATF_TC_BODY(munmap_success, tc)
58
{
59
pid = getpid();
60
snprintf(extregex, sizeof(extregex), "munmap.*%d.*return,success", pid);
61
62
/* Allocate sample memory, to be removed by munmap(2) */
63
char *addr = mmap(NULL, sizeof(char), PROT_READ , MAP_ANONYMOUS, -1, 0);
64
FILE *pipefd = setup(fds, auclass);
65
ATF_REQUIRE_EQ(0, munmap(addr, sizeof(char)));
66
check_audit(fds, extregex, pipefd);
67
}
68
69
ATF_TC_CLEANUP(munmap_success, tc)
70
{
71
cleanup();
72
}
73
74
75
ATF_TC_WITH_CLEANUP(munmap_failure);
76
ATF_TC_HEAD(munmap_failure, tc)
77
{
78
atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
79
"munmap(2) call");
80
}
81
82
ATF_TC_BODY(munmap_failure, tc)
83
{
84
const char *regex = "munmap.*return,failure : Invalid argument";
85
FILE *pipefd = setup(fds, auclass);
86
ATF_REQUIRE_EQ(-1, munmap((void *)SIZE_MAX, -1));
87
check_audit(fds, regex, pipefd);
88
}
89
90
ATF_TC_CLEANUP(munmap_failure, tc)
91
{
92
cleanup();
93
}
94
95
96
ATF_TC_WITH_CLEANUP(close_success);
97
ATF_TC_HEAD(close_success, tc)
98
{
99
atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
100
"close(2) call");
101
}
102
103
ATF_TC_BODY(close_success, tc)
104
{
105
/* File needs to exist to call close(2) */
106
ATF_REQUIRE((filedesc = open(path, O_CREAT | O_RDWR, mode)) != -1);
107
/* Call stat(2) to store the Inode number of 'path' */
108
ATF_REQUIRE_EQ(0, stat(path, &statbuff));
109
FILE *pipefd = setup(fds, auclass);
110
ATF_REQUIRE_EQ(0, close(filedesc));
111
112
/* intmax_t to support all architectures */
113
snprintf(extregex, sizeof(extregex), "close.*%jd.*return,succes",
114
(intmax_t)statbuff.st_ino);
115
check_audit(fds, extregex, pipefd);
116
}
117
118
ATF_TC_CLEANUP(close_success, tc)
119
{
120
cleanup();
121
}
122
123
124
ATF_TC_WITH_CLEANUP(close_failure);
125
ATF_TC_HEAD(close_failure, tc)
126
{
127
atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
128
"close(2) call");
129
}
130
131
ATF_TC_BODY(close_failure, tc)
132
{
133
const char *regex = "close.*return,failure";
134
FILE *pipefd = setup(fds, auclass);
135
/* Failure reason: file does not exist */
136
ATF_REQUIRE_EQ(-1, close(-1));
137
check_audit(fds, regex, pipefd);
138
}
139
140
ATF_TC_CLEANUP(close_failure, tc)
141
{
142
cleanup();
143
}
144
145
146
ATF_TC_WITH_CLEANUP(closefrom_success);
147
ATF_TC_HEAD(closefrom_success, tc)
148
{
149
atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
150
"closefrom(2) call");
151
}
152
153
ATF_TC_BODY(closefrom_success, tc)
154
{
155
const char *regex = "close_range\\(2\\),.*,0x7fffffff,lowfd,.*"
156
"0xffffffff,highfd,.*return,success";
157
FILE *pipefd = setup(fds, auclass);
158
159
/* closefrom(2) returns 'void' */
160
closefrom(INT_MAX);
161
check_audit(fds, regex, pipefd);
162
}
163
164
ATF_TC_CLEANUP(closefrom_success, tc)
165
{
166
cleanup();
167
}
168
169
170
ATF_TC_WITH_CLEANUP(revoke_success);
171
ATF_TC_HEAD(revoke_success, tc)
172
{
173
atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
174
"revoke(2) call");
175
}
176
177
ATF_TC_BODY(revoke_success, tc)
178
{
179
char *ptyname;
180
pid = getpid();
181
snprintf(extregex, sizeof(extregex), "revoke.*%d.*return,success", pid);
182
183
/* Obtain a pseudo terminal and get the path to slave device */
184
ATF_REQUIRE((filedesc = posix_openpt(O_RDWR | O_NOCTTY)) != -1);
185
ATF_REQUIRE((ptyname = ptsname(filedesc)) != NULL);
186
187
FILE *pipefd = setup(fds, auclass);
188
ATF_REQUIRE_EQ(0, revoke(ptyname));
189
check_audit(fds, extregex, pipefd);
190
close(filedesc);
191
}
192
193
ATF_TC_CLEANUP(revoke_success, tc)
194
{
195
cleanup();
196
}
197
198
199
ATF_TC_WITH_CLEANUP(revoke_failure);
200
ATF_TC_HEAD(revoke_failure, tc)
201
{
202
atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
203
"revoke(2) call");
204
}
205
206
ATF_TC_BODY(revoke_failure, tc)
207
{
208
FILE *pipefd = setup(fds, auclass);
209
/* Failure reason: file does not exist */
210
ATF_REQUIRE_EQ(-1, revoke(errpath));
211
check_audit(fds, failurereg, pipefd);
212
}
213
214
ATF_TC_CLEANUP(revoke_failure, tc)
215
{
216
cleanup();
217
}
218
219
220
ATF_TP_ADD_TCS(tp)
221
{
222
ATF_TP_ADD_TC(tp, munmap_success);
223
ATF_TP_ADD_TC(tp, munmap_failure);
224
225
ATF_TP_ADD_TC(tp, close_success);
226
ATF_TP_ADD_TC(tp, close_failure);
227
ATF_TP_ADD_TC(tp, closefrom_success);
228
229
ATF_TP_ADD_TC(tp, revoke_success);
230
ATF_TP_ADD_TC(tp, revoke_failure);
231
232
return (atf_no_error());
233
}
234
235