summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJ. R. Okajima <hooanon05@yahoo.co.jp>2009-06-18 23:30:15 +0900
committerAl Viro <viro@zeniv.linux.org.uk>2009-06-24 08:15:24 -0400
commit654f562c526cf9dfb8d453f687341fe0777ee454 (patch)
tree407b4c7755b6db7ecf77a881121228831876ee55
parentb5450d9c84bdd38b261922057cd167da51dfae93 (diff)
downloadlinux-654f562c526cf9dfb8d453f687341fe0777ee454.tar.bz2
vfs: fix nd->root leak in do_filp_open()
commit 2a737871108de9ba8930f7650d549f1383767f8b "Cache root in nameidata" introduced a new member nd->root, but forgot to put it in do_filp_open(). Signed-off-by: J. R. Okajima <hooanon05@yahoo.co.jp> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r--fs/namei.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/fs/namei.c b/fs/namei.c
index 527119afb6a5..5b961eb71cbf 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -1698,8 +1698,11 @@ struct file *do_filp_open(int dfd, const char *pathname,
if (error)
return ERR_PTR(error);
error = path_walk(pathname, &nd);
- if (error)
+ if (error) {
+ if (nd.root.mnt)
+ path_put(&nd.root);
return ERR_PTR(error);
+ }
if (unlikely(!audit_dummy_context()))
audit_inode(pathname, nd.path.dentry);
@@ -1759,6 +1762,8 @@ do_last:
}
filp = nameidata_to_filp(&nd, open_flag);
mnt_drop_write(nd.path.mnt);
+ if (nd.root.mnt)
+ path_put(&nd.root);
return filp;
}
@@ -1819,6 +1824,8 @@ ok:
*/
if (will_write)
mnt_drop_write(nd.path.mnt);
+ if (nd.root.mnt)
+ path_put(&nd.root);
return filp;
exit_mutex_unlock:
@@ -1859,6 +1866,8 @@ do_link:
* with "intent.open".
*/
release_open_intent(&nd);
+ if (nd.root.mnt)
+ path_put(&nd.root);
return ERR_PTR(error);
}
nd.flags &= ~LOOKUP_PARENT;