The branch stable/12 has been updated by kevans:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=d2336460daffae7d2cb2344f52054a7a7a0047ad

commit d2336460daffae7d2cb2344f52054a7a7a0047ad
Author:     Kyle Evans <kev...@freebsd.org>
AuthorDate: 2021-01-28 14:27:28 +0000
Commit:     Kyle Evans <kev...@freebsd.org>
CommitDate: 2021-02-01 05:44:09 +0000

    tmpfs: push VEXEC check into tmpfs_lookup()
    
    vfs_cache_lookup() has already done the appropriate VEXEC check, therefore
    we must not re-check in VOP_CACHEDLOOKUP.
    
    This fixes O_SEARCH semantics on tmpfs and removes a redundant descent into
    VOP_ACCESS() in the common case.
    
    Reported-by:    arichardson (via CheriBSD Jenkins CI)
    
    (cherry picked from commit 0f919ed4ae4df082eefb517afe02752b1790afd3)
---
 sys/fs/tmpfs/tmpfs_vnops.c | 17 +++++++++++------
 1 file changed, 11 insertions(+), 6 deletions(-)

diff --git a/sys/fs/tmpfs/tmpfs_vnops.c b/sys/fs/tmpfs/tmpfs_vnops.c
index bfb84c508c78..7df835113397 100644
--- a/sys/fs/tmpfs/tmpfs_vnops.c
+++ b/sys/fs/tmpfs/tmpfs_vnops.c
@@ -86,14 +86,10 @@ tmpfs_lookup1(struct vnode *dvp, struct vnode **vpp, struct 
componentname *cnp)
        struct tmpfs_mount *tm;
        int error;
 
+       /* Caller assumes responsibility for ensuring access (VEXEC). */
        dnode = VP_TO_TMPFS_DIR(dvp);
        *vpp = NULLVP;
 
-       /* Check accessibility of requested node as a first step. */
-       error = vn_dir_check_exec(dvp, cnp);
-       if (error != 0)
-               goto out;
-
        /* We cannot be requesting the parent directory of the root node. */
        MPASS(IMPLIES(dnode->tn_type == VDIR &&
            dnode->tn_dir.tn_parent == dnode,
@@ -236,8 +232,17 @@ tmpfs_cached_lookup(struct vop_cachedlookup_args *v)
 static int
 tmpfs_lookup(struct vop_lookup_args *v)
 {
+       struct vnode *dvp = v->a_dvp;
+       struct vnode **vpp = v->a_vpp;
+       struct componentname *cnp = v->a_cnp;
+       int error;
 
-       return (tmpfs_lookup1(v->a_dvp, v->a_vpp, v->a_cnp));
+       /* Check accessibility of requested node as a first step. */
+       error = vn_dir_check_exec(dvp, cnp);
+       if (error != 0)
+               return (error);
+
+       return (tmpfs_lookup1(dvp, vpp, cnp));
 }
 
 static int
_______________________________________________
dev-commits-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/dev-commits-src-all
To unsubscribe, send any mail to "dev-commits-src-all-unsubscr...@freebsd.org"

Reply via email to