namei: only return -ECHILD from follow_dotdot_rcu()
commit5.4-rM2-2.2.x-imx-squashed2b98149c23
upstream. It's over-zealous to return hard errors under RCU-walk here, given that a REF-walk will be triggered for all other cases handling ".." under RCU. The original purpose of this check was to ensure that if a rename occurs such that a directory is moved outside of the bind-mount which the resolution started in, it would be detected and blocked to avoid being able to mess with paths outside of the bind-mount. However, triggering a new REF-walk is just as effective a solution. Cc: "Eric W. Biederman" <ebiederm@xmission.com> Fixes:397d425dc2
("vfs: Test for and handle paths that are unreachable from their mnt_root") Suggested-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Aleksa Sarai <cyphar@cyphar.com> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
parent
c15a3d8f5e
commit
8a7d7fa161
|
@ -1360,7 +1360,7 @@ static int follow_dotdot_rcu(struct nameidata *nd)
|
||||||
nd->path.dentry = parent;
|
nd->path.dentry = parent;
|
||||||
nd->seq = seq;
|
nd->seq = seq;
|
||||||
if (unlikely(!path_connected(&nd->path)))
|
if (unlikely(!path_connected(&nd->path)))
|
||||||
return -ENOENT;
|
return -ECHILD;
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
struct mount *mnt = real_mount(nd->path.mnt);
|
struct mount *mnt = real_mount(nd->path.mnt);
|
||||||
|
|
Loading…
Reference in New Issue