diff options
author | Peter Staubach <staubach@redhat.com> | 2005-11-07 03:59:42 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-11-07 10:53:39 -0500 |
commit | 6fdcc2162285a8fc96ab12ff85086c37bceaa494 (patch) | |
tree | 957c0a2c2c273f6f13d8b9f95412f71856b5d449 /fs/open.c | |
parent | 5c7ad5104d8ecf2c3a6428d73748126e91b1a250 (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>
Diffstat (limited to 'fs/open.c')
-rw-r--r-- | fs/open.c | 9 |
1 files changed, 8 insertions, 1 deletions
@@ -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 | */ | ||
890 | struct file *dentry_open(struct dentry *dentry, struct vfsmount *mnt, int flags) | 894 | struct 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 | } |