tests/netinet: test case for a jail with 2 addresses

Check that wildcard bind(2) doesn't yet select a local address, and later
connect(2) succeeds.
This commit is contained in:
Gleb Smirnoff committed 2026-09-07 11:51:22 -07:00
1 parent 08cf9598bd
commit 2e16d37e27
1 file changed
+31
+31
View File
@@ -215,6 +215,36 @@ ATF_TC_BODY(gethostname_jailed, tc)
close(s);
}
ATF_TC_WITHOUT_HEAD(connect_bound_socket_from_2address_jail);
ATF_TC_BODY(connect_bound_socket_from_2address_jail, tc)
{
struct in_addr addrs[] = {
{ htonl(0xc0000202) }, { htonl(0xc0000203) }
};
struct jail jconf = {
.version = JAIL_API_VERSION,
.path = __DECONST(char *, "/"),
.hostname = __DECONST(char *,"test"),
.ip4s = nitems(addrs),
.ip4 = addrs,
};
struct sockaddr_in sin = { .sin_family = AF_INET };
socklen_t slen = sizeof(sin);
int s;
ATF_REQUIRE(jail(&jconf) > 0);
ATF_REQUIRE((s = socket(PF_INET, SOCK_DGRAM, 0)) > 0);
ATF_REQUIRE(bind(s, (struct sockaddr *)&sin, sizeof(sin)) == 0);
ATF_REQUIRE(getsockname(s, (struct sockaddr *)&sin, &slen) == 0);
ATF_REQUIRE_MSG(sin.sin_addr.s_addr == INADDR_ANY && sin.sin_port != 0,
"jailed unconnected socket name %s:%u", inet_ntoa(sin.sin_addr),
ntohs(sin.sin_port));
sin.sin_addr.s_addr = htonl(0xc0000204);
sin.sin_port = htons(6666);
ATF_REQUIRE(connect(s, (struct sockaddr *)&sin, sizeof(sin)) == 0);
close(s);
}
/*
* See bug 274009.
*/
@@ -243,6 +273,7 @@ ATF_TP_ADD_TCS(tp)
ATF_TP_ADD_TC(tp, v4mapped);
ATF_TP_ADD_TC(tp, gethostname);
ATF_TP_ADD_TC(tp, gethostname_jailed);
ATF_TP_ADD_TC(tp, connect_bound_socket_from_2address_jail);
ATF_TP_ADD_TC(tp, IP_SENDSRCADDR);
return (atf_no_error());