From nobody Tue Apr 15 00:57:30 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 4Zc5NW28Fhz5sbK4; Tue, 15 Apr 2025 00:57:31 +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 "R10" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4Zc5NV4Xrvz3ptY; Tue, 15 Apr 2025 00:57:30 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1744678650; 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=gnIaVsqWObTj4piJjjw0n8GJ/cK+pNMq1410STM2dtw=; b=Vpfl3LzMDLhe6kQ7k19gIvMSneKdXpdcva88pzx4hvSORpA0v9QGKycHR68K7f3DABaUe+ WSgEthtrKXzOwf5z9eW8H8ZjxUxvh71tcc6uxs5moxI8/FMqmnUick7f+7bP/3v2+6yRJM 7dTuXbopdmZxZd+Jp7uGX3tEzu87I/C1RsWqJcS4DO1e98Gs1kSACjwpet/2e5mPweFr1k Q7+xJd6RfbjKVinKJ7A1dBOEXfH0hrgG8MxeYZQErW2yAz1jo0XwgcxpXfmMyqzgvAs5Wz G46Tq/CUtc6sIpaOBs9XpKFHDOg1hIa20n2vWkLsefFMJ3sQ7rnyoO3pp+Og3A== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1744678650; a=rsa-sha256; cv=none; b=UgK+hH3KqOPISrcs/T7g/jthn1VCjCiGkuM/+q4EvlxgGl88ndMVm1zEDBvHLkC/J96MI6 kJtfclz7MHgOz8OnM7vPTi1eWLp/gLn5qfLwPWQpdI5f91CXQy8jvuQrzAYHAIKEMRh3mN dhxcttKlKVMTjYgH2pMMhkyo/cUmdvmFRCtrmCQP0cEV/bfr33DooCPEdg/mFpr5oFHy7B L16Vs3wW/PlHTSp/rmMLNy+C9Xw/YbI7SVOJZWM9afqLb4vkbkSPm5SgPrtgT44Mw/f/VF 7OBIEG/Iwub1mHE8Wy8I/TvMfs9S7IjDKA51G8AllY5NaXW65rYwDcpF6Uc5JA== 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=1744678650; 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=gnIaVsqWObTj4piJjjw0n8GJ/cK+pNMq1410STM2dtw=; b=Q62gDixf8cXknWDgpozs8g+vc5f4ARfoQLjI5zhWhZmLxTXg1on/R8dEJEhwSsaK402cN0 sFKTOFIqqsuzsZ0efcmk7CDTdz2Jakph6jGSpo4jL+3u/I9YuYSyM/R8fY1SXbTy9SGe1T YLW46LZg42YQqGcBxhkuEsfROC2bQdICYh4IwSdFLVaDkzLFIREHKVdZ7KhfDPHHr4RLHH 4y0yH5+lrxt+M4x1/Hj4kXDlDuOEIk7Uxvp8D+CvR1tDOK4jQbL4uGwEnLP+0TRbkeAvoY 0psaDKJBLIRESsv/Su3tqxOeA39V/DA4Z3TwJfumgRjbnXb/JuPH7lu/kmtDzg== 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 4Zc5NV3tGVz1B1d; Tue, 15 Apr 2025 00:57:30 +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 53F0vUE7046028; Tue, 15 Apr 2025 00:57:30 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 53F0vUis046025; Tue, 15 Apr 2025 00:57:30 GMT (envelope-from git) Date: Tue, 15 Apr 2025 00:57:30 GMT Message-Id: <202504150057.53F0vUis046025@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Mark Johnston Subject: git: 992b18a9ec9f - main - so_splice: Synchronize so_unsplice() with so_splice() 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: markj X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 992b18a9ec9f21cdf15b70b2f510fa2a69844385 Auto-Submitted: auto-generated The branch main has been updated by markj: URL: https://cgit.FreeBSD.org/src/commit/?id=992b18a9ec9f21cdf15b70b2f510fa2a69844385 commit 992b18a9ec9f21cdf15b70b2f510fa2a69844385 Author: Mark Johnston AuthorDate: 2025-04-15 00:55:00 +0000 Commit: Mark Johnston CommitDate: 2025-04-15 00:55:00 +0000 so_splice: Synchronize so_unsplice() with so_splice() so_unsplice() assumed that if SB_SPLICED is set in the receive buffer of the first socket, then the splice is fully initialized. However, that's not true, and it's possible for so_unsplice() to race ahead of so_splice(). Modify so_unsplice() to simply bail if the splice state is embryonic. Reported by: syzkaller Reviewed by: gallatin Fixes: a1da7dc1cdad ("socket: Implement SO_SPLICE") MFC after: 2 weeks Differential Revision: https://reviews.freebsd.org/D49814 --- sys/kern/uipc_socket.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c index ac00696236a5..291a832189e5 100644 --- a/sys/kern/uipc_socket.c +++ b/sys/kern/uipc_socket.c @@ -1742,6 +1742,8 @@ so_splice(struct socket *so, struct socket *so2, struct splice *splice) /* * Transfer any data already present in the socket buffer. */ + KASSERT(sp->state == SPLICE_INIT, + ("so_splice: splice %p state %d", sp, sp->state)); sp->state = SPLICE_QUEUED; so_splice_xfer(sp); return (0); @@ -1770,8 +1772,19 @@ so_unsplice(struct socket *so, bool timeout) SOCK_UNLOCK(so); return (ENOTCONN); } - so->so_rcv.sb_flags &= ~SB_SPLICED; sp = so->so_splice; + mtx_lock(&sp->mtx); + if (sp->state == SPLICE_INIT) { + /* + * A splice is in the middle of being set up. + */ + mtx_unlock(&sp->mtx); + SOCK_RECVBUF_UNLOCK(so); + SOCK_UNLOCK(so); + return (ENOTCONN); + } + mtx_unlock(&sp->mtx); + so->so_rcv.sb_flags &= ~SB_SPLICED; so->so_splice = NULL; SOCK_RECVBUF_UNLOCK(so); SOCK_UNLOCK(so);