From nobody Wed Jul 1 11:49:35 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 4gqyww0zksz6k8DB for ; Wed, 01 Jul 2026 11:49:36 +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 "YR1" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4gqywv5Yfnz3tq0 for ; Wed, 01 Jul 2026 11:49:35 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1782906575; 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=874yBGnYmpic44KO9po4RlC7OP96O/OMQSOoiiZBwWc=; b=bQrOJuiH/PuMqiAaZrVCwBJq+XQ7WuTouHppLd8x7WrTitrFcLddMhrkpK0i0lMkbeCfTi C9d8HgBHHo+lVw7MZE1vmX2W3h1oOUDN9P0Bq89+UZGUG7nQ0ifrs5eB89ruGn6PvQuBBh Upe+n4fXHhHV278xxTzi5bz/MWA4/uIdZz0whZIxQcAunbnNppNoovo8XDLuy6NyVMZ4sS 7wWLDvINrlJaW98iq5tZYJBDPhU7mDhYDdkj8xauG1ZMzpU0NpWwGgQDNPmijVE0dFaqUD v+6Mdy9R1J+iQdkglDqAxWPe56nPRg1QCI0VAAbh9NuCvJIw7ZGUZFWEyUy9mA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1782906575; a=rsa-sha256; cv=none; b=LmncfhBMsqnsRJfB6Ig3b0WDRjF6gYyM6gEWSiNVp0BX2MfmSAzBtTFGZkMESSa5/iIXeb bfb8RrefX7R0TpaXA2lKOXnuu5e68Px806Gdx5a460YrDlHFNC6zSNLJfpsMRk597N8L0z sohtdRFFepoc1mfm58cqmJy0nSXCCM2xlEt+q/zUAuGYQv7aXPR0norXS2UzTKl4ieZ7ig RXWSMxiAuRhns8NWmQC90Nm4x+TSQaiFpfCqqxmSuwqs7nsqmiY3f0Msiaj6oncQbwzl/f TJE5NAJkvkv93FPmfqhKChJNrTdp8LYGtzeRzemWAcNHO65uZDGdDnjJShlRxQ== 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=1782906575; 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=874yBGnYmpic44KO9po4RlC7OP96O/OMQSOoiiZBwWc=; b=vjORV//710wrwqhX8b0xG3zo2BxuB88JqjOOhHSlxKOfqSTUOh8lF3hP9soPVPoZOOL7Oj IFF22Higl4YllMIEd+mHTecjTs2ZqPecTTXjYaFgRT0fKaHnFzXccDiNJSVZuTScbuno36 hOro2K41GsrYFUdDnfWyoga6TInl0HgAxKRO4AEWvLIiLEi+zpNAhyG/rl/n/QO8wB4UXw KtqtFBB7i3/Kix/zs1zc4+8uXNtqv9e8WQOfk7JnmcdzDUdftS33EVmLwTWaOBsKWYrxHD nxfqnmvfYqZG7UJNf3T/OBj+qTF2/5JqINiOnDiClKQZuTFg6XFevFki25JBHQ== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4gqywv421sz1S09 for ; Wed, 01 Jul 2026 11:49:35 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 19dfc by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Wed, 01 Jul 2026 11:49:35 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Brooks Davis Subject: git: f14bdfefa41c - main - CHERI: add sooptcopyinptr to preserve pointer provenance 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: brooks X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: f14bdfefa41c7d81dd1317e61b98de22dc03016c Auto-Submitted: auto-generated Date: Wed, 01 Jul 2026 11:49:35 +0000 Message-Id: <6a44fecf.19dfc.3d115c69@gitrepo.freebsd.org> The branch main has been updated by brooks: URL: https://cgit.FreeBSD.org/src/commit/?id=f14bdfefa41c7d81dd1317e61b98de22dc03016c commit f14bdfefa41c7d81dd1317e61b98de22dc03016c Author: Brooks Davis AuthorDate: 2026-07-01 11:46:39 +0000 Commit: Brooks Davis CommitDate: 2026-07-01 11:48:10 +0000 CHERI: add sooptcopyinptr to preserve pointer provenance Most socket options don't involve pointers so make the default sooptcopyin discard provenance and add a sooptcopyinptr that preserves. Reviewed by: markj, emaste Effort: CHERI upstreaming Sponsored by: DARPA, AFRL, Innovate UK Differential Revision: https://reviews.freebsd.org/D57665 --- share/man/man9/socket.9 | 13 ++++++++++++- sys/kern/uipc_socket.c | 34 ++++++++++++++++++++++++++++------ sys/sys/sockopt.h | 6 ++++++ 3 files changed, 46 insertions(+), 7 deletions(-) diff --git a/share/man/man9/socket.9 b/share/man/man9/socket.9 index fb0ead0e20e1..c54716d8e155 100644 --- a/share/man/man9/socket.9 +++ b/share/man/man9/socket.9 @@ -24,7 +24,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.Dd September 6, 2022 +.Dd July 1, 2026 .Dt SOCKET 9 .Os .Sh NAME @@ -146,6 +146,8 @@ .Ft int .Fn sooptcopyin "struct sockopt *sopt" "void *buf" "size_t len" "size_t minlen" .Ft int +.Fn sooptcopyinptr "struct sockopt *sopt" "void *buf" "size_t len" "size_t minlen" +.Ft int .Fn sooptcopyout "struct sockopt *sopt" "const void *buf" "size_t len" .Sh DESCRIPTION The kernel @@ -577,6 +579,15 @@ and are useful for transferring .Vt struct sockopt data between user and kernel code. +They do not preserve the provenance of pointers in copied objects +.Pq see Xr memory_model 7 for further information . +If the object to be copied contains pointers, the +.Fn sooptcopyinptr +function must be used to preserve the provenance of those pointers. +There is no corresponding +.Fn sooptcopyoutptr +as the kernel does not typically return pointers to userspace objects +and instead would update objects previously passed via sooptcopyinptr. .Sh SEE ALSO .Xr bind 2 , .Xr close 2 , diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c index 47de87c1887c..dc4db57c07e2 100644 --- a/sys/kern/uipc_socket.c +++ b/sys/kern/uipc_socket.c @@ -3808,8 +3808,9 @@ hhook_run_socket(struct socket *so, void *hctx, int32_t h_id) * here, these functions are also called by the protocol-level pr_ctloutput() * routines. */ -int -sooptcopyin(struct sockopt *sopt, void *buf, size_t len, size_t minlen) +static int +_sooptcopyin(struct sockopt *sopt, void *buf, size_t len, size_t minlen, + bool copycaps) { size_t valsize; @@ -3824,13 +3825,34 @@ sooptcopyin(struct sockopt *sopt, void *buf, size_t len, size_t minlen) if (valsize > len) sopt->sopt_valsize = valsize = len; - if (sopt->sopt_td != NULL) - return (copyin(sopt->sopt_val, buf, valsize)); + if (sopt->sopt_td != NULL) { + if (copycaps) + return (copyinptr(sopt->sopt_val, buf, valsize)); + else + return (copyin(sopt->sopt_val, buf, valsize)); + } - memcpy(buf, sopt->sopt_val, valsize); + if (copycaps) + memcpy(buf, sopt->sopt_val, valsize); + else + memcpy_data(buf, sopt->sopt_val, valsize); return (0); } +int +sooptcopyin(struct sockopt *sopt, void *buf, size_t len, size_t minlen) +{ + return (_sooptcopyin(sopt, buf, len, minlen, false)); +} + +#ifdef __CHERI__ +int +sooptcopyinptr(struct sockopt *sopt, void *buf, size_t len, size_t minlen) +{ + return (_sooptcopyin(sopt, buf, len, minlen, true)); +} +#endif + /* * Kernel version of setsockopt(2). * @@ -4118,7 +4140,7 @@ sooptcopyout(struct sockopt *sopt, const void *buf, size_t len) if (sopt->sopt_td != NULL) error = copyout(buf, sopt->sopt_val, valsize); else - memcpy(sopt->sopt_val, buf, valsize); + memcpy_data(sopt->sopt_val, buf, valsize); } return (error); } diff --git a/sys/sys/sockopt.h b/sys/sys/sockopt.h index d2b0ff5ed2c8..54d0afe673d5 100644 --- a/sys/sys/sockopt.h +++ b/sys/sys/sockopt.h @@ -59,6 +59,12 @@ int sosetopt(struct socket *so, struct sockopt *sopt); int sogetopt(struct socket *so, struct sockopt *sopt); int __result_use_check sooptcopyin(struct sockopt *sopt, void *buf, size_t len, size_t minlen); +#ifdef __CHERI__ +int __result_use_check sooptcopyinptr(struct sockopt *sopt, void *buf, + size_t len, size_t minlen); +#else +#define sooptcopyinptr sooptcopyin +#endif int __result_use_check sooptcopyout(struct sockopt *sopt, const void *buf, size_t len); int soopt_getm(struct sockopt *sopt, struct mbuf **mp);