Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5129fa48 authored by Al Viro's avatar Al Viro
Browse files

do_last(): ELOOP failure exit should be done after leaving RCU mode



... or we risk seeing a bogus value of d_is_symlink() there.

Cc: stable@vger.kernel.org # v4.2+
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent a7f77542
Loading
Loading
Loading
Loading
+4 −5
Original line number Diff line number Diff line
@@ -3211,11 +3211,6 @@ static int do_last(struct nameidata *nd,
	if (unlikely(error))
		return error;

	if (unlikely(d_is_symlink(path.dentry)) && !(open_flag & O_PATH)) {
		path_to_nameidata(&path, nd);
		return -ELOOP;
	}

	if ((nd->flags & LOOKUP_RCU) || nd->path.mnt != path.mnt) {
		path_to_nameidata(&path, nd);
	} else {
@@ -3234,6 +3229,10 @@ static int do_last(struct nameidata *nd,
		return error;
	}
	audit_inode(nd->name, nd->path.dentry, 0);
	if (unlikely(d_is_symlink(nd->path.dentry)) && !(open_flag & O_PATH)) {
		error = -ELOOP;
		goto out;
	}
	error = -EISDIR;
	if ((open_flag & O_CREAT) && d_is_dir(nd->path.dentry))
		goto out;