fix autofs/afs/etc. magic mountpoint breakage
authorAl Viro <viro@zeniv.linux.org.uk>
Wed, 23 Dec 2009 04:45:11 +0000 (23:45 -0500)
committerAl Viro <viro@zeniv.linux.org.uk>
Thu, 14 Jan 2010 14:05:25 +0000 (09:05 -0500)
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: Al Viro <viro@zeniv.linux.org.uk>
fs/namei.c
fs/proc/base.c

index b55440baf7ab832e9d05ae8fdddc2337da57b5ed..1b26b1620664221e9f60a0d69c40ff528becb6a0 100644 (file)
@@ -561,6 +561,7 @@ static __always_inline int __do_follow_link(struct path *path, struct nameidata
                dget(dentry);
        }
        mntget(path->mnt);
+       nd->last_type = LAST_BIND;
        cookie = dentry->d_inode->i_op->follow_link(dentry, nd);
        error = PTR_ERR(cookie);
        if (!IS_ERR(cookie)) {
index 18d5cc62d8ed92ebefb2a85cb26642ecc78d796d..e42bbd843ed13793e93a9af193e8b14136013d31 100644 (file)
@@ -1419,7 +1419,6 @@ static void *proc_pid_follow_link(struct dentry *dentry, struct nameidata *nd)
                goto out;
 
        error = PROC_I(inode)->op.proc_get_link(inode, &nd->path);
-       nd->last_type = LAST_BIND;
 out:
        return ERR_PTR(error);
 }