aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Staubach <staubach@redhat.com>2005-11-07 03:59:42 -0500
committerLinus Torvalds <torvalds@g5.osdl.org>2005-11-07 10:53:39 -0500
commit6fdcc2162285a8fc96ab12ff85086c37bceaa494 (patch)
tree957c0a2c2c273f6f13d8b9f95412f71856b5d449
parent5c7ad5104d8ecf2c3a6428d73748126e91b1a250 (diff)
[PATCH] memory leak in dentry_open()
There is a memory leak possible in dentry_open(). If get_empty_filp() fails, then the references to dentry and mnt need to be released. The attached patch adds the calls to dput() and mntput() to release these two references. Signed-off-by: Peter Staubach <staubach@redhat.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--fs/open.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/fs/open.c b/fs/open.c
index 8d06ec911fd9..2835f096c683 100644
--- a/fs/open.c
+++ b/fs/open.c
@@ -887,6 +887,10 @@ struct file *nameidata_to_filp(struct nameidata *nd, int flags)
887 return filp; 887 return filp;
888} 888}
889 889
890/*
891 * dentry_open() will have done dput(dentry) and mntput(mnt) if it returns an
892 * error.
893 */
890struct file *dentry_open(struct dentry *dentry, struct vfsmount *mnt, int flags) 894struct file *dentry_open(struct dentry *dentry, struct vfsmount *mnt, int flags)
891{ 895{
892 int error; 896 int error;
@@ -894,8 +898,11 @@ struct file *dentry_open(struct dentry *dentry, struct vfsmount *mnt, int flags)
894 898
895 error = -ENFILE; 899 error = -ENFILE;
896 f = get_empty_filp(); 900 f = get_empty_filp();
897 if (f == NULL) 901 if (f == NULL) {
902 dput(dentry);
903 mntput(mnt);
898 return ERR_PTR(error); 904 return ERR_PTR(error);
905 }
899 906
900 return __dentry_open(dentry, mnt, flags, f, NULL); 907 return __dentry_open(dentry, mnt, flags, f, NULL);
901} 908}