git: 2e16d37e275f - main - tests/netinet: test case for a jail with 2 addresses

From: Gleb Smirnoff <glebius_at_FreeBSD.org>
Date: Mon, 07 Sep 2026 18:51:43 UTC
The branch main has been updated by glebius:

URL: https://cgit.FreeBSD.org/src/commit/?id=2e16d37e275fa6bcd0494dbc48868a979404ce56

commit 2e16d37e275fa6bcd0494dbc48868a979404ce56
Author:     Gleb Smirnoff <glebius@FreeBSD.org>
AuthorDate: 2026-09-07 18:51:22 +0000
Commit:     Gleb Smirnoff <glebius@FreeBSD.org>
CommitDate: 2026-09-07 18:51:22 +0000

    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.
---
 tests/sys/netinet/udp_bindings.c | 31 +++++++++++++++++++++++++++++++
 1 file changed, 31 insertions(+)

diff --git a/tests/sys/netinet/udp_bindings.c b/tests/sys/netinet/udp_bindings.c
index b05967d4b080..8470318aafef 100644
--- a/tests/sys/netinet/udp_bindings.c
+++ b/tests/sys/netinet/udp_bindings.c
@@ -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());