From a44b84812670ad1f0909941634d42ad8c4731f52 Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Mon, 18 Jun 2012 10:47:03 -0400 Subject: [PATCH] --- yaml --- r: 312932 b: refs/heads/master c: 408ef013cc9e2f94a14f7ccbbe52ddfb18437a99 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/fs/namei.c | 3 +-- trunk/fs/proc/base.c | 12 ++++++++---- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/[refs] b/[refs] index 88c949738ec9..6e2a4ed9d1b6 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: ac481d6ca4081bdd348cbd84963d1ece843a3407 +refs/heads/master: 408ef013cc9e2f94a14f7ccbbe52ddfb18437a99 diff --git a/trunk/fs/namei.c b/trunk/fs/namei.c index 6b29a51bef5d..a9b94c62c303 100644 --- a/trunk/fs/namei.c +++ b/trunk/fs/namei.c @@ -624,7 +624,7 @@ follow_link(struct path *link, struct nameidata *nd, void **p) *p = dentry->d_inode->i_op->follow_link(dentry, nd); error = PTR_ERR(*p); if (IS_ERR(*p)) - goto out_put_link; + goto out_put_nd_path; error = 0; s = nd_get_link(nd); @@ -646,7 +646,6 @@ follow_link(struct path *link, struct nameidata *nd, void **p) out_put_nd_path: path_put(&nd->path); -out_put_link: path_put(link); return error; } diff --git a/trunk/fs/proc/base.c b/trunk/fs/proc/base.c index 8eaa5ea1c613..3bd5ac1ff018 100644 --- a/trunk/fs/proc/base.c +++ b/trunk/fs/proc/base.c @@ -1427,16 +1427,20 @@ static int proc_exe_link(struct dentry *dentry, struct path *exe_path) static void *proc_pid_follow_link(struct dentry *dentry, struct nameidata *nd) { struct inode *inode = dentry->d_inode; + struct path path; int error = -EACCES; - /* We don't need a base pointer in the /proc filesystem */ - path_put(&nd->path); - /* Are we allowed to snoop on the tasks file descriptors? */ if (!proc_fd_access_allowed(inode)) goto out; - error = PROC_I(inode)->op.proc_get_link(dentry, &nd->path); + error = PROC_I(inode)->op.proc_get_link(dentry, &path); + if (error) + goto out; + + path_put(&nd->path); + nd->path = path; + return NULL; out: return ERR_PTR(error); }