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)
Reviewed-by:	kib
MFC-after:	3 days
Differential Revision:	https://reviews.freebsd.org/D28401
This commit is contained in:
Kyle Evans 2021-01-28 08:27:28 -06:00
parent 8a51f14a78
commit 0f919ed4ae

View File

@ -91,14 +91,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,
@ -241,8 +237,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