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