From nobody Sun Apr 12 18:35:42 2026 X-Original-To: dev-commits-src-all@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 4ftzkR0Jdjz6YVyH for ; Sun, 12 Apr 2026 18:35:43 +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 "R12" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4ftzkQ2crSz3b37 for ; Sun, 12 Apr 2026 18:35:42 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1776018942; 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=onlNTC957PbBJTiVWYFnGPqFaXp7mdjTezck/ELFUTw=; b=cRUXAon+fmEoIm5yqKNLU1QOhiF8CIXWzcUi2uhJclEXzmAp3pBatO1jkSiSEpvmXHr/OB 0WjwgW5q7sOTPVeQtfvZWK9lRII5mnhBcJ9fX2+m1Uzbq843dBdTxg6JW/2UBVAP1MD0rL gHktvLbuhV0tl3sqDVEPGI0q5QeNV2hl9K153mUsyDkhzwLTX719LtS1iSbHeLSUIo510n iOtZ5+vESuuBWbIyl79UdlacQkCfXDSTqknDI9SK6kUKbpHKOouDsIW28cmgLK+u1ZsCDG G8VDoGcGQLDCzgUhz5NIsql6/7K6DvLUatGBG6Dn4TvMYFGSqxIveakxHc+fXg== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1776018942; a=rsa-sha256; cv=none; b=cbvx0lGKHrmkO4E2oFSp6INRmzC7ZtWxMbkd3IbmuTuUGQ9QNc/lGeSHkw6C23OsmjQr+O lswQGlcexhedqVpjaIaD6+HfKnhD3IxVbPTVvmYbzsAzrGHZoiesjynPdbyoNWeM4meu/U gBDq5ti29OGempYV1znpq4fFAa23KVwhyuRRukiJkhqK6TnEG87Uwt6etTiy46iY27B9BX B1/1LhF7RzF+WOmuX0N4Q+nrs6s9zV7qONqeKKItSwNOfJGY8ZeLPahyk9jFVgUExvLLva JIZjbj21i9AlvosAK7iyKlELC2QBRfTIXIwaqSI5LTjVoYpyzZeEphLAiq/ckw== 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=1776018942; 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=onlNTC957PbBJTiVWYFnGPqFaXp7mdjTezck/ELFUTw=; b=WwdvZb/9vvDfEi7oyzjYbvmiFYixHdVwMyPxYKB11C7sT3YEcPkWewngWUbItss6KxbHDq wWdb64Z1Iq1a33WDVO8iCoJbL4cBaxkILbbzZhREP9ioh6H1NLsjpO6FrI+AI1FJv1XYUZ KJLtjjf9t7MrnndNcBL+jJ3K5mcRHBPvEEIxus/VWf62I5cf9gU9xAMF1Kr2UWKtHOz9bU TlvYQINFYsRPIc5ZhoJ7NNwYuFXammyEBKDx5+1Y6QezOwv+hq8cRZvXcEeNLgX6lPwRuf oWfvK38+Aybrl0NeG1jT4l7wOnuSLSJ3/3iH7kwVhHE/aqBU4hhX9DMMG1hrnA== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4ftzkQ17RfzD7r for ; Sun, 12 Apr 2026 18:35:42 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 3a555 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Sun, 12 Apr 2026 18:35:42 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Gleb Smirnoff Subject: git: edece33b38eb - main - inpcb: move local address assignment out of in_pcbdisconnect() List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org 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: edece33b38ebcba46bd4d81382ebdb5a634a0c6d Auto-Submitted: auto-generated Date: Sun, 12 Apr 2026 18:35:42 +0000 Message-Id: <69dbe5fe.3a555.54922024@gitrepo.freebsd.org> The branch main has been updated by glebius: URL: https://cgit.FreeBSD.org/src/commit/?id=edece33b38ebcba46bd4d81382ebdb5a634a0c6d commit edece33b38ebcba46bd4d81382ebdb5a634a0c6d Author: Gleb Smirnoff AuthorDate: 2026-04-12 18:34:57 +0000 Commit: Gleb Smirnoff CommitDate: 2026-04-12 18:34:57 +0000 inpcb: move local address assignment out of in_pcbdisconnect() The logic of clearing local address at the protocol level makes sense. It is feature of UDP, not of any protocol, that local address is cleared on disconnect. This code can be tracked down to pre-FreeBSD times. For example, for TCP we want a disconnected socket to return previously used local address with getsockname(2). The TCP has successfully evaded that by not calling in_pcbdisconnect() and calling in_pcbdetach() in the very old code and in_pcbdrop() later. After D55661 TCP again has this potential bug masked. Better make it right than rely on such unintentional evasions. The raw IP sockets don't use in_pcbdisconnect(), but they are going to in the near future. If in_pcbdisconnect() clears local address for them, that would be a larger bug than just getsockname(). A raw socket may be bound with bind(2) and then connect(2)ed, and then disconnected, e.g. connect(INADDR_ANY). And when we run raw IP socket through in_pcbdisconnect() we don't want to lose local address. This reverts D38362. This reverts commit 2589ec0f365777faacf36bd1eb24706538836b17. Reviewed by: rrs, markj Differential Revision: https://reviews.freebsd.org/D56170 --- sys/netinet/in_pcb.c | 1 - sys/netinet/udp_usrreq.c | 3 +++ sys/netinet6/in6_pcb.c | 1 - sys/netinet6/udp6_usrreq.c | 3 +++ 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/sys/netinet/in_pcb.c b/sys/netinet/in_pcb.c index 29214fbd2cf6..7b294e0a92d5 100644 --- a/sys/netinet/in_pcb.c +++ b/sys/netinet/in_pcb.c @@ -1465,7 +1465,6 @@ in_pcbdisconnect(struct inpcb *inp) if ((inp->inp_socket->so_proto->pr_flags & PR_CONNREQUIRED) == 0) { /* See the comment in in_pcbinshash(). */ inp->inp_smr = smr_advance(inp->inp_pcbinfo->ipi_smr); - inp->inp_laddr.s_addr = INADDR_ANY; inp->inp_faddr.s_addr = INADDR_ANY; inp->inp_fport = 0; } diff --git a/sys/netinet/udp_usrreq.c b/sys/netinet/udp_usrreq.c index b973b299ca56..23b0ca684b09 100644 --- a/sys/netinet/udp_usrreq.c +++ b/sys/netinet/udp_usrreq.c @@ -1528,6 +1528,7 @@ udp_abort(struct socket *so) INP_WLOCK(inp); if (inp->inp_faddr.s_addr != INADDR_ANY) { in_pcbdisconnect(inp); + inp->inp_laddr.s_addr = INADDR_ANY; soisdisconnected(so); } INP_WUNLOCK(inp); @@ -1630,6 +1631,7 @@ udp_close(struct socket *so) INP_WLOCK(inp); if (inp->inp_faddr.s_addr != INADDR_ANY) { in_pcbdisconnect(inp); + inp->inp_laddr.s_addr = INADDR_ANY; soisdisconnected(so); } INP_WUNLOCK(inp); @@ -1697,6 +1699,7 @@ udp_disconnect(struct socket *so) return (ENOTCONN); } in_pcbdisconnect(inp); + inp->inp_laddr.s_addr = INADDR_ANY; SOCK_LOCK(so); so->so_state &= ~SS_ISCONNECTED; /* XXX */ SOCK_UNLOCK(so); diff --git a/sys/netinet6/in6_pcb.c b/sys/netinet6/in6_pcb.c index 136f5c8a9828..ad596cf761d2 100644 --- a/sys/netinet6/in6_pcb.c +++ b/sys/netinet6/in6_pcb.c @@ -542,7 +542,6 @@ in6_pcbdisconnect(struct inpcb *inp) /* See the comment in in_pcbinshash(). */ inp->inp_smr = smr_advance(inp->inp_pcbinfo->ipi_smr); /* XXX-MJ torn writes are visible to SMR lookup */ - memset(&inp->in6p_laddr, 0, sizeof(inp->in6p_laddr)); memset(&inp->in6p_faddr, 0, sizeof(inp->in6p_faddr)); inp->inp_fport = 0; } diff --git a/sys/netinet6/udp6_usrreq.c b/sys/netinet6/udp6_usrreq.c index 3f4c3111fa5b..ede791a7d175 100644 --- a/sys/netinet6/udp6_usrreq.c +++ b/sys/netinet6/udp6_usrreq.c @@ -996,6 +996,7 @@ udp6_abort(struct socket *so) if (!IN6_IS_ADDR_UNSPECIFIED(&inp->in6p_faddr)) { in6_pcbdisconnect(inp); + memset(&inp->in6p_laddr, 0, sizeof(inp->in6p_laddr)); soisdisconnected(so); } INP_WUNLOCK(inp); @@ -1105,6 +1106,7 @@ udp6_close(struct socket *so) #endif if (!IN6_IS_ADDR_UNSPECIFIED(&inp->in6p_faddr)) { in6_pcbdisconnect(inp); + memset(&inp->in6p_laddr, 0, sizeof(inp->in6p_laddr)); soisdisconnected(so); } INP_WUNLOCK(inp); @@ -1239,6 +1241,7 @@ udp6_disconnect(struct socket *so) } in6_pcbdisconnect(inp); + memset(&inp->in6p_laddr, 0, sizeof(inp->in6p_laddr)); SOCK_LOCK(so); so->so_state &= ~SS_ISCONNECTED; /* XXX */ SOCK_UNLOCK(so);