Path: blob/main/lib/libcasper/services/cap_net/tests/net_test.c
48380 views
/*-1* Copyright (c) 2020 Mariusz Zaborski <[email protected]>2*3* Redistribution and use in source and binary forms, with or without4* modification, are permitted provided that the following conditions5* are met:6* 1. Redistributions of source code must retain the above copyright7* notice, this list of conditions and the following disclaimer.8* 2. Redistributions in binary form must reproduce the above copyright9* notice, this list of conditions and the following disclaimer in the10* documentation and/or other materials provided with the distribution.11*12* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS13* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED14* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR15* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS16* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR17* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF18* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS19* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN20* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)21* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE22* POSSIBILITY OF SUCH DAMAGE.23*/2425#include <sys/param.h>26#include <sys/socket.h>27#include <netinet/in.h>28#include <arpa/inet.h>2930#include <errno.h>31#include <netdb.h>3233#include <atf-c.h>3435#include <libcasper.h>36#include <casper/cap_net.h>3738#define TEST_DOMAIN_0 "example.com"39#define TEST_DOMAIN_1 "freebsd.org"40#define TEST_IPV4 "1.1.1.1"41#define TEST_IPV6 "2001:4860:4860::8888"42#define TEST_BIND_IPV4 "127.0.0.1"43#define TEST_PORT 8044#define TEST_PORT_STR "80"4546static cap_channel_t *47create_network_service(void)48{49cap_channel_t *capcas, *capnet;5051capcas = cap_init();52ATF_REQUIRE(capcas != NULL);5354capnet = cap_service_open(capcas, "system.net");55ATF_REQUIRE(capnet != NULL);5657cap_close(capcas);58return (capnet);59}6061static int62test_getnameinfo_v4(cap_channel_t *chan, int family, const char *ip)63{64struct sockaddr_in ipaddr;65char capfn[MAXHOSTNAMELEN];66char origfn[MAXHOSTNAMELEN];67int capret, sysret;6869memset(&ipaddr, 0, sizeof(ipaddr));70ipaddr.sin_family = family;71inet_pton(family, ip, &ipaddr.sin_addr);7273capret = cap_getnameinfo(chan, (struct sockaddr *)&ipaddr, sizeof(ipaddr),74capfn, sizeof(capfn), NULL, 0, NI_NAMEREQD);75if (capret != 0 && capret == ENOTCAPABLE)76return (ENOTCAPABLE);7778sysret = getnameinfo((struct sockaddr *)&ipaddr, sizeof(ipaddr), origfn,79sizeof(origfn), NULL, 0, NI_NAMEREQD);80if (sysret != 0) {81atf_tc_skip("getnameinfo(%s) failed: %s",82ip, gai_strerror(sysret));83}84ATF_REQUIRE(capret == 0);85ATF_REQUIRE(strcmp(origfn, capfn) == 0);8687return (0);88}8990static int91test_getnameinfo_v6(cap_channel_t *chan, const char *ip)92{93struct sockaddr_in6 ipaddr;94char capfn[MAXHOSTNAMELEN];95char origfn[MAXHOSTNAMELEN];96int capret, sysret;9798memset(&ipaddr, 0, sizeof(ipaddr));99ipaddr.sin6_family = AF_INET6;100inet_pton(AF_INET6, ip, &ipaddr.sin6_addr);101102capret = cap_getnameinfo(chan, (struct sockaddr *)&ipaddr, sizeof(ipaddr),103capfn, sizeof(capfn), NULL, 0, NI_NAMEREQD);104if (capret != 0 && capret == ENOTCAPABLE)105return (ENOTCAPABLE);106107sysret = getnameinfo((struct sockaddr *)&ipaddr, sizeof(ipaddr), origfn,108sizeof(origfn), NULL, 0, NI_NAMEREQD);109if (sysret != 0) {110atf_tc_skip("getnameinfo(%s) failed: %s",111ip, gai_strerror(sysret));112}113ATF_REQUIRE(capret == 0);114ATF_REQUIRE(strcmp(origfn, capfn) == 0);115116return (0);117}118119static int120test_getnameinfo(cap_channel_t *chan, int family, const char *ip)121{122123if (family == AF_INET6) {124return (test_getnameinfo_v6(chan, ip));125}126127return (test_getnameinfo_v4(chan, family, ip));128}129130static int131test_gethostbyaddr_v4(cap_channel_t *chan, int family, const char *ip)132{133struct in_addr ipaddr;134struct hostent *caphp, *orighp;135136memset(&ipaddr, 0, sizeof(ipaddr));137inet_pton(AF_INET, ip, &ipaddr);138139caphp = cap_gethostbyaddr(chan, &ipaddr, sizeof(ipaddr), family);140if (caphp == NULL && h_errno == ENOTCAPABLE)141return (ENOTCAPABLE);142143orighp = gethostbyaddr(&ipaddr, sizeof(ipaddr), family);144if (orighp == NULL)145atf_tc_skip("gethostbyaddr(%s) failed", ip);146ATF_REQUIRE(caphp != NULL);147ATF_REQUIRE(strcmp(orighp->h_name, caphp->h_name) == 0);148149return (0);150}151152static int153test_gethostbyaddr_v6(cap_channel_t *chan, const char *ip)154{155struct in6_addr ipaddr;156struct hostent *caphp, *orighp;157158memset(&ipaddr, 0, sizeof(ipaddr));159inet_pton(AF_INET6, ip, &ipaddr);160161caphp = cap_gethostbyaddr(chan, &ipaddr, sizeof(ipaddr), AF_INET6);162if (caphp == NULL && h_errno == ENOTCAPABLE)163return (ENOTCAPABLE);164165orighp = gethostbyaddr(&ipaddr, sizeof(ipaddr), AF_INET6);166if (orighp == NULL)167atf_tc_skip("gethostbyaddr(%s) failed", ip);168ATF_REQUIRE(caphp != NULL);169ATF_REQUIRE(strcmp(orighp->h_name, caphp->h_name) == 0);170171return (0);172}173174static int175test_gethostbyaddr(cap_channel_t *chan, int family, const char *ip)176{177178if (family == AF_INET6) {179return (test_gethostbyaddr_v6(chan, ip));180} else {181return (test_gethostbyaddr_v4(chan, family, ip));182}183}184185static int186test_getaddrinfo(cap_channel_t *chan, int family, const char *domain,187const char *servname)188{189struct addrinfo hints, *capres, *origres, *res0, *res1;190bool found;191int capret, sysret;192193memset(&hints, 0, sizeof(hints));194hints.ai_family = family;195hints.ai_socktype = SOCK_STREAM;196197capret = cap_getaddrinfo(chan, domain, servname, &hints, &capres);198if (capret != 0 && capret == ENOTCAPABLE)199return (capret);200201sysret = getaddrinfo(domain, servname, &hints, &origres);202if (sysret != 0)203atf_tc_skip("getaddrinfo(%s) failed: %s",204domain, gai_strerror(sysret));205ATF_REQUIRE(capret == 0);206207for (res0 = capres; res0 != NULL; res0 = res0->ai_next) {208found = false;209for (res1 = origres; res1 != NULL; res1 = res1->ai_next) {210if (res1->ai_addrlen == res0->ai_addrlen &&211memcmp(res1->ai_addr, res0->ai_addr,212res0->ai_addrlen) == 0) {213found = true;214break;215}216}217ATF_REQUIRE(found);218}219220freeaddrinfo(capres);221freeaddrinfo(origres);222return (0);223}224225static int226test_gethostbyname(cap_channel_t *chan, int family, const char *domain)227{228struct hostent *caphp, *orighp;229230caphp = cap_gethostbyname2(chan, domain, family);231if (caphp == NULL && h_errno == ENOTCAPABLE)232return (h_errno);233234orighp = gethostbyname2(domain, family);235if (orighp == NULL)236atf_tc_skip("gethostbyname2(%s) failed", domain);237238ATF_REQUIRE(caphp != NULL);239ATF_REQUIRE(strcmp(caphp->h_name, orighp->h_name) == 0);240return (0);241}242243static int244test_bind(cap_channel_t *chan, const char *ip)245{246struct sockaddr_in ipv4;247int capfd, ret, serrno;248249capfd = socket(AF_INET, SOCK_STREAM, 0);250ATF_REQUIRE(capfd > 0);251252memset(&ipv4, 0, sizeof(ipv4));253ipv4.sin_family = AF_INET;254inet_pton(AF_INET, ip, &ipv4.sin_addr);255256ret = cap_bind(chan, capfd, (struct sockaddr *)&ipv4, sizeof(ipv4));257serrno = errno;258close(capfd);259260return (ret < 0 ? serrno : 0);261}262263static int264test_connect(cap_channel_t *chan, const char *ip, unsigned short port)265{266struct sockaddr_in ipv4;267int capfd, ret, serrno;268269capfd = socket(AF_INET, SOCK_STREAM, 0);270ATF_REQUIRE(capfd >= 0);271272memset(&ipv4, 0, sizeof(ipv4));273ipv4.sin_family = AF_INET;274ipv4.sin_port = htons(port);275inet_pton(AF_INET, ip, &ipv4.sin_addr);276277ret = cap_connect(chan, capfd, (struct sockaddr *)&ipv4, sizeof(ipv4));278serrno = errno;279ATF_REQUIRE(close(capfd) == 0);280281if (ret < 0 && serrno != ENOTCAPABLE) {282int sd;283284/*285* If the connection failed, it might be because we can't reach286* the destination host. To check, try a plain connect() and287* see if it fails with the same error.288*/289sd = socket(AF_INET, SOCK_STREAM, 0);290ATF_REQUIRE(sd >= 0);291292memset(&ipv4, 0, sizeof(ipv4));293ipv4.sin_family = AF_INET;294ipv4.sin_port = htons(port);295inet_pton(AF_INET, ip, &ipv4.sin_addr);296ret = connect(sd, (struct sockaddr *)&ipv4, sizeof(ipv4));297ATF_REQUIRE(ret < 0);298ATF_REQUIRE_MSG(errno == serrno, "errno %d != serrno %d",299errno, serrno);300ATF_REQUIRE(close(sd) == 0);301atf_tc_skip("connect(%s:%d) failed: %s",302ip, port, strerror(serrno));303}304305return (ret < 0 ? serrno : 0);306}307308static void309test_extend_mode(cap_channel_t *capnet, int current)310{311cap_net_limit_t *limit;312const int rights[] = {313CAPNET_ADDR2NAME,314CAPNET_NAME2ADDR,315CAPNET_DEPRECATED_ADDR2NAME,316CAPNET_DEPRECATED_NAME2ADDR,317CAPNET_CONNECT,318CAPNET_BIND,319CAPNET_CONNECTDNS320};321size_t i;322323for (i = 0; i < nitems(rights); i++) {324if (current == rights[i])325continue;326327limit = cap_net_limit_init(capnet, current | rights[i]);328ATF_REQUIRE(limit != NULL);329ATF_REQUIRE(cap_net_limit(limit) != 0);330}331}332333ATF_TC(capnet__getnameinfo);334ATF_TC_HEAD(capnet__getnameinfo, tc)335{336atf_tc_set_md_var(tc, "require.config", "allow_network_access");337}338ATF_TC_BODY(capnet__getnameinfo, tc)339{340cap_channel_t *capnet;341342capnet = create_network_service();343344ATF_REQUIRE(test_getnameinfo(capnet, AF_INET, TEST_IPV4) == 0);345ATF_REQUIRE(test_getnameinfo(capnet, AF_INET6, TEST_IPV6) == 0);346347cap_close(capnet);348}349350ATF_TC(capnet__connect);351ATF_TC_HEAD(capnet__connect, tc)352{353atf_tc_set_md_var(tc, "require.config", "allow_network_access");354}355ATF_TC_BODY(capnet__connect, tc)356{357cap_channel_t *capnet;358359capnet = create_network_service();360361ATF_REQUIRE(test_connect(capnet, TEST_IPV4, 80) == 0);362363cap_close(capnet);364}365366ATF_TC(capnet__bind);367ATF_TC_HEAD(capnet__bind, tc)368{369atf_tc_set_md_var(tc, "require.config", "allow_network_access");370}371ATF_TC_BODY(capnet__bind, tc)372{373cap_channel_t *capnet;374375capnet = create_network_service();376377ATF_REQUIRE(test_bind(capnet, TEST_BIND_IPV4) == 0);378379cap_close(capnet);380}381382ATF_TC(capnet__getaddrinfo);383ATF_TC_HEAD(capnet__getaddrinfo, tc)384{385atf_tc_set_md_var(tc, "require.config", "allow_network_access");386}387ATF_TC_BODY(capnet__getaddrinfo, tc)388{389cap_channel_t *capnet;390struct addrinfo hints, *capres;391392capnet = create_network_service();393394memset(&hints, 0, sizeof(hints));395hints.ai_family = AF_INET;396hints.ai_socktype = SOCK_STREAM;397398ATF_REQUIRE(cap_getaddrinfo(capnet, TEST_IPV4, "80", &hints, &capres) ==3990);400401cap_close(capnet);402}403404ATF_TC(capnet__gethostbyname);405ATF_TC_HEAD(capnet__gethostbyname, tc)406{407atf_tc_set_md_var(tc, "require.config", "allow_network_access");408}409ATF_TC_BODY(capnet__gethostbyname, tc)410{411cap_channel_t *capnet;412413capnet = create_network_service();414415ATF_REQUIRE(test_gethostbyname(capnet, AF_INET, TEST_DOMAIN_0) == 0);416417cap_close(capnet);418}419420ATF_TC(capnet__gethostbyaddr);421ATF_TC_HEAD(capnet__gethostbyaddr, tc)422{423atf_tc_set_md_var(tc, "require.config", "allow_network_access");424}425ATF_TC_BODY(capnet__gethostbyaddr, tc)426{427cap_channel_t *capnet;428429capnet = create_network_service();430431ATF_REQUIRE(test_gethostbyaddr(capnet, AF_INET, TEST_IPV4) == 0);432ATF_REQUIRE(test_gethostbyaddr(capnet, AF_INET6, TEST_IPV6) == 0);433434cap_close(capnet);435}436437ATF_TC(capnet__getnameinfo_buffer);438ATF_TC_HEAD(capnet__getnameinfo_buffer, tc)439{440atf_tc_set_md_var(tc, "require.config", "allow_network_access");441}442ATF_TC_BODY(capnet__getnameinfo_buffer, tc)443{444cap_channel_t *chan;445struct sockaddr_in sin;446int ret;447struct {448char host[sizeof(TEST_IPV4)];449char host_canary;450char serv[sizeof(TEST_PORT_STR)];451char serv_canary;452} buffers;453454memset(&sin, 0, sizeof(sin));455sin.sin_family = AF_INET;456sin.sin_port = htons(TEST_PORT);457ret = inet_pton(AF_INET, TEST_IPV4, &sin.sin_addr);458ATF_REQUIRE_EQ(1, ret);459460memset(&buffers, '!', sizeof(buffers));461462chan = create_network_service();463ret = cap_getnameinfo(chan, (struct sockaddr *)&sin, sizeof(sin),464buffers.host, sizeof(buffers.host),465buffers.serv, sizeof(buffers.serv),466NI_NUMERICHOST | NI_NUMERICSERV);467ATF_REQUIRE_EQ_MSG(0, ret, "%d", ret);468469// Verify that cap_getnameinfo worked with minimally sized buffers.470ATF_CHECK_EQ(0, strcmp(TEST_IPV4, buffers.host));471ATF_CHECK_EQ(0, strcmp(TEST_PORT_STR, buffers.serv));472473// Verify that cap_getnameinfo did not overflow the buffers.474ATF_CHECK_EQ('!', buffers.host_canary);475ATF_CHECK_EQ('!', buffers.serv_canary);476477cap_close(chan);478}479480ATF_TC(capnet__limits_addr2name_mode);481ATF_TC_HEAD(capnet__limits_addr2name_mode, tc)482{483atf_tc_set_md_var(tc, "require.config", "allow_network_access");484}485ATF_TC_BODY(capnet__limits_addr2name_mode, tc)486{487cap_channel_t *capnet;488cap_net_limit_t *limit;489490capnet = create_network_service();491492/* LIMIT */493limit = cap_net_limit_init(capnet, CAPNET_ADDR2NAME);494ATF_REQUIRE(limit != NULL);495ATF_REQUIRE(cap_net_limit(limit) == 0);496497/* ALLOWED */498ATF_REQUIRE(test_getnameinfo(capnet, AF_INET, TEST_IPV4) == 0);499500/* DISALLOWED */501ATF_REQUIRE(test_gethostbyname(capnet, AF_INET, TEST_DOMAIN_0) ==502ENOTCAPABLE);503ATF_REQUIRE(test_gethostbyaddr(capnet, AF_INET, TEST_IPV4) ==504ENOTCAPABLE);505ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_0, NULL) ==506ENOTCAPABLE);507ATF_REQUIRE(test_bind(capnet, TEST_BIND_IPV4) == ENOTCAPABLE);508ATF_REQUIRE(test_connect(capnet, TEST_IPV4, 80) == ENOTCAPABLE);509510test_extend_mode(capnet, CAPNET_ADDR2NAME);511512cap_close(capnet);513}514515ATF_TC(capnet__limits_addr2name_family);516ATF_TC_HEAD(capnet__limits_addr2name_family, tc)517{518atf_tc_set_md_var(tc, "require.config", "allow_network_access");519}520ATF_TC_BODY(capnet__limits_addr2name_family, tc)521{522cap_channel_t *capnet;523cap_net_limit_t *limit;524int family[] = { AF_INET6, AF_INET };525526capnet = create_network_service();527528/* Limit to AF_INET6 and AF_INET. */529limit = cap_net_limit_init(capnet, CAPNET_ADDR2NAME);530ATF_REQUIRE(limit != NULL);531cap_net_limit_addr2name_family(limit, family, nitems(family));532ATF_REQUIRE(cap_net_limit(limit) == 0);533534ATF_REQUIRE(test_getnameinfo(capnet, AF_INET, TEST_IPV4) == 0);535ATF_REQUIRE(test_getnameinfo(capnet, AF_INET6, TEST_IPV6) == 0);536537/* Limit to AF_INET6 and AF_INET. */538limit = cap_net_limit_init(capnet, CAPNET_ADDR2NAME);539ATF_REQUIRE(limit != NULL);540cap_net_limit_addr2name_family(limit, &family[0], 1);541cap_net_limit_addr2name_family(limit, &family[1], 1);542ATF_REQUIRE(cap_net_limit(limit) == 0);543544ATF_REQUIRE(test_getnameinfo(capnet, AF_INET, TEST_IPV4) == 0);545ATF_REQUIRE(test_getnameinfo(capnet, AF_INET6, TEST_IPV6) == 0);546547/* Limit to AF_INET6. */548limit = cap_net_limit_init(capnet, CAPNET_ADDR2NAME);549ATF_REQUIRE(limit != NULL);550cap_net_limit_addr2name_family(limit, family, 1);551ATF_REQUIRE(cap_net_limit(limit) == 0);552553ATF_REQUIRE(test_getnameinfo(capnet, AF_INET, TEST_IPV4) ==554ENOTCAPABLE);555ATF_REQUIRE(test_getnameinfo(capnet, AF_INET6, TEST_IPV6) == 0);556557/* Unable to set empty limits. Empty limits means full access. */558limit = cap_net_limit_init(capnet, CAPNET_ADDR2NAME);559ATF_REQUIRE(cap_net_limit(limit) != 0);560561cap_close(capnet);562}563564ATF_TC(capnet__limits_addr2name);565ATF_TC_HEAD(capnet__limits_addr2name, tc)566{567atf_tc_set_md_var(tc, "require.config", "allow_network_access");568}569ATF_TC_BODY(capnet__limits_addr2name, tc)570{571cap_channel_t *capnet;572cap_net_limit_t *limit;573struct sockaddr_in ipaddrv4;574struct sockaddr_in6 ipaddrv6;575576capnet = create_network_service();577578/* Limit to TEST_IPV4 and TEST_IPV6. */579memset(&ipaddrv4, 0, sizeof(ipaddrv4));580memset(&ipaddrv6, 0, sizeof(ipaddrv6));581582ipaddrv4.sin_family = AF_INET;583inet_pton(AF_INET, TEST_IPV4, &ipaddrv4.sin_addr);584585ipaddrv6.sin6_family = AF_INET6;586inet_pton(AF_INET6, TEST_IPV6, &ipaddrv6.sin6_addr);587588limit = cap_net_limit_init(capnet, CAPNET_ADDR2NAME);589ATF_REQUIRE(limit != NULL);590591cap_net_limit_addr2name(limit, (struct sockaddr *)&ipaddrv4,592sizeof(ipaddrv4));593cap_net_limit_addr2name(limit, (struct sockaddr *)&ipaddrv6,594sizeof(ipaddrv6));595ATF_REQUIRE(cap_net_limit(limit) == 0);596597ATF_REQUIRE(test_getnameinfo(capnet, AF_INET, TEST_IPV4) == 0);598ATF_REQUIRE(test_getnameinfo(capnet, AF_INET6, TEST_IPV6) == 0);599ATF_REQUIRE(test_getnameinfo(capnet, AF_INET, "127.0.0.1") ==600ENOTCAPABLE);601602/* Limit to AF_INET. */603limit = cap_net_limit_init(capnet, CAPNET_ADDR2NAME);604ATF_REQUIRE(limit != NULL);605cap_net_limit_addr2name(limit, (struct sockaddr *)&ipaddrv4,606sizeof(ipaddrv4));607ATF_REQUIRE(cap_net_limit(limit) == 0);608609ATF_REQUIRE(test_getnameinfo(capnet, AF_INET, TEST_IPV4) == 0);610ATF_REQUIRE(test_getnameinfo(capnet, AF_INET6, TEST_IPV6) ==611ENOTCAPABLE);612ATF_REQUIRE(test_getnameinfo(capnet, AF_INET, "127.0.0.1") ==613ENOTCAPABLE);614615/* Unable to set empty limits. Empty limits means full access. */616limit = cap_net_limit_init(capnet, CAPNET_ADDR2NAME);617ATF_REQUIRE(cap_net_limit(limit) != 0);618619cap_close(capnet);620}621622ATF_TC(capnet__limits_deprecated_addr2name_mode);623ATF_TC_HEAD(capnet__limits_deprecated_addr2name_mode, tc)624{625atf_tc_set_md_var(tc, "require.config", "allow_network_access");626}627ATF_TC_BODY(capnet__limits_deprecated_addr2name_mode, tc)628{629cap_channel_t *capnet;630cap_net_limit_t *limit;631632capnet = create_network_service();633634/* LIMIT */635limit = cap_net_limit_init(capnet, CAPNET_DEPRECATED_ADDR2NAME);636ATF_REQUIRE(limit != NULL);637ATF_REQUIRE(cap_net_limit(limit) == 0);638639/* ALLOWED */640ATF_REQUIRE(test_gethostbyaddr(capnet, AF_INET, TEST_IPV4) == 0);641642/* DISALLOWED */643ATF_REQUIRE(test_gethostbyname(capnet, AF_INET, TEST_DOMAIN_0) ==644ENOTCAPABLE);645ATF_REQUIRE(test_getnameinfo(capnet, AF_INET, TEST_IPV4) ==646ENOTCAPABLE);647ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_0, NULL) ==648ENOTCAPABLE);649ATF_REQUIRE(test_bind(capnet, TEST_BIND_IPV4) == ENOTCAPABLE);650ATF_REQUIRE(test_connect(capnet, TEST_IPV4, 80) == ENOTCAPABLE);651652cap_close(capnet);653}654655ATF_TC(capnet__limits_deprecated_addr2name_family);656ATF_TC_HEAD(capnet__limits_deprecated_addr2name_family, tc)657{658atf_tc_set_md_var(tc, "require.config", "allow_network_access");659}660ATF_TC_BODY(capnet__limits_deprecated_addr2name_family, tc)661{662cap_channel_t *capnet;663cap_net_limit_t *limit;664int family[] = { AF_INET6, AF_INET };665666capnet = create_network_service();667668/* Limit to AF_INET6 and AF_INET. */669limit = cap_net_limit_init(capnet, CAPNET_DEPRECATED_ADDR2NAME);670ATF_REQUIRE(limit != NULL);671cap_net_limit_addr2name_family(limit, family, nitems(family));672ATF_REQUIRE(cap_net_limit(limit) == 0);673674ATF_REQUIRE(test_gethostbyaddr(capnet, AF_INET, TEST_IPV4) == 0);675ATF_REQUIRE(test_gethostbyaddr(capnet, AF_INET6, TEST_IPV6) == 0);676ATF_REQUIRE(test_gethostbyaddr(capnet, PF_LINK, TEST_IPV4) ==677ENOTCAPABLE);678679/* Limit to AF_INET6 and AF_INET. */680limit = cap_net_limit_init(capnet, CAPNET_DEPRECATED_ADDR2NAME);681ATF_REQUIRE(limit != NULL);682cap_net_limit_addr2name_family(limit, &family[0], 1);683cap_net_limit_addr2name_family(limit, &family[1], 1);684ATF_REQUIRE(cap_net_limit(limit) == 0);685686ATF_REQUIRE(test_gethostbyaddr(capnet, AF_INET, TEST_IPV4) == 0);687ATF_REQUIRE(test_gethostbyaddr(capnet, AF_INET6, TEST_IPV6) == 0);688ATF_REQUIRE(test_gethostbyaddr(capnet, PF_LINK, TEST_IPV4) ==689ENOTCAPABLE);690691/* Limit to AF_INET6. */692limit = cap_net_limit_init(capnet, CAPNET_DEPRECATED_ADDR2NAME);693ATF_REQUIRE(limit != NULL);694cap_net_limit_addr2name_family(limit, family, 1);695ATF_REQUIRE(cap_net_limit(limit) == 0);696697ATF_REQUIRE(test_gethostbyaddr(capnet, AF_INET, TEST_IPV4) ==698ENOTCAPABLE);699ATF_REQUIRE(test_gethostbyaddr(capnet, AF_INET6, TEST_IPV6) == 0);700ATF_REQUIRE(test_gethostbyaddr(capnet, PF_LINK, TEST_IPV4) ==701ENOTCAPABLE);702703/* Unable to set empty limits. Empty limits means full access. */704limit = cap_net_limit_init(capnet, CAPNET_DEPRECATED_ADDR2NAME);705ATF_REQUIRE(cap_net_limit(limit) != 0);706707cap_close(capnet);708}709710ATF_TC(capnet__limits_deprecated_addr2name);711ATF_TC_HEAD(capnet__limits_deprecated_addr2name, tc)712{713atf_tc_set_md_var(tc, "require.config", "allow_network_access");714}715ATF_TC_BODY(capnet__limits_deprecated_addr2name, tc)716{717cap_channel_t *capnet;718cap_net_limit_t *limit;719struct in_addr ipaddrv4;720struct in6_addr ipaddrv6;721722capnet = create_network_service();723724/* Limit to TEST_IPV4 and TEST_IPV6. */725memset(&ipaddrv4, 0, sizeof(ipaddrv4));726memset(&ipaddrv6, 0, sizeof(ipaddrv6));727728inet_pton(AF_INET, TEST_IPV4, &ipaddrv4);729inet_pton(AF_INET6, TEST_IPV6, &ipaddrv6);730731limit = cap_net_limit_init(capnet, CAPNET_DEPRECATED_ADDR2NAME);732ATF_REQUIRE(limit != NULL);733734cap_net_limit_addr2name(limit, (struct sockaddr *)&ipaddrv4,735sizeof(ipaddrv4));736cap_net_limit_addr2name(limit, (struct sockaddr *)&ipaddrv6,737sizeof(ipaddrv6));738ATF_REQUIRE(cap_net_limit(limit) == 0);739740ATF_REQUIRE(test_gethostbyaddr(capnet, AF_INET, TEST_IPV4) == 0);741ATF_REQUIRE(test_gethostbyaddr(capnet, AF_INET6, TEST_IPV6) == 0);742ATF_REQUIRE(test_gethostbyaddr(capnet, AF_INET, "127.0.0.1") ==743ENOTCAPABLE);744745/* Limit to AF_INET. */746limit = cap_net_limit_init(capnet, CAPNET_DEPRECATED_ADDR2NAME);747ATF_REQUIRE(limit != NULL);748cap_net_limit_addr2name(limit, (struct sockaddr *)&ipaddrv4,749sizeof(ipaddrv4));750ATF_REQUIRE(cap_net_limit(limit) == 0);751752ATF_REQUIRE(test_gethostbyaddr(capnet, AF_INET, TEST_IPV4) == 0);753ATF_REQUIRE(test_gethostbyaddr(capnet, AF_INET6, TEST_IPV6) ==754ENOTCAPABLE);755ATF_REQUIRE(test_gethostbyaddr(capnet, AF_INET, "127.0.0.1") ==756ENOTCAPABLE);757758/* Unable to set empty limits. Empty limits means full access. */759limit = cap_net_limit_init(capnet, CAPNET_DEPRECATED_ADDR2NAME);760ATF_REQUIRE(cap_net_limit(limit) != 0);761762cap_close(capnet);763}764765766ATF_TC(capnet__limits_name2addr_mode);767ATF_TC_HEAD(capnet__limits_name2addr_mode, tc)768{769atf_tc_set_md_var(tc, "require.config", "allow_network_access");770}771ATF_TC_BODY(capnet__limits_name2addr_mode, tc)772{773cap_channel_t *capnet;774cap_net_limit_t *limit;775776capnet = create_network_service();777778/* LIMIT */779limit = cap_net_limit_init(capnet, CAPNET_NAME2ADDR);780ATF_REQUIRE(limit != NULL);781ATF_REQUIRE(cap_net_limit(limit) == 0);782783/* ALLOWED */784ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_0, NULL) ==7850);786787/* DISALLOWED */788ATF_REQUIRE(789test_gethostbyname(capnet, AF_INET, TEST_DOMAIN_0) == ENOTCAPABLE);790ATF_REQUIRE(test_getnameinfo(capnet, AF_INET, TEST_IPV4) ==791ENOTCAPABLE);792ATF_REQUIRE(test_gethostbyaddr(capnet, AF_INET, TEST_IPV4) ==793ENOTCAPABLE);794ATF_REQUIRE(test_bind(capnet, TEST_BIND_IPV4) == ENOTCAPABLE);795ATF_REQUIRE(test_connect(capnet, TEST_IPV4, 80) == ENOTCAPABLE);796797test_extend_mode(capnet, CAPNET_ADDR2NAME);798799cap_close(capnet);800}801802ATF_TC(capnet__limits_name2addr_hosts);803ATF_TC_HEAD(capnet__limits_name2addr_hosts, tc)804{805atf_tc_set_md_var(tc, "require.config", "allow_network_access");806}807ATF_TC_BODY(capnet__limits_name2addr_hosts, tc)808{809cap_channel_t *capnet;810cap_net_limit_t *limit;811812capnet = create_network_service();813814/* Limit to TEST_DOMAIN_0 and localhost only. */815limit = cap_net_limit_init(capnet, CAPNET_NAME2ADDR);816ATF_REQUIRE(limit != NULL);817cap_net_limit_name2addr(limit, TEST_DOMAIN_0, NULL);818cap_net_limit_name2addr(limit, "localhost", NULL);819ATF_REQUIRE(cap_net_limit(limit) == 0);820821ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_0, NULL) ==8220);823ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, "localhost", NULL) == 0);824ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_1, NULL) ==825ENOTCAPABLE);826827/* Limit to TEST_DOMAIN_0 only. */828limit = cap_net_limit_init(capnet, CAPNET_NAME2ADDR);829ATF_REQUIRE(limit != NULL);830cap_net_limit_name2addr(limit, TEST_DOMAIN_0, NULL);831ATF_REQUIRE(cap_net_limit(limit) == 0);832833ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, "localhost", NULL) ==834ENOTCAPABLE);835ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_1, NULL) ==836ENOTCAPABLE);837ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_0, NULL) ==8380);839840/* Unable to set empty limits. Empty limits means full access. */841limit = cap_net_limit_init(capnet, CAPNET_NAME2ADDR);842ATF_REQUIRE(cap_net_limit(limit) != 0);843844/* Try to extend the limit. */845limit = cap_net_limit_init(capnet, CAPNET_NAME2ADDR);846ATF_REQUIRE(limit != NULL);847cap_net_limit_name2addr(limit, TEST_DOMAIN_1, NULL);848ATF_REQUIRE(cap_net_limit(limit) != 0);849850limit = cap_net_limit_init(capnet, CAPNET_NAME2ADDR);851ATF_REQUIRE(limit != NULL);852cap_net_limit_name2addr(limit, TEST_DOMAIN_0, NULL);853cap_net_limit_name2addr(limit, TEST_DOMAIN_1, NULL);854ATF_REQUIRE(cap_net_limit(limit) != 0);855856cap_close(capnet);857}858859ATF_TC(capnet__limits_name2addr_hosts_servnames_strict);860ATF_TC_HEAD(capnet__limits_name2addr_hosts_servnames_strict, tc)861{862atf_tc_set_md_var(tc, "require.config", "allow_network_access");863}864ATF_TC_BODY(capnet__limits_name2addr_hosts_servnames_strict, tc)865{866cap_channel_t *capnet;867cap_net_limit_t *limit;868869capnet = create_network_service();870871/*872* Limit to TEST_DOMAIN_0 and HTTP service.873*/874limit = cap_net_limit_init(capnet, CAPNET_NAME2ADDR);875ATF_REQUIRE(limit != NULL);876cap_net_limit_name2addr(limit, TEST_DOMAIN_0, "http");877ATF_REQUIRE(cap_net_limit(limit) == 0);878879ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_0, "http") ==8800);881ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_0, NULL) ==882ENOTCAPABLE);883ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_0, "snmp") ==884ENOTCAPABLE);885ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_1, "http") ==886ENOTCAPABLE);887888/* Unable to set empty limits. Empty limits means full access. */889limit = cap_net_limit_init(capnet, CAPNET_NAME2ADDR);890ATF_REQUIRE(cap_net_limit(limit) != 0);891892cap_close(capnet);893}894895ATF_TC(capnet__limits_name2addr_hosts_servnames_mix);896ATF_TC_HEAD(capnet__limits_name2addr_hosts_servnames_mix, tc)897{898atf_tc_set_md_var(tc, "require.config", "allow_network_access");899}900ATF_TC_BODY(capnet__limits_name2addr_hosts_servnames_mix, tc)901{902cap_channel_t *capnet;903cap_net_limit_t *limit;904905capnet = create_network_service();906907/*908* Limit to TEST_DOMAIN_0 and any servnamex, and any domain with909* servname HTTP.910*/911limit = cap_net_limit_init(capnet, CAPNET_NAME2ADDR);912ATF_REQUIRE(limit != NULL);913cap_net_limit_name2addr(limit, TEST_DOMAIN_0, NULL);914cap_net_limit_name2addr(limit, NULL, "http");915ATF_REQUIRE(cap_net_limit(limit) == 0);916917ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_0, "http") ==9180);919ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_0, NULL) ==9200);921ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_1, "http") ==9220);923ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_0, NULL) ==9240);925ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_1, "snmp") ==926ENOTCAPABLE);927928/* Limit to HTTP servname only. */929limit = cap_net_limit_init(capnet, CAPNET_NAME2ADDR);930ATF_REQUIRE(limit != NULL);931cap_net_limit_name2addr(limit, NULL, "http");932ATF_REQUIRE(cap_net_limit(limit) == 0);933934ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_0, "http") ==9350);936ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_0, NULL) ==937ENOTCAPABLE);938ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_1, "http") ==9390);940ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_0, NULL) ==941ENOTCAPABLE);942ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_1, "snmp") ==943ENOTCAPABLE);944945/* Unable to set empty limits. Empty limits means full access. */946limit = cap_net_limit_init(capnet, CAPNET_NAME2ADDR);947ATF_REQUIRE(cap_net_limit(limit) != 0);948949cap_close(capnet);950}951952ATF_TC(capnet__limits_name2addr_family);953ATF_TC_HEAD(capnet__limits_name2addr_family, tc)954{955atf_tc_set_md_var(tc, "require.config", "allow_network_access");956}957ATF_TC_BODY(capnet__limits_name2addr_family, tc)958{959cap_channel_t *capnet;960cap_net_limit_t *limit;961int family[] = { AF_INET6, AF_INET };962963capnet = create_network_service();964965/* Limit to AF_INET and AF_INET6. */966limit = cap_net_limit_init(capnet, CAPNET_NAME2ADDR);967ATF_REQUIRE(limit != NULL);968cap_net_limit_name2addr(limit, TEST_DOMAIN_0, NULL);969cap_net_limit_name2addr_family(limit, family, nitems(family));970ATF_REQUIRE(cap_net_limit(limit) == 0);971972ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_0, NULL) ==9730);974ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET6, TEST_DOMAIN_0, NULL) ==9750);976ATF_REQUIRE(test_getaddrinfo(capnet, PF_LINK, TEST_DOMAIN_0, NULL) ==977ENOTCAPABLE);978979/* Limit to AF_INET and AF_INET6. */980limit = cap_net_limit_init(capnet, CAPNET_NAME2ADDR);981ATF_REQUIRE(limit != NULL);982cap_net_limit_name2addr(limit, TEST_DOMAIN_0, NULL);983cap_net_limit_name2addr_family(limit, &family[0], 1);984cap_net_limit_name2addr_family(limit, &family[1], 1);985ATF_REQUIRE(cap_net_limit(limit) == 0);986987ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_0, NULL) ==9880);989ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET6, TEST_DOMAIN_0, NULL) ==9900);991ATF_REQUIRE(test_getaddrinfo(capnet, PF_LINK, TEST_DOMAIN_0, NULL) ==992ENOTCAPABLE);993994/* Limit to AF_INET6 only. */995limit = cap_net_limit_init(capnet, CAPNET_NAME2ADDR);996ATF_REQUIRE(limit != NULL);997cap_net_limit_name2addr(limit, TEST_DOMAIN_0, NULL);998cap_net_limit_name2addr_family(limit, family, 1);999ATF_REQUIRE(cap_net_limit(limit) == 0);10001001ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_0, NULL) ==1002ENOTCAPABLE);1003ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET6, TEST_DOMAIN_0, NULL) ==10040);1005ATF_REQUIRE(test_getaddrinfo(capnet, PF_LINK, TEST_DOMAIN_0, NULL) ==1006ENOTCAPABLE);10071008/* Unable to set empty limits. Empty limits means full access. */1009limit = cap_net_limit_init(capnet, CAPNET_NAME2ADDR);1010ATF_REQUIRE(cap_net_limit(limit) != 0);10111012cap_close(capnet);1013}10141015ATF_TC(capnet__limits_deprecated_name2addr_mode);1016ATF_TC_HEAD(capnet__limits_deprecated_name2addr_mode, tc)1017{1018atf_tc_set_md_var(tc, "require.config", "allow_network_access");1019}1020ATF_TC_BODY(capnet__limits_deprecated_name2addr_mode, tc)1021{1022cap_channel_t *capnet;1023cap_net_limit_t *limit;10241025capnet = create_network_service();10261027/* LIMIT */1028limit = cap_net_limit_init(capnet, CAPNET_DEPRECATED_NAME2ADDR);1029ATF_REQUIRE(limit != NULL);1030ATF_REQUIRE(cap_net_limit(limit) == 0);10311032/* ALLOWED */1033ATF_REQUIRE(test_gethostbyname(capnet, AF_INET, TEST_DOMAIN_0) == 0);10341035/* DISALLOWED */1036ATF_REQUIRE(test_getnameinfo(capnet, AF_INET, TEST_IPV4) ==1037ENOTCAPABLE);1038ATF_REQUIRE(test_gethostbyaddr(capnet, AF_INET, TEST_IPV4) ==1039ENOTCAPABLE);1040ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_0, NULL) ==1041ENOTCAPABLE);1042ATF_REQUIRE(test_bind(capnet, TEST_BIND_IPV4) == ENOTCAPABLE);1043ATF_REQUIRE(test_connect(capnet, TEST_IPV4, 80) == ENOTCAPABLE);10441045test_extend_mode(capnet, CAPNET_ADDR2NAME);10461047cap_close(capnet);1048}10491050ATF_TC(capnet__limits_deprecated_name2addr_hosts);1051ATF_TC_HEAD(capnet__limits_deprecated_name2addr_hosts, tc)1052{1053atf_tc_set_md_var(tc, "require.config", "allow_network_access");1054}1055ATF_TC_BODY(capnet__limits_deprecated_name2addr_hosts, tc)1056{1057cap_channel_t *capnet;1058cap_net_limit_t *limit;10591060capnet = create_network_service();10611062/* Limit to TEST_DOMAIN_0 and localhost only. */1063limit = cap_net_limit_init(capnet, CAPNET_DEPRECATED_NAME2ADDR);1064ATF_REQUIRE(limit != NULL);1065cap_net_limit_name2addr(limit, TEST_DOMAIN_0, NULL);1066cap_net_limit_name2addr(limit, "localhost", NULL);1067ATF_REQUIRE(cap_net_limit(limit) == 0);10681069ATF_REQUIRE(test_gethostbyname(capnet, AF_INET, TEST_DOMAIN_0) == 0);1070ATF_REQUIRE(test_gethostbyname(capnet, AF_INET, "localhost") == 0);1071ATF_REQUIRE(1072test_gethostbyname(capnet, AF_INET, TEST_DOMAIN_1) == ENOTCAPABLE);10731074/* Limit to TEST_DOMAIN_0 only. */1075limit = cap_net_limit_init(capnet, CAPNET_DEPRECATED_NAME2ADDR);1076ATF_REQUIRE(limit != NULL);1077cap_net_limit_name2addr(limit, TEST_DOMAIN_0, NULL);1078ATF_REQUIRE(cap_net_limit(limit) == 0);10791080ATF_REQUIRE(1081test_gethostbyname(capnet, AF_INET, "localhost") == ENOTCAPABLE);1082ATF_REQUIRE(1083test_gethostbyname(capnet, AF_INET, TEST_DOMAIN_1) == ENOTCAPABLE);1084ATF_REQUIRE(test_gethostbyname(capnet, AF_INET, TEST_DOMAIN_0) == 0);10851086/* Unable to set empty limits. Empty limits means full access. */1087limit = cap_net_limit_init(capnet, CAPNET_DEPRECATED_NAME2ADDR);1088ATF_REQUIRE(cap_net_limit(limit) != 0);10891090cap_close(capnet);1091}10921093ATF_TC(capnet__limits_deprecated_name2addr_family);1094ATF_TC_HEAD(capnet__limits_deprecated_name2addr_family, tc)1095{1096atf_tc_set_md_var(tc, "require.config", "allow_network_access");1097}1098ATF_TC_BODY(capnet__limits_deprecated_name2addr_family, tc)1099{1100cap_channel_t *capnet;1101cap_net_limit_t *limit;1102int family[] = { AF_INET6, AF_INET };11031104capnet = create_network_service();11051106/* Limit to AF_INET and AF_INET6. */1107limit = cap_net_limit_init(capnet, CAPNET_DEPRECATED_NAME2ADDR);1108ATF_REQUIRE(limit != NULL);1109cap_net_limit_name2addr(limit, TEST_DOMAIN_0, NULL);1110cap_net_limit_name2addr_family(limit, family, nitems(family));1111ATF_REQUIRE(cap_net_limit(limit) == 0);11121113ATF_REQUIRE(test_gethostbyname(capnet, AF_INET, TEST_DOMAIN_0) == 0);1114ATF_REQUIRE(test_gethostbyname(capnet, AF_INET6, TEST_DOMAIN_0) == 0);1115ATF_REQUIRE(1116test_gethostbyname(capnet, PF_LINK, TEST_DOMAIN_0) == ENOTCAPABLE);11171118/* Limit to AF_INET and AF_INET6. */1119limit = cap_net_limit_init(capnet, CAPNET_DEPRECATED_NAME2ADDR);1120ATF_REQUIRE(limit != NULL);1121cap_net_limit_name2addr(limit, TEST_DOMAIN_0, NULL);1122cap_net_limit_name2addr_family(limit, &family[0], 1);1123cap_net_limit_name2addr_family(limit, &family[1], 1);1124ATF_REQUIRE(cap_net_limit(limit) == 0);11251126ATF_REQUIRE(test_gethostbyname(capnet, AF_INET, TEST_DOMAIN_0) == 0);1127ATF_REQUIRE(test_gethostbyname(capnet, AF_INET6, TEST_DOMAIN_0) == 0);1128ATF_REQUIRE(1129test_gethostbyname(capnet, PF_LINK, TEST_DOMAIN_0) == ENOTCAPABLE);11301131/* Limit to AF_INET6 only. */1132limit = cap_net_limit_init(capnet, CAPNET_DEPRECATED_NAME2ADDR);1133ATF_REQUIRE(limit != NULL);1134cap_net_limit_name2addr(limit, TEST_DOMAIN_0, NULL);1135cap_net_limit_name2addr_family(limit, family, 1);1136ATF_REQUIRE(cap_net_limit(limit) == 0);11371138ATF_REQUIRE(1139test_gethostbyname(capnet, AF_INET, TEST_DOMAIN_0) == ENOTCAPABLE);1140ATF_REQUIRE(test_gethostbyname(capnet, AF_INET6, TEST_DOMAIN_0) == 0);1141ATF_REQUIRE(1142test_gethostbyname(capnet, PF_LINK, TEST_DOMAIN_0) == ENOTCAPABLE);11431144/* Unable to set empty limits. Empty limits means full access. */1145limit = cap_net_limit_init(capnet, CAPNET_DEPRECATED_NAME2ADDR);1146ATF_REQUIRE(cap_net_limit(limit) != 0);11471148cap_close(capnet);1149}11501151ATF_TC(capnet__limits_bind_mode);1152ATF_TC_HEAD(capnet__limits_bind_mode, tc)1153{1154atf_tc_set_md_var(tc, "require.config", "allow_network_access");1155}1156ATF_TC_BODY(capnet__limits_bind_mode, tc)1157{1158cap_channel_t *capnet;1159cap_net_limit_t *limit;11601161capnet = create_network_service();11621163/* LIMIT */1164limit = cap_net_limit_init(capnet, CAPNET_BIND);1165ATF_REQUIRE(limit != NULL);1166ATF_REQUIRE(cap_net_limit(limit) == 0);11671168/* ALLOWED */1169ATF_REQUIRE(test_bind(capnet, TEST_BIND_IPV4) == 0);11701171/* DISALLOWED */1172ATF_REQUIRE(1173test_gethostbyname(capnet, AF_INET, TEST_DOMAIN_0) == ENOTCAPABLE);1174ATF_REQUIRE(test_getnameinfo(capnet, AF_INET, TEST_IPV4) ==1175ENOTCAPABLE);1176ATF_REQUIRE(test_gethostbyaddr(capnet, AF_INET, TEST_IPV4) ==1177ENOTCAPABLE);1178ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_0, NULL) ==1179ENOTCAPABLE);1180ATF_REQUIRE(test_connect(capnet, TEST_IPV4, 80) == ENOTCAPABLE);11811182test_extend_mode(capnet, CAPNET_ADDR2NAME);11831184cap_close(capnet);1185}11861187ATF_TC(capnet__limits_bind);1188ATF_TC_HEAD(capnet__limits_bind, tc)1189{1190atf_tc_set_md_var(tc, "require.config", "allow_network_access");1191}1192ATF_TC_BODY(capnet__limits_bind, tc)1193{1194cap_channel_t *capnet;1195cap_net_limit_t *limit;1196struct sockaddr_in ipv4;11971198capnet = create_network_service();11991200limit = cap_net_limit_init(capnet, CAPNET_BIND);1201ATF_REQUIRE(limit != NULL);12021203memset(&ipv4, 0, sizeof(ipv4));1204ipv4.sin_family = AF_INET;1205inet_pton(AF_INET, TEST_BIND_IPV4, &ipv4.sin_addr);12061207cap_net_limit_bind(limit, (struct sockaddr *)&ipv4, sizeof(ipv4));1208ATF_REQUIRE(cap_net_limit(limit) == 0);12091210ATF_REQUIRE(test_bind(capnet, TEST_BIND_IPV4) == 0);1211ATF_REQUIRE(test_bind(capnet, "127.0.0.2") == ENOTCAPABLE);12121213cap_close(capnet);1214}12151216ATF_TC(capnet__limits_connect_mode);1217ATF_TC_HEAD(capnet__limits_connect_mode, tc)1218{1219atf_tc_set_md_var(tc, "require.config", "allow_network_access");1220}1221ATF_TC_BODY(capnet__limits_connect_mode, tc)1222{1223cap_channel_t *capnet;1224cap_net_limit_t *limit;12251226capnet = create_network_service();12271228/* LIMIT */1229limit = cap_net_limit_init(capnet, CAPNET_CONNECT);1230ATF_REQUIRE(limit != NULL);1231ATF_REQUIRE(cap_net_limit(limit) == 0);12321233/* ALLOWED */1234ATF_REQUIRE(test_connect(capnet, TEST_IPV4, 80) == 0);12351236/* DISALLOWED */1237ATF_REQUIRE(1238test_gethostbyname(capnet, AF_INET, TEST_DOMAIN_0) == ENOTCAPABLE);1239ATF_REQUIRE(test_getnameinfo(capnet, AF_INET, TEST_IPV4) ==1240ENOTCAPABLE);1241ATF_REQUIRE(test_gethostbyaddr(capnet, AF_INET, TEST_IPV4) ==1242ENOTCAPABLE);1243ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_0, NULL) ==1244ENOTCAPABLE);1245ATF_REQUIRE(test_bind(capnet, TEST_BIND_IPV4) == ENOTCAPABLE);12461247test_extend_mode(capnet, CAPNET_ADDR2NAME);12481249cap_close(capnet);1250}12511252ATF_TC(capnet__limits_connect_dns_mode);1253ATF_TC_HEAD(capnet__limits_connect_dns_mode, tc)1254{1255atf_tc_set_md_var(tc, "require.config", "allow_network_access");1256}1257ATF_TC_BODY(capnet__limits_connect_dns_mode, tc)1258{1259cap_channel_t *capnet;1260cap_net_limit_t *limit;12611262capnet = create_network_service();12631264/* LIMIT */1265limit = cap_net_limit_init(capnet, CAPNET_CONNECT | CAPNET_CONNECTDNS);1266ATF_REQUIRE(limit != NULL);1267ATF_REQUIRE(cap_net_limit(limit) == 0);12681269/* ALLOWED */1270ATF_REQUIRE(test_connect(capnet, TEST_IPV4, 80) == 0);12711272/* DISALLOWED */1273ATF_REQUIRE(1274test_gethostbyname(capnet, AF_INET, TEST_DOMAIN_0) == ENOTCAPABLE);1275ATF_REQUIRE(test_getnameinfo(capnet, AF_INET, TEST_IPV4) ==1276ENOTCAPABLE);1277ATF_REQUIRE(test_gethostbyaddr(capnet, AF_INET, TEST_IPV4) ==1278ENOTCAPABLE);1279ATF_REQUIRE(test_getaddrinfo(capnet, AF_INET, TEST_DOMAIN_0, NULL) ==1280ENOTCAPABLE);1281ATF_REQUIRE(test_bind(capnet, TEST_BIND_IPV4) == ENOTCAPABLE);12821283test_extend_mode(capnet, CAPNET_ADDR2NAME);12841285cap_close(capnet);1286}12871288ATF_TC(capnet__limits_connect);1289ATF_TC_HEAD(capnet__limits_connect, tc)1290{1291atf_tc_set_md_var(tc, "require.config", "allow_network_access");1292}1293ATF_TC_BODY(capnet__limits_connect, tc)1294{1295cap_channel_t *capnet;1296cap_net_limit_t *limit;1297struct sockaddr_in ipv4;12981299capnet = create_network_service();13001301/* Limit only to TEST_IPV4 on port 80 and 443. */1302limit = cap_net_limit_init(capnet, CAPNET_CONNECT);1303ATF_REQUIRE(limit != NULL);1304memset(&ipv4, 0, sizeof(ipv4));1305ipv4.sin_family = AF_INET;1306ipv4.sin_port = htons(80);1307inet_pton(AF_INET, TEST_IPV4, &ipv4.sin_addr);1308cap_net_limit_connect(limit, (struct sockaddr *)&ipv4, sizeof(ipv4));13091310ipv4.sin_port = htons(443);1311cap_net_limit_connect(limit, (struct sockaddr *)&ipv4, sizeof(ipv4));1312ATF_REQUIRE(cap_net_limit(limit) == 0);13131314ATF_REQUIRE(test_connect(capnet, TEST_IPV4, 80) == 0);1315ATF_REQUIRE(test_connect(capnet, "8.8.8.8", 80) == ENOTCAPABLE);1316ATF_REQUIRE(test_connect(capnet, "8.8.8.8", 433) == ENOTCAPABLE);1317ATF_REQUIRE(test_connect(capnet, TEST_IPV4, 443) == 0);13181319/* Limit only to TEST_IPV4 on port 443. */1320limit = cap_net_limit_init(capnet, CAPNET_CONNECT);1321cap_net_limit_connect(limit, (struct sockaddr *)&ipv4, sizeof(ipv4));1322ATF_REQUIRE(cap_net_limit(limit) == 0);13231324ATF_REQUIRE(test_connect(capnet, TEST_IPV4, 433) == ENOTCAPABLE);1325ATF_REQUIRE(test_connect(capnet, "8.8.8.8", 80) == ENOTCAPABLE);1326ATF_REQUIRE(test_connect(capnet, "8.8.8.8", 433) == ENOTCAPABLE);1327ATF_REQUIRE(test_connect(capnet, TEST_IPV4, 443) == 0);13281329/* Unable to set empty limits. Empty limits means full access. */1330limit = cap_net_limit_init(capnet, CAPNET_CONNECT);1331ATF_REQUIRE(cap_net_limit(limit) != 0);13321333cap_close(capnet);1334}13351336ATF_TC(capnet__limits_connecttodns);1337ATF_TC_HEAD(capnet__limits_connecttodns, tc)1338{1339atf_tc_set_md_var(tc, "require.config", "allow_network_access");1340}1341ATF_TC_BODY(capnet__limits_connecttodns, tc)1342{1343cap_channel_t *capnet;1344cap_net_limit_t *limit;1345struct addrinfo hints, *capres, *res;1346int family[] = { AF_INET };1347int error;13481349capnet = create_network_service();13501351limit = cap_net_limit_init(capnet, CAPNET_CONNECTDNS |1352CAPNET_NAME2ADDR);1353ATF_REQUIRE(limit != NULL);1354cap_net_limit_name2addr(limit, TEST_IPV4, "80");1355cap_net_limit_name2addr_family(limit, family, 1);1356ATF_REQUIRE(cap_net_limit(limit) == 0);13571358memset(&hints, 0, sizeof(hints));1359hints.ai_family = AF_INET;1360hints.ai_socktype = SOCK_STREAM;13611362ATF_REQUIRE(test_connect(capnet, "8.8.8.8", 433) == ENOTCAPABLE);1363ATF_REQUIRE(cap_getaddrinfo(capnet, TEST_IPV4, "80", &hints, &capres) ==13640);1365ATF_REQUIRE(test_connect(capnet, "8.8.8.8", 433) == ENOTCAPABLE);13661367for (res = capres; res != NULL; res = res->ai_next) {1368int s;13691370ATF_REQUIRE(res->ai_family == AF_INET);1371ATF_REQUIRE(res->ai_socktype == SOCK_STREAM);13721373s = socket(res->ai_family, res->ai_socktype, res->ai_protocol);1374ATF_REQUIRE(s >= 0);13751376error = cap_connect(capnet, s, res->ai_addr,1377res->ai_addrlen);1378if (error != 0 && errno != ENOTCAPABLE)1379atf_tc_skip("unable to connect: %s", strerror(errno));1380ATF_REQUIRE(error == 0);1381ATF_REQUIRE(close(s) == 0);1382}13831384freeaddrinfo(capres);1385cap_close(capnet);1386}138713881389ATF_TC(capnet__limits_deprecated_connecttodns);1390ATF_TC_HEAD(capnet__limits_deprecated_connecttodns, tc)1391{1392atf_tc_set_md_var(tc, "require.config", "allow_network_access");1393}1394ATF_TC_BODY(capnet__limits_deprecated_connecttodns, tc)1395{1396cap_channel_t *capnet;1397cap_net_limit_t *limit;1398struct hostent *caphp;1399struct in_addr ipaddr;1400struct sockaddr_in connaddr;1401int family[] = { AF_INET };1402int error, i;14031404capnet = create_network_service();14051406limit = cap_net_limit_init(capnet, CAPNET_CONNECTDNS |1407CAPNET_DEPRECATED_NAME2ADDR);1408ATF_REQUIRE(limit != NULL);1409cap_net_limit_name2addr(limit, TEST_IPV4, NULL);1410cap_net_limit_name2addr_family(limit, family, 1);1411ATF_REQUIRE(cap_net_limit(limit) == 0);14121413memset(&ipaddr, 0, sizeof(ipaddr));1414inet_pton(AF_INET, TEST_IPV4, &ipaddr);14151416ATF_REQUIRE(test_connect(capnet, "8.8.8.8", 433) == ENOTCAPABLE);1417caphp = cap_gethostbyname2(capnet, TEST_IPV4, AF_INET);1418ATF_REQUIRE(caphp != NULL);1419ATF_REQUIRE(caphp->h_addrtype == AF_INET);1420ATF_REQUIRE(test_connect(capnet, "8.8.8.8", 433) == ENOTCAPABLE);14211422for (i = 0; caphp->h_addr_list[i] != NULL; i++) {1423int s;14241425s = socket(AF_INET, SOCK_STREAM, 0);1426ATF_REQUIRE(s >= 0);14271428memset(&connaddr, 0, sizeof(connaddr));1429connaddr.sin_family = AF_INET;1430memcpy((char *)&connaddr.sin_addr.s_addr,1431(char *)caphp->h_addr_list[i], caphp->h_length);1432connaddr.sin_port = htons(80);14331434error = cap_connect(capnet, s, (struct sockaddr *)&connaddr,1435sizeof(connaddr));1436if (error != 0 && errno != ENOTCAPABLE)1437atf_tc_skip("unable to connect: %s", strerror(errno));1438ATF_REQUIRE(error == 0);1439ATF_REQUIRE(close(s) == 0);1440}14411442cap_close(capnet);1443}14441445ATF_TP_ADD_TCS(tp)1446{14471448ATF_TP_ADD_TC(tp, capnet__connect);1449ATF_TP_ADD_TC(tp, capnet__bind);1450ATF_TP_ADD_TC(tp, capnet__getnameinfo);1451ATF_TP_ADD_TC(tp, capnet__getaddrinfo);1452ATF_TP_ADD_TC(tp, capnet__gethostbyname);1453ATF_TP_ADD_TC(tp, capnet__gethostbyaddr);14541455ATF_TP_ADD_TC(tp, capnet__getnameinfo_buffer);14561457ATF_TP_ADD_TC(tp, capnet__limits_addr2name_mode);1458ATF_TP_ADD_TC(tp, capnet__limits_addr2name_family);1459ATF_TP_ADD_TC(tp, capnet__limits_addr2name);14601461ATF_TP_ADD_TC(tp, capnet__limits_deprecated_addr2name_mode);1462ATF_TP_ADD_TC(tp, capnet__limits_deprecated_addr2name_family);1463ATF_TP_ADD_TC(tp, capnet__limits_deprecated_addr2name);14641465ATF_TP_ADD_TC(tp, capnet__limits_name2addr_mode);1466ATF_TP_ADD_TC(tp, capnet__limits_name2addr_hosts);1467ATF_TP_ADD_TC(tp, capnet__limits_name2addr_hosts_servnames_strict);1468ATF_TP_ADD_TC(tp, capnet__limits_name2addr_hosts_servnames_mix);1469ATF_TP_ADD_TC(tp, capnet__limits_name2addr_family);14701471ATF_TP_ADD_TC(tp, capnet__limits_deprecated_name2addr_mode);1472ATF_TP_ADD_TC(tp, capnet__limits_deprecated_name2addr_hosts);1473ATF_TP_ADD_TC(tp, capnet__limits_deprecated_name2addr_family);14741475ATF_TP_ADD_TC(tp, capnet__limits_bind_mode);1476ATF_TP_ADD_TC(tp, capnet__limits_bind);14771478ATF_TP_ADD_TC(tp, capnet__limits_connect_mode);1479ATF_TP_ADD_TC(tp, capnet__limits_connect_dns_mode);1480ATF_TP_ADD_TC(tp, capnet__limits_connect);14811482ATF_TP_ADD_TC(tp, capnet__limits_connecttodns);1483ATF_TP_ADD_TC(tp, capnet__limits_deprecated_connecttodns);14841485return (atf_no_error());1486}148714881489