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