From nobody Tue Apr 29 00:47:55 2025 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 4ZmhW055GKz5v8KX; Tue, 29 Apr 2025 00:47:56 +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 4ZmhW018gRz3nyJ; Tue, 29 Apr 2025 00:47:56 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1745887676; 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=pNObt8ESXjnlBRtt4nnarVbSgWbcOuyLOTs9ZeGmNSg=; b=NHHsRepx0tU7VMULNtvo2eSDCyUedRkIvYdTh6uEWYUVwanEaE4S9c6qZibCW1oJ4aNhMQ BqH7TU1S4l0ytpxdUG7totwUP9H2bv5Ykh6JANL+YuXs2xGfCvFSu/QcWns8LVqYpQOvPR WCz2lo6URk3tirr2rYfCOlMatLgdUk3sZScX4sNm2UrNcWEJSZQfELwrR+v2bySUjToehG sNHjylPPxBDXyvkvDf6iiOVegVAoGkLrwFbfgQ9yWFuI2Eqk/hNcYDMqmIuPmTt7AfFv/I EqzjqV+PildMQoXmP4oKqvAIeElCQOyV7nB7oNbIKM7ZK3UeyiHnKKSrpsRw/g== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1745887676; a=rsa-sha256; cv=none; b=F4TQXtHPnqSMp3XRFq0HQ+mGSaA0/PSrPE2NYufeMV8M6COhvNFgWnWd66zLOQgVvmQwZq L0Aj4a/Piu/oRYtEAFBiylR3m2SjEUFMmc8xRWGD0JCeMcgr7ohCYIgM1C5iN4JgH/x5Rh hQCTIz9dbEG76Cq1Bu+Q4M4rgWnCGDilQGif5mlwE/2WO5oVaXbTkMSxm3x4j/S+JkOfLx S/19YSf24czGh47cigH17orLrp/KFconId/mTlwaaAfQoTP1tLL5m+FKh8ORswFRQR2Qrz QJqYHeH3Od2Iy0EIfUREXN2HzFC/Bxg2XSk51wxj2NV3FYGpD+MMvypc00QGTA== 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=1745887676; 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=pNObt8ESXjnlBRtt4nnarVbSgWbcOuyLOTs9ZeGmNSg=; b=D8feFFtNHUtt7bUplIwa/eLFA7G5A5gnrTuXLKYb+pQe6EkhbpF11vvBjCTbiOzk/NVHb5 s6SOVKHuAjCs869cjDxl9ccU22yb6u5u27lAeOmsxRJnMp3an4ZKe/AQq6cgbec9yuuK4i 77SiDEU36HSDdJ+YiVhhEjrfkifbwxVa0glHb5G5y4GYO/1YBuSlIUXSPlH9i7tNSY/jWu E7ohtdeTQyGLcN1WY1ouW8tezUhyOaRPhwKNt9gD9m+3+nxBe8+kvu8+pjSuzKYn29AJsU QYhTb8VUP97aGpPCJe3vtcgSGHjLgkGzrWP/+4t2jSp73+cOBrA07ePFAdhPLQ== 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 4ZmhW00brNzyBZ; Tue, 29 Apr 2025 00:47:56 +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 53T0ltwW014380; Tue, 29 Apr 2025 00:47:55 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 53T0ltFP014377; Tue, 29 Apr 2025 00:47:55 GMT (envelope-from git) Date: Tue, 29 Apr 2025 00:47:55 GMT Message-Id: <202504290047.53T0ltFP014377@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Mark Johnston Subject: git: c0c5d01e5374 - stable/14 - so_splice: Synchronize so_unsplice() with so_splice() 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: markj X-Git-Repository: src X-Git-Refname: refs/heads/stable/14 X-Git-Reftype: branch X-Git-Commit: c0c5d01e53745f97a1fa132d47c27a8c300ab4f8 Auto-Submitted: auto-generated The branch stable/14 has been updated by markj: URL: https://cgit.FreeBSD.org/src/commit/?id=c0c5d01e53745f97a1fa132d47c27a8c300ab4f8 commit c0c5d01e53745f97a1fa132d47c27a8c300ab4f8 Author: Mark Johnston AuthorDate: 2025-04-15 00:55:00 +0000 Commit: Mark Johnston CommitDate: 2025-04-29 00:44:04 +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 (cherry picked from commit 992b18a9ec9f21cdf15b70b2f510fa2a69844385) --- 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 fffb1d5b9af4..6468b3001b3e 100644 --- a/sys/kern/uipc_socket.c +++ b/sys/kern/uipc_socket.c @@ -1721,6 +1721,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); @@ -1749,8 +1751,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);