| @@ -1,14 +1,14 @@ | | | @@ -1,14 +1,14 @@ |
1 | /* $NetBSD: t_o_search.c,v 1.5 2017/01/10 22:25:01 christos Exp $ */ | | 1 | /* $NetBSD: t_o_search.c,v 1.6 2020/01/28 07:12:08 martin Exp $ */ |
2 | | | 2 | |
3 | /*- | | 3 | /*- |
4 | * Copyright (c) 2012 The NetBSD Foundation, Inc. | | 4 | * Copyright (c) 2012 The NetBSD Foundation, Inc. |
5 | * All rights reserved. | | 5 | * All rights reserved. |
6 | * | | 6 | * |
7 | * This code is derived from software contributed to The NetBSD Foundation | | 7 | * This code is derived from software contributed to The NetBSD Foundation |
8 | * by Emmanuel Dreyfus. | | 8 | * by Emmanuel Dreyfus. |
9 | * | | 9 | * |
10 | * Redistribution and use in source and binary forms, with or without | | 10 | * Redistribution and use in source and binary forms, with or without |
11 | * modification, are permitted provided that the following conditions | | 11 | * modification, are permitted provided that the following conditions |
12 | * are met: | | 12 | * are met: |
13 | * 1. Redistributions of source code must retain the above copyright | | 13 | * 1. Redistributions of source code must retain the above copyright |
14 | * notice, this list of conditions and the following disclaimer. | | 14 | * notice, this list of conditions and the following disclaimer. |
| @@ -19,27 +19,27 @@ | | | @@ -19,27 +19,27 @@ |
19 | * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS | | 19 | * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS |
20 | * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED | | 20 | * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
21 | * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | | 21 | * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
22 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS | | 22 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS |
23 | * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | | 23 | * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
24 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | | 24 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
25 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | | 25 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
26 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | | 26 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
27 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | | 27 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
28 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | | 28 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
29 | * POSSIBILITY OF SUCH DAMAGE. | | 29 | * POSSIBILITY OF SUCH DAMAGE. |
30 | */ | | 30 | */ |
31 | #include <sys/cdefs.h> | | 31 | #include <sys/cdefs.h> |
32 | __RCSID("$NetBSD: t_o_search.c,v 1.5 2017/01/10 22:25:01 christos Exp $"); | | 32 | __RCSID("$NetBSD: t_o_search.c,v 1.6 2020/01/28 07:12:08 martin Exp $"); |
33 | | | 33 | |
34 | #include <atf-c.h> | | 34 | #include <atf-c.h> |
35 | | | 35 | |
36 | #include <sys/param.h> | | 36 | #include <sys/param.h> |
37 | #include <sys/stat.h> | | 37 | #include <sys/stat.h> |
38 | | | 38 | |
39 | #include <errno.h> | | 39 | #include <errno.h> |
40 | #include <fcntl.h> | | 40 | #include <fcntl.h> |
41 | #include <limits.h> | | 41 | #include <limits.h> |
42 | #include <paths.h> | | 42 | #include <paths.h> |
43 | #include <stdio.h> | | 43 | #include <stdio.h> |
44 | #include <string.h> | | 44 | #include <string.h> |
45 | #include <unistd.h> | | 45 | #include <unistd.h> |
| @@ -69,27 +69,27 @@ ATF_TC_BODY(o_search_perm1, tc) | | | @@ -69,27 +69,27 @@ ATF_TC_BODY(o_search_perm1, tc) |
69 | { | | 69 | { |
70 | int dfd; | | 70 | int dfd; |
71 | int fd; | | 71 | int fd; |
72 | | | 72 | |
73 | ATF_REQUIRE(mkdir(DIR, 0755) == 0); | | 73 | ATF_REQUIRE(mkdir(DIR, 0755) == 0); |
74 | ATF_REQUIRE((fd = open(FILE, O_CREAT|O_RDWR, 0644)) != -1); | | 74 | ATF_REQUIRE((fd = open(FILE, O_CREAT|O_RDWR, 0644)) != -1); |
75 | ATF_REQUIRE(close(fd) == 0); | | 75 | ATF_REQUIRE(close(fd) == 0); |
76 | | | 76 | |
77 | ATF_REQUIRE((dfd = open(DIR, O_RDONLY, 0)) != -1); | | 77 | ATF_REQUIRE((dfd = open(DIR, O_RDONLY, 0)) != -1); |
78 | | | 78 | |
79 | ATF_REQUIRE((fd = openat(dfd, BASEFILE, O_RDWR, 0)) != -1); | | 79 | ATF_REQUIRE((fd = openat(dfd, BASEFILE, O_RDWR, 0)) != -1); |
80 | ATF_REQUIRE(close(fd) == 0); | | 80 | ATF_REQUIRE(close(fd) == 0); |
81 | | | 81 | |
82 | ATF_REQUIRE(fchmod(dfd, 644) == 0); | | 82 | ATF_REQUIRE(fchmod(dfd, 0644) == 0); |
83 | | | 83 | |
84 | ATF_REQUIRE((fd = openat(dfd, BASEFILE, O_RDWR, 0)) == -1); | | 84 | ATF_REQUIRE((fd = openat(dfd, BASEFILE, O_RDWR, 0)) == -1); |
85 | ATF_REQUIRE(errno == EACCES); | | 85 | ATF_REQUIRE(errno == EACCES); |
86 | | | 86 | |
87 | ATF_REQUIRE(close(dfd) == 0); | | 87 | ATF_REQUIRE(close(dfd) == 0); |
88 | } | | 88 | } |
89 | | | 89 | |
90 | #ifdef USE_O_SEARCH | | 90 | #ifdef USE_O_SEARCH |
91 | | | 91 | |
92 | ATF_TC(o_search_root_flag1); | | 92 | ATF_TC(o_search_root_flag1); |
93 | ATF_TC_HEAD(o_search_root_flag1, tc) | | 93 | ATF_TC_HEAD(o_search_root_flag1, tc) |
94 | { | | 94 | { |
95 | atf_tc_set_md_var(tc, "descr", "See that root openat honours O_SEARCH"); | | 95 | atf_tc_set_md_var(tc, "descr", "See that root openat honours O_SEARCH"); |
| @@ -99,91 +99,91 @@ ATF_TC_BODY(o_search_root_flag1, tc) | | | @@ -99,91 +99,91 @@ ATF_TC_BODY(o_search_root_flag1, tc) |
99 | { | | 99 | { |
100 | int dfd; | | 100 | int dfd; |
101 | int fd; | | 101 | int fd; |
102 | | | 102 | |
103 | ATF_REQUIRE(mkdir(DIR, 0755) == 0); | | 103 | ATF_REQUIRE(mkdir(DIR, 0755) == 0); |
104 | ATF_REQUIRE((fd = open(FILE, O_CREAT|O_RDWR, 0644)) != -1); | | 104 | ATF_REQUIRE((fd = open(FILE, O_CREAT|O_RDWR, 0644)) != -1); |
105 | ATF_REQUIRE(close(fd) == 0); | | 105 | ATF_REQUIRE(close(fd) == 0); |
106 | | | 106 | |
107 | ATF_REQUIRE((dfd = open(DIR, O_RDONLY|O_SEARCH, 0)) != -1); | | 107 | ATF_REQUIRE((dfd = open(DIR, O_RDONLY|O_SEARCH, 0)) != -1); |
108 | | | 108 | |
109 | ATF_REQUIRE((fd = openat(dfd, BASEFILE, O_RDWR, 0)) != -1); | | 109 | ATF_REQUIRE((fd = openat(dfd, BASEFILE, O_RDWR, 0)) != -1); |
110 | ATF_REQUIRE(close(fd) == 0); | | 110 | ATF_REQUIRE(close(fd) == 0); |
111 | | | 111 | |
112 | ATF_REQUIRE(fchmod(dfd, 644) == 0); | | 112 | ATF_REQUIRE(fchmod(dfd, 0644) == 0); |
113 | | | 113 | |
114 | ATF_REQUIRE((fd = openat(dfd, BASEFILE, O_RDWR, 0)) != -1); | | 114 | ATF_REQUIRE((fd = openat(dfd, BASEFILE, O_RDWR, 0)) != -1); |
115 | ATF_REQUIRE(close(fd) == 0); | | 115 | ATF_REQUIRE(close(fd) == 0); |
116 | | | 116 | |
117 | ATF_REQUIRE(fchmod(dfd, 444) == 0); | | 117 | ATF_REQUIRE(fchmod(dfd, 0444) == 0); |
118 | | | 118 | |
119 | ATF_REQUIRE((fd = openat(dfd, BASEFILE, O_RDWR, 0)) != -1); | | 119 | ATF_REQUIRE((fd = openat(dfd, BASEFILE, O_RDWR, 0)) != -1); |
120 | | | 120 | |
121 | ATF_REQUIRE(close(dfd) == 0); | | 121 | ATF_REQUIRE(close(dfd) == 0); |
122 | } | | 122 | } |
123 | | | 123 | |
124 | ATF_TC(o_search_unpriv_flag1); | | 124 | ATF_TC(o_search_unpriv_flag1); |
125 | ATF_TC_HEAD(o_search_unpriv_flag1, tc) | | 125 | ATF_TC_HEAD(o_search_unpriv_flag1, tc) |
126 | { | | 126 | { |
127 | atf_tc_set_md_var(tc, "descr", "See that openat honours O_SEARCH"); | | 127 | atf_tc_set_md_var(tc, "descr", "See that openat honours O_SEARCH"); |
128 | atf_tc_set_md_var(tc, "require.user", "unprivileged"); | | 128 | atf_tc_set_md_var(tc, "require.user", "unprivileged"); |
129 | } | | 129 | } |
130 | ATF_TC_BODY(o_search_unpriv_flag1, tc) | | 130 | ATF_TC_BODY(o_search_unpriv_flag1, tc) |
131 | { | | 131 | { |
132 | int dfd; | | 132 | int dfd; |
133 | int fd; | | 133 | int fd; |
134 | | | 134 | |
135 | ATF_REQUIRE(mkdir(DIR, 0755) == 0); | | 135 | ATF_REQUIRE(mkdir(DIR, 0755) == 0); |
136 | ATF_REQUIRE((fd = open(FILE, O_CREAT|O_RDWR, 0644)) != -1); | | 136 | ATF_REQUIRE((fd = open(FILE, O_CREAT|O_RDWR, 0644)) != -1); |
137 | ATF_REQUIRE(close(fd) == 0); | | 137 | ATF_REQUIRE(close(fd) == 0); |
138 | | | 138 | |
139 | ATF_REQUIRE((dfd = open(DIR, O_RDONLY|O_SEARCH, 0)) != -1); | | 139 | ATF_REQUIRE((dfd = open(DIR, O_RDONLY|O_SEARCH, 0)) != -1); |
140 | | | 140 | |
141 | ATF_REQUIRE((fd = openat(dfd, BASEFILE, O_RDWR, 0)) != -1); | | 141 | ATF_REQUIRE((fd = openat(dfd, BASEFILE, O_RDWR, 0)) != -1); |
142 | ATF_REQUIRE(close(fd) == 0); | | 142 | ATF_REQUIRE(close(fd) == 0); |
143 | | | 143 | |
144 | ATF_REQUIRE(fchmod(dfd, 644) == 0); | | 144 | ATF_REQUIRE(fchmod(dfd, 0644) == 0); |
145 | | | 145 | |
146 | ATF_REQUIRE((fd = openat(dfd, BASEFILE, O_RDWR, 0)) != -1); | | 146 | ATF_REQUIRE((fd = openat(dfd, BASEFILE, O_RDWR, 0)) != -1); |
147 | ATF_REQUIRE(close(fd) == 0); | | 147 | ATF_REQUIRE(close(fd) == 0); |
148 | | | 148 | |
149 | ATF_REQUIRE(fchmod(dfd, 444) == 0); | | 149 | ATF_REQUIRE(fchmod(dfd, 0444) == 0); |
150 | | | 150 | |
151 | ATF_REQUIRE((fd = openat(dfd, BASEFILE, O_RDWR, 0)) != -1); | | 151 | ATF_REQUIRE((fd = openat(dfd, BASEFILE, O_RDWR, 0)) != -1); |
152 | | | 152 | |
153 | ATF_REQUIRE(close(dfd) == 0); | | 153 | ATF_REQUIRE(close(dfd) == 0); |
154 | } | | 154 | } |
155 | | | 155 | |
156 | #endif /* USE_O_SEARCH */ | | 156 | #endif /* USE_O_SEARCH */ |
157 | | | 157 | |
158 | ATF_TC(o_search_perm2); | | 158 | ATF_TC(o_search_perm2); |
159 | ATF_TC_HEAD(o_search_perm2, tc) | | 159 | ATF_TC_HEAD(o_search_perm2, tc) |
160 | { | | 160 | { |
161 | atf_tc_set_md_var(tc, "descr", "See that faccessat enforces search permission"); | | 161 | atf_tc_set_md_var(tc, "descr", "See that faccessat enforces search permission"); |
162 | atf_tc_set_md_var(tc, "require.user", "unprivileged"); | | 162 | atf_tc_set_md_var(tc, "require.user", "unprivileged"); |
163 | } | | 163 | } |
164 | ATF_TC_BODY(o_search_perm2, tc) | | 164 | ATF_TC_BODY(o_search_perm2, tc) |
165 | { | | 165 | { |
166 | int dfd; | | 166 | int dfd; |
167 | int fd; | | 167 | int fd; |
168 | ATF_REQUIRE(mkdir(DIR, 0755) == 0); | | 168 | ATF_REQUIRE(mkdir(DIR, 0755) == 0); |
169 | ATF_REQUIRE((fd = open(FILE, O_CREAT|O_RDWR, 0644)) != -1); | | 169 | ATF_REQUIRE((fd = open(FILE, O_CREAT|O_RDWR, 0644)) != -1); |
170 | ATF_REQUIRE(close(fd) == 0); | | 170 | ATF_REQUIRE(close(fd) == 0); |
171 | | | 171 | |
172 | ATF_REQUIRE((dfd = open(DIR, O_RDONLY, 0)) != -1); | | 172 | ATF_REQUIRE((dfd = open(DIR, O_RDONLY, 0)) != -1); |
173 | | | 173 | |
174 | ATF_REQUIRE(faccessat(dfd, BASEFILE, W_OK, 0) == 0); | | 174 | ATF_REQUIRE(faccessat(dfd, BASEFILE, W_OK, 0) == 0); |
175 | | | 175 | |
176 | ATF_REQUIRE(fchmod(dfd, 644) == 0); | | 176 | ATF_REQUIRE(fchmod(dfd, 0644) == 0); |
177 | | | 177 | |
178 | ATF_REQUIRE(faccessat(dfd, BASEFILE, W_OK, 0) == -1); | | 178 | ATF_REQUIRE(faccessat(dfd, BASEFILE, W_OK, 0) == -1); |
179 | ATF_REQUIRE(errno == EACCES); | | 179 | ATF_REQUIRE(errno == EACCES); |
180 | | | 180 | |
181 | ATF_REQUIRE(close(dfd) == 0); | | 181 | ATF_REQUIRE(close(dfd) == 0); |
182 | } | | 182 | } |
183 | | | 183 | |
184 | #ifdef USE_O_SEARCH | | 184 | #ifdef USE_O_SEARCH |
185 | | | 185 | |
186 | ATF_TC(o_search_root_flag2); | | 186 | ATF_TC(o_search_root_flag2); |
187 | ATF_TC_HEAD(o_search_root_flag2, tc) | | 187 | ATF_TC_HEAD(o_search_root_flag2, tc) |
188 | { | | 188 | { |
189 | atf_tc_set_md_var(tc, "descr", "See that root fstatat honours O_SEARCH"); | | 189 | atf_tc_set_md_var(tc, "descr", "See that root fstatat honours O_SEARCH"); |
| @@ -192,61 +192,61 @@ ATF_TC_HEAD(o_search_root_flag2, tc) | | | @@ -192,61 +192,61 @@ ATF_TC_HEAD(o_search_root_flag2, tc) |
192 | ATF_TC_BODY(o_search_root_flag2, tc) | | 192 | ATF_TC_BODY(o_search_root_flag2, tc) |
193 | { | | 193 | { |
194 | int dfd; | | 194 | int dfd; |
195 | int fd; | | 195 | int fd; |
196 | | | 196 | |
197 | ATF_REQUIRE(mkdir(DIR, 0755) == 0); | | 197 | ATF_REQUIRE(mkdir(DIR, 0755) == 0); |
198 | ATF_REQUIRE((fd = open(FILE, O_CREAT|O_RDWR, 0644)) != -1); | | 198 | ATF_REQUIRE((fd = open(FILE, O_CREAT|O_RDWR, 0644)) != -1); |
199 | ATF_REQUIRE(close(fd) == 0); | | 199 | ATF_REQUIRE(close(fd) == 0); |
200 | | | 200 | |
201 | ATF_REQUIRE((dfd = open(DIR, O_RDONLY|O_SEARCH, 0)) != -1); | | 201 | ATF_REQUIRE((dfd = open(DIR, O_RDONLY|O_SEARCH, 0)) != -1); |
202 | | | 202 | |
203 | ATF_REQUIRE(faccessat(dfd, BASEFILE, W_OK, 0) == 0); | | 203 | ATF_REQUIRE(faccessat(dfd, BASEFILE, W_OK, 0) == 0); |
204 | | | 204 | |
205 | ATF_REQUIRE(fchmod(dfd, 644) == 0); | | 205 | ATF_REQUIRE(fchmod(dfd, 0644) == 0); |
206 | | | 206 | |
207 | ATF_REQUIRE(faccessat(dfd, BASEFILE, W_OK, 0) == 0); | | 207 | ATF_REQUIRE(faccessat(dfd, BASEFILE, W_OK, 0) == 0); |
208 | | | 208 | |
209 | ATF_REQUIRE(fchmod(dfd, 444) == 0); | | 209 | ATF_REQUIRE(fchmod(dfd, 0444) == 0); |
210 | | | 210 | |
211 | ATF_REQUIRE(faccessat(dfd, BASEFILE, W_OK, 0) == 0); | | 211 | ATF_REQUIRE(faccessat(dfd, BASEFILE, W_OK, 0) == 0); |
212 | | | 212 | |
213 | ATF_REQUIRE(close(dfd) == 0); | | 213 | ATF_REQUIRE(close(dfd) == 0); |
214 | } | | 214 | } |
215 | | | 215 | |
216 | ATF_TC(o_search_unpriv_flag2); | | 216 | ATF_TC(o_search_unpriv_flag2); |
217 | ATF_TC_HEAD(o_search_unpriv_flag2, tc) | | 217 | ATF_TC_HEAD(o_search_unpriv_flag2, tc) |
218 | { | | 218 | { |
219 | atf_tc_set_md_var(tc, "descr", "See that fstatat honours O_SEARCH"); | | 219 | atf_tc_set_md_var(tc, "descr", "See that fstatat honours O_SEARCH"); |
220 | atf_tc_set_md_var(tc, "require.user", "unprivileged"); | | 220 | atf_tc_set_md_var(tc, "require.user", "unprivileged"); |
221 | } | | 221 | } |
222 | ATF_TC_BODY(o_search_unpriv_flag2, tc) | | 222 | ATF_TC_BODY(o_search_unpriv_flag2, tc) |
223 | { | | 223 | { |
224 | int dfd; | | 224 | int dfd; |
225 | int fd; | | 225 | int fd; |
226 | | | 226 | |
227 | ATF_REQUIRE(mkdir(DIR, 0755) == 0); | | 227 | ATF_REQUIRE(mkdir(DIR, 0755) == 0); |
228 | ATF_REQUIRE((fd = open(FILE, O_CREAT|O_RDWR, 0644)) != -1); | | 228 | ATF_REQUIRE((fd = open(FILE, O_CREAT|O_RDWR, 0644)) != -1); |
229 | ATF_REQUIRE(close(fd) == 0); | | 229 | ATF_REQUIRE(close(fd) == 0); |
230 | | | 230 | |
231 | ATF_REQUIRE((dfd = open(DIR, O_RDONLY|O_SEARCH, 0)) != -1); | | 231 | ATF_REQUIRE((dfd = open(DIR, O_RDONLY|O_SEARCH, 0)) != -1); |
232 | | | 232 | |
233 | ATF_REQUIRE(faccessat(dfd, BASEFILE, W_OK, 0) == 0); | | 233 | ATF_REQUIRE(faccessat(dfd, BASEFILE, W_OK, 0) == 0); |
234 | | | 234 | |
235 | ATF_REQUIRE(fchmod(dfd, 644) == 0); | | 235 | ATF_REQUIRE(fchmod(dfd, 0644) == 0); |
236 | | | 236 | |
237 | ATF_REQUIRE(faccessat(dfd, BASEFILE, W_OK, 0) == 0); | | 237 | ATF_REQUIRE(faccessat(dfd, BASEFILE, W_OK, 0) == 0); |
238 | | | 238 | |
239 | ATF_REQUIRE(fchmod(dfd, 444) == 0); | | 239 | ATF_REQUIRE(fchmod(dfd, 0444) == 0); |
240 | | | 240 | |
241 | ATF_REQUIRE(faccessat(dfd, BASEFILE, W_OK, 0) == 0); | | 241 | ATF_REQUIRE(faccessat(dfd, BASEFILE, W_OK, 0) == 0); |
242 | | | 242 | |
243 | ATF_REQUIRE(close(dfd) == 0); | | 243 | ATF_REQUIRE(close(dfd) == 0); |
244 | } | | 244 | } |
245 | | | 245 | |
246 | #endif /* USE_O_SEARCH */ | | 246 | #endif /* USE_O_SEARCH */ |
247 | | | 247 | |
248 | | | 248 | |
249 | ATF_TC(o_search_notdir); | | 249 | ATF_TC(o_search_notdir); |
250 | ATF_TC_HEAD(o_search_notdir, tc) | | 250 | ATF_TC_HEAD(o_search_notdir, tc) |
251 | { | | 251 | { |
252 | atf_tc_set_md_var(tc, "descr", "See that openat fails with non dir fd"); | | 252 | atf_tc_set_md_var(tc, "descr", "See that openat fails with non dir fd"); |