From nobody Wed Jul 1 05:48:46 2026 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4gqpwb23RGz6hWc4 for ; Wed, 01 Jul 2026 05:48:47 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "YR1" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4gqpwZ69Ghz45gL for ; Wed, 01 Jul 2026 05:48:46 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1782884926; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=mshbrl9IXITGPeIvyrWLGxMwFv4HpB+qcHmiAThIVSg=; b=iZs4/XqOrPbfwpxcB6HOxFhkN/8PTSyFEnt/V8af8ILm7B/E/FPPECjIDP8r1umxmNVtAO PvaWg7Ag7SpR0REPHmgJGrnCSZJA2fYYltoO1hpUAyKtj8B1T/CYZy+Lfm6h67ZOfF8ms3 waaF3E2saotzOkhjch8aDhi6zPUCen1zmthy2y18PrL+nVghqQquMIptO+dGg28HcNlzKm vmsNTKBfwQJQTU2NHVZbIlqc+e0MLBTIBsUlsvvFab2X877kXq9Xys4p6JTf8lf7vxeWZ5 0PPj+P1eAAZWr9KJvH9r2A9KuEbbXmA5RoQuPOaImaI/x3vBoOYa4XpqtxPPuQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1782884926; a=rsa-sha256; cv=none; b=fczUQ8ZNxvJsmnUtEHeS1pj4LBHnLcDdZfDR3XBccvFPjExR2qmUJh3Lb1WglPWkHt3Mc4 SrGshUIy9vkWUiaz1dvrrjJ6UHcuVR4QJGGdJqnC/wgR0SgwHVP1V9E1vF5/1YBAo1pNsQ rLGNiHo9htAu7oOu7bqecCijuBmFU3DN169tKZYdLE8tBKgSON0VtfWgrFoD3Gw8QkXiNu CNyD9JFfXyxAUMLF3Y1uQe7FQn0qqQsk1MEXH+ciDvDWVviSCX+sQTEvG/j3dGqXDSnrH4 5u8gaOQGguI7cpzV/zjNRkAqZY1HcmGjrxR+PJXKvmEv2wbv/D4MPqFk60H1PA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1782884926; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=mshbrl9IXITGPeIvyrWLGxMwFv4HpB+qcHmiAThIVSg=; b=jfDuWJaZsiBhm/EqdAkSVWJ+Y9uIF5+b/ad9saq3drLqhY11edsB60P1AGODV0HJPgzYK5 k2W9HZkqG9Osok3NFMkE2YxX/a5P/6I9D/m+b1nQ5+bh76v4rPRDHDDpQf3TUvwQ8NC+65 x48LJucjFzAug3V436ZNyok8M+YmtvAEpwk2ADsK8FfT0mF2RYaRRnhhEpBP/t1xTjyHrE AI/wHHM6JV6CiEYDnYBANnVIUeGCCo4cyt/mH1iB4YzYA5LBm9B6AURQsQBitk0TUWuCYv 7s5dl4SAJf7lgZfNIF/NeDeQ94LQJRUJ/FZPynq+ZDlR6XIq2MMQn1m/bS4t5A== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4gqpwZ4lDpz1GwM for ; Wed, 01 Jul 2026 05:48:46 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 1c4d6 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Wed, 01 Jul 2026 05:48:46 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Gleb Smirnoff Subject: git: 0bc0b0c3f738 - main - tests/socket_afinet: extend bind_connected_port_test to cover more cases List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: glebius X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 0bc0b0c3f73812fdcdb89865879c7478bcbc7323 Auto-Submitted: auto-generated Date: Wed, 01 Jul 2026 05:48:46 +0000 Message-Id: <6a44aa3e.1c4d6.8631dda@gitrepo.freebsd.org> The branch main has been updated by glebius: URL: https://cgit.FreeBSD.org/src/commit/?id=0bc0b0c3f73812fdcdb89865879c7478bcbc7323 commit 0bc0b0c3f73812fdcdb89865879c7478bcbc7323 Author: Gleb Smirnoff AuthorDate: 2026-07-01 05:48:06 +0000 Commit: Gleb Smirnoff CommitDate: 2026-07-01 05:48:06 +0000 tests/socket_afinet: extend bind_connected_port_test to cover more cases - Test SOCK_DGRAM (UDP) sockets. - Test binding to 0:port and to a addr:port in presence of connected socket using the port. Differential Revision: https://reviews.freebsd.org/D56707 --- tests/sys/netinet/socket_afinet.c | 137 +++++++++++++++++++++++++++++--------- 1 file changed, 107 insertions(+), 30 deletions(-) diff --git a/tests/sys/netinet/socket_afinet.c b/tests/sys/netinet/socket_afinet.c index ddd4f9a6f5da..936e5ada9802 100644 --- a/tests/sys/netinet/socket_afinet.c +++ b/tests/sys/netinet/socket_afinet.c @@ -31,6 +31,7 @@ #include #include +#include #include #include @@ -516,23 +517,26 @@ ATF_TC_BODY(socket_afinet_multibind, tc) multibind_test(tc, AF_INET6, SOCK_DGRAM); } -static void -bind_connected_port_test(const atf_tc_t *tc, int domain) +/* + * Test operation of bind(2) in presence of a connected inpcb using the + * same local port. + */ +static enum bind_res +bind_connected_port_test(const atf_tc_t *tc, int domain, int type, bool wild, + bool unpriv) { struct sockaddr_in sin; struct sockaddr_in6 sin6; struct sockaddr *sinp; socklen_t slen; - int error, sd[3], tmp; + int error, ss, cs, as; enum bind_res res; /* * Create a connected socket pair. */ - sd[0] = socket(domain, SOCK_STREAM, 0); - ATF_REQUIRE_MSG(sd[0] >= 0, "socket failed: %s", strerror(errno)); - sd[1] = socket(domain, SOCK_STREAM, 0); - ATF_REQUIRE_MSG(sd[1] >= 0, "socket failed: %s", strerror(errno)); + ss = socket(domain, type, 0); + ATF_REQUIRE_MSG(ss >= 0, "socket failed: %s", strerror(errno)); if (domain == PF_INET) { memset(&sin, 0, sizeof(sin)); sin.sin_family = AF_INET; @@ -550,28 +554,61 @@ bind_connected_port_test(const atf_tc_t *tc, int domain) sinp = (struct sockaddr *)&sin6; } - error = bind(sd[0], sinp, sinp->sa_len); + error = bind(ss, sinp, sinp->sa_len); ATF_REQUIRE_MSG(error == 0, "bind failed: %s", strerror(errno)); - error = listen(sd[0], 1); - ATF_REQUIRE_MSG(error == 0, "listen failed: %s", strerror(errno)); - - error = getsockname(sd[0], sinp, &(socklen_t){ sinp->sa_len }); - ATF_REQUIRE_MSG(error == 0, "getsockname failed: %s", strerror(errno)); - if (domain == PF_INET) - sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK); - else - sin6.sin6_addr = in6addr_loopback; - error = connect(sd[1], sinp, sinp->sa_len); - ATF_REQUIRE_MSG(error == 0, "connect failed: %s", strerror(errno)); - slen = sinp->sa_len; - tmp = accept(sd[0], sinp, &slen); - ATF_REQUIRE_MSG(tmp >= 0, "accept failed: %s", strerror(errno)); - - /* bind() should succeed even from an unprivileged user. */ - res = child_bind_priv(tc, SOCK_STREAM, sinp, SO_REUSEADDR); - ATF_REQUIRE(res == BIND_REUSE_SUCCESS); - res = child_bind_unpriv(tc, SOCK_STREAM, sinp, SO_REUSEADDR); - ATF_REQUIRE(res == BIND_REUSE_SUCCESS); + + if (type == SOCK_STREAM) { + error = getsockname(ss, sinp, &(socklen_t){ sinp->sa_len }); + ATF_REQUIRE_MSG(error == 0, "getsockname failed: %s", + strerror(errno)); + error = listen(ss, 1); + ATF_REQUIRE_MSG(error == 0, + "listen failed: %s", strerror(errno)); + cs = socket(domain, type, 0); + ATF_REQUIRE_MSG(cs >= 0, "socket failed: %s", strerror(errno)); + if (domain == PF_INET) + sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK); + else + sin6.sin6_addr = in6addr_loopback; + error = connect(cs, sinp, sinp->sa_len); + ATF_REQUIRE_MSG(error == 0, + "connect failed: %s", strerror(errno)); + slen = sinp->sa_len; + as = accept(ss, sinp, &slen); + ATF_REQUIRE_MSG(as >= 0, "accept failed: %s", strerror(errno)); + } else { + ATF_REQUIRE(type == SOCK_DGRAM); + if (domain == PF_INET) { + sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK); + sin.sin_port = htons(6666); + } else { + sin6.sin6_addr = in6addr_loopback; + sin6.sin6_port = htons(6666); + } + error = connect(ss, sinp, sinp->sa_len); + ATF_REQUIRE_MSG(error == 0, + "connect failed: %s", strerror(errno)); + error = getsockname(ss, sinp, &(socklen_t){ sinp->sa_len }); + ATF_REQUIRE_MSG(error == 0, "getsockname failed: %s", + strerror(errno)); + } + + if (wild) { + if (domain == PF_INET) + sin.sin_addr.s_addr = htonl(INADDR_ANY); + else + sin6.sin6_addr = in6addr_any; + } + + res = child_bind(tc, type, sinp, SO_REUSEADDR, unpriv); + + if (type == SOCK_STREAM) { + ATF_REQUIRE(close(as) == 0); + ATF_REQUIRE(close(cs) == 0); + } + ATF_REQUIRE(close(ss) == 0); + + return (res); } /* @@ -587,8 +624,48 @@ ATF_TC_HEAD(socket_afinet_bind_connected_port, tc) } ATF_TC_BODY(socket_afinet_bind_connected_port, tc) { - bind_connected_port_test(tc, AF_INET); - bind_connected_port_test(tc, AF_INET6); + struct socket_afinet_bind_connected_port_res { + int domain; + int type; + bool wild; + bool unpriv; + enum bind_res result; + } tests[] = { +#define x true +#define o false + /* W U */ + { AF_INET, SOCK_STREAM, x, x, BIND_REUSE_SUCCESS }, + { AF_INET, SOCK_STREAM, o, x, BIND_REUSE_SUCCESS }, + { AF_INET, SOCK_STREAM, x, o, BIND_REUSE_SUCCESS }, + { AF_INET, SOCK_STREAM, o, o, BIND_REUSE_SUCCESS }, + { AF_INET6, SOCK_STREAM, x, x, BIND_REUSE_SUCCESS }, + { AF_INET6, SOCK_STREAM, o, x, BIND_REUSE_SUCCESS }, + { AF_INET6, SOCK_STREAM, x, o, BIND_REUSE_SUCCESS }, + { AF_INET6, SOCK_STREAM, o, o, BIND_REUSE_SUCCESS }, + { AF_INET, SOCK_DGRAM, x, x, BIND_FAILED }, + { AF_INET, SOCK_DGRAM, o, x, BIND_FAILED }, + { AF_INET, SOCK_DGRAM, x, o, BIND_REUSE_SUCCESS }, + { AF_INET, SOCK_DGRAM, o, o, BIND_REUSE_SUCCESS }, + { AF_INET6, SOCK_DGRAM, x, x, BIND_FAILED }, + { AF_INET6, SOCK_DGRAM, o, x, BIND_FAILED }, + { AF_INET6, SOCK_DGRAM, x, o, BIND_REUSE_SUCCESS }, + { AF_INET6, SOCK_DGRAM, o, o, BIND_REUSE_SUCCESS }, +#undef x +#undef o + }; + + for (u_int i = 0; i < nitems(tests); i++) { + enum bind_res res; + + res = bind_connected_port_test(tc, tests[i].domain, + tests[i].type, tests[i].wild, tests[i].unpriv); + ATF_REQUIRE_MSG(res == tests[i].result, "test #%u: " + "domain %u type %u%s %sprivileged: result %u (expected %u)", + i, tests[i].domain, tests[i].type, + tests[i].wild ? " wild" : "", + tests[i].unpriv ? "un" : "", + res, tests[i].result); + } } ATF_TP_ADD_TCS(tp)