From owner-svn-src-head@freebsd.org Tue Sep 22 22:22:30 2020 Return-Path: Delivered-To: svn-src-head@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id 6F74E3E1F2F; Tue, 22 Sep 2020 22:22:30 +0000 (UTC) (envelope-from kib@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 "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4Bwwm62PrVz3WvV; Tue, 22 Sep 2020 22:22:30 +0000 (UTC) (envelope-from kib@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 36F7B2652E; Tue, 22 Sep 2020 22:22:30 +0000 (UTC) (envelope-from kib@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 08MMMU20053495; Tue, 22 Sep 2020 22:22:30 GMT (envelope-from kib@FreeBSD.org) Received: (from kib@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 08MMMUrq053494; Tue, 22 Sep 2020 22:22:30 GMT (envelope-from kib@FreeBSD.org) Message-Id: <202009222222.08MMMUrq053494@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: kib set sender to kib@FreeBSD.org using -f From: Konstantin Belousov Date: Tue, 22 Sep 2020 22:22:30 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366018 - head/sys/kern X-SVN-Group: head X-SVN-Commit-Author: kib X-SVN-Commit-Paths: head/sys/kern X-SVN-Commit-Revision: 366018 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.33 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 22 Sep 2020 22:22:30 -0000 Author: kib Date: Tue Sep 22 22:22:29 2020 New Revision: 366018 URL: https://svnweb.freebsd.org/changeset/base/366018 Log: Add at2cnpflags() the helper to convert AT_ flags for *at() syscalls to namei flags. Reviewed by: markj Tested by: pho Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D25886 Modified: head/sys/kern/vfs_syscalls.c Modified: head/sys/kern/vfs_syscalls.c ============================================================================== --- head/sys/kern/vfs_syscalls.c Tue Sep 22 22:06:20 2020 (r366017) +++ head/sys/kern/vfs_syscalls.c Tue Sep 22 22:22:29 2020 (r366018) @@ -112,6 +112,28 @@ static int kern_readlink_vp(struct vnode *vp, char *bu static int kern_linkat_vp(struct thread *td, struct vnode *vp, int fd, const char *path, enum uio_seg segflag); +static uint64_t +at2cnpflags(u_int at_flags, u_int mask) +{ + u_int64_t res; + + MPASS((at_flags & (AT_SYMLINK_FOLLOW | AT_SYMLINK_NOFOLLOW)) != + (AT_SYMLINK_FOLLOW | AT_SYMLINK_NOFOLLOW)); + + res = 0; + at_flags &= mask; + if ((at_flags & AT_BENEATH) != 0) + res |= BENEATH; + if ((at_flags & AT_SYMLINK_FOLLOW) != 0) + res |= FOLLOW; + /* NOFOLLOW is pseudo flag */ + if ((mask & AT_SYMLINK_NOFOLLOW) != 0) { + res |= (at_flags & AT_SYMLINK_NOFOLLOW) != 0 ? NOFOLLOW : + FOLLOW; + } + return (res); +} + int kern_sync(struct thread *td) { @@ -1485,8 +1507,7 @@ sys_linkat(struct thread *td, struct linkat_args *uap) return (EINVAL); return (kern_linkat(td, uap->fd1, uap->fd2, uap->path1, uap->path2, - UIO_USERSPACE, ((flag & AT_SYMLINK_FOLLOW) != 0 ? FOLLOW : - NOFOLLOW) | ((flag & AT_BENEATH) != 0 ? BENEATH : 0))); + UIO_USERSPACE, at2cnpflags(flag, AT_SYMLINK_FOLLOW | AT_BENEATH))); } int hardlink_check_uid = 0; @@ -1851,7 +1872,7 @@ kern_funlinkat(struct thread *td, int dfd, const char restart: bwillwrite(); NDINIT_ATRIGHTS(&nd, DELETE, LOCKPARENT | LOCKLEAF | AUDITVNODE1 | - ((flag & AT_BENEATH) != 0 ? BENEATH : 0), + at2cnpflags(flag, AT_BENEATH), pathseg, path, dfd, &cap_unlinkat_rights, td); if ((error = namei(&nd)) != 0) { if (error == EINVAL) @@ -2075,7 +2096,7 @@ kern_accessat(struct thread *td, int fd, const char *p usecred = cred; AUDIT_ARG_VALUE(amode); NDINIT_ATRIGHTS(&nd, LOOKUP, FOLLOW | LOCKSHARED | LOCKLEAF | - AUDITVNODE1 | ((flag & AT_BENEATH) != 0 ? BENEATH : 0), + AUDITVNODE1 | at2cnpflags(flag, AT_BENEATH), pathseg, path, fd, &cap_fstat_rights, td); if ((error = namei(&nd)) != 0) goto out; @@ -2369,10 +2390,9 @@ kern_statat(struct thread *td, int flag, int fd, const if ((flag & ~(AT_SYMLINK_NOFOLLOW | AT_BENEATH)) != 0) return (EINVAL); - NDINIT_ATRIGHTS(&nd, LOOKUP, ((flag & AT_SYMLINK_NOFOLLOW) != 0 ? - NOFOLLOW : FOLLOW) | ((flag & AT_BENEATH) != 0 ? BENEATH : 0) | - LOCKSHARED | LOCKLEAF | AUDITVNODE1, pathseg, path, fd, - &cap_fstat_rights, td); + NDINIT_ATRIGHTS(&nd, LOOKUP, at2cnpflags(flag, AT_BENEATH | + AT_SYMLINK_NOFOLLOW) | LOCKSHARED | LOCKLEAF | + AUDITVNODE1, pathseg, path, fd, &cap_fstat_rights, td); if ((error = namei(&nd)) != 0) return (error); @@ -2719,12 +2739,11 @@ kern_chflagsat(struct thread *td, int fd, const char * enum uio_seg pathseg, u_long flags, int atflag) { struct nameidata nd; - int error, follow; + int error; AUDIT_ARG_FFLAGS(flags); - follow = (atflag & AT_SYMLINK_NOFOLLOW) ? NOFOLLOW : FOLLOW; - follow |= (atflag & AT_BENEATH) != 0 ? BENEATH : 0; - NDINIT_ATRIGHTS(&nd, LOOKUP, follow | AUDITVNODE1, pathseg, path, fd, + NDINIT_ATRIGHTS(&nd, LOOKUP, at2cnpflags(atflag, AT_SYMLINK_NOFOLLOW | + AT_BENEATH) | AUDITVNODE1, pathseg, path, fd, &cap_fchflags_rights, td); if ((error = namei(&nd)) != 0) return (error); @@ -2848,12 +2867,11 @@ kern_fchmodat(struct thread *td, int fd, const char *p enum uio_seg pathseg, mode_t mode, int flag) { struct nameidata nd; - int error, follow; + int error; AUDIT_ARG_MODE(mode); - follow = (flag & AT_SYMLINK_NOFOLLOW) != 0 ? NOFOLLOW : FOLLOW; - follow |= (flag & AT_BENEATH) != 0 ? BENEATH : 0; - NDINIT_ATRIGHTS(&nd, LOOKUP, follow | AUDITVNODE1, pathseg, path, fd, + NDINIT_ATRIGHTS(&nd, LOOKUP, at2cnpflags(flag, AT_SYMLINK_NOFOLLOW | + AT_BENEATH) | AUDITVNODE1, pathseg, path, fd, &cap_fchmod_rights, td); if ((error = namei(&nd)) != 0) return (error); @@ -2960,12 +2978,11 @@ kern_fchownat(struct thread *td, int fd, const char *p enum uio_seg pathseg, int uid, int gid, int flag) { struct nameidata nd; - int error, follow; + int error; AUDIT_ARG_OWNER(uid, gid); - follow = (flag & AT_SYMLINK_NOFOLLOW) ? NOFOLLOW : FOLLOW; - follow |= (flag & AT_BENEATH) != 0 ? BENEATH : 0; - NDINIT_ATRIGHTS(&nd, LOOKUP, follow | AUDITVNODE1, pathseg, path, fd, + NDINIT_ATRIGHTS(&nd, LOOKUP, at2cnpflags(flag, AT_SYMLINK_NOFOLLOW | + AT_BENEATH) | AUDITVNODE1, pathseg, path, fd, &cap_fchown_rights, td); if ((error = namei(&nd)) != 0) @@ -3322,8 +3339,8 @@ kern_utimensat(struct thread *td, int fd, const char * if ((error = getutimens(tptr, tptrseg, ts, &flags)) != 0) return (error); - NDINIT_ATRIGHTS(&nd, LOOKUP, ((flag & AT_SYMLINK_NOFOLLOW) ? NOFOLLOW : - FOLLOW) | ((flag & AT_BENEATH) != 0 ? BENEATH : 0) | AUDITVNODE1, + NDINIT_ATRIGHTS(&nd, LOOKUP, at2cnpflags(flag, AT_SYMLINK_NOFOLLOW | + AT_BENEATH) | AUDITVNODE1, pathseg, path, fd, &cap_futimes_rights, td); if ((error = namei(&nd)) != 0) return (error); @@ -3818,7 +3835,7 @@ kern_frmdirat(struct thread *td, int dfd, const char * restart: bwillwrite(); NDINIT_ATRIGHTS(&nd, DELETE, LOCKPARENT | LOCKLEAF | AUDITVNODE1 | - ((flag & AT_BENEATH) != 0 ? BENEATH : 0), + at2cnpflags(flag, AT_BENEATH), pathseg, path, dfd, &cap_unlinkat_rights, td); if ((error = namei(&nd)) != 0) goto fdout; @@ -4321,9 +4338,9 @@ kern_getfhat(struct thread *td, int flags, int fd, con error = priv_check(td, PRIV_VFS_GETFH); if (error != 0) return (error); - NDINIT_AT(&nd, LOOKUP, ((flags & AT_SYMLINK_NOFOLLOW) != 0 ? NOFOLLOW : - FOLLOW) | ((flags & AT_BENEATH) != 0 ? BENEATH : 0) | LOCKLEAF | - AUDITVNODE1, pathseg, path, fd, td); + NDINIT_AT(&nd, LOOKUP, at2cnpflags(flags, AT_SYMLINK_NOFOLLOW | + AT_BENEATH) | LOCKLEAF | AUDITVNODE1, + pathseg, path, fd, td); error = namei(&nd); if (error != 0) return (error);