summaryrefslogtreecommitdiff
path: root/fs/namei.c
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2020-02-24 15:53:19 -0500
committerAl Viro <viro@zeniv.linux.org.uk>2020-03-13 21:09:13 -0400
commit6b03f7edf43e3b284c023ab03aba6e5e7c5a7559 (patch)
treebd0de0479f17f196ecffb81f8b8ba2ce42ba2280 /fs/namei.c
parentc981a4828125e4a5832a726761343cbff8810674 (diff)
downloadlwn-6b03f7edf43e3b284c023ab03aba6e5e7c5a7559.tar.gz
lwn-6b03f7edf43e3b284c023ab03aba6e5e7c5a7559.zip
path_connected(): pass mount and dentry separately
eventually we'll want to do that check *before* mangling nd->path.dentry... Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/namei.c')
-rw-r--r--fs/namei.c12
1 files changed, 5 insertions, 7 deletions
diff --git a/fs/namei.c b/fs/namei.c
index 6530e3cbd486..2bf9f605c46f 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -550,22 +550,20 @@ static int __nd_alloc_stack(struct nameidata *nd)
}
/**
- * path_connected - Verify that a path->dentry is below path->mnt.mnt_root
- * @path: nameidate to verify
+ * path_connected - Verify that a dentry is below mnt.mnt_root
*
* Rename can sometimes move a file or directory outside of a bind
* mount, path_connected allows those cases to be detected.
*/
-static bool path_connected(const struct path *path)
+static bool path_connected(struct vfsmount *mnt, struct dentry *dentry)
{
- struct vfsmount *mnt = path->mnt;
struct super_block *sb = mnt->mnt_sb;
/* Bind mounts and multi-root filesystems can have disconnected paths */
if (!(sb->s_iflags & SB_I_MULTIROOT) && (mnt->mnt_root == sb->s_root))
return true;
- return is_subdir(path->dentry, mnt->mnt_root);
+ return is_subdir(dentry, mnt->mnt_root);
}
static inline int nd_alloc_stack(struct nameidata *nd)
@@ -1386,7 +1384,7 @@ static int follow_dotdot_rcu(struct nameidata *nd)
return -ECHILD;
nd->path.dentry = parent;
nd->seq = seq;
- if (unlikely(!path_connected(&nd->path)))
+ if (unlikely(!path_connected(nd->path.mnt, parent)))
return -ECHILD;
break;
} else {
@@ -1448,7 +1446,7 @@ static int path_parent_directory(struct path *path)
/* rare case of legitimate dget_parent()... */
path->dentry = dget_parent(path->dentry);
dput(old);
- if (unlikely(!path_connected(path)))
+ if (unlikely(!path_connected(path->mnt, path->dentry)))
return -ENOENT;
return 0;
}