]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - lib/libcasper/services/cap_sysctl/tests/sysctl_test.c
Merge OpenSSL 1.1.1d.
[FreeBSD/FreeBSD.git] / lib / libcasper / services / cap_sysctl / tests / sysctl_test.c
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3  *
4  * Copyright (c) 2013, 2018 The FreeBSD Foundation
5  * All rights reserved.
6  *
7  * This software was developed by Pawel Jakub Dawidek under sponsorship from
8  * the FreeBSD Foundation.
9  *
10  * Portions of this software were developed by Mark Johnston
11  * under sponsorship from the FreeBSD Foundation.
12  *
13  * Redistribution and use in source and binary forms, with or without
14  * modification, are permitted provided that the following conditions
15  * are met:
16  * 1. Redistributions of source code must retain the above copyright
17  *    notice, this list of conditions and the following disclaimer.
18  * 2. Redistributions in binary form must reproduce the above copyright
19  *    notice, this list of conditions and the following disclaimer in the
20  *    documentation and/or other materials provided with the distribution.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
23  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
26  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32  * SUCH DAMAGE.
33  */
34
35 #include <sys/cdefs.h>
36 __FBSDID("$FreeBSD$");
37
38 #include <sys/types.h>
39 #include <sys/capsicum.h>
40 #include <sys/sysctl.h>
41 #include <sys/nv.h>
42
43 #include <assert.h>
44 #include <err.h>
45 #include <errno.h>
46 #include <netdb.h>
47 #include <stdio.h>
48 #include <stdlib.h>
49 #include <string.h>
50 #include <unistd.h>
51
52 #include <libcasper.h>
53 #include <casper/cap_sysctl.h>
54
55 #include <atf-c.h>
56
57 /*
58  * We need some sysctls to perform the tests on.
59  * We remember their values and restore them afer the test is done.
60  */
61 #define SYSCTL0_PARENT  "kern"
62 #define SYSCTL0_NAME    "kern.sync_on_panic"
63 #define SYSCTL0_FILE    "./sysctl0"
64 #define SYSCTL1_PARENT  "debug"
65 #define SYSCTL1_NAME    "debug.minidump"
66 #define SYSCTL1_FILE    "./sysctl1"
67
68 #define SYSCTL0_READ0           0x0001
69 #define SYSCTL0_READ1           0x0002
70 #define SYSCTL0_READ2           0x0004
71 #define SYSCTL0_WRITE           0x0008
72 #define SYSCTL0_READ_WRITE      0x0010
73 #define SYSCTL1_READ0           0x0020
74 #define SYSCTL1_READ1           0x0040
75 #define SYSCTL1_READ2           0x0080
76 #define SYSCTL1_WRITE           0x0100
77 #define SYSCTL1_READ_WRITE      0x0200
78
79 static void
80 save_int_sysctl(const char *name, const char *file)
81 {
82         ssize_t n;
83         size_t sz;
84         int error, fd, val;
85
86         sz = sizeof(val);
87         error = sysctlbyname(name, &val, &sz, NULL, 0);
88         ATF_REQUIRE_MSG(error == 0,
89             "sysctlbyname(%s): %s", name, strerror(errno));
90
91         fd = open(file, O_CREAT | O_WRONLY, 0600);
92         ATF_REQUIRE_MSG(fd >= 0, "open(%s): %s", file, strerror(errno));
93         n = write(fd, &val, sz);
94         ATF_REQUIRE(n >= 0 && (size_t)n == sz);
95         error = close(fd);
96         ATF_REQUIRE(error == 0);
97 }
98
99 static void
100 restore_int_sysctl(const char *name, const char *file)
101 {
102         ssize_t n;
103         size_t sz;
104         int error, fd, val;
105
106         fd = open(file, O_RDONLY);
107         ATF_REQUIRE(fd >= 0);
108         sz = sizeof(val);
109         n = read(fd, &val, sz);
110         ATF_REQUIRE(n >= 0 && (size_t)n == sz);
111         error = unlink(file);
112         ATF_REQUIRE(error == 0);
113         error = close(fd);
114         ATF_REQUIRE(error == 0);
115
116         error = sysctlbyname(name, NULL, NULL, &val, sz);
117         ATF_REQUIRE_MSG(error == 0,
118             "sysctlbyname(%s): %s", name, strerror(errno));
119 }
120
121 static cap_channel_t *
122 initcap(void)
123 {
124         cap_channel_t *capcas, *capsysctl;
125
126         save_int_sysctl(SYSCTL0_NAME, SYSCTL0_FILE);
127         save_int_sysctl(SYSCTL1_NAME, SYSCTL1_FILE);
128
129         capcas = cap_init();
130         ATF_REQUIRE(capcas != NULL);
131
132         capsysctl = cap_service_open(capcas, "system.sysctl");
133         ATF_REQUIRE(capsysctl != NULL);
134
135         cap_close(capcas);
136
137         return (capsysctl);
138 }
139
140 static void
141 cleanup(void)
142 {
143
144         restore_int_sysctl(SYSCTL0_NAME, SYSCTL0_FILE);
145         restore_int_sysctl(SYSCTL1_NAME, SYSCTL1_FILE);
146 }
147
148 static unsigned int
149 checkcaps(cap_channel_t *capsysctl)
150 {
151         unsigned int result;
152         size_t len0, len1, oldsize;
153         int error, mib0[2], mib1[2], oldvalue, newvalue;
154
155         result = 0;
156
157         len0 = nitems(mib0);
158         ATF_REQUIRE(sysctlnametomib(SYSCTL0_NAME, mib0, &len0) == 0);
159         len1 = nitems(mib1);
160         ATF_REQUIRE(sysctlnametomib(SYSCTL1_NAME, mib1, &len1) == 0);
161
162         oldsize = sizeof(oldvalue);
163         if (cap_sysctlbyname(capsysctl, SYSCTL0_NAME, &oldvalue, &oldsize,
164             NULL, 0) == 0) {
165                 if (oldsize == sizeof(oldvalue))
166                         result |= SYSCTL0_READ0;
167         }
168         error = cap_sysctl(capsysctl, mib0, len0, &oldvalue, &oldsize, NULL, 0);
169         if ((result & SYSCTL0_READ0) != 0)
170                 ATF_REQUIRE(error == 0);
171         else
172                 ATF_REQUIRE_ERRNO(ENOTCAPABLE, error != 0);
173
174         newvalue = 123;
175         if (cap_sysctlbyname(capsysctl, SYSCTL0_NAME, NULL, NULL, &newvalue,
176             sizeof(newvalue)) == 0) {
177                 result |= SYSCTL0_WRITE;
178         }
179
180         if ((result & SYSCTL0_WRITE) != 0) {
181                 oldsize = sizeof(oldvalue);
182                 if (cap_sysctlbyname(capsysctl, SYSCTL0_NAME, &oldvalue,
183                     &oldsize, NULL, 0) == 0) {
184                         if (oldsize == sizeof(oldvalue) && oldvalue == 123)
185                                 result |= SYSCTL0_READ1;
186                 }
187         }
188         newvalue = 123;
189         error = cap_sysctl(capsysctl, mib0, len0, NULL, NULL,
190             &newvalue, sizeof(newvalue));
191         if ((result & SYSCTL0_WRITE) != 0)
192                 ATF_REQUIRE(error == 0);
193         else
194                 ATF_REQUIRE_ERRNO(ENOTCAPABLE, error != 0);
195
196         oldsize = sizeof(oldvalue);
197         newvalue = 4567;
198         if (cap_sysctlbyname(capsysctl, SYSCTL0_NAME, &oldvalue, &oldsize,
199             &newvalue, sizeof(newvalue)) == 0) {
200                 if (oldsize == sizeof(oldvalue) && oldvalue == 123)
201                         result |= SYSCTL0_READ_WRITE;
202         }
203
204         if ((result & SYSCTL0_READ_WRITE) != 0) {
205                 oldsize = sizeof(oldvalue);
206                 if (cap_sysctlbyname(capsysctl, SYSCTL0_NAME, &oldvalue,
207                     &oldsize, NULL, 0) == 0) {
208                         if (oldsize == sizeof(oldvalue) && oldvalue == 4567)
209                                 result |= SYSCTL0_READ2;
210                 }
211         }
212
213         oldsize = sizeof(oldvalue);
214         if (cap_sysctlbyname(capsysctl, SYSCTL1_NAME, &oldvalue, &oldsize,
215             NULL, 0) == 0) {
216                 if (oldsize == sizeof(oldvalue))
217                         result |= SYSCTL1_READ0;
218         }
219         error = cap_sysctl(capsysctl, mib1, len1, &oldvalue, &oldsize, NULL, 0);
220         if ((result & SYSCTL1_READ0) != 0)
221                 ATF_REQUIRE(error == 0);
222         else
223                 ATF_REQUIRE_ERRNO(ENOTCAPABLE, error != 0);
224
225         newvalue = 506;
226         if (cap_sysctlbyname(capsysctl, SYSCTL1_NAME, NULL, NULL, &newvalue,
227             sizeof(newvalue)) == 0) {
228                 result |= SYSCTL1_WRITE;
229         }
230
231         if ((result & SYSCTL1_WRITE) != 0) {
232                 newvalue = 506;
233                 ATF_REQUIRE(cap_sysctl(capsysctl, mib1, len1, NULL, NULL,
234                     &newvalue, sizeof(newvalue)) == 0);
235
236                 oldsize = sizeof(oldvalue);
237                 if (cap_sysctlbyname(capsysctl, SYSCTL1_NAME, &oldvalue,
238                     &oldsize, NULL, 0) == 0) {
239                         if (oldsize == sizeof(oldvalue) && oldvalue == 506)
240                                 result |= SYSCTL1_READ1;
241                 }
242         }
243         newvalue = 506;
244         error = cap_sysctl(capsysctl, mib1, len1, NULL, NULL,
245             &newvalue, sizeof(newvalue));
246         if ((result & SYSCTL1_WRITE) != 0)
247                 ATF_REQUIRE(error == 0);
248         else
249                 ATF_REQUIRE_ERRNO(ENOTCAPABLE, error != 0);
250
251         oldsize = sizeof(oldvalue);
252         newvalue = 7008;
253         if (cap_sysctlbyname(capsysctl, SYSCTL1_NAME, &oldvalue, &oldsize,
254             &newvalue, sizeof(newvalue)) == 0) {
255                 if (oldsize == sizeof(oldvalue) && oldvalue == 506)
256                         result |= SYSCTL1_READ_WRITE;
257         }
258
259         if ((result & SYSCTL1_READ_WRITE) != 0) {
260                 oldsize = sizeof(oldvalue);
261                 if (cap_sysctlbyname(capsysctl, SYSCTL1_NAME, &oldvalue,
262                     &oldsize, NULL, 0) == 0) {
263                         if (oldsize == sizeof(oldvalue) && oldvalue == 7008)
264                                 result |= SYSCTL1_READ2;
265                 }
266         }
267
268         return (result);
269 }
270
271 ATF_TC_WITH_CLEANUP(cap_sysctl__operation);
272 ATF_TC_HEAD(cap_sysctl__operation, tc)
273 {
274 }
275 ATF_TC_BODY(cap_sysctl__operation, tc)
276 {
277         cap_channel_t *capsysctl, *ocapsysctl;
278         void *limit;
279
280         ocapsysctl = initcap();
281
282         /*
283          * Allow:
284          * SYSCTL0_PARENT/RDWR/RECURSIVE
285          * SYSCTL1_PARENT/RDWR/RECURSIVE
286          */
287
288         capsysctl = cap_clone(ocapsysctl);
289         ATF_REQUIRE(capsysctl != NULL);
290
291         limit = cap_sysctl_limit_init(capsysctl);
292         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT,
293             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
294         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT,
295             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
296         ATF_REQUIRE(cap_sysctl_limit(limit) == 0);
297
298         limit = cap_sysctl_limit_init(capsysctl);
299         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT,
300             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
301         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT,
302             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
303         (void)cap_sysctl_limit_name(limit, "foo.bar",
304             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
305         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
306
307         limit = cap_sysctl_limit_init(capsysctl);
308         (void)cap_sysctl_limit_name(limit, "foo.bar",
309             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
310         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
311
312         ATF_REQUIRE(checkcaps(capsysctl) == (SYSCTL0_READ0 | SYSCTL0_READ1 |
313             SYSCTL0_READ2 | SYSCTL0_WRITE | SYSCTL0_READ_WRITE |
314             SYSCTL1_READ0 | SYSCTL1_READ1 | SYSCTL1_READ2 | SYSCTL1_WRITE |
315             SYSCTL1_READ_WRITE));
316
317         limit = cap_sysctl_limit_init(capsysctl);
318         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME,
319             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
320         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME,
321             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
322         ATF_REQUIRE(cap_sysctl_limit(limit) == 0);
323
324         ATF_REQUIRE(checkcaps(capsysctl) == (SYSCTL0_READ0 | SYSCTL0_READ1 |
325             SYSCTL0_READ2 | SYSCTL0_WRITE | SYSCTL0_READ_WRITE |
326             SYSCTL1_READ0 | SYSCTL1_READ1 | SYSCTL1_READ2 | SYSCTL1_WRITE |
327             SYSCTL1_READ_WRITE));
328
329         limit = cap_sysctl_limit_init(capsysctl);
330         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME,
331             CAP_SYSCTL_READ | CAP_SYSCTL_RECURSIVE);
332         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME,
333             CAP_SYSCTL_WRITE | CAP_SYSCTL_RECURSIVE);
334         ATF_REQUIRE(cap_sysctl_limit(limit) == 0);
335
336         ATF_REQUIRE(checkcaps(capsysctl) == (SYSCTL0_READ0 | SYSCTL1_WRITE));
337
338         limit = cap_sysctl_limit_init(capsysctl);
339         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME, CAP_SYSCTL_READ);
340         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME, CAP_SYSCTL_WRITE);
341         ATF_REQUIRE(cap_sysctl_limit(limit) == 0);
342
343         ATF_REQUIRE(checkcaps(capsysctl) == (SYSCTL0_READ0 | SYSCTL1_WRITE));
344
345         limit = cap_sysctl_limit_init(capsysctl);
346         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME, CAP_SYSCTL_READ);
347         ATF_REQUIRE(cap_sysctl_limit(limit) == 0);
348
349         ATF_REQUIRE(checkcaps(capsysctl) == SYSCTL0_READ0);
350
351         cap_close(capsysctl);
352
353         /*
354          * Allow:
355          * SYSCTL0_NAME/RDWR/RECURSIVE
356          * SYSCTL1_NAME/RDWR/RECURSIVE
357          */
358
359         capsysctl = cap_clone(ocapsysctl);
360         ATF_REQUIRE(capsysctl != NULL);
361
362         limit = cap_sysctl_limit_init(capsysctl);
363         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME,
364             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
365         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME,
366             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
367         ATF_REQUIRE(cap_sysctl_limit(limit) == 0);
368
369         limit = cap_sysctl_limit_init(capsysctl);
370         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT,
371             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
372         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT,
373             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
374         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
375         limit = cap_sysctl_limit_init(capsysctl);
376         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT, CAP_SYSCTL_RDWR);
377         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT, CAP_SYSCTL_RDWR);
378         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
379         limit = cap_sysctl_limit_init(capsysctl);
380         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT, CAP_SYSCTL_READ);
381         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT, CAP_SYSCTL_WRITE);
382         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
383         limit = cap_sysctl_limit_init(capsysctl);
384         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT, CAP_SYSCTL_READ);
385         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
386
387         ATF_REQUIRE(checkcaps(capsysctl) == (SYSCTL0_READ0 | SYSCTL0_READ1 |
388             SYSCTL0_READ2 | SYSCTL0_WRITE | SYSCTL0_READ_WRITE |
389             SYSCTL1_READ0 | SYSCTL1_READ1 | SYSCTL1_READ2 | SYSCTL1_WRITE |
390             SYSCTL1_READ_WRITE));
391
392         cap_close(capsysctl);
393
394         /*
395          * Allow:
396          * SYSCTL0_PARENT/RDWR
397          * SYSCTL1_PARENT/RDWR
398          */
399
400         capsysctl = cap_clone(ocapsysctl);
401         ATF_REQUIRE(capsysctl != NULL);
402
403         limit = cap_sysctl_limit_init(capsysctl);
404         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT, CAP_SYSCTL_RDWR);
405         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT, CAP_SYSCTL_RDWR);
406         ATF_REQUIRE(cap_sysctl_limit(limit) == 0);
407         limit = cap_sysctl_limit_init(capsysctl);
408         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT,
409             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
410         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT,
411             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
412         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
413         limit = cap_sysctl_limit_init(capsysctl);
414         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT,
415             CAP_SYSCTL_READ | CAP_SYSCTL_RECURSIVE);
416         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT,
417             CAP_SYSCTL_WRITE | CAP_SYSCTL_RECURSIVE);
418         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
419         limit = cap_sysctl_limit_init(capsysctl);
420         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT,
421             CAP_SYSCTL_READ | CAP_SYSCTL_RECURSIVE);
422         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
423
424         ATF_REQUIRE(checkcaps(capsysctl) == 0);
425
426         cap_close(capsysctl);
427
428         /*
429          * Allow:
430          * SYSCTL0_NAME/RDWR
431          * SYSCTL1_NAME/RDWR
432          */
433
434         capsysctl = cap_clone(ocapsysctl);
435         ATF_REQUIRE(capsysctl != NULL);
436
437         limit = cap_sysctl_limit_init(capsysctl);
438         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME, CAP_SYSCTL_RDWR);
439         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME, CAP_SYSCTL_RDWR);
440         ATF_REQUIRE(cap_sysctl_limit(limit) == 0);
441         limit = cap_sysctl_limit_init(capsysctl);
442         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT,
443             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
444         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT,
445             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
446         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
447         limit = cap_sysctl_limit_init(capsysctl);
448         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT,
449             CAP_SYSCTL_READ | CAP_SYSCTL_RECURSIVE);
450         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT,
451             CAP_SYSCTL_WRITE | CAP_SYSCTL_RECURSIVE);
452         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
453         limit = cap_sysctl_limit_init(capsysctl);
454         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT,
455             CAP_SYSCTL_WRITE | CAP_SYSCTL_RECURSIVE);
456         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
457
458         ATF_REQUIRE(checkcaps(capsysctl) == (SYSCTL0_READ0 | SYSCTL0_READ1 |
459             SYSCTL0_READ2 | SYSCTL0_WRITE | SYSCTL0_READ_WRITE |
460             SYSCTL1_READ0 | SYSCTL1_READ1 | SYSCTL1_READ2 | SYSCTL1_WRITE |
461             SYSCTL1_READ_WRITE));
462
463         cap_close(capsysctl);
464
465         /*
466          * Allow:
467          * SYSCTL0_PARENT/RDWR
468          * SYSCTL1_PARENT/RDWR/RECURSIVE
469          */
470
471         capsysctl = cap_clone(ocapsysctl);
472         ATF_REQUIRE(capsysctl != NULL);
473
474         limit = cap_sysctl_limit_init(capsysctl);
475         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT, CAP_SYSCTL_RDWR);
476         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT,
477             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
478         ATF_REQUIRE(cap_sysctl_limit(limit) == 0);
479         limit = cap_sysctl_limit_init(capsysctl);
480         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT,
481             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
482         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT,
483             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
484         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
485         limit = cap_sysctl_limit_init(capsysctl);
486         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT,
487             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
488         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
489         limit = cap_sysctl_limit_init(capsysctl);
490         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT,
491             CAP_SYSCTL_READ | CAP_SYSCTL_RECURSIVE);
492         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
493         limit = cap_sysctl_limit_init(capsysctl);
494         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME,
495             CAP_SYSCTL_READ | CAP_SYSCTL_RECURSIVE);
496         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
497
498         ATF_REQUIRE(checkcaps(capsysctl) == (SYSCTL1_READ0 | SYSCTL1_READ1 |
499             SYSCTL1_READ2 | SYSCTL1_WRITE | SYSCTL1_READ_WRITE));
500
501         cap_close(capsysctl);
502
503         /*
504          * Allow:
505          * SYSCTL0_NAME/RDWR
506          * SYSCTL1_NAME/RDWR/RECURSIVE
507          */
508
509         capsysctl = cap_clone(ocapsysctl);
510         ATF_REQUIRE(capsysctl != NULL);
511
512         limit = cap_sysctl_limit_init(capsysctl);
513         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME, CAP_SYSCTL_RDWR);
514         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME,
515             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
516         ATF_REQUIRE(cap_sysctl_limit(limit) == 0);
517         limit = cap_sysctl_limit_init(capsysctl);
518         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME,
519             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
520         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME,
521             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
522         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
523         limit = cap_sysctl_limit_init(capsysctl);
524         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME,
525             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
526         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
527         limit = cap_sysctl_limit_init(capsysctl);
528         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME,
529             CAP_SYSCTL_WRITE | CAP_SYSCTL_RECURSIVE);
530         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
531
532         ATF_REQUIRE(checkcaps(capsysctl) == (SYSCTL0_READ0 | SYSCTL0_READ1 |
533             SYSCTL0_READ2 | SYSCTL0_WRITE | SYSCTL0_READ_WRITE |
534             SYSCTL1_READ0 | SYSCTL1_READ1 | SYSCTL1_READ2 | SYSCTL1_WRITE |
535             SYSCTL1_READ_WRITE));
536
537         cap_close(capsysctl);
538
539         /*
540          * Allow:
541          * SYSCTL0_PARENT/READ/RECURSIVE
542          * SYSCTL1_PARENT/READ/RECURSIVE
543          */
544
545         capsysctl = cap_clone(ocapsysctl);
546         ATF_REQUIRE(capsysctl != NULL);
547
548         limit = cap_sysctl_limit_init(capsysctl);
549         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT,
550             CAP_SYSCTL_READ | CAP_SYSCTL_RECURSIVE);
551         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT,
552             CAP_SYSCTL_READ | CAP_SYSCTL_RECURSIVE);
553         ATF_REQUIRE(cap_sysctl_limit(limit) == 0);
554         limit = cap_sysctl_limit_init(capsysctl);
555         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT,
556             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
557         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT,
558             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
559         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
560         limit = cap_sysctl_limit_init(capsysctl);
561         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT,
562             CAP_SYSCTL_WRITE | CAP_SYSCTL_RECURSIVE);
563         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT,
564             CAP_SYSCTL_WRITE | CAP_SYSCTL_RECURSIVE);
565         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
566         limit = cap_sysctl_limit_init(capsysctl);
567         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT, CAP_SYSCTL_RDWR);
568         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT, CAP_SYSCTL_RDWR);
569         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
570         limit = cap_sysctl_limit_init(capsysctl);
571         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT, CAP_SYSCTL_WRITE);
572         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT, CAP_SYSCTL_WRITE);
573         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
574         limit = cap_sysctl_limit_init(capsysctl);
575         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT,
576             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
577         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
578         limit = cap_sysctl_limit_init(capsysctl);
579         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT,
580             CAP_SYSCTL_WRITE | CAP_SYSCTL_RECURSIVE);
581         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
582         limit = cap_sysctl_limit_init(capsysctl);
583         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT, CAP_SYSCTL_RDWR);
584         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
585         limit = cap_sysctl_limit_init(capsysctl);
586         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT, CAP_SYSCTL_WRITE);
587         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
588
589         ATF_REQUIRE(checkcaps(capsysctl) == (SYSCTL0_READ0 | SYSCTL1_READ0));
590
591         cap_close(capsysctl);
592
593         /*
594          * Allow:
595          * SYSCTL0_NAME/READ/RECURSIVE
596          * SYSCTL1_NAME/READ/RECURSIVE
597          */
598
599         capsysctl = cap_clone(ocapsysctl);
600         ATF_REQUIRE(capsysctl != NULL);
601
602         limit = cap_sysctl_limit_init(capsysctl);
603         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME,
604             CAP_SYSCTL_READ | CAP_SYSCTL_RECURSIVE);
605         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME,
606             CAP_SYSCTL_READ | CAP_SYSCTL_RECURSIVE);
607         ATF_REQUIRE(cap_sysctl_limit(limit) == 0);
608         limit = cap_sysctl_limit_init(capsysctl);
609         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME,
610             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
611         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME,
612             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
613         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
614         limit = cap_sysctl_limit_init(capsysctl);
615         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME,
616             CAP_SYSCTL_WRITE | CAP_SYSCTL_RECURSIVE);
617         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME,
618             CAP_SYSCTL_WRITE | CAP_SYSCTL_RECURSIVE);
619         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
620         limit = cap_sysctl_limit_init(capsysctl);
621         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME, CAP_SYSCTL_RDWR);
622         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME, CAP_SYSCTL_RDWR);
623         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
624         limit = cap_sysctl_limit_init(capsysctl);
625         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME, CAP_SYSCTL_WRITE);
626         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME, CAP_SYSCTL_WRITE);
627         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
628         limit = cap_sysctl_limit_init(capsysctl);
629         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME,
630             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
631         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
632         limit = cap_sysctl_limit_init(capsysctl);
633         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME,
634             CAP_SYSCTL_WRITE | CAP_SYSCTL_RECURSIVE);
635         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
636         limit = cap_sysctl_limit_init(capsysctl);
637         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME, CAP_SYSCTL_RDWR);
638         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
639         limit = cap_sysctl_limit_init(capsysctl);
640         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME, CAP_SYSCTL_WRITE);
641         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
642
643         ATF_REQUIRE(checkcaps(capsysctl) == (SYSCTL0_READ0 | SYSCTL1_READ0));
644
645         cap_close(capsysctl);
646
647         /*
648          * Allow:
649          * SYSCTL0_PARENT/READ
650          * SYSCTL1_PARENT/READ
651          */
652
653         capsysctl = cap_clone(ocapsysctl);
654         ATF_REQUIRE(capsysctl != NULL);
655
656         limit = cap_sysctl_limit_init(capsysctl);
657         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT, CAP_SYSCTL_READ);
658         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT, CAP_SYSCTL_READ);
659         ATF_REQUIRE(cap_sysctl_limit(limit) == 0);
660         limit = cap_sysctl_limit_init(capsysctl);
661         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT,
662             CAP_SYSCTL_READ | CAP_SYSCTL_RECURSIVE);
663         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT,
664             CAP_SYSCTL_READ | CAP_SYSCTL_RECURSIVE);
665         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
666         limit = cap_sysctl_limit_init(capsysctl);
667         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT,
668             CAP_SYSCTL_WRITE | CAP_SYSCTL_RECURSIVE);
669         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT,
670             CAP_SYSCTL_WRITE | CAP_SYSCTL_RECURSIVE);
671         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
672         limit = cap_sysctl_limit_init(capsysctl);
673         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT,
674             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
675         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT,
676             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
677         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
678         limit = cap_sysctl_limit_init(capsysctl);
679         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT, CAP_SYSCTL_RDWR);
680         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT, CAP_SYSCTL_RDWR);
681         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
682         limit = cap_sysctl_limit_init(capsysctl);
683         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT, CAP_SYSCTL_WRITE);
684         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT, CAP_SYSCTL_WRITE);
685         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
686         limit = cap_sysctl_limit_init(capsysctl);
687         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT,
688             CAP_SYSCTL_READ | CAP_SYSCTL_RECURSIVE);
689         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
690         limit = cap_sysctl_limit_init(capsysctl);
691         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT,
692             CAP_SYSCTL_WRITE | CAP_SYSCTL_RECURSIVE);
693         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
694         limit = cap_sysctl_limit_init(capsysctl);
695         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT,
696             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
697         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
698         limit = cap_sysctl_limit_init(capsysctl);
699         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT, CAP_SYSCTL_RDWR);
700         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
701         limit = cap_sysctl_limit_init(capsysctl);
702         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT, CAP_SYSCTL_WRITE);
703         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
704
705         ATF_REQUIRE(checkcaps(capsysctl) == 0);
706
707         cap_close(capsysctl);
708
709         /*
710          * Allow:
711          * SYSCTL0_NAME/READ
712          * SYSCTL1_NAME/READ
713          */
714
715         capsysctl = cap_clone(ocapsysctl);
716         ATF_REQUIRE(capsysctl != NULL);
717
718         limit = cap_sysctl_limit_init(capsysctl);
719         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME, CAP_SYSCTL_READ);
720         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME, CAP_SYSCTL_READ);
721         ATF_REQUIRE(cap_sysctl_limit(limit) == 0);
722         limit = cap_sysctl_limit_init(capsysctl);
723         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME,
724             CAP_SYSCTL_READ | CAP_SYSCTL_RECURSIVE);
725         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME,
726             CAP_SYSCTL_READ | CAP_SYSCTL_RECURSIVE);
727         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
728         limit = cap_sysctl_limit_init(capsysctl);
729         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME,
730             CAP_SYSCTL_WRITE | CAP_SYSCTL_RECURSIVE);
731         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME,
732             CAP_SYSCTL_WRITE | CAP_SYSCTL_RECURSIVE);
733         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
734         limit = cap_sysctl_limit_init(capsysctl);
735         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME,
736             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
737         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME,
738             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
739         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
740         limit = cap_sysctl_limit_init(capsysctl);
741         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME, CAP_SYSCTL_RDWR);
742         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME, CAP_SYSCTL_RDWR);
743         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
744         limit = cap_sysctl_limit_init(capsysctl);
745         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME, CAP_SYSCTL_WRITE);
746         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME, CAP_SYSCTL_WRITE);
747         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
748         limit = cap_sysctl_limit_init(capsysctl);
749         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME,
750             CAP_SYSCTL_READ | CAP_SYSCTL_RECURSIVE);
751         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
752         limit = cap_sysctl_limit_init(capsysctl);
753         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME,
754             CAP_SYSCTL_WRITE | CAP_SYSCTL_RECURSIVE);
755         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
756         limit = cap_sysctl_limit_init(capsysctl);
757         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME,
758             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
759         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
760         limit = cap_sysctl_limit_init(capsysctl);
761         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME, CAP_SYSCTL_RDWR);
762         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
763         limit = cap_sysctl_limit_init(capsysctl);
764         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME, CAP_SYSCTL_WRITE);
765         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
766
767         ATF_REQUIRE(checkcaps(capsysctl) == (SYSCTL0_READ0 | SYSCTL1_READ0));
768
769         cap_close(capsysctl);
770
771         /*
772          * Allow:
773          * SYSCTL0_PARENT/READ
774          * SYSCTL1_PARENT/READ/RECURSIVE
775          */
776
777         capsysctl = cap_clone(ocapsysctl);
778         ATF_REQUIRE(capsysctl != NULL);
779
780         limit = cap_sysctl_limit_init(capsysctl);
781         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT, CAP_SYSCTL_READ);
782         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT,
783             CAP_SYSCTL_READ | CAP_SYSCTL_RECURSIVE);
784         ATF_REQUIRE(cap_sysctl_limit(limit) == 0);
785         limit = cap_sysctl_limit_init(capsysctl);
786         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT,
787             CAP_SYSCTL_READ | CAP_SYSCTL_RECURSIVE);
788         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT, CAP_SYSCTL_READ);
789         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
790
791         ATF_REQUIRE(checkcaps(capsysctl) == SYSCTL1_READ0);
792
793         cap_close(capsysctl);
794
795         /*
796          * Allow:
797          * SYSCTL0_NAME/READ
798          * SYSCTL1_NAME/READ/RECURSIVE
799          */
800
801         capsysctl = cap_clone(ocapsysctl);
802         ATF_REQUIRE(capsysctl != NULL);
803
804         limit = cap_sysctl_limit_init(capsysctl);
805         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME, CAP_SYSCTL_READ);
806         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME,
807             CAP_SYSCTL_READ | CAP_SYSCTL_RECURSIVE);
808         ATF_REQUIRE(cap_sysctl_limit(limit) == 0);
809         limit = cap_sysctl_limit_init(capsysctl);
810         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME,
811             CAP_SYSCTL_READ | CAP_SYSCTL_RECURSIVE);
812         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME, CAP_SYSCTL_READ);
813         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
814
815         ATF_REQUIRE(checkcaps(capsysctl) == (SYSCTL0_READ0 | SYSCTL1_READ0));
816
817         cap_close(capsysctl);
818
819         /*
820          * Allow:
821          * SYSCTL0_PARENT/WRITE/RECURSIVE
822          * SYSCTL1_PARENT/WRITE/RECURSIVE
823          */
824
825         capsysctl = cap_clone(ocapsysctl);
826         ATF_REQUIRE(capsysctl != NULL);
827
828         limit = cap_sysctl_limit_init(capsysctl);
829         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT,
830             CAP_SYSCTL_WRITE | CAP_SYSCTL_RECURSIVE);
831         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT,
832             CAP_SYSCTL_WRITE | CAP_SYSCTL_RECURSIVE);
833         ATF_REQUIRE(cap_sysctl_limit(limit) == 0);
834         limit = cap_sysctl_limit_init(capsysctl);
835         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT,
836             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
837         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT,
838             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
839         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
840         limit = cap_sysctl_limit_init(capsysctl);
841         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT,
842             CAP_SYSCTL_READ | CAP_SYSCTL_RECURSIVE);
843         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT,
844             CAP_SYSCTL_READ | CAP_SYSCTL_RECURSIVE);
845         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
846         limit = cap_sysctl_limit_init(capsysctl);
847         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT, CAP_SYSCTL_RDWR);
848         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT, CAP_SYSCTL_RDWR);
849         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
850         limit = cap_sysctl_limit_init(capsysctl);
851         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT, CAP_SYSCTL_READ);
852         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT, CAP_SYSCTL_READ);
853         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
854         limit = cap_sysctl_limit_init(capsysctl);
855         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT,
856             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
857         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
858         limit = cap_sysctl_limit_init(capsysctl);
859         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT,
860             CAP_SYSCTL_READ | CAP_SYSCTL_RECURSIVE);
861         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
862         limit = cap_sysctl_limit_init(capsysctl);
863         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT, CAP_SYSCTL_RDWR);
864         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
865         limit = cap_sysctl_limit_init(capsysctl);
866         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT, CAP_SYSCTL_READ);
867         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
868
869         ATF_REQUIRE(checkcaps(capsysctl) == (SYSCTL0_WRITE | SYSCTL1_WRITE));
870
871         cap_close(capsysctl);
872
873         /*
874          * Allow:
875          * SYSCTL0_NAME/WRITE/RECURSIVE
876          * SYSCTL1_NAME/WRITE/RECURSIVE
877          */
878
879         capsysctl = cap_clone(ocapsysctl);
880         ATF_REQUIRE(capsysctl != NULL);
881
882         limit = cap_sysctl_limit_init(capsysctl);
883         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME,
884             CAP_SYSCTL_WRITE | CAP_SYSCTL_RECURSIVE);
885         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME,
886             CAP_SYSCTL_WRITE | CAP_SYSCTL_RECURSIVE);
887         ATF_REQUIRE(cap_sysctl_limit(limit) == 0);
888         limit = cap_sysctl_limit_init(capsysctl);
889         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME,
890             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
891         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME,
892             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
893         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
894         limit = cap_sysctl_limit_init(capsysctl);
895         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME,
896             CAP_SYSCTL_READ | CAP_SYSCTL_RECURSIVE);
897         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME,
898             CAP_SYSCTL_READ | CAP_SYSCTL_RECURSIVE);
899         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
900         limit = cap_sysctl_limit_init(capsysctl);
901         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME, CAP_SYSCTL_RDWR);
902         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME, CAP_SYSCTL_RDWR);
903         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
904         limit = cap_sysctl_limit_init(capsysctl);
905         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME, CAP_SYSCTL_READ);
906         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME, CAP_SYSCTL_READ);
907         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
908         limit = cap_sysctl_limit_init(capsysctl);
909         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME,
910             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
911         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
912         limit = cap_sysctl_limit_init(capsysctl);
913         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME,
914             CAP_SYSCTL_READ | CAP_SYSCTL_RECURSIVE);
915         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
916         limit = cap_sysctl_limit_init(capsysctl);
917         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME, CAP_SYSCTL_RDWR);
918         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
919         limit = cap_sysctl_limit_init(capsysctl);
920         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME, CAP_SYSCTL_READ);
921         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
922
923         ATF_REQUIRE(checkcaps(capsysctl) == (SYSCTL0_WRITE | SYSCTL1_WRITE));
924
925         cap_close(capsysctl);
926
927         /*
928          * Allow:
929          * SYSCTL0_PARENT/WRITE
930          * SYSCTL1_PARENT/WRITE
931          */
932
933         capsysctl = cap_clone(ocapsysctl);
934         ATF_REQUIRE(capsysctl != NULL);
935
936         limit = cap_sysctl_limit_init(capsysctl);
937         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT, CAP_SYSCTL_WRITE);
938         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT, CAP_SYSCTL_WRITE);
939         ATF_REQUIRE(cap_sysctl_limit(limit) == 0);
940         limit = cap_sysctl_limit_init(capsysctl);
941         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT,
942             CAP_SYSCTL_WRITE | CAP_SYSCTL_RECURSIVE);
943         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT,
944             CAP_SYSCTL_WRITE | CAP_SYSCTL_RECURSIVE);
945         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
946         limit = cap_sysctl_limit_init(capsysctl);
947         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT,
948             CAP_SYSCTL_READ | CAP_SYSCTL_RECURSIVE);
949         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT,
950             CAP_SYSCTL_READ | CAP_SYSCTL_RECURSIVE);
951         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
952         limit = cap_sysctl_limit_init(capsysctl);
953         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT,
954             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
955         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT,
956             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
957         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
958         limit = cap_sysctl_limit_init(capsysctl);
959         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT, CAP_SYSCTL_RDWR);
960         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT, CAP_SYSCTL_RDWR);
961         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
962         limit = cap_sysctl_limit_init(capsysctl);
963         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT, CAP_SYSCTL_READ);
964         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT, CAP_SYSCTL_READ);
965         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
966         limit = cap_sysctl_limit_init(capsysctl);
967         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT,
968             CAP_SYSCTL_WRITE | CAP_SYSCTL_RECURSIVE);
969         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
970         limit = cap_sysctl_limit_init(capsysctl);
971         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT,
972             CAP_SYSCTL_READ | CAP_SYSCTL_RECURSIVE);
973         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
974         limit = cap_sysctl_limit_init(capsysctl);
975         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT,
976             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
977         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
978         limit = cap_sysctl_limit_init(capsysctl);
979         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT, CAP_SYSCTL_RDWR);
980         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
981         limit = cap_sysctl_limit_init(capsysctl);
982         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT, CAP_SYSCTL_READ);
983         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
984
985         ATF_REQUIRE(checkcaps(capsysctl) == 0);
986
987         cap_close(capsysctl);
988
989         /*
990          * Allow:
991          * SYSCTL0_NAME/WRITE
992          * SYSCTL1_NAME/WRITE
993          */
994
995         capsysctl = cap_clone(ocapsysctl);
996         ATF_REQUIRE(capsysctl != NULL);
997
998         limit = cap_sysctl_limit_init(capsysctl);
999         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME, CAP_SYSCTL_WRITE);
1000         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME, CAP_SYSCTL_WRITE);
1001         ATF_REQUIRE(cap_sysctl_limit(limit) == 0);
1002         limit = cap_sysctl_limit_init(capsysctl);
1003         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME,
1004             CAP_SYSCTL_WRITE | CAP_SYSCTL_RECURSIVE);
1005         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME,
1006             CAP_SYSCTL_WRITE | CAP_SYSCTL_RECURSIVE);
1007         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
1008         limit = cap_sysctl_limit_init(capsysctl);
1009         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME,
1010             CAP_SYSCTL_READ | CAP_SYSCTL_RECURSIVE);
1011         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME,
1012             CAP_SYSCTL_READ | CAP_SYSCTL_RECURSIVE);
1013         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
1014         limit = cap_sysctl_limit_init(capsysctl);
1015         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME,
1016             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
1017         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME,
1018             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
1019         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
1020         limit = cap_sysctl_limit_init(capsysctl);
1021         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME, CAP_SYSCTL_RDWR);
1022         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME, CAP_SYSCTL_RDWR);
1023         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
1024         limit = cap_sysctl_limit_init(capsysctl);
1025         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME, CAP_SYSCTL_READ);
1026         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME, CAP_SYSCTL_READ);
1027         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
1028         limit = cap_sysctl_limit_init(capsysctl);
1029         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME,
1030             CAP_SYSCTL_WRITE | CAP_SYSCTL_RECURSIVE);
1031         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
1032         limit = cap_sysctl_limit_init(capsysctl);
1033         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME,
1034             CAP_SYSCTL_READ | CAP_SYSCTL_RECURSIVE);
1035         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
1036         limit = cap_sysctl_limit_init(capsysctl);
1037         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME,
1038             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
1039         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
1040         limit = cap_sysctl_limit_init(capsysctl);
1041         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME, CAP_SYSCTL_RDWR);
1042         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
1043         limit = cap_sysctl_limit_init(capsysctl);
1044         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME, CAP_SYSCTL_READ);
1045         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
1046
1047         ATF_REQUIRE(checkcaps(capsysctl) == (SYSCTL0_WRITE | SYSCTL1_WRITE));
1048
1049         cap_close(capsysctl);
1050
1051         /*
1052          * Allow:
1053          * SYSCTL0_PARENT/WRITE
1054          * SYSCTL1_PARENT/WRITE/RECURSIVE
1055          */
1056
1057         capsysctl = cap_clone(ocapsysctl);
1058         ATF_REQUIRE(capsysctl != NULL);
1059
1060         limit = cap_sysctl_limit_init(capsysctl);
1061         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT, CAP_SYSCTL_WRITE);
1062         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT,
1063             CAP_SYSCTL_WRITE | CAP_SYSCTL_RECURSIVE);
1064         ATF_REQUIRE(cap_sysctl_limit(limit) == 0);
1065         limit = cap_sysctl_limit_init(capsysctl);
1066         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT,
1067             CAP_SYSCTL_WRITE | CAP_SYSCTL_RECURSIVE);
1068         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT, CAP_SYSCTL_WRITE);
1069         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
1070
1071         ATF_REQUIRE(checkcaps(capsysctl) == SYSCTL1_WRITE);
1072
1073         cap_close(capsysctl);
1074
1075         /*
1076          * Allow:
1077          * SYSCTL0_NAME/WRITE
1078          * SYSCTL1_NAME/WRITE/RECURSIVE
1079          */
1080
1081         capsysctl = cap_clone(ocapsysctl);
1082         ATF_REQUIRE(capsysctl != NULL);
1083
1084         limit = cap_sysctl_limit_init(capsysctl);
1085         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME, CAP_SYSCTL_WRITE);
1086         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME,
1087             CAP_SYSCTL_WRITE | CAP_SYSCTL_RECURSIVE);
1088         ATF_REQUIRE(cap_sysctl_limit(limit) == 0);
1089         limit = cap_sysctl_limit_init(capsysctl);
1090         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME,
1091             CAP_SYSCTL_WRITE | CAP_SYSCTL_RECURSIVE);
1092         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME, CAP_SYSCTL_WRITE);
1093         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
1094
1095         ATF_REQUIRE(checkcaps(capsysctl) == (SYSCTL0_WRITE | SYSCTL1_WRITE));
1096
1097         cap_close(capsysctl);
1098
1099         /*
1100          * Allow:
1101          * SYSCTL0_PARENT/READ/RECURSIVE
1102          * SYSCTL1_PARENT/WRITE/RECURSIVE
1103          */
1104
1105         capsysctl = cap_clone(ocapsysctl);
1106         ATF_REQUIRE(capsysctl != NULL);
1107
1108         limit = cap_sysctl_limit_init(capsysctl);
1109         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT,
1110             CAP_SYSCTL_READ | CAP_SYSCTL_RECURSIVE);
1111         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT,
1112             CAP_SYSCTL_WRITE | CAP_SYSCTL_RECURSIVE);
1113         ATF_REQUIRE(cap_sysctl_limit(limit) == 0);
1114
1115         ATF_REQUIRE(checkcaps(capsysctl) == (SYSCTL0_READ0 | SYSCTL1_WRITE));
1116
1117         cap_close(capsysctl);
1118
1119         /*
1120          * Allow:
1121          * SYSCTL0_NAME/READ/RECURSIVE
1122          * SYSCTL1_NAME/WRITE/RECURSIVE
1123          */
1124
1125         capsysctl = cap_clone(ocapsysctl);
1126         ATF_REQUIRE(capsysctl != NULL);
1127
1128         limit = cap_sysctl_limit_init(capsysctl);
1129         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME,
1130             CAP_SYSCTL_READ | CAP_SYSCTL_RECURSIVE);
1131         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME,
1132             CAP_SYSCTL_WRITE | CAP_SYSCTL_RECURSIVE);
1133         ATF_REQUIRE(cap_sysctl_limit(limit) == 0);
1134
1135         ATF_REQUIRE(checkcaps(capsysctl) == (SYSCTL0_READ0 | SYSCTL1_WRITE));
1136
1137         cap_close(capsysctl);
1138
1139         /*
1140          * Allow:
1141          * SYSCTL0_PARENT/READ
1142          * SYSCTL1_PARENT/WRITE
1143          */
1144
1145         capsysctl = cap_clone(ocapsysctl);
1146         ATF_REQUIRE(capsysctl != NULL);
1147
1148         limit = cap_sysctl_limit_init(capsysctl);
1149         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT, CAP_SYSCTL_READ);
1150         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT, CAP_SYSCTL_WRITE);
1151         ATF_REQUIRE(cap_sysctl_limit(limit) == 0);
1152
1153         ATF_REQUIRE(checkcaps(capsysctl) == 0);
1154
1155         cap_close(capsysctl);
1156
1157         /*
1158          * Allow:
1159          * SYSCTL0_NAME/READ
1160          * SYSCTL1_NAME/WRITE
1161          */
1162
1163         capsysctl = cap_clone(ocapsysctl);
1164         ATF_REQUIRE(capsysctl != NULL);
1165
1166         limit = cap_sysctl_limit_init(capsysctl);
1167         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME, CAP_SYSCTL_READ);
1168         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME, CAP_SYSCTL_WRITE);
1169         ATF_REQUIRE(cap_sysctl_limit(limit) == 0);
1170
1171         ATF_REQUIRE(checkcaps(capsysctl) == (SYSCTL0_READ0 | SYSCTL1_WRITE));
1172
1173         cap_close(capsysctl);
1174
1175         /*
1176          * Allow:
1177          * SYSCTL0_PARENT/READ
1178          * SYSCTL1_PARENT/WRITE/RECURSIVE
1179          */
1180
1181         capsysctl = cap_clone(ocapsysctl);
1182         ATF_REQUIRE(capsysctl != NULL);
1183
1184         limit = cap_sysctl_limit_init(capsysctl);
1185         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT, CAP_SYSCTL_READ);
1186         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT,
1187             CAP_SYSCTL_WRITE | CAP_SYSCTL_RECURSIVE);
1188         ATF_REQUIRE(cap_sysctl_limit(limit) == 0);
1189
1190         ATF_REQUIRE(checkcaps(capsysctl) == SYSCTL1_WRITE);
1191
1192         cap_close(capsysctl);
1193
1194         /*
1195          * Allow:
1196          * SYSCTL0_NAME/READ
1197          * SYSCTL1_NAME/WRITE/RECURSIVE
1198          */
1199
1200         capsysctl = cap_clone(ocapsysctl);
1201         ATF_REQUIRE(capsysctl != NULL);
1202
1203         limit = cap_sysctl_limit_init(capsysctl);
1204         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME, CAP_SYSCTL_READ);
1205         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME,
1206             CAP_SYSCTL_WRITE | CAP_SYSCTL_RECURSIVE);
1207         ATF_REQUIRE(cap_sysctl_limit(limit) == 0);
1208
1209         ATF_REQUIRE(checkcaps(capsysctl) == (SYSCTL0_READ0 | SYSCTL1_WRITE));
1210
1211         cap_close(capsysctl);
1212 }
1213 ATF_TC_CLEANUP(cap_sysctl__operation, tc)
1214 {
1215         cleanup();
1216 }
1217
1218 ATF_TC_WITH_CLEANUP(cap_sysctl__names);
1219 ATF_TC_HEAD(cap_sysctl__names, tc)
1220 {
1221 }
1222 ATF_TC_BODY(cap_sysctl__names, tc)
1223 {
1224         cap_channel_t *capsysctl, *ocapsysctl;
1225         void *limit;
1226
1227         ocapsysctl = initcap();
1228
1229         /*
1230          * Allow:
1231          * SYSCTL0_PARENT/READ/RECURSIVE
1232          */
1233
1234         capsysctl = cap_clone(ocapsysctl);
1235         ATF_REQUIRE(capsysctl != NULL);
1236
1237         limit = cap_sysctl_limit_init(capsysctl);
1238         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT,
1239             CAP_SYSCTL_READ | CAP_SYSCTL_RECURSIVE);
1240         ATF_REQUIRE(cap_sysctl_limit(limit) == 0);
1241         limit = cap_sysctl_limit_init(capsysctl);
1242         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT,
1243             CAP_SYSCTL_READ | CAP_SYSCTL_RECURSIVE);
1244         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT,
1245             CAP_SYSCTL_READ | CAP_SYSCTL_RECURSIVE);
1246         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
1247         limit = cap_sysctl_limit_init(capsysctl);
1248         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT,
1249             CAP_SYSCTL_READ | CAP_SYSCTL_RECURSIVE);
1250         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
1251         limit = cap_sysctl_limit_init(capsysctl);
1252         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT, CAP_SYSCTL_READ);
1253         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT, CAP_SYSCTL_READ);
1254         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
1255         limit = cap_sysctl_limit_init(capsysctl);
1256         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT, CAP_SYSCTL_READ);
1257         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
1258
1259         ATF_REQUIRE(checkcaps(capsysctl) == SYSCTL0_READ0);
1260
1261         cap_close(capsysctl);
1262
1263         /*
1264          * Allow:
1265          * SYSCTL1_NAME/READ/RECURSIVE
1266          */
1267
1268         capsysctl = cap_clone(ocapsysctl);
1269         ATF_REQUIRE(capsysctl != NULL);
1270
1271         limit = cap_sysctl_limit_init(capsysctl);
1272         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME,
1273             CAP_SYSCTL_READ | CAP_SYSCTL_RECURSIVE);
1274         ATF_REQUIRE(cap_sysctl_limit(limit) == 0);
1275         limit = cap_sysctl_limit_init(capsysctl);
1276         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME,
1277             CAP_SYSCTL_READ | CAP_SYSCTL_RECURSIVE);
1278         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME,
1279             CAP_SYSCTL_READ | CAP_SYSCTL_RECURSIVE);
1280         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
1281         limit = cap_sysctl_limit_init(capsysctl);
1282         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME,
1283             CAP_SYSCTL_READ | CAP_SYSCTL_RECURSIVE);
1284         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
1285         limit = cap_sysctl_limit_init(capsysctl);
1286         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME, CAP_SYSCTL_READ);
1287         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME, CAP_SYSCTL_READ);
1288         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
1289         limit = cap_sysctl_limit_init(capsysctl);
1290         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME, CAP_SYSCTL_READ);
1291         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
1292
1293         ATF_REQUIRE(checkcaps(capsysctl) == SYSCTL1_READ0);
1294
1295         cap_close(capsysctl);
1296
1297         /*
1298          * Allow:
1299          * SYSCTL0_PARENT/WRITE/RECURSIVE
1300          */
1301
1302         capsysctl = cap_clone(ocapsysctl);
1303         ATF_REQUIRE(capsysctl != NULL);
1304
1305         limit = cap_sysctl_limit_init(capsysctl);
1306         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT,
1307             CAP_SYSCTL_WRITE | CAP_SYSCTL_RECURSIVE);
1308         ATF_REQUIRE(cap_sysctl_limit(limit) == 0);
1309         limit = cap_sysctl_limit_init(capsysctl);
1310         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT,
1311             CAP_SYSCTL_WRITE | CAP_SYSCTL_RECURSIVE);
1312         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT,
1313             CAP_SYSCTL_WRITE | CAP_SYSCTL_RECURSIVE);
1314         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
1315         limit = cap_sysctl_limit_init(capsysctl);
1316         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT,
1317             CAP_SYSCTL_WRITE | CAP_SYSCTL_RECURSIVE);
1318         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
1319         limit = cap_sysctl_limit_init(capsysctl);
1320         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT, CAP_SYSCTL_WRITE);
1321         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT, CAP_SYSCTL_WRITE);
1322         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
1323         limit = cap_sysctl_limit_init(capsysctl);
1324         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT, CAP_SYSCTL_WRITE);
1325         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
1326
1327         ATF_REQUIRE(checkcaps(capsysctl) == SYSCTL0_WRITE);
1328
1329         cap_close(capsysctl);
1330
1331         /*
1332          * Allow:
1333          * SYSCTL1_NAME/WRITE/RECURSIVE
1334          */
1335
1336         capsysctl = cap_clone(ocapsysctl);
1337         ATF_REQUIRE(capsysctl != NULL);
1338
1339         limit = cap_sysctl_limit_init(capsysctl);
1340         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME,
1341             CAP_SYSCTL_WRITE | CAP_SYSCTL_RECURSIVE);
1342         ATF_REQUIRE(cap_sysctl_limit(limit) == 0);
1343         limit = cap_sysctl_limit_init(capsysctl);
1344         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME,
1345             CAP_SYSCTL_WRITE | CAP_SYSCTL_RECURSIVE);
1346         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME,
1347             CAP_SYSCTL_WRITE | CAP_SYSCTL_RECURSIVE);
1348         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
1349         limit = cap_sysctl_limit_init(capsysctl);
1350         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME,
1351             CAP_SYSCTL_WRITE | CAP_SYSCTL_RECURSIVE);
1352         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
1353         limit = cap_sysctl_limit_init(capsysctl);
1354         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME, CAP_SYSCTL_WRITE);
1355         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME, CAP_SYSCTL_WRITE);
1356         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
1357         limit = cap_sysctl_limit_init(capsysctl);
1358         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME, CAP_SYSCTL_WRITE);
1359         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
1360
1361         ATF_REQUIRE(checkcaps(capsysctl) == SYSCTL1_WRITE);
1362
1363         cap_close(capsysctl);
1364
1365         /*
1366          * Allow:
1367          * SYSCTL0_PARENT/RDWR/RECURSIVE
1368          */
1369
1370         capsysctl = cap_clone(ocapsysctl);
1371         ATF_REQUIRE(capsysctl != NULL);
1372
1373         limit = cap_sysctl_limit_init(capsysctl);
1374         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT,
1375             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
1376         ATF_REQUIRE(cap_sysctl_limit(limit) == 0);
1377         limit = cap_sysctl_limit_init(capsysctl);
1378         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT,
1379             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
1380         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT,
1381             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
1382         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
1383         limit = cap_sysctl_limit_init(capsysctl);
1384         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT,
1385             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
1386         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
1387         limit = cap_sysctl_limit_init(capsysctl);
1388         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT, CAP_SYSCTL_READ);
1389         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT, CAP_SYSCTL_READ);
1390         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
1391         limit = cap_sysctl_limit_init(capsysctl);
1392         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT, CAP_SYSCTL_READ);
1393         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
1394
1395         ATF_REQUIRE(checkcaps(capsysctl) == (SYSCTL0_READ0 | SYSCTL0_READ1 |
1396             SYSCTL0_READ2 | SYSCTL0_WRITE | SYSCTL0_READ_WRITE));
1397
1398         cap_close(capsysctl);
1399
1400         /*
1401          * Allow:
1402          * SYSCTL1_NAME/RDWR/RECURSIVE
1403          */
1404
1405         capsysctl = cap_clone(ocapsysctl);
1406         ATF_REQUIRE(capsysctl != NULL);
1407
1408         limit = cap_sysctl_limit_init(capsysctl);
1409         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME,
1410             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
1411         ATF_REQUIRE(cap_sysctl_limit(limit) == 0);
1412         limit = cap_sysctl_limit_init(capsysctl);
1413         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME,
1414             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
1415         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME,
1416             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
1417         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
1418         limit = cap_sysctl_limit_init(capsysctl);
1419         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME,
1420             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
1421         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
1422         limit = cap_sysctl_limit_init(capsysctl);
1423         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME, CAP_SYSCTL_READ);
1424         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME, CAP_SYSCTL_READ);
1425         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
1426         limit = cap_sysctl_limit_init(capsysctl);
1427         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME, CAP_SYSCTL_READ);
1428         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
1429
1430         ATF_REQUIRE(checkcaps(capsysctl) == (SYSCTL1_READ0 | SYSCTL1_READ1 |
1431             SYSCTL1_READ2 | SYSCTL1_WRITE | SYSCTL1_READ_WRITE));
1432
1433         cap_close(capsysctl);
1434
1435         /*
1436          * Allow:
1437          * SYSCTL0_PARENT/READ
1438          */
1439
1440         capsysctl = cap_clone(ocapsysctl);
1441         ATF_REQUIRE(capsysctl != NULL);
1442
1443         limit = cap_sysctl_limit_init(capsysctl);
1444         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT, CAP_SYSCTL_READ);
1445         ATF_REQUIRE(cap_sysctl_limit(limit) == 0);
1446         limit = cap_sysctl_limit_init(capsysctl);
1447         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT, CAP_SYSCTL_READ);
1448         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT, CAP_SYSCTL_READ);
1449         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
1450         limit = cap_sysctl_limit_init(capsysctl);
1451         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT, CAP_SYSCTL_READ);
1452         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
1453
1454         ATF_REQUIRE(checkcaps(capsysctl) == 0);
1455
1456         cap_close(capsysctl);
1457
1458         /*
1459          * Allow:
1460          * SYSCTL1_NAME/READ
1461          */
1462
1463         capsysctl = cap_clone(ocapsysctl);
1464         ATF_REQUIRE(capsysctl != NULL);
1465
1466         limit = cap_sysctl_limit_init(capsysctl);
1467         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME, CAP_SYSCTL_READ);
1468         ATF_REQUIRE(cap_sysctl_limit(limit) == 0);
1469         limit = cap_sysctl_limit_init(capsysctl);
1470         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME, CAP_SYSCTL_READ);
1471         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME, CAP_SYSCTL_READ);
1472         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
1473         limit = cap_sysctl_limit_init(capsysctl);
1474         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME, CAP_SYSCTL_READ);
1475         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
1476
1477         ATF_REQUIRE(checkcaps(capsysctl) == SYSCTL1_READ0);
1478
1479         cap_close(capsysctl);
1480
1481         /*
1482          * Allow:
1483          * SYSCTL0_PARENT/WRITE
1484          */
1485
1486         capsysctl = cap_clone(ocapsysctl);
1487         ATF_REQUIRE(capsysctl != NULL);
1488
1489         limit = cap_sysctl_limit_init(capsysctl);
1490         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT, CAP_SYSCTL_WRITE);
1491         ATF_REQUIRE(cap_sysctl_limit(limit) == 0);
1492         limit = cap_sysctl_limit_init(capsysctl);
1493         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT, CAP_SYSCTL_WRITE);
1494         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT, CAP_SYSCTL_WRITE);
1495         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
1496         limit = cap_sysctl_limit_init(capsysctl);
1497         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT, CAP_SYSCTL_WRITE);
1498         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
1499
1500         ATF_REQUIRE(checkcaps(capsysctl) == 0);
1501
1502         cap_close(capsysctl);
1503
1504         /*
1505          * Allow:
1506          * SYSCTL1_NAME/WRITE
1507          */
1508
1509         capsysctl = cap_clone(ocapsysctl);
1510         ATF_REQUIRE(capsysctl != NULL);
1511
1512         limit = cap_sysctl_limit_init(capsysctl);
1513         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME, CAP_SYSCTL_WRITE);
1514         ATF_REQUIRE(cap_sysctl_limit(limit) == 0);
1515         limit = cap_sysctl_limit_init(capsysctl);
1516         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME, CAP_SYSCTL_WRITE);
1517         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME, CAP_SYSCTL_WRITE);
1518         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
1519         limit = cap_sysctl_limit_init(capsysctl);
1520         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME, CAP_SYSCTL_WRITE);
1521         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
1522
1523         ATF_REQUIRE(checkcaps(capsysctl) == SYSCTL1_WRITE);
1524
1525         cap_close(capsysctl);
1526
1527         /*
1528          * Allow:
1529          * SYSCTL0_PARENT/RDWR
1530          */
1531
1532         capsysctl = cap_clone(ocapsysctl);
1533         ATF_REQUIRE(capsysctl != NULL);
1534
1535         limit = cap_sysctl_limit_init(capsysctl);
1536         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT, CAP_SYSCTL_RDWR);
1537         ATF_REQUIRE(cap_sysctl_limit(limit) == 0);
1538         limit = cap_sysctl_limit_init(capsysctl);
1539         (void)cap_sysctl_limit_name(limit, SYSCTL0_PARENT, CAP_SYSCTL_RDWR);
1540         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT, CAP_SYSCTL_RDWR);
1541         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
1542         limit = cap_sysctl_limit_init(capsysctl);
1543         (void)cap_sysctl_limit_name(limit, SYSCTL1_PARENT, CAP_SYSCTL_RDWR);
1544         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
1545
1546         ATF_REQUIRE(checkcaps(capsysctl) == 0);
1547
1548         cap_close(capsysctl);
1549
1550         /*
1551          * Allow:
1552          * SYSCTL1_NAME/RDWR
1553          */
1554
1555         capsysctl = cap_clone(ocapsysctl);
1556         ATF_REQUIRE(capsysctl != NULL);
1557
1558         limit = cap_sysctl_limit_init(capsysctl);
1559         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME, CAP_SYSCTL_RDWR);
1560         ATF_REQUIRE(cap_sysctl_limit(limit) == 0);
1561         limit = cap_sysctl_limit_init(capsysctl);
1562         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME, CAP_SYSCTL_RDWR);
1563         (void)cap_sysctl_limit_name(limit, SYSCTL1_NAME, CAP_SYSCTL_RDWR);
1564         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
1565         limit = cap_sysctl_limit_init(capsysctl);
1566         (void)cap_sysctl_limit_name(limit, SYSCTL0_NAME, CAP_SYSCTL_RDWR);
1567         ATF_REQUIRE(cap_sysctl_limit(limit) == -1 && errno == ENOTCAPABLE);
1568
1569         ATF_REQUIRE(checkcaps(capsysctl) == (SYSCTL1_READ0 | SYSCTL1_READ1 |
1570             SYSCTL1_READ2 | SYSCTL1_WRITE | SYSCTL1_READ_WRITE));
1571
1572         cap_close(capsysctl);
1573 }
1574 ATF_TC_CLEANUP(cap_sysctl__names, tc)
1575 {
1576         cleanup();
1577 }
1578
1579 ATF_TC_WITH_CLEANUP(cap_sysctl__no_limits);
1580 ATF_TC_HEAD(cap_sysctl__no_limits, tc)
1581 {
1582 }
1583 ATF_TC_BODY(cap_sysctl__no_limits, tc)
1584 {
1585         cap_channel_t *capsysctl;
1586
1587         capsysctl = initcap();
1588
1589         ATF_REQUIRE_EQ(checkcaps(capsysctl), (SYSCTL0_READ0 | SYSCTL0_READ1 |
1590             SYSCTL0_READ2 | SYSCTL0_WRITE | SYSCTL0_READ_WRITE |
1591             SYSCTL1_READ0 | SYSCTL1_READ1 | SYSCTL1_READ2 | SYSCTL1_WRITE |
1592             SYSCTL1_READ_WRITE));
1593 }
1594 ATF_TC_CLEANUP(cap_sysctl__no_limits, tc)
1595 {
1596         cleanup();
1597 }
1598
1599 ATF_TC_WITH_CLEANUP(cap_sysctl__recursive_limits);
1600 ATF_TC_HEAD(cap_sysctl__recursive_limits, tc)
1601 {
1602 }
1603 ATF_TC_BODY(cap_sysctl__recursive_limits, tc)
1604 {
1605         cap_channel_t *capsysctl, *ocapsysctl;
1606         void *limit;
1607         size_t len;
1608         int mib[2], val = 420;
1609
1610         len = nitems(mib);
1611         ATF_REQUIRE(sysctlnametomib(SYSCTL0_NAME, mib, &len) == 0);
1612
1613         ocapsysctl = initcap();
1614
1615         /*
1616          * Make sure that we match entire components.
1617          */
1618         capsysctl = cap_clone(ocapsysctl);
1619         ATF_REQUIRE(capsysctl != NULL);
1620
1621         limit = cap_sysctl_limit_init(capsysctl);
1622         (void)cap_sysctl_limit_name(limit, "ker",
1623             CAP_SYSCTL_RDWR | CAP_SYSCTL_RECURSIVE);
1624         ATF_REQUIRE(cap_sysctl_limit(limit) == 0);
1625
1626         ATF_REQUIRE_ERRNO(ENOTCAPABLE, cap_sysctlbyname(capsysctl, SYSCTL0_NAME,
1627             NULL, NULL, &val, sizeof(val)));
1628         ATF_REQUIRE_ERRNO(ENOTCAPABLE, cap_sysctl(capsysctl, mib, len,
1629             NULL, NULL, &val, sizeof(val)));
1630
1631         cap_close(capsysctl);
1632
1633         /*
1634          * Verify that we check for CAP_SYSCTL_RECURSIVE.
1635          */
1636         capsysctl = cap_clone(ocapsysctl);
1637         ATF_REQUIRE(capsysctl != NULL);
1638
1639         limit = cap_sysctl_limit_init(capsysctl);
1640         (void)cap_sysctl_limit_name(limit, "kern", CAP_SYSCTL_RDWR);
1641         ATF_REQUIRE(cap_sysctl_limit(limit) == 0);
1642
1643         ATF_REQUIRE_ERRNO(ENOTCAPABLE, cap_sysctlbyname(capsysctl, SYSCTL0_NAME,
1644             NULL, NULL, &val, sizeof(val)));
1645         ATF_REQUIRE_ERRNO(ENOTCAPABLE, cap_sysctl(capsysctl, mib, len,
1646             NULL, NULL, &val, sizeof(val)));
1647
1648         cap_close(capsysctl);
1649 }
1650 ATF_TC_CLEANUP(cap_sysctl__recursive_limits, tc)
1651 {
1652         cleanup();
1653 }
1654
1655 ATF_TC_WITH_CLEANUP(cap_sysctl__just_size);
1656 ATF_TC_HEAD(cap_sysctl__just_size, tc)
1657 {
1658 }
1659 ATF_TC_BODY(cap_sysctl__just_size, tc)
1660 {
1661         cap_channel_t *capsysctl;
1662         size_t len;
1663         int mib0[2];
1664
1665         capsysctl = initcap();
1666
1667         len = nitems(mib0);
1668         ATF_REQUIRE(sysctlnametomib(SYSCTL0_NAME, mib0, &len) == 0);
1669
1670         ATF_REQUIRE(cap_sysctlbyname(capsysctl, SYSCTL0_NAME,
1671             NULL, &len, NULL, 0) == 0);
1672         ATF_REQUIRE(len == sizeof(int));
1673         ATF_REQUIRE(cap_sysctl(capsysctl, mib0, nitems(mib0),
1674             NULL, &len, NULL, 0) == 0);
1675         ATF_REQUIRE(len == sizeof(int));
1676
1677         cap_close(capsysctl);
1678 }
1679 ATF_TC_CLEANUP(cap_sysctl__just_size, tc)
1680 {
1681         cleanup();
1682 }
1683
1684 ATF_TP_ADD_TCS(tp)
1685 {
1686         ATF_TP_ADD_TC(tp, cap_sysctl__operation);
1687         ATF_TP_ADD_TC(tp, cap_sysctl__names);
1688         ATF_TP_ADD_TC(tp, cap_sysctl__no_limits);
1689         ATF_TP_ADD_TC(tp, cap_sysctl__recursive_limits);
1690         ATF_TP_ADD_TC(tp, cap_sysctl__just_size);
1691
1692         return (atf_no_error());
1693 }