From nobody Wed Jan 31 01:02:06 2024 X-Original-To: dev-commits-src-branches@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 4TPkJt2vDBz582R2; Wed, 31 Jan 2024 01:02:06 +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 "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4TPkJt1gNvz4Cdg; Wed, 31 Jan 2024 01:02:06 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1706662926; 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=OqoMl7nS3vClPm2qBmgTsPQW5wTdrMUY0R15uC15C6I=; b=W0/0XYyy+ziMzug6/4QFvC4AsyMKfSeZWITlTxueUJ9cJPMUfHlM2q4fwlqvuFXYCiO+nI 5mamjIFaYeeVYnHDtZNZfYmQoERw2cuviYRi3FhWcp0mXh22gnxtWlemeStQBG5Ss+0zrF FW9iAwIswqxd4DpcpLLQBKJV5Tfcgy4EtNymXqeiHlZDpmV1HQ4i4Ry6r2PxVhyfhUogIN SuaCiAqJiOboNF9QFXsSfu2tdMnBYkfqYr5vaN/VRddUpOfg2vxZKK+u2xJXXA1KyiUFcy 5vPcXbX1b73unQBnYQu+TswIcM16ApRnMooPv6nMA6kThN0u0ipra5wDpPmvoA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1706662926; 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=OqoMl7nS3vClPm2qBmgTsPQW5wTdrMUY0R15uC15C6I=; b=lt4nIgO+IgDygtFdjObT9zLHY/w/zk5/xo2RKvLfDD9roNqB8oEfTN3a9tqjroTzuOmqBg /epDDcxsFCn+PB5NhqnAcrXvpjZ3PtqDkasSmf4fiL6zMEU+eSQ403LcJm+L1hpP3IVCcn JxUSqifbjJ/GRghQiJT8zMJNZ5Qo1gfsWHC+eT/4O4CbCXLOQH/t/sGWvu5bBu7ztlUPX6 EoQBKNTVROhKN3hv79ZpmDbQmRD3VwhO2LRCWesRXab/uwZJo+qQV8qkkMNLtqXG2L8KDZ ZfnE+dpEZEXWGHikCzbmfF96WXUj+loxyLm/EwI0Ov5lUwUDXc6wbBhWuR/hiA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1706662926; a=rsa-sha256; cv=none; b=jKgqricAyCY5WKOi6h/04eqop8QqEm5gmn5J5zkmRoL5NgA59SlCREOsY/IMGqY2QlQn6A 0w2vDFo5SegZOBIF3b1RqmYOw2eLU0E8POvu/00jdbFg45B2/StKTxb2XmV5z0pOlpA+cd v5l7C90Wf/1yYBEQHa32pjneSTbk51NXLP+d2mLQvelAmTMDTS6yrUMOAldlXl69A5+YrY B2U9y5yScpROde5sRJ6MLj6E9QsjNlkwuzK9bk8QnF/8CNpWl3pW6gXUGmpqV+z727tu2A YgIhWZQV/e1movcFVeOBicqOS7YlrXtQp2rEyHLi4+Ox3kJkqDTHUb6uf+8SXQ== 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 4TPkJt0k3NzyTH; Wed, 31 Jan 2024 01:02:06 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.17.1/8.17.1) with ESMTP id 40V126xx096879; Wed, 31 Jan 2024 01:02:06 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 40V126UM096876; Wed, 31 Jan 2024 01:02:06 GMT (envelope-from git) Date: Wed, 31 Jan 2024 01:02:06 GMT Message-Id: <202401310102.40V126UM096876@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Konstantin Belousov Subject: git: ca39124ff3bb - stable/13 - Add kern_openatfp(9) List-Id: Commits to the stable branches of the FreeBSD src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-branches@freebsd.org X-BeenThere: dev-commits-src-branches@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: kib X-Git-Repository: src X-Git-Refname: refs/heads/stable/13 X-Git-Reftype: branch X-Git-Commit: ca39124ff3bbebc34a62f36b4a231976e2de9f10 Auto-Submitted: auto-generated The branch stable/13 has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=ca39124ff3bbebc34a62f36b4a231976e2de9f10 commit ca39124ff3bbebc34a62f36b4a231976e2de9f10 Author: Konstantin Belousov AuthorDate: 2024-01-20 20:34:46 +0000 Commit: Konstantin Belousov CommitDate: 2024-01-30 20:24:33 +0000 Add kern_openatfp(9) (cherry picked from commit c662306e19ce60d0f5e5e32a22ddcd5c79a90849) --- sys/kern/vfs_syscalls.c | 39 ++++++++++++++++++++++++++++++++++++--- sys/sys/syscallsubr.h | 2 ++ 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c index 494bae687406..7dcdaa66adb8 100644 --- a/sys/kern/vfs_syscalls.c +++ b/sys/kern/vfs_syscalls.c @@ -1103,9 +1103,14 @@ sys_openat(struct thread *td, struct openat_args *uap) uap->mode)); } -int -kern_openat(struct thread *td, int dirfd, const char *path, - enum uio_seg pathseg, int flags, int mode) +/* + * If fpp != NULL, opened file is not installed into the file + * descriptor table, instead it is returned in *fpp. This is + * incompatible with fdopen(), in which case we return EINVAL. + */ +static int +openatfp(struct thread *td, int dirfd, const char *path, + enum uio_seg pathseg, int flags, int mode, struct file **fpp) { struct proc *p; struct filedesc *fdp; @@ -1179,6 +1184,7 @@ kern_openat(struct thread *td, int dirfd, const char *path, if ((nd.ni_resflags & NIRES_STRICTREL) == 0 && (error == ENODEV || error == ENXIO) && td->td_dupfd >= 0) { + MPASS(fpp == NULL); error = dupfdopen(td, fdp, td->td_dupfd, flags, error, &indx); if (error == 0) @@ -1220,6 +1226,13 @@ kern_openat(struct thread *td, int dirfd, const char *path, goto bad; } success: + if (fpp != NULL) { + MPASS(error == 0); + NDFREE_IOCTLCAPS(&nd); + *fpp = fp; + return (0); + } + /* * If we haven't already installed the FD (for dupfdopen), do so now. */ @@ -1249,6 +1262,26 @@ bad: return (error); } +int +kern_openat(struct thread *td, int dirfd, const char *path, + enum uio_seg pathseg, int flags, int mode) +{ + return (openatfp(td, dirfd, path, pathseg, flags, mode, NULL)); +} + +int +kern_openatfp(struct thread *td, int dirfd, const char *path, + enum uio_seg pathseg, int flags, int mode, struct file **fpp) +{ + int error, old_dupfd; + + old_dupfd = td->td_dupfd; + td->td_dupfd = -1; + error = openatfp(td, dirfd, path, pathseg, flags, mode, fpp); + td->td_dupfd = old_dupfd; + return (error); +} + #ifdef COMPAT_43 /* * Create a file. diff --git a/sys/sys/syscallsubr.h b/sys/sys/syscallsubr.h index 02e5b1a4c077..77c16d8fffc0 100644 --- a/sys/sys/syscallsubr.h +++ b/sys/sys/syscallsubr.h @@ -230,6 +230,8 @@ int kern_ogetdirentries(struct thread *td, struct ogetdirentries_args *uap, long *ploff); int kern_openat(struct thread *td, int dirfd, const char *path, enum uio_seg pathseg, int flags, int mode); +int kern_openatfp(struct thread *td, int dirfd, const char *path, + enum uio_seg pathseg, int flags, int mode, struct file **fpp); int kern_pathconf(struct thread *td, const char *path, enum uio_seg pathseg, int name, u_long flags, long *valuep); int kern_pipe(struct thread *td, int fildes[2], int flags,