From nobody Sun Jul 06 23:18: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 4bb3G93qdtz60Zrw; Sun, 06 Jul 2025 23:18:41 +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 4bb3G81R8fz3tcS; Sun, 06 Jul 2025 23:18:40 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1751843920; 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=0Qb41BXZjwvzHltCrXyQOlNO99L/CteCmLubOibr2Zs=; b=esZ8/Izqsh1jnarKuZ9pelNbVykWAGWWeno3ZS1PQZtVY7fOrz7KMV1gEHhIEdODcQR3bp f1KUkHwhH3KFG6M8Z2+CHFrS59FPHN7ph7XdH86p6AVbuaIM57uYdPjcFrxpnAzAEJ0e2f OwUemEOdxPO+y9brctyNzteFcACgWnwMBb7zoibL4627qgTfeN6xKAEhRocVHjd1w7NcNw c7rMjcaxwYqcxWGqwR6LmnYSQGKa+fDL1ZyRsuywnrPDox/XH+CAI8ocaxVZ11/DarWSy6 fMn7XS1aXnKkZKuWWqlwrAj5ggHfPoim1EoKw97mJRLs1fqcTWOzQwrIxOQqEA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1751843920; 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=0Qb41BXZjwvzHltCrXyQOlNO99L/CteCmLubOibr2Zs=; b=tapQIFnSjYDQHcNilVYLoDTtbhTdZ0TNJi3+qb/1YQYXZbT8RUxZLUm1c2ggSgZ5+yzeye P9dAf4nfCNVbRHsZiVWGIoSkHWxjS5obmFH5BMUneoa6cdbf5ktxUTWVNZlY4VYWlyOqfe qEwHPvfCzoc6Qs7pBVNlv5EeZBRju6CGcK01B3kfZQNP/Y9y/J7v5ta0bYl9mSJQ9KZZMx bxeLsQDs7N9lWNA86HQJ/MgwuDA/pPx3CugyF1DpFmpwWfYFegJm9xT7NNYr/UoB474LWd beModO/kSdEoQpjB9BiTmTIzHR08CLAbPQOeEnxe4N0GlTnbjs/RiUWNMo1RoQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1751843920; a=rsa-sha256; cv=none; b=mXUAlY2wZDVnIw5y265oIMT52A7hkKLwscfIgf2Qmgxw2YvRJRoUkjyCr0tQEVKtbcKEQ3 o5+IwvhtpUhbwV77VYW1kJHD7tNVn00Nu98O0VcwD8neM6Ed6G08ZvCFlBbskFU9NJrtUR z8z/wuebmLIvmdxlMx5tiug83R+MAJoAefAwS+T4koYerdqp/zbNaotQ+HoKw8nTjbplMN vLG9frmhK8mEXaucYEkoYa9MKqjBBjRzpAJbbC4NTAbpDCrlFf+mOuY/IobA6Lwue1yOL2 RWUiYriOCPKenUhDXKxoygfHqylY4MqCs3n4aoRsGKQH9GhWZA46Ot2/PhZWcg== 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 4bb3G76Rg9z9Vb; Sun, 06 Jul 2025 23:18: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 566NIdSU031198; Sun, 6 Jul 2025 23:18:39 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 566NIdea031195; Sun, 6 Jul 2025 23:18:39 GMT (envelope-from git) Date: Sun, 6 Jul 2025 23:18:39 GMT Message-Id: <202507062318.566NIdea031195@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: 971f738679e2 - main - kern: Make dup3() support O_CLOFORK 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: 971f738679e2e57114366c0f69af99e07150f1ff Auto-Submitted: auto-generated The branch main has been updated by markj: URL: https://cgit.FreeBSD.org/src/commit/?id=971f738679e2e57114366c0f69af99e07150f1ff commit 971f738679e2e57114366c0f69af99e07150f1ff Author: Ricardo Branco AuthorDate: 2025-05-17 09:53:10 +0000 Commit: Mark Johnston CommitDate: 2025-07-06 23:08:37 +0000 kern: Make dup3() support O_CLOFORK Reviewed by: kib MFC after: 1 month Pull Request: https://github.com/freebsd/freebsd-src/pull/1698 --- lib/libc/gen/dup3.c | 9 +++++---- sys/kern/kern_descrip.c | 15 ++++++++++++++- sys/sys/fcntl.h | 4 ++++ 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/lib/libc/gen/dup3.c b/lib/libc/gen/dup3.c index fca1e99fb47b..1401c1f5b607 100644 --- a/lib/libc/gen/dup3.c +++ b/lib/libc/gen/dup3.c @@ -39,21 +39,22 @@ int __dup3(int, int, int); int __dup3(int oldfd, int newfd, int flags) { - int how; + int fdflags; if (oldfd == newfd) { errno = EINVAL; return (-1); } - if (flags & ~O_CLOEXEC) { + if ((flags & ~(O_CLOEXEC | O_CLOFORK)) != 0) { errno = EINVAL; return (-1); } - how = (flags & O_CLOEXEC) ? F_DUP2FD_CLOEXEC : F_DUP2FD; + fdflags = ((flags & O_CLOEXEC) != 0 ? FD_CLOEXEC : 0) | + ((flags & O_CLOFORK) != 0 ? FD_CLOFORK : 0); - return (_fcntl(oldfd, how, newfd)); + return (_fcntl(oldfd, F_DUP3FD | (fdflags << F_DUP3FD_SHIFT), newfd)); } __weak_reference(__dup3, dup3); diff --git a/sys/kern/kern_descrip.c b/sys/kern/kern_descrip.c index e432f33d810e..406236fc2723 100644 --- a/sys/kern/kern_descrip.c +++ b/sys/kern/kern_descrip.c @@ -38,9 +38,11 @@ #include "opt_ddb.h" #include "opt_ktrace.h" +#define EXTERR_CATEGORY EXTERR_CAT_FILEDESC #include #include #include +#include #include #include #include @@ -492,6 +494,7 @@ kern_fcntl(struct thread *td, int fd, int cmd, intptr_t arg) int error, flg, kif_sz, seals, tmp, got_set, got_cleared; uint64_t bsize; off_t foffset; + int flags; error = 0; flg = F_POSIX; @@ -923,7 +926,17 @@ revert_f_setfl: break; default: - error = EINVAL; + if ((cmd & ((1u << F_DUP3FD_SHIFT) - 1)) != F_DUP3FD) + return (EXTERROR(EINVAL, "invalid fcntl cmd")); + /* Handle F_DUP3FD */ + flags = (cmd >> F_DUP3FD_SHIFT); + if ((flags & ~(FD_CLOEXEC | FD_CLOFORK)) != 0) + return (EXTERROR(EINVAL, "invalid flags for F_DUP3FD")); + tmp = arg; + error = kern_dup(td, FDDUP_FIXED, + ((flags & FD_CLOEXEC) != 0 ? FDDUP_FLAG_CLOEXEC : 0) | + ((flags & FD_CLOFORK) != 0 ? FDDUP_FLAG_CLOFORK : 0), + fd, tmp); break; } return (error); diff --git a/sys/sys/fcntl.h b/sys/sys/fcntl.h index 7234c9240c84..18d3928e91c7 100644 --- a/sys/sys/fcntl.h +++ b/sys/sys/fcntl.h @@ -291,6 +291,10 @@ typedef __pid_t pid_t; #endif #if __BSD_VISIBLE +#define F_DUP3FD 24 /* Used with dup3() */ + +#define F_DUP3FD_SHIFT 16 /* Shift used for F_DUP3FD */ + /* Seals (F_ADD_SEALS, F_GET_SEALS). */ #define F_SEAL_SEAL 0x0001 /* Prevent adding sealings */ #define F_SEAL_SHRINK 0x0002 /* May not shrink */