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

Commit 86acdca1 authored by Al Viro's avatar Al Viro
Browse files

fix autofs/afs/etc. magic mountpoint breakage



We end up trying to kfree() nd.last.name on open("/mnt/tmp", O_CREAT)
if /mnt/tmp is an autofs direct mount.  The reason is that nd.last_type
is bogus here; we want LAST_BIND for everything of that kind and we
get LAST_NORM left over from finding parent directory.

So make sure that it *is* set properly; set to LAST_BIND before
doing ->follow_link() - for normal symlinks it will be changed
by __vfs_follow_link() and everything else needs it set that way.

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 004b3506
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -561,6 +561,7 @@ static __always_inline int __do_follow_link(struct path *path, struct nameidata
		dget(dentry);
		dget(dentry);
	}
	}
	mntget(path->mnt);
	mntget(path->mnt);
	nd->last_type = LAST_BIND;
	cookie = dentry->d_inode->i_op->follow_link(dentry, nd);
	cookie = dentry->d_inode->i_op->follow_link(dentry, nd);
	error = PTR_ERR(cookie);
	error = PTR_ERR(cookie);
	if (!IS_ERR(cookie)) {
	if (!IS_ERR(cookie)) {
+0 −1
Original line number Original line Diff line number Diff line
@@ -1419,7 +1419,6 @@ static void *proc_pid_follow_link(struct dentry *dentry, struct nameidata *nd)
		goto out;
		goto out;


	error = PROC_I(inode)->op.proc_get_link(inode, &nd->path);
	error = PROC_I(inode)->op.proc_get_link(inode, &nd->path);
	nd->last_type = LAST_BIND;
out:
out:
	return ERR_PTR(error);
	return ERR_PTR(error);
}
}