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