]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - lib/libcasper/services/cap_net/tests/net_test.c
libcasper: Introduce cap_net a network service for Casper.
[FreeBSD/FreeBSD.git] / lib / libcasper / services / cap_net / tests / net_test.c
1 /*-
2  * Copyright (c) 2020 Mariusz Zaborski <oshogbo@FreeBSD.org>
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
14  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
15  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
23  * POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include <sys/cdefs.h>
27 __FBSDID("$FreeBSD$");
28
29 #include <sys/param.h>
30 #include <sys/socket.h>
31 #include <netinet/in.h>
32 #include <arpa/inet.h>
33
34 #include <errno.h>
35 #include <netdb.h>
36
37 #include <atf-c.h>
38
39 #include <libcasper.h>
40 #include <casper/cap_net.h>
41
42 #define TEST_DOMAIN_0   "example.com"
43 #define TEST_DOMAIN_1   "freebsd.org"
44 #define TEST_IPV4       "1.1.1.1"
45 #define TEST_IPV6       "2001:4860:4860::8888"
46 #define TEST_BIND_IPV4  "127.0.0.1"
47
48 static cap_channel_t *
49 create_network_service(void)
50 {
51         cap_channel_t *capcas, *capnet;
52
53         capcas = cap_init();
54         ATF_REQUIRE(capcas != NULL);
55
56         capnet = cap_service_open(capcas, "system.net");
57         ATF_REQUIRE(capnet != NULL);
58
59         cap_close(capcas);
60         return (capnet);
61 }
62
63 static int
64 test_getnameinfo_v4(cap_channel_t *chan, int family, const char *ip)
65 {
66         struct sockaddr_in ipaddr;
67         char capfn[MAXHOSTNAMELEN];
68         char origfn[MAXHOSTNAMELEN];
69         int ret;
70
71         memset(&ipaddr, 0, sizeof(ipaddr));
72         ipaddr.sin_family = family;
73         inet_pton(family, ip, &ipaddr.sin_addr);
74
75         ret = cap_getnameinfo(chan, (struct sockaddr *)&ipaddr, sizeof(ipaddr),
76             capfn, sizeof(capfn), NULL, 0, NI_NAMEREQD);
77         if (ret != 0) {
78                 return (ret);
79         }
80
81         ret = getnameinfo((struct sockaddr *)&ipaddr, sizeof(ipaddr), origfn,
82             sizeof(origfn), NULL, 0, NI_NAMEREQD);
83         ATF_REQUIRE(ret == 0);
84         ATF_REQUIRE(strcmp(origfn, capfn) == 0);
85
86         return (0);
87 }
88
89 static int
90 test_getnameinfo_v6(cap_channel_t *chan, const char *ip)
91 {
92         struct sockaddr_in6 ipaddr;
93         char capfn[MAXHOSTNAMELEN];
94         char origfn[MAXHOSTNAMELEN];
95         int ret;
96
97         memset(&ipaddr, 0, sizeof(ipaddr));
98         ipaddr.sin6_family = AF_INET6;
99         inet_pton(AF_INET6, ip, &ipaddr.sin6_addr);
100
101         ret = cap_getnameinfo(chan, (struct sockaddr *)&ipaddr, sizeof(ipaddr),
102             capfn, sizeof(capfn), NULL, 0, NI_NAMEREQD);
103         if (ret != 0) {
104                 return (ret);
105         }
106
107         ret = getnameinfo((struct sockaddr *)&ipaddr, sizeof(ipaddr), origfn,
108             sizeof(origfn), NULL, 0, NI_NAMEREQD);
109         ATF_REQUIRE(ret == 0);
110         ATF_REQUIRE(strcmp(origfn, capfn) == 0);
111
112         return (0);
113 }
114
115 static int
116 test_getnameinfo(cap_channel_t *chan, int family, const char *ip)
117 {
118
119         if (family == AF_INET6) {
120                 return (test_getnameinfo_v6(chan, ip));
121         }
122
123         return (test_getnameinfo_v4(chan, family, ip));
124 }
125
126 static int
127 test_gethostbyaddr_v4(cap_channel_t *chan, int family, const char *ip)
128 {
129         struct in_addr ipaddr;
130         struct hostent *caphp, *orighp;
131
132         memset(&ipaddr, 0, sizeof(ipaddr));
133         inet_pton(AF_INET, ip, &ipaddr);
134
135         caphp = cap_gethostbyaddr(chan, &ipaddr, sizeof(ipaddr), family);
136         if (caphp == NULL) {
137                 return (h_errno);
138         }
139
140         orighp = gethostbyaddr(&ipaddr, sizeof(ipaddr), family);
141         ATF_REQUIRE(orighp != NULL);
142         ATF_REQUIRE(strcmp(caphp->h_name, caphp->h_name) == 0);
143
144         return (0);
145 }
146
147 static int
148 test_gethostbyaddr_v6(cap_channel_t *chan, const char *ip)
149 {
150         struct in6_addr ipaddr;
151         struct hostent *caphp, *orighp;
152
153         memset(&ipaddr, 0, sizeof(ipaddr));
154         inet_pton(AF_INET6, ip, &ipaddr);
155
156         caphp = cap_gethostbyaddr(chan, &ipaddr, sizeof(ipaddr), AF_INET6);
157         if (caphp == NULL)
158                 return (h_errno);
159
160         orighp = gethostbyaddr(&ipaddr, sizeof(ipaddr), AF_INET6);
161         ATF_REQUIRE(orighp != NULL);
162         ATF_REQUIRE(strcmp(caphp->h_name, caphp->h_name) == 0);
163
164         return (0);
165 }
166
167 static int
168 test_gethostbyaddr(cap_channel_t *chan, int family, const char *ip)
169 {
170
171         if (family == AF_INET6) {
172                 return (test_gethostbyaddr_v6(chan, ip));
173         } else {
174                 return (test_gethostbyaddr_v4(chan, family, ip));
175         }
176 }
177
178 static int
179 test_getaddrinfo(cap_channel_t *chan, int family, const char *domain,
180     const char *servname)
181 {
182         struct addrinfo hints, *capres, *origres, *res0, *res1;
183         bool found;
184         int ret;
185
186         memset(&hints, 0, sizeof(hints));
187         hints.ai_family = family;
188         hints.ai_socktype = SOCK_STREAM;
189
190         ret = cap_getaddrinfo(chan, domain, servname, &hints, &capres);
191         if (ret != 0) {
192                 return (ret);
193         }
194
195         ret = getaddrinfo(domain, servname, &hints, &origres);
196         ATF_REQUIRE(ret == 0);
197
198         for (res0 = capres; res0 != NULL; res0 = res0->ai_next) {
199                 found = false;
200                 for (res1 = origres; res1 != NULL; res1 = res1->ai_next) {
201                         if (res1->ai_addrlen == res0->ai_addrlen &&
202                             memcmp(res1->ai_addr, res0->ai_addr,
203                             res0->ai_addrlen) == 0) {
204                                 found = true;
205                                 break;
206                         }
207                 }
208                 ATF_REQUIRE(found);
209         }
210
211         freeaddrinfo(capres);
212         freeaddrinfo(origres);
213         return (0);
214 }
215
216 static int
217 test_gethostbyname(cap_channel_t *chan, int family, const char *domain)
218 {
219         struct hostent *caphp, *orighp;
220
221         caphp = cap_gethostbyname2(chan, domain, family);
222         if (caphp == NULL) {
223                 return (h_errno);
224         }
225
226         orighp = gethostbyname2(domain, family);
227         ATF_REQUIRE(orighp != NULL);
228         ATF_REQUIRE(strcmp(caphp->h_name, orighp->h_name) == 0);
229
230         return (0);
231 }
232
233 static int
234 test_bind(cap_channel_t *chan, const char *ip)
235 {
236         struct sockaddr_in ipv4;
237         int capfd, ret, serrno;
238
239         capfd = socket(AF_INET, SOCK_STREAM, 0);
240         ATF_REQUIRE(capfd > 0);
241
242         memset(&ipv4, 0, sizeof(ipv4));
243         ipv4.sin_family = AF_INET;
244         inet_pton(AF_INET, ip, &ipv4.sin_addr);
245
246         ret = cap_bind(chan, capfd, (struct sockaddr *)&ipv4, sizeof(ipv4));
247         serrno = errno;
248         close(capfd);
249
250         return (ret < 0 ? serrno : 0);
251 }
252
253 static int
254 test_connect(cap_channel_t *chan, const char *ip, unsigned short port)
255 {
256         struct sockaddr_in ipv4;
257         int capfd, ret, serrno;
258
259         capfd = socket(AF_INET, SOCK_STREAM, 0);
260         ATF_REQUIRE(capfd > 0);
261
262         memset(&ipv4, 0, sizeof(ipv4));
263         ipv4.sin_family = AF_INET;
264         ipv4.sin_port = htons(port);
265         inet_pton(AF_INET, ip, &ipv4.sin_addr);
266
267         ret = cap_connect(chan, capfd, (struct sockaddr *)&ipv4, sizeof(ipv4));
268         serrno = errno;
269         close(capfd);
270
271         return (ret < 0 ? serrno : 0);
272 }
273
274 static void
275 test_extend_mode(cap_channel_t *capnet, int current)
276 {
277         cap_net_limit_t *limit;
278         const int rights[] = {
279                 CAPNET_ADDR2NAME,
280                 CAPNET_NAME2ADDR,
281                 CAPNET_DEPRECATED_ADDR2NAME,
282                 CAPNET_DEPRECATED_NAME2ADDR,
283                 CAPNET_CONNECT,
284                 CAPNET_BIND,
285                 CAPNET_CONNECTDNS
286         };
287         size_t i;
288
289         for (i = 0; i < nitems(rights); i++) {
290                 if (current == rights[i])
291                         continue;
292
293                 limit = cap_net_limit_init(capnet, current | rights[i]);
294                 ATF_REQUIRE(limit != NULL);
295                 ATF_REQUIRE(cap_net_limit(limit) != 0);
296         }
297 }
298
299 ATF_TC_WITHOUT_HEAD(capnet__limits_addr2name_mode);
300 ATF_TC_BODY(capnet__limits_addr2name_mode, tc)
301 {
302         cap_channel_t *capnet;
303         cap_net_limit_t *limit;
304
305         capnet = create_network_service();
306
307         /* LIMIT */
308         limit = cap_net_limit_init(capnet, CAPNET_ADDR2NAME);
309         ATF_REQUIRE(limit != NULL);
310         ATF_REQUIRE(cap_net_limit(limit) == 0);
311
312         /* ALLOWED */
313         ATF_REQUIRE(test_getnameinfo(capnet, AF_INET, TEST_IPV4) == 0);
314
315         /* DISALLOWED */
316         ATF_REQUIRE(test_gethostbyname(capnet, AF_INET, TEST_DOMAIN_0) ==
317             ENOTCAPABLE);
318         ATF_REQUIRE(test_gethostbyaddr(capnet, AF_INET, TEST_IPV4) ==
319             ENOTCAPABLE);
320         ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_0, NULL) ==
321             ENOTCAPABLE);
322         ATF_REQUIRE(test_bind(capnet, TEST_BIND_IPV4) == ENOTCAPABLE);
323         ATF_REQUIRE(test_connect(capnet, TEST_IPV4, 80) == ENOTCAPABLE);
324
325         test_extend_mode(capnet, CAPNET_ADDR2NAME);
326
327         cap_close(capnet);
328 }
329
330 ATF_TC_WITHOUT_HEAD(capnet__limits_addr2name_family);
331 ATF_TC_BODY(capnet__limits_addr2name_family, tc)
332 {
333         cap_channel_t *capnet;
334         cap_net_limit_t *limit;
335         int family[] = { AF_INET6, AF_INET };
336
337         capnet = create_network_service();
338
339         /* Limit to AF_INET6 and AF_INET. */
340         limit = cap_net_limit_init(capnet, CAPNET_ADDR2NAME);
341         ATF_REQUIRE(limit != NULL);
342         cap_net_limit_addr2name_family(limit, family, nitems(family));
343         ATF_REQUIRE(cap_net_limit(limit) == 0);
344
345         ATF_REQUIRE(test_getnameinfo(capnet, AF_INET, TEST_IPV4) == 0);
346         ATF_REQUIRE(test_getnameinfo(capnet, AF_INET6, TEST_IPV6) == 0);
347
348         /* Limit to AF_INET6 and AF_INET. */
349         limit = cap_net_limit_init(capnet, CAPNET_ADDR2NAME);
350         ATF_REQUIRE(limit != NULL);
351         cap_net_limit_addr2name_family(limit, &family[0], 1);
352         cap_net_limit_addr2name_family(limit, &family[1], 1);
353         ATF_REQUIRE(cap_net_limit(limit) == 0);
354
355         ATF_REQUIRE(test_getnameinfo(capnet, AF_INET, TEST_IPV4) == 0);
356         ATF_REQUIRE(test_getnameinfo(capnet, AF_INET6, TEST_IPV6) == 0);
357
358         /* Limit to AF_INET6. */
359         limit = cap_net_limit_init(capnet, CAPNET_ADDR2NAME);
360         ATF_REQUIRE(limit != NULL);
361         cap_net_limit_addr2name_family(limit, family, 1);
362         ATF_REQUIRE(cap_net_limit(limit) == 0);
363
364         ATF_REQUIRE(test_getnameinfo(capnet, AF_INET, TEST_IPV4) ==
365             ENOTCAPABLE);
366         ATF_REQUIRE(test_getnameinfo(capnet, AF_INET6, TEST_IPV6) == 0);
367
368         /* Unable to set empty limits. Empty limits means full access. */
369         limit = cap_net_limit_init(capnet, CAPNET_ADDR2NAME);
370         ATF_REQUIRE(cap_net_limit(limit) != 0);
371
372         cap_close(capnet);
373 }
374
375 ATF_TC_WITHOUT_HEAD(capnet__limits_addr2name);
376 ATF_TC_BODY(capnet__limits_addr2name, tc)
377 {
378         cap_channel_t *capnet;
379         cap_net_limit_t *limit;
380         struct sockaddr_in ipaddrv4;
381         struct sockaddr_in6 ipaddrv6;
382
383         capnet = create_network_service();
384
385         /* Limit to TEST_IPV4 and TEST_IPV6. */
386         memset(&ipaddrv4, 0, sizeof(ipaddrv4));
387         memset(&ipaddrv6, 0, sizeof(ipaddrv6));
388
389         ipaddrv4.sin_family = AF_INET;
390         inet_pton(AF_INET, TEST_IPV4, &ipaddrv4.sin_addr);
391
392         ipaddrv6.sin6_family = AF_INET6;
393         inet_pton(AF_INET6, TEST_IPV6, &ipaddrv6.sin6_addr);
394
395         limit = cap_net_limit_init(capnet, CAPNET_ADDR2NAME);
396         ATF_REQUIRE(limit != NULL);
397
398         cap_net_limit_addr2name(limit, (struct sockaddr *)&ipaddrv4,
399             sizeof(ipaddrv4));
400         cap_net_limit_addr2name(limit, (struct sockaddr *)&ipaddrv6,
401             sizeof(ipaddrv6));
402         ATF_REQUIRE(cap_net_limit(limit) == 0);
403
404         ATF_REQUIRE(test_getnameinfo(capnet, AF_INET, TEST_IPV4) == 0);
405         ATF_REQUIRE(test_getnameinfo(capnet, AF_INET6, TEST_IPV6) == 0);
406         ATF_REQUIRE(test_getnameinfo(capnet, AF_INET, "127.0.0.1") ==
407             ENOTCAPABLE);
408
409         /* Limit to AF_INET. */
410         limit = cap_net_limit_init(capnet, CAPNET_ADDR2NAME);
411         ATF_REQUIRE(limit != NULL);
412         cap_net_limit_addr2name(limit, (struct sockaddr *)&ipaddrv4,
413             sizeof(ipaddrv4));
414         ATF_REQUIRE(cap_net_limit(limit) == 0);
415
416         ATF_REQUIRE(test_getnameinfo(capnet, AF_INET, TEST_IPV4) == 0);
417         ATF_REQUIRE(test_getnameinfo(capnet, AF_INET6, TEST_IPV6) ==
418             ENOTCAPABLE);
419         ATF_REQUIRE(test_getnameinfo(capnet, AF_INET, "127.0.0.1") ==
420             ENOTCAPABLE);
421
422         /* Unable to set empty limits. Empty limits means full access. */
423         limit = cap_net_limit_init(capnet, CAPNET_ADDR2NAME);
424         ATF_REQUIRE(cap_net_limit(limit) != 0);
425
426         cap_close(capnet);
427 }
428
429 ATF_TC_WITHOUT_HEAD(capnet__limits_deprecated_addr2name_mode);
430 ATF_TC_BODY(capnet__limits_deprecated_addr2name_mode, tc)
431 {
432         cap_channel_t *capnet;
433         cap_net_limit_t *limit;
434
435         capnet = create_network_service();
436
437         /* LIMIT */
438         limit = cap_net_limit_init(capnet, CAPNET_DEPRECATED_ADDR2NAME);
439         ATF_REQUIRE(limit != NULL);
440         ATF_REQUIRE(cap_net_limit(limit) == 0);
441
442         /* ALLOWED */
443         ATF_REQUIRE(test_gethostbyaddr(capnet, AF_INET, TEST_IPV4) == 0);
444
445         /* DISALLOWED */
446         ATF_REQUIRE(test_gethostbyname(capnet, AF_INET, TEST_DOMAIN_0) ==
447             ENOTCAPABLE);
448         ATF_REQUIRE(test_getnameinfo(capnet, AF_INET, TEST_IPV4) ==
449             ENOTCAPABLE);
450         ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_0, NULL) ==
451             ENOTCAPABLE);
452         ATF_REQUIRE(test_bind(capnet, TEST_BIND_IPV4) == ENOTCAPABLE);
453         ATF_REQUIRE(test_connect(capnet, TEST_IPV4, 80) == ENOTCAPABLE);
454
455         cap_close(capnet);
456 }
457
458 ATF_TC_WITHOUT_HEAD(capnet__limits_deprecated_addr2name_family);
459 ATF_TC_BODY(capnet__limits_deprecated_addr2name_family, tc)
460 {
461         cap_channel_t *capnet;
462         cap_net_limit_t *limit;
463         int family[] = { AF_INET6, AF_INET };
464
465         capnet = create_network_service();
466
467         /* Limit to AF_INET6 and AF_INET. */
468         limit = cap_net_limit_init(capnet, CAPNET_DEPRECATED_ADDR2NAME);
469         ATF_REQUIRE(limit != NULL);
470         cap_net_limit_addr2name_family(limit, family, nitems(family));
471         ATF_REQUIRE(cap_net_limit(limit) == 0);
472
473         ATF_REQUIRE(test_gethostbyaddr(capnet, AF_INET, TEST_IPV4) == 0);
474         ATF_REQUIRE(test_gethostbyaddr(capnet, AF_INET6, TEST_IPV6) == 0);
475         ATF_REQUIRE(test_gethostbyaddr(capnet, PF_LINK, TEST_IPV4) ==
476             ENOTCAPABLE);
477
478         /* Limit to AF_INET6 and AF_INET. */
479         limit = cap_net_limit_init(capnet, CAPNET_DEPRECATED_ADDR2NAME);
480         ATF_REQUIRE(limit != NULL);
481         cap_net_limit_addr2name_family(limit, &family[0], 1);
482         cap_net_limit_addr2name_family(limit, &family[1], 1);
483         ATF_REQUIRE(cap_net_limit(limit) == 0);
484
485         ATF_REQUIRE(test_gethostbyaddr(capnet, AF_INET, TEST_IPV4) == 0);
486         ATF_REQUIRE(test_gethostbyaddr(capnet, AF_INET6, TEST_IPV6) == 0);
487         ATF_REQUIRE(test_gethostbyaddr(capnet, PF_LINK, TEST_IPV4) ==
488             ENOTCAPABLE);
489
490         /* Limit to AF_INET6. */
491         limit = cap_net_limit_init(capnet, CAPNET_DEPRECATED_ADDR2NAME);
492         ATF_REQUIRE(limit != NULL);
493         cap_net_limit_addr2name_family(limit, family, 1);
494         ATF_REQUIRE(cap_net_limit(limit) == 0);
495
496         ATF_REQUIRE(test_gethostbyaddr(capnet, AF_INET, TEST_IPV4) ==
497             ENOTCAPABLE);
498         ATF_REQUIRE(test_gethostbyaddr(capnet, AF_INET6, TEST_IPV6) == 0);
499         ATF_REQUIRE(test_gethostbyaddr(capnet, PF_LINK, TEST_IPV4) ==
500             ENOTCAPABLE);
501
502         /* Unable to set empty limits. Empty limits means full access. */
503         limit = cap_net_limit_init(capnet, CAPNET_DEPRECATED_ADDR2NAME);
504         ATF_REQUIRE(cap_net_limit(limit) != 0);
505
506         cap_close(capnet);
507 }
508
509 ATF_TC_WITHOUT_HEAD(capnet__limits_deprecated_addr2name);
510 ATF_TC_BODY(capnet__limits_deprecated_addr2name, tc)
511 {
512         cap_channel_t *capnet;
513         cap_net_limit_t *limit;
514         struct in_addr ipaddrv4;
515         struct in6_addr ipaddrv6;
516
517         capnet = create_network_service();
518
519         /* Limit to TEST_IPV4 and TEST_IPV6. */
520         memset(&ipaddrv4, 0, sizeof(ipaddrv4));
521         memset(&ipaddrv6, 0, sizeof(ipaddrv6));
522
523         inet_pton(AF_INET, TEST_IPV4, &ipaddrv4);
524         inet_pton(AF_INET6, TEST_IPV6, &ipaddrv6);
525
526         limit = cap_net_limit_init(capnet, CAPNET_DEPRECATED_ADDR2NAME);
527         ATF_REQUIRE(limit != NULL);
528
529         cap_net_limit_addr2name(limit, (struct sockaddr *)&ipaddrv4,
530             sizeof(ipaddrv4));
531         cap_net_limit_addr2name(limit, (struct sockaddr *)&ipaddrv6,
532             sizeof(ipaddrv6));
533         ATF_REQUIRE(cap_net_limit(limit) == 0);
534
535         ATF_REQUIRE(test_gethostbyaddr(capnet, AF_INET, TEST_IPV4) == 0);
536         ATF_REQUIRE(test_gethostbyaddr(capnet, AF_INET6, TEST_IPV6) == 0);
537         ATF_REQUIRE(test_gethostbyaddr(capnet, AF_INET, "127.0.0.1") ==
538             ENOTCAPABLE);
539
540         /* Limit to AF_INET. */
541         limit = cap_net_limit_init(capnet, CAPNET_DEPRECATED_ADDR2NAME);
542         ATF_REQUIRE(limit != NULL);
543         cap_net_limit_addr2name(limit, (struct sockaddr *)&ipaddrv4,
544             sizeof(ipaddrv4));
545         ATF_REQUIRE(cap_net_limit(limit) == 0);
546
547         ATF_REQUIRE(test_gethostbyaddr(capnet, AF_INET, TEST_IPV4) == 0);
548         ATF_REQUIRE(test_gethostbyaddr(capnet, AF_INET6, TEST_IPV6) ==
549             ENOTCAPABLE);
550         ATF_REQUIRE(test_gethostbyaddr(capnet, AF_INET, "127.0.0.1") ==
551             ENOTCAPABLE);
552
553         /* Unable to set empty limits. Empty limits means full access. */
554         limit = cap_net_limit_init(capnet, CAPNET_DEPRECATED_ADDR2NAME);
555         ATF_REQUIRE(cap_net_limit(limit) != 0);
556
557         cap_close(capnet);
558 }
559
560
561 ATF_TC_WITHOUT_HEAD(capnet__limits_name2addr_mode);
562 ATF_TC_BODY(capnet__limits_name2addr_mode, tc)
563 {
564         cap_channel_t *capnet;
565         cap_net_limit_t *limit;
566
567         capnet = create_network_service();
568
569         /* LIMIT */
570         limit = cap_net_limit_init(capnet, CAPNET_NAME2ADDR);
571         ATF_REQUIRE(limit != NULL);
572         ATF_REQUIRE(cap_net_limit(limit) == 0);
573
574         /* ALLOWED */
575         ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_0, NULL) ==
576             0);
577
578         /* DISALLOWED */
579         ATF_REQUIRE(
580             test_gethostbyname(capnet, AF_INET, TEST_DOMAIN_0) == ENOTCAPABLE);
581         ATF_REQUIRE(test_getnameinfo(capnet, AF_INET, TEST_IPV4) ==
582             ENOTCAPABLE);
583         ATF_REQUIRE(test_gethostbyaddr(capnet, AF_INET, TEST_IPV4) ==
584             ENOTCAPABLE);
585         ATF_REQUIRE(test_bind(capnet, TEST_BIND_IPV4) == ENOTCAPABLE);
586         ATF_REQUIRE(test_connect(capnet, TEST_IPV4, 80) == ENOTCAPABLE);
587
588         test_extend_mode(capnet, CAPNET_ADDR2NAME);
589
590         cap_close(capnet);
591 }
592
593 ATF_TC_WITHOUT_HEAD(capnet__limits_name2addr_hosts);
594 ATF_TC_BODY(capnet__limits_name2addr_hosts, tc)
595 {
596         cap_channel_t *capnet;
597         cap_net_limit_t *limit;
598
599         capnet = create_network_service();
600
601         /* Limit to TEST_DOMAIN_0 and localhost only. */
602         limit = cap_net_limit_init(capnet, CAPNET_NAME2ADDR);
603         ATF_REQUIRE(limit != NULL);
604         cap_net_limit_name2addr(limit, TEST_DOMAIN_0, NULL);
605         cap_net_limit_name2addr(limit, "localhost", NULL);
606         ATF_REQUIRE(cap_net_limit(limit) == 0);
607
608         ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_0, NULL) ==
609             0);
610         ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, "localhost", NULL) == 0);
611         ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_1, NULL) ==
612             ENOTCAPABLE);
613
614         /* Limit to TEST_DOMAIN_0 only. */
615         limit = cap_net_limit_init(capnet, CAPNET_NAME2ADDR);
616         ATF_REQUIRE(limit != NULL);
617         cap_net_limit_name2addr(limit, TEST_DOMAIN_0, NULL);
618         ATF_REQUIRE(cap_net_limit(limit) == 0);
619
620         ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, "localhost", NULL) ==
621             ENOTCAPABLE);
622         ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_1, NULL) ==
623             ENOTCAPABLE);
624         ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_0, NULL) ==
625             0);
626
627         /* Unable to set empty limits. Empty limits means full access. */
628         limit = cap_net_limit_init(capnet, CAPNET_NAME2ADDR);
629         ATF_REQUIRE(cap_net_limit(limit) != 0);
630
631         cap_close(capnet);
632 }
633
634 ATF_TC_WITHOUT_HEAD(capnet__limits_name2addr_hosts_servnames_strict);
635 ATF_TC_BODY(capnet__limits_name2addr_hosts_servnames_strict, tc)
636 {
637         cap_channel_t *capnet;
638         cap_net_limit_t *limit;
639
640         capnet = create_network_service();
641
642         /*
643          * Limit to TEST_DOMAIN_0 and HTTP service.
644          */
645         limit = cap_net_limit_init(capnet, CAPNET_NAME2ADDR);
646         ATF_REQUIRE(limit != NULL);
647         cap_net_limit_name2addr(limit, TEST_DOMAIN_0, "http");
648         ATF_REQUIRE(cap_net_limit(limit) == 0);
649
650         ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_0, "http") ==
651             0);
652         ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_0, NULL) ==
653             ENOTCAPABLE);
654         ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_0, "snmp") ==
655             ENOTCAPABLE);
656         ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_1, "http") ==
657             ENOTCAPABLE);
658
659         /* Unable to set empty limits. Empty limits means full access. */
660         limit = cap_net_limit_init(capnet, CAPNET_NAME2ADDR);
661         ATF_REQUIRE(cap_net_limit(limit) != 0);
662
663         cap_close(capnet);
664 }
665
666 ATF_TC_WITHOUT_HEAD(capnet__limits_name2addr_hosts_servnames_mix);
667 ATF_TC_BODY(capnet__limits_name2addr_hosts_servnames_mix, tc)
668 {
669         cap_channel_t *capnet;
670         cap_net_limit_t *limit;
671
672         capnet = create_network_service();
673
674         /*
675          * Limit to TEST_DOMAIN_0 and any servnamex, and any domain with
676          * servname HTTP.
677          */
678         limit = cap_net_limit_init(capnet, CAPNET_NAME2ADDR);
679         ATF_REQUIRE(limit != NULL);
680         cap_net_limit_name2addr(limit, TEST_DOMAIN_0, NULL);
681         cap_net_limit_name2addr(limit, NULL, "http");
682         ATF_REQUIRE(cap_net_limit(limit) == 0);
683
684         ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_0, "http") ==
685             0);
686         ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_0, NULL) ==
687             0);
688         ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_1, "http") ==
689             0);
690         ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_0, NULL) ==
691             0);
692         ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_1, "snmp") ==
693             ENOTCAPABLE);
694
695         /* Limit to HTTTP servname only. */
696         limit = cap_net_limit_init(capnet, CAPNET_NAME2ADDR);
697         ATF_REQUIRE(limit != NULL);
698         cap_net_limit_name2addr(limit, NULL, "http");
699         ATF_REQUIRE(cap_net_limit(limit) == 0);
700
701         ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_0, "http") ==
702             0);
703         ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_0, NULL) ==
704             ENOTCAPABLE);
705         ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_1, "http") ==
706             0);
707         ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_0, NULL) ==
708             ENOTCAPABLE);
709         ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_1, "snmp") ==
710             ENOTCAPABLE);
711
712         /* Unable to set empty limits. Empty limits means full access. */
713         limit = cap_net_limit_init(capnet, CAPNET_NAME2ADDR);
714         ATF_REQUIRE(cap_net_limit(limit) != 0);
715
716         cap_close(capnet);
717 }
718
719 ATF_TC_WITHOUT_HEAD(capnet__limits_name2addr_family);
720 ATF_TC_BODY(capnet__limits_name2addr_family, tc)
721 {
722         cap_channel_t *capnet;
723         cap_net_limit_t *limit;
724         int family[] = { AF_INET6, AF_INET };
725
726         capnet = create_network_service();
727
728         /* Limit to AF_INET and AF_INET6. */
729         limit = cap_net_limit_init(capnet, CAPNET_NAME2ADDR);
730         ATF_REQUIRE(limit != NULL);
731         cap_net_limit_name2addr(limit, TEST_DOMAIN_0, NULL);
732         cap_net_limit_name2addr_family(limit, family, nitems(family));
733         ATF_REQUIRE(cap_net_limit(limit) == 0);
734
735         ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_0, NULL) ==
736             0);
737         ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET6, TEST_DOMAIN_0, NULL) ==
738             0);
739         ATF_REQUIRE(test_getaddrinfo(capnet, PF_LINK, TEST_DOMAIN_0, NULL) ==
740             ENOTCAPABLE);
741
742         /* Limit to AF_INET and AF_INET6. */
743         limit = cap_net_limit_init(capnet, CAPNET_NAME2ADDR);
744         ATF_REQUIRE(limit != NULL);
745         cap_net_limit_name2addr(limit, TEST_DOMAIN_0, NULL);
746         cap_net_limit_name2addr_family(limit, &family[0], 1);
747         cap_net_limit_name2addr_family(limit, &family[1], 1);
748         ATF_REQUIRE(cap_net_limit(limit) == 0);
749
750         ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_0, NULL) ==
751             0);
752         ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET6, TEST_DOMAIN_0, NULL) ==
753             0);
754         ATF_REQUIRE(test_getaddrinfo(capnet, PF_LINK, TEST_DOMAIN_0, NULL) ==
755             ENOTCAPABLE);
756
757         /* Limit to AF_INET6 only. */
758         limit = cap_net_limit_init(capnet, CAPNET_NAME2ADDR);
759         ATF_REQUIRE(limit != NULL);
760         cap_net_limit_name2addr(limit, TEST_DOMAIN_0, NULL);
761         cap_net_limit_name2addr_family(limit, family, 1);
762         ATF_REQUIRE(cap_net_limit(limit) == 0);
763
764         ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_0, NULL) ==
765             ENOTCAPABLE);
766         ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET6, TEST_DOMAIN_0, NULL) ==
767             0);
768         ATF_REQUIRE(test_getaddrinfo(capnet, PF_LINK, TEST_DOMAIN_0, NULL) ==
769             ENOTCAPABLE);
770
771         /* Unable to set empty limits. Empty limits means full access. */
772         limit = cap_net_limit_init(capnet, CAPNET_NAME2ADDR);
773         ATF_REQUIRE(cap_net_limit(limit) != 0);
774
775         cap_close(capnet);
776 }
777
778 ATF_TC_WITHOUT_HEAD(capnet__limits_deprecated_name2addr_mode);
779 ATF_TC_BODY(capnet__limits_deprecated_name2addr_mode, tc)
780 {
781         cap_channel_t *capnet;
782         cap_net_limit_t *limit;
783
784         capnet = create_network_service();
785
786         /* LIMIT */
787         limit = cap_net_limit_init(capnet, CAPNET_DEPRECATED_NAME2ADDR);
788         ATF_REQUIRE(limit != NULL);
789         ATF_REQUIRE(cap_net_limit(limit) == 0);
790
791         /* ALLOWED */
792         ATF_REQUIRE(test_gethostbyname(capnet, AF_INET, TEST_DOMAIN_0) == 0);
793
794         /* DISALLOWED */
795         ATF_REQUIRE(test_getnameinfo(capnet, AF_INET, TEST_IPV4) ==
796             ENOTCAPABLE);
797         ATF_REQUIRE(test_gethostbyaddr(capnet, AF_INET, TEST_IPV4) ==
798             ENOTCAPABLE);
799         ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_0, NULL) ==
800             ENOTCAPABLE);
801         ATF_REQUIRE(test_bind(capnet, TEST_BIND_IPV4) == ENOTCAPABLE);
802         ATF_REQUIRE(test_connect(capnet, TEST_IPV4, 80) == ENOTCAPABLE);
803
804         test_extend_mode(capnet, CAPNET_ADDR2NAME);
805
806         cap_close(capnet);
807 }
808
809 ATF_TC_WITHOUT_HEAD(capnet__limits_deprecated_name2addr_hosts);
810 ATF_TC_BODY(capnet__limits_deprecated_name2addr_hosts, tc)
811 {
812         cap_channel_t *capnet;
813         cap_net_limit_t *limit;
814
815         capnet = create_network_service();
816
817         /* Limit to TEST_DOMAIN_0 and localhost only. */
818         limit = cap_net_limit_init(capnet, CAPNET_DEPRECATED_NAME2ADDR);
819         ATF_REQUIRE(limit != NULL);
820         cap_net_limit_name2addr(limit, TEST_DOMAIN_0, NULL);
821         cap_net_limit_name2addr(limit, "localhost", NULL);
822         ATF_REQUIRE(cap_net_limit(limit) == 0);
823
824         ATF_REQUIRE(test_gethostbyname(capnet, AF_INET, TEST_DOMAIN_0) == 0);
825         ATF_REQUIRE(test_gethostbyname(capnet, AF_INET, "localhost") == 0);
826         ATF_REQUIRE(
827             test_gethostbyname(capnet, AF_INET, TEST_DOMAIN_1) == ENOTCAPABLE);
828
829         /* Limit to TEST_DOMAIN_0 only. */
830         limit = cap_net_limit_init(capnet, CAPNET_DEPRECATED_NAME2ADDR);
831         ATF_REQUIRE(limit != NULL);
832         cap_net_limit_name2addr(limit, TEST_DOMAIN_0, NULL);
833         ATF_REQUIRE(cap_net_limit(limit) == 0);
834
835         ATF_REQUIRE(
836             test_gethostbyname(capnet, AF_INET, "localhost") == ENOTCAPABLE);
837         ATF_REQUIRE(
838             test_gethostbyname(capnet, AF_INET, TEST_DOMAIN_1) == ENOTCAPABLE);
839         ATF_REQUIRE(test_gethostbyname(capnet, AF_INET, TEST_DOMAIN_0) == 0);
840
841         /* Unable to set empty limits. Empty limits means full access. */
842         limit = cap_net_limit_init(capnet, CAPNET_DEPRECATED_NAME2ADDR);
843         ATF_REQUIRE(cap_net_limit(limit) != 0);
844
845         cap_close(capnet);
846 }
847
848 ATF_TC_WITHOUT_HEAD(capnet__limits_deprecated_name2addr_family);
849 ATF_TC_BODY(capnet__limits_deprecated_name2addr_family, tc)
850 {
851         cap_channel_t *capnet;
852         cap_net_limit_t *limit;
853         int family[] = { AF_INET6, AF_INET };
854
855         capnet = create_network_service();
856
857         /* Limit to AF_INET and AF_INET6. */
858         limit = cap_net_limit_init(capnet, CAPNET_DEPRECATED_NAME2ADDR);
859         ATF_REQUIRE(limit != NULL);
860         cap_net_limit_name2addr(limit, TEST_DOMAIN_0, NULL);
861         cap_net_limit_name2addr_family(limit, family, nitems(family));
862         ATF_REQUIRE(cap_net_limit(limit) == 0);
863
864         ATF_REQUIRE(test_gethostbyname(capnet, AF_INET, TEST_DOMAIN_0) == 0);
865         ATF_REQUIRE(test_gethostbyname(capnet, AF_INET6, TEST_DOMAIN_0) == 0);
866         ATF_REQUIRE(
867             test_gethostbyname(capnet, PF_LINK, TEST_DOMAIN_0) == ENOTCAPABLE);
868
869         /* Limit to AF_INET and AF_INET6. */
870         limit = cap_net_limit_init(capnet, CAPNET_DEPRECATED_NAME2ADDR);
871         ATF_REQUIRE(limit != NULL);
872         cap_net_limit_name2addr(limit, TEST_DOMAIN_0, NULL);
873         cap_net_limit_name2addr_family(limit, &family[0], 1);
874         cap_net_limit_name2addr_family(limit, &family[1], 1);
875         ATF_REQUIRE(cap_net_limit(limit) == 0);
876
877         ATF_REQUIRE(test_gethostbyname(capnet, AF_INET, TEST_DOMAIN_0) == 0);
878         ATF_REQUIRE(test_gethostbyname(capnet, AF_INET6, TEST_DOMAIN_0) == 0);
879         ATF_REQUIRE(
880             test_gethostbyname(capnet, PF_LINK, TEST_DOMAIN_0) == ENOTCAPABLE);
881
882         /* Limit to AF_INET6 only. */
883         limit = cap_net_limit_init(capnet, CAPNET_DEPRECATED_NAME2ADDR);
884         ATF_REQUIRE(limit != NULL);
885         cap_net_limit_name2addr(limit, TEST_DOMAIN_0, NULL);
886         cap_net_limit_name2addr_family(limit, family, 1);
887         ATF_REQUIRE(cap_net_limit(limit) == 0);
888
889         ATF_REQUIRE(
890             test_gethostbyname(capnet, AF_INET, TEST_DOMAIN_0) == ENOTCAPABLE);
891         ATF_REQUIRE(test_gethostbyname(capnet, AF_INET6, TEST_DOMAIN_0) == 0);
892         ATF_REQUIRE(
893             test_gethostbyname(capnet, PF_LINK, TEST_DOMAIN_0) == ENOTCAPABLE);
894
895         /* Unable to set empty limits. Empty limits means full access. */
896         limit = cap_net_limit_init(capnet, CAPNET_DEPRECATED_NAME2ADDR);
897         ATF_REQUIRE(cap_net_limit(limit) != 0);
898
899         cap_close(capnet);
900 }
901
902 ATF_TC_WITHOUT_HEAD(capnet__limits_bind_mode);
903 ATF_TC_BODY(capnet__limits_bind_mode, tc)
904 {
905         cap_channel_t *capnet;
906         cap_net_limit_t *limit;
907
908         capnet = create_network_service();
909
910         /* LIMIT */
911         limit = cap_net_limit_init(capnet, CAPNET_BIND);
912         ATF_REQUIRE(limit != NULL);
913         ATF_REQUIRE(cap_net_limit(limit) == 0);
914
915         /* ALLOWED */
916         ATF_REQUIRE(test_bind(capnet, TEST_BIND_IPV4) == 0);
917
918         /* DISALLOWED */
919         ATF_REQUIRE(
920             test_gethostbyname(capnet, AF_INET, TEST_DOMAIN_0) == ENOTCAPABLE);
921         ATF_REQUIRE(test_getnameinfo(capnet, AF_INET, TEST_IPV4) ==
922             ENOTCAPABLE);
923         ATF_REQUIRE(test_gethostbyaddr(capnet, AF_INET, TEST_IPV4) ==
924             ENOTCAPABLE);
925         ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_0, NULL) ==
926             ENOTCAPABLE);
927         ATF_REQUIRE(test_connect(capnet, TEST_IPV4, 80) == ENOTCAPABLE);
928
929         test_extend_mode(capnet, CAPNET_ADDR2NAME);
930
931         cap_close(capnet);
932 }
933
934 ATF_TC_WITHOUT_HEAD(capnet__limits_bind);
935 ATF_TC_BODY(capnet__limits_bind, tc)
936 {
937         cap_channel_t *capnet;
938         cap_net_limit_t *limit;
939         struct sockaddr_in ipv4;
940
941         capnet = create_network_service();
942
943         limit = cap_net_limit_init(capnet, CAPNET_BIND);
944         ATF_REQUIRE(limit != NULL);
945
946         memset(&ipv4, 0, sizeof(ipv4));
947         ipv4.sin_family = AF_INET;
948         inet_pton(AF_INET, TEST_BIND_IPV4, &ipv4.sin_addr);
949
950         cap_net_limit_bind(limit, (struct sockaddr *)&ipv4, sizeof(ipv4));
951         ATF_REQUIRE(cap_net_limit(limit) == 0);
952
953         ATF_REQUIRE(test_bind(capnet, TEST_BIND_IPV4) == 0);
954         ATF_REQUIRE(test_bind(capnet, "127.0.0.2") == ENOTCAPABLE);
955
956         cap_close(capnet);
957 }
958
959 ATF_TC_WITHOUT_HEAD(capnet__limits_connect_mode);
960 ATF_TC_BODY(capnet__limits_connect_mode, tc)
961 {
962         cap_channel_t *capnet;
963         cap_net_limit_t *limit;
964
965         capnet = create_network_service();
966
967         /* LIMIT */
968         limit = cap_net_limit_init(capnet, CAPNET_CONNECT);
969         ATF_REQUIRE(limit != NULL);
970         ATF_REQUIRE(cap_net_limit(limit) == 0);
971
972         /* ALLOWED */
973         ATF_REQUIRE(test_connect(capnet, TEST_IPV4, 80) == 0);
974
975         /* DISALLOWED */
976         ATF_REQUIRE(
977             test_gethostbyname(capnet, AF_INET, TEST_DOMAIN_0) == ENOTCAPABLE);
978         ATF_REQUIRE(test_getnameinfo(capnet, AF_INET, TEST_IPV4) ==
979             ENOTCAPABLE);
980         ATF_REQUIRE(test_gethostbyaddr(capnet, AF_INET, TEST_IPV4) ==
981             ENOTCAPABLE);
982         ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_0, NULL) ==
983             ENOTCAPABLE);
984         ATF_REQUIRE(test_bind(capnet, TEST_BIND_IPV4) == ENOTCAPABLE);
985
986         test_extend_mode(capnet, CAPNET_ADDR2NAME);
987
988         cap_close(capnet);
989 }
990
991 ATF_TC_WITHOUT_HEAD(capnet__limits_connect);
992 ATF_TC_BODY(capnet__limits_connect, tc)
993 {
994         cap_channel_t *capnet;
995         cap_net_limit_t *limit;
996         struct sockaddr_in ipv4;
997
998         capnet = create_network_service();
999
1000         /* Limit only to TEST_IPV4 on port 80 and 443. */
1001         limit = cap_net_limit_init(capnet, CAPNET_CONNECT);
1002         ATF_REQUIRE(limit != NULL);
1003         memset(&ipv4, 0, sizeof(ipv4));
1004         ipv4.sin_family = AF_INET;
1005         ipv4.sin_port = htons(80);
1006         inet_pton(AF_INET, TEST_IPV4, &ipv4.sin_addr);
1007         cap_net_limit_connect(limit, (struct sockaddr *)&ipv4, sizeof(ipv4));
1008
1009         ipv4.sin_port = htons(443);
1010         cap_net_limit_connect(limit, (struct sockaddr *)&ipv4, sizeof(ipv4));
1011         ATF_REQUIRE(cap_net_limit(limit) == 0);
1012
1013         ATF_REQUIRE(test_connect(capnet, TEST_IPV4, 80) == 0);
1014         ATF_REQUIRE(test_connect(capnet, "8.8.8.8", 80) == ENOTCAPABLE);
1015         ATF_REQUIRE(test_connect(capnet, "8.8.8.8", 433) == ENOTCAPABLE);
1016         ATF_REQUIRE(test_connect(capnet, TEST_IPV4, 443) == 0);
1017
1018         /* Limit only to TEST_IPV4 on port 443. */
1019         limit = cap_net_limit_init(capnet, CAPNET_CONNECT);
1020         cap_net_limit_connect(limit, (struct sockaddr *)&ipv4, sizeof(ipv4));
1021         ATF_REQUIRE(cap_net_limit(limit) == 0);
1022
1023         ATF_REQUIRE(test_connect(capnet, TEST_IPV4, 433) == ENOTCAPABLE);
1024         ATF_REQUIRE(test_connect(capnet, "8.8.8.8", 80) == ENOTCAPABLE);
1025         ATF_REQUIRE(test_connect(capnet, "8.8.8.8", 433) == ENOTCAPABLE);
1026         ATF_REQUIRE(test_connect(capnet, TEST_IPV4, 443) == 0);
1027
1028         /* Unable to set empty limits. Empty limits means full access. */
1029         limit = cap_net_limit_init(capnet, CAPNET_CONNECT);
1030         ATF_REQUIRE(cap_net_limit(limit) != 0);
1031
1032         cap_close(capnet);
1033 }
1034
1035 ATF_TC_WITHOUT_HEAD(capnet__limits_connecttodns);
1036 ATF_TC_BODY(capnet__limits_connecttodns, tc)
1037 {
1038         cap_channel_t *capnet;
1039         cap_net_limit_t *limit;
1040         struct addrinfo hints, *capres, *res;
1041         int family[] = { AF_INET };
1042
1043         capnet = create_network_service();
1044
1045         limit = cap_net_limit_init(capnet, CAPNET_CONNECTDNS |
1046             CAPNET_NAME2ADDR);
1047         ATF_REQUIRE(limit != NULL);
1048         cap_net_limit_name2addr(limit, TEST_IPV4, "80");
1049         cap_net_limit_name2addr_family(limit, family, 1);
1050         ATF_REQUIRE(cap_net_limit(limit) == 0);
1051
1052         memset(&hints, 0, sizeof(hints));
1053         hints.ai_family = AF_INET;
1054         hints.ai_socktype = SOCK_STREAM;
1055
1056         ATF_REQUIRE(test_connect(capnet, "8.8.8.8", 433) == ENOTCAPABLE);
1057         ATF_REQUIRE(cap_getaddrinfo(capnet, TEST_IPV4, "80", &hints, &capres) ==
1058             0);
1059         ATF_REQUIRE(test_connect(capnet, "8.8.8.8", 433) == ENOTCAPABLE);
1060
1061         for (res = capres; res != NULL; res = res->ai_next) {
1062                 int s;
1063
1064                 ATF_REQUIRE(res->ai_family == AF_INET);
1065                 ATF_REQUIRE(res->ai_socktype == SOCK_STREAM);
1066
1067                 s = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
1068                 ATF_REQUIRE(s >= 0);
1069
1070                 ATF_REQUIRE(cap_connect(capnet, s, res->ai_addr,
1071                     res->ai_addrlen) == 0);
1072                 close(s);
1073         }
1074
1075         freeaddrinfo(capres);
1076         cap_close(capnet);
1077 }
1078
1079
1080 ATF_TC_WITHOUT_HEAD(capnet__limits_deprecated_connecttodns);
1081 ATF_TC_BODY(capnet__limits_deprecated_connecttodns, tc)
1082 {
1083         cap_channel_t *capnet;
1084         cap_net_limit_t *limit;
1085         struct hostent *caphp;
1086         struct in_addr ipaddr;
1087         struct sockaddr_in connaddr;
1088         int family[] = { AF_INET };
1089         int i;
1090
1091         capnet = create_network_service();
1092
1093         limit = cap_net_limit_init(capnet, CAPNET_CONNECTDNS |
1094             CAPNET_DEPRECATED_NAME2ADDR);
1095         ATF_REQUIRE(limit != NULL);
1096         cap_net_limit_name2addr(limit, TEST_IPV4, NULL);
1097         cap_net_limit_name2addr_family(limit, family, 1);
1098         ATF_REQUIRE(cap_net_limit(limit) == 0);
1099
1100         memset(&ipaddr, 0, sizeof(ipaddr));
1101         inet_pton(AF_INET, TEST_IPV4, &ipaddr);
1102
1103         ATF_REQUIRE(test_connect(capnet, "8.8.8.8", 433) == ENOTCAPABLE);
1104         caphp = cap_gethostbyname2(capnet, TEST_IPV4, AF_INET);
1105         ATF_REQUIRE(caphp != NULL);
1106         ATF_REQUIRE(caphp->h_addrtype == AF_INET);
1107         ATF_REQUIRE(test_connect(capnet, "8.8.8.8", 433) == ENOTCAPABLE);
1108
1109         for (i = 0; caphp->h_addr_list[i] != NULL; i++) {
1110                 int s;
1111
1112                 s = socket(AF_INET, SOCK_STREAM, 0);
1113                 ATF_REQUIRE(s >= 0);
1114
1115                 memset(&connaddr, 0, sizeof(connaddr));
1116                 connaddr.sin_family = AF_INET;
1117                 memcpy((char *)&connaddr.sin_addr.s_addr,
1118                     (char *)caphp->h_addr_list[i], caphp->h_length);
1119                 connaddr.sin_port = htons(80);
1120
1121                 ATF_REQUIRE(cap_connect(capnet, s, (struct sockaddr *)&connaddr,
1122                     sizeof(connaddr)) == 0);
1123                 close(s);
1124         }
1125
1126         cap_close(capnet);
1127 }
1128
1129 ATF_TP_ADD_TCS(tp)
1130 {
1131
1132         ATF_TP_ADD_TC(tp, capnet__limits_addr2name_mode);
1133         ATF_TP_ADD_TC(tp, capnet__limits_addr2name_family);
1134         ATF_TP_ADD_TC(tp, capnet__limits_addr2name);
1135
1136         ATF_TP_ADD_TC(tp, capnet__limits_deprecated_addr2name_mode);
1137         ATF_TP_ADD_TC(tp, capnet__limits_deprecated_addr2name_family);
1138         ATF_TP_ADD_TC(tp, capnet__limits_deprecated_addr2name);
1139
1140         ATF_TP_ADD_TC(tp, capnet__limits_name2addr_mode);
1141         ATF_TP_ADD_TC(tp, capnet__limits_name2addr_hosts);
1142         ATF_TP_ADD_TC(tp, capnet__limits_name2addr_hosts_servnames_strict);
1143         ATF_TP_ADD_TC(tp, capnet__limits_name2addr_hosts_servnames_mix);
1144         ATF_TP_ADD_TC(tp, capnet__limits_name2addr_family);
1145
1146         ATF_TP_ADD_TC(tp, capnet__limits_deprecated_name2addr_mode);
1147         ATF_TP_ADD_TC(tp, capnet__limits_deprecated_name2addr_hosts);
1148         ATF_TP_ADD_TC(tp, capnet__limits_deprecated_name2addr_family);
1149
1150         ATF_TP_ADD_TC(tp, capnet__limits_bind_mode);
1151         ATF_TP_ADD_TC(tp, capnet__limits_bind);
1152
1153         ATF_TP_ADD_TC(tp, capnet__limits_connect_mode);
1154         ATF_TP_ADD_TC(tp, capnet__limits_connect);
1155
1156         ATF_TP_ADD_TC(tp, capnet__limits_connecttodns);
1157         ATF_TP_ADD_TC(tp, capnet__limits_deprecated_connecttodns);
1158
1159         return (atf_no_error());
1160 }