From nobody Wed May 21 02:55:39 2025 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 4b2GJD5Hdbz5wg2X; Wed, 21 May 2025 02:55:40 +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 "R11" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4b2GJD3qGhz40FB; Wed, 21 May 2025 02:55:40 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1747796140; 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=+pjl2gWKg5dIfDD2oDdWe2yOtCkY7QvkW/8xB3zG444=; b=mXfEsh+Lw2MeZKw3a5p5tTGZvPj60b27RWxNp+GjZudy4ER4tUFHMsDRfmx9FRDEGcfevh fZXRVbyFn/3hsxvDB5cQnBVsre5Qv0u7HU8Hg3J3IYE55cmLaK9FFbjC9pLtNbmrCbNZM0 CM6hLxKb8EfJ40xxUy18VMo02GnbdHHI37EFmZyrmALOCFQmAtJdzwdfe1HMEUep0IlT32 1FGteHLhB5RMwYJEt344IuJgm1f0xSzLvi819w9Hpb7SAT+D2nxmjLvgDKm22ljavIDpRH gl9SGQ2gVat7L5JR4dWJEIW8DKPyXsWU8aGvtk+Prr1x8PDkk2jPV0qYgtUZlw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1747796140; 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=+pjl2gWKg5dIfDD2oDdWe2yOtCkY7QvkW/8xB3zG444=; b=UZC7E6SOL9nJyCoqbKRd1aJiq2s5cW0Keg/+Hk9MB6qnY399VVDZVZjpYQ1skGNR2ZSaQi hOPkxApdMmaIQYV7RV5wG8pj3rqHQT7M0B8CrQFRA1gJwCUmohHksvJ3w8p8OZlg5q+SbZ 92bCkvQqOdoi5fJpCXZDrIrDyMzMPVvpEyo5BPR85oroPwHK8PTr4PmRo70+gDMI5iYhAa JaR1jiObdOl7iJT0AEvxd054zu0xd6TzMH9PpT4tE5R7xVHmTYDHaW7L6rcD+e3xRA4bMM PoQpXP6H4/9GE/AnI9jJrqWiQvd6fTN9BhIiCnqEQxdZRjwPvxGn0i7IZgB2QA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1747796140; a=rsa-sha256; cv=none; b=xpumTerJKXpSQwQvqRSbaZ3lnaSBRvXy9zzLyhnGAzrz5qKMPyyvi9YVfE20itv74VF0Iu MZuzW2h/ao68T3/SxAI/K0z0sJmVIYHFE3MdCcJR32p8RygWjyeb50M5Rjv3F61RMr0BcU TKB4xH4ZlptJLOOAZ7YZQKjNvjRVvEyUV5R5pW0Ive7wyFwWp+nPflkW90rtWGuHIQDLkq k0EYUVi+JaycJu86AuEC0ra1iRWepso2JIWxFLy3R0DHBCmTjP9VEDsjbcbDNPeyyhJKhL SOBkS2IrEwqhxUWF8Tfy7UnXeWVZQn8mD05PPRz8sGIufcZL6+PMomfC7Cvqzg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (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 did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4b2GJC4k5xz2Fl; Wed, 21 May 2025 02:55:39 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 54L2tdeS001574; Wed, 21 May 2025 02:55:39 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 54L2tdkb001571; Wed, 21 May 2025 02:55:39 GMT (envelope-from git) Date: Wed, 21 May 2025 02:55:39 GMT Message-Id: <202505210255.54L2tdkb001571@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Gleb Smirnoff Subject: git: eafe5967ac55 - main - unix: fix EVFILT_WRITE when peer close(2)s and shutdown(2)s 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 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: eafe5967ac558de142d91660e18e9238289890e3 Auto-Submitted: auto-generated The branch main has been updated by glebius: URL: https://cgit.FreeBSD.org/src/commit/?id=eafe5967ac558de142d91660e18e9238289890e3 commit eafe5967ac558de142d91660e18e9238289890e3 Author: Gleb Smirnoff AuthorDate: 2025-05-21 00:30:57 +0000 Commit: Gleb Smirnoff CommitDate: 2025-05-21 02:54:51 +0000 unix: fix EVFILT_WRITE when peer close(2)s and shutdown(2)s For the close(2) case restore reporting the event with EV_EOF set. This fixes bug 286692. For the shutdown(2) case restore original behavior, but leave comment that we may want to change that. The d15792780760 was not intended to bring in functional API changes. Provide tests for both cases. PR: 286692 Fixes: d15792780760ef94647af9b377b5f0a80e1826bc --- sys/kern/uipc_usrreq.c | 16 ++++++++++++--- tests/sys/kern/unix_stream.c | 48 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 3 deletions(-) diff --git a/sys/kern/uipc_usrreq.c b/sys/kern/uipc_usrreq.c index 0836652b6a24..164030eec7ab 100644 --- a/sys/kern/uipc_usrreq.c +++ b/sys/kern/uipc_usrreq.c @@ -1767,16 +1767,26 @@ uipc_filt_sowrite(struct knote *kn, long hint) struct socket *so = kn->kn_fp->f_data, *so2; struct unpcb *unp = sotounpcb(so), *unp2 = unp->unp_conn; - if (SOLISTENING(so) || unp2 == NULL) + if (SOLISTENING(so)) return (0); + if (unp2 == NULL) { + if (so->so_state & SS_ISDISCONNECTED) { + kn->kn_flags |= EV_EOF; + kn->kn_fflags = so->so_error; + return (1); + } else + return (0); + } + so2 = unp2->unp_socket; SOCK_RECVBUF_LOCK_ASSERT(so2); kn->kn_data = uipc_stream_sbspace(&so2->so_rcv); if (so2->so_rcv.sb_state & SBS_CANTRCVMORE) { - kn->kn_flags |= EV_EOF; - kn->kn_fflags = so->so_error; + /* + * XXXGL: maybe kn->kn_flags |= EV_EOF ? + */ return (1); } else if (kn->kn_sfflags & NOTE_LOWAT) return (kn->kn_data >= kn->kn_sdata); diff --git a/tests/sys/kern/unix_stream.c b/tests/sys/kern/unix_stream.c index 7aedf462dcce..9f750967ebf8 100644 --- a/tests/sys/kern/unix_stream.c +++ b/tests/sys/kern/unix_stream.c @@ -279,6 +279,52 @@ ATF_TC_BODY(unconnected_writability, tc) close(s); } +ATF_TC_WITHOUT_HEAD(peerclosed_writability); +ATF_TC_BODY(peerclosed_writability, tc) +{ + struct kevent kev; + int sv[2], kq; + + do_socketpair(sv); + close(sv[1]); + + check_writable_select(sv[0], 1, false); + check_writable_poll(sv[0], 1, false); + + ATF_REQUIRE(kq = kqueue()); + EV_SET(&kev, sv[0], EVFILT_WRITE, EV_ADD, 0, 0, NULL); + ATF_REQUIRE(kevent(kq, &kev, 1, &kev, 1, NULL) == 1); + ATF_REQUIRE(kev.ident == (uintptr_t)sv[0] && + kev.filter == EVFILT_WRITE && + kev.flags == EV_EOF); + + close(sv[0]); +} + +ATF_TC_WITHOUT_HEAD(peershutdown_writability); +ATF_TC_BODY(peershutdown_writability, tc) +{ + int sv[2]; + + do_socketpair(sv); + shutdown(sv[1], SHUT_RD); + + check_writable_select(sv[0], 1, false); + check_writable_poll(sv[0], 1, false); + /* + * XXXGL: historically unix(4) sockets were not reporting peer's + * shutdown(SHUT_RD) as our EV_EOF. The kevent(2) manual page says + * "filter will set EV_EOF when the reader disconnects", which is hard + * to interpret unambigously. For now leave the historic behavior, + * but we may want to change that in uipc_usrreq.c:uipc_filt_sowrite(), + * and then this test will look like the peerclosed_writability test. + */ + check_writable_kevent(sv[0], 1, false); + + close(sv[0]); + close(sv[1]); +} + ATF_TP_ADD_TCS(tp) { ATF_TP_ADD_TC(tp, getpeereid); @@ -288,6 +334,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, peershutdown_writability); return atf_no_error(); }