From nobody Sat May 09 19:24:44 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 4gCbXY0z8yz6cfWr for ; Sat, 09 May 2026 19:24:45 +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 "R13" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4gCbXX5byLz3Ymg for ; Sat, 09 May 2026 19:24:44 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1778354684; 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=aL/xUmuHpH0KlVSwvnfhHPQwj1oAIaNLIwMlY5By4Yo=; b=nzexF8PtaUQr/tog2KX6dVNAeipMV9sHnFtUXdcYbrTkwKnzDOWJfyg+TYTVtMyG7waeU5 v3tssSDCOSay4pjBae+kw6CIVL/wSO7XEXSMZ+LHVZDNDgjNS1450M7WRMDoAae8cGz2S0 XXRd2xVaf3K777EMHtAWA6plPBgUc89dcyv6vjzJVUBF/tM/hO3FpjKHvR+RQV+2RJns8R EeQjSaSDaviSgcUfkq6giDD2FdAHrHgZZQvWyChbTptlFp2IE4kr2aPT4c9KJtAfLOZyBd 3NgVKBlDlpvGvIPSEToBsp3FLEsSu9M5fpEI6sEJKGTl7iV8vUwZePHhL/DSbQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1778354684; a=rsa-sha256; cv=none; b=A3hFzpln24w8tcspTEJVRIbxxnN17MuCFkWFM+BYIV1mVOF+nV6pQoM6ARDp35Apw5t8zU dzNrDw9AgKaoqJgwPAju9eNQ+y+cS4zlorIZ972+JDwoJnMkDAYp0capzXQLx+108fNJKd xIhY0VroOiUcLOq9XGOh475KIQ9xSuOwGn/PNcaYNt6dXaC2FT4OBgES+qBkFC2zC/l6ik HbXylx6LEhmSeVICis61O+JvtKxHtgE/l76c04vaTENRnMSMl8C863LeS7SRe355W3iDkx fv5BAkJnGbsgO910Z52RRjB+W+Q8HEoY3JpimegPEC+F6PHBUBo2q/Q17VvdQg== 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=1778354684; 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=aL/xUmuHpH0KlVSwvnfhHPQwj1oAIaNLIwMlY5By4Yo=; b=TusdX8sSFQ3byX4r9qpXBpmBmb6w1ZU5KBZMNsMbJDeY3y/jtrVmlJPXlnwp+G6ew3RnV3 hyHmvnlX/CMwI54n0h4DL0SzRSXVHVU/Bfqae1o5ERRa1UW+c/PK7i7qbXJchPhkCd10// vxJ+2iiA1xL+WecWsr7KKyyFdQMvpoBcezQOxuMjYZoASQR9g2mP23uTcpsu8yClbO5fRJ mpwNl3Up3cJrmbJuSPYdRNUra5kEWGrcYVfg5WQG7Uq7juO2AozZIVPJkyLByX71eHnI4B ilR4EyvXqPtdnnHLZYhH2z00NR5vIUpVq1Y7t1y6kvHO8NBAX0xXME4sIoIMhg== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4gCbXX44J0z1Bk9 for ; Sat, 09 May 2026 19:24:44 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 1bb84 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Sat, 09 May 2026 19:24:44 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Mark Johnston Subject: git: f06697907f36 - stable/15 - unix: Make sure we signal EOF on the write side when disconnecting 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 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: markj X-Git-Repository: src X-Git-Refname: refs/heads/stable/15 X-Git-Reftype: branch X-Git-Commit: f06697907f360b02682594c6179a7361644d3c87 Auto-Submitted: auto-generated Date: Sat, 09 May 2026 19:24:44 +0000 Message-Id: <69ff89fc.1bb84.f469540@gitrepo.freebsd.org> The branch stable/15 has been updated by markj: URL: https://cgit.FreeBSD.org/src/commit/?id=f06697907f360b02682594c6179a7361644d3c87 commit f06697907f360b02682594c6179a7361644d3c87 Author: Mark Johnston AuthorDate: 2026-05-03 15:46:22 +0000 Commit: Mark Johnston CommitDate: 2026-05-09 19:16:02 +0000 unix: Make sure we signal EOF on the write side when disconnecting Add a regression test. PR: 294014 Reported by: diizzy Reviewed by: glebius MFC after: 1 week Fixes: d15792780760 ("unix: new implementation of unix/stream & unix/seqpacket") Differential Revision: https://reviews.freebsd.org/D56764 (cherry picked from commit 476805133f5736c2c8638e41d2b5d8dd2c597f3a) --- sys/kern/uipc_usrreq.c | 2 ++ tests/sys/kern/unix_stream.c | 77 ++++++++++++++++++++++++++++++++++---------- 2 files changed, 62 insertions(+), 17 deletions(-) diff --git a/sys/kern/uipc_usrreq.c b/sys/kern/uipc_usrreq.c index 6569422a3710..44d0185e9d1c 100644 --- a/sys/kern/uipc_usrreq.c +++ b/sys/kern/uipc_usrreq.c @@ -3162,6 +3162,8 @@ unp_soisdisconnected(struct socket *so) so->so_state |= SS_ISDISCONNECTED; so->so_state &= ~SS_ISCONNECTED; so->so_rcv.uxst_peer = NULL; + selwakeuppri(&so->so_wrsel, PSOCK); + KNOTE_LOCKED(&so->so_snd.sb_sel->si_note, 0); socantrcvmore_locked(so); } diff --git a/tests/sys/kern/unix_stream.c b/tests/sys/kern/unix_stream.c index 442b766ac885..df8dd1a15f85 100644 --- a/tests/sys/kern/unix_stream.c +++ b/tests/sys/kern/unix_stream.c @@ -109,6 +109,7 @@ typedef void check_func_t(struct check_ctx *); struct check_ctx { check_func_t *method; int sv[2]; + int kq; bool timeout; union { enum { SELECT_RD, SELECT_WR } select_what; @@ -156,24 +157,47 @@ check_poll(struct check_ctx *ctx) } static void -check_kevent(struct check_ctx *ctx) +add_kevent(struct check_ctx *ctx) { struct kevent kev; - int nfds, kq; + int kq, nfds; + + if (ctx->kq <= 0) { + kq = kqueue(); + ATF_REQUIRE(kq > 0); + ctx->kq = kq; + } - ATF_REQUIRE(kq = kqueue()); EV_SET(&kev, ctx->sv[0], ctx->kev_filter, EV_ADD, 0, 0, NULL); - nfds = kevent(kq, &kev, 1, NULL, 0, NULL); + nfds = kevent(ctx->kq, &kev, 1, NULL, 0, NULL); ATF_REQUIRE_MSG(nfds == 0, "kevent() returns %d errno %d", nfds, errno); - nfds = kevent(kq, NULL, 0, &kev, 1, ctx->timeout ? +} + +static void +check_kevent(struct check_ctx *ctx) +{ + struct kevent kev; + int nfds; + + nfds = kevent(ctx->kq, NULL, 0, &kev, 1, ctx->timeout ? &(struct timespec){.tv_nsec = 1000000} : NULL); ATF_REQUIRE_MSG(nfds == ctx->nfds, "kevent() returns %d errno %d", nfds, errno); - ATF_REQUIRE(kev.ident == (uintptr_t)ctx->sv[0] && - kev.filter == ctx->kev_filter && - (kev.flags & ctx->kev_flags) == ctx->kev_flags); - close(kq); + if (nfds > 0) { + ATF_REQUIRE_EQ(kev.ident, (uintptr_t)ctx->sv[0]); + ATF_REQUIRE_EQ(kev.filter, ctx->kev_filter); + ATF_REQUIRE_EQ(kev.flags & ctx->kev_flags, ctx->kev_flags); + } + close(ctx->kq); + ctx->kq = -1; +} + +static void +add_and_check_kevent(struct check_ctx *ctx) +{ + add_kevent(ctx); + check_kevent(ctx); } static void @@ -287,7 +311,7 @@ ATF_TC_WITHOUT_HEAD(full_writability_kevent); ATF_TC_BODY(full_writability_kevent, tc) { struct check_ctx ctx = { - .method = check_kevent, + .method = add_and_check_kevent, .kev_filter = EVFILT_WRITE, }; @@ -312,7 +336,7 @@ ATF_TC_BODY(connected_writability, tc) ctx.poll_events = POLLOUT | POLLWRNORM; check_poll(&ctx); ctx.kev_filter = EVFILT_WRITE; - check_kevent(&ctx); + add_and_check_kevent(&ctx); close(ctx.sv[0]); close(ctx.sv[1]); @@ -333,13 +357,13 @@ ATF_TC_BODY(unconnected_writability, tc) ctx.poll_events = POLLOUT | POLLWRNORM; check_poll(&ctx); ctx.kev_filter = EVFILT_WRITE; - check_kevent(&ctx); + add_and_check_kevent(&ctx); close(ctx.sv[0]); } -ATF_TC_WITHOUT_HEAD(peerclosed_writability); -ATF_TC_BODY(peerclosed_writability, tc) +ATF_TC_WITHOUT_HEAD(peerclosed_writability_level); +ATF_TC_BODY(peerclosed_writability_level, tc) { struct check_ctx ctx = { .timeout = false, @@ -355,6 +379,24 @@ ATF_TC_BODY(peerclosed_writability, tc) check_poll(&ctx); ctx.kev_filter = EVFILT_WRITE; ctx.kev_flags = EV_EOF; + add_and_check_kevent(&ctx); + + close(ctx.sv[0]); +} + +ATF_TC_WITHOUT_HEAD(peerclosed_writability_edge); +ATF_TC_BODY(peerclosed_writability_edge, tc) +{ + struct check_ctx ctx = { + .timeout = false, + .nfds = 1, + }; + + do_socketpair(ctx.sv); + ctx.kev_filter = EVFILT_WRITE; + ctx.kev_flags = EV_EOF; + add_kevent(&ctx); + close(ctx.sv[1]); check_kevent(&ctx); close(ctx.sv[0]); @@ -384,7 +426,7 @@ ATF_TC_BODY(peershutdown_writability, tc) * and then this test will also expect EV_EOF in returned flags. */ ctx.kev_filter = EVFILT_WRITE; - check_kevent(&ctx); + add_and_check_kevent(&ctx); close(ctx.sv[0]); close(ctx.sv[1]); @@ -463,7 +505,7 @@ ATF_TC_WITHOUT_HEAD(peershutdown_wakeup_kevent); ATF_TC_BODY(peershutdown_wakeup_kevent, tc) { peershutdown_wakeup(&(struct check_ctx){ - .method = check_kevent, + .method = add_and_check_kevent, .kev_filter = EVFILT_READ, .kev_flags = EV_EOF, }); @@ -525,7 +567,8 @@ ATF_TP_ADD_TCS(tp) ATF_TP_ADD_TC(tp, full_writability_select); ATF_TP_ADD_TC(tp, full_writability_poll); ATF_TP_ADD_TC(tp, full_writability_kevent); - ATF_TP_ADD_TC(tp, peerclosed_writability); + ATF_TP_ADD_TC(tp, peerclosed_writability_level); + ATF_TP_ADD_TC(tp, peerclosed_writability_edge); ATF_TP_ADD_TC(tp, peershutdown_writability); ATF_TP_ADD_TC(tp, peershutdown_readability); ATF_TP_ADD_TC(tp, peershutdown_wakeup_select);