| From 9683336a67eee5f15684a186fc85352740ccd189 Mon Sep 17 00:00:00 2001 |
| From: Oskar Schirmer <oskar@scara.com> |
| Date: Wed, 10 Nov 2010 21:06:13 +0000 |
| Subject: cifs: fix another memleak, in cifs_root_iget |
| |
| From: Oskar Schirmer <oskar@scara.com> |
| |
| commit a7851ce73b9fdef53f251420e6883cf4f3766534 upstream. |
| |
| cifs_root_iget allocates full_path through |
| cifs_build_path_to_root, but fails to kfree it upon |
| cifs_get_inode_info* failure. |
| |
| Make all failure exit paths traverse clean up |
| handling at the end of the function. |
| |
| Signed-off-by: Oskar Schirmer <oskar@scara.com> |
| Signed-off-by: Andi Kleen <ak@linux.intel.com> |
| Reviewed-by: Jesper Juhl <jj@chaosbits.net> |
| Signed-off-by: Steve French <sfrench@us.ibm.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| --- |
| fs/cifs/inode.c | 12 ++++++------ |
| 1 file changed, 6 insertions(+), 6 deletions(-) |
| |
| --- a/fs/cifs/inode.c |
| +++ b/fs/cifs/inode.c |
| @@ -688,8 +688,10 @@ struct inode *cifs_root_iget(struct supe |
| rc = cifs_get_inode_info(&inode, full_path, NULL, sb, |
| xid, NULL); |
| |
| - if (!inode) |
| - return ERR_PTR(-ENOMEM); |
| + if (!inode) { |
| + inode = ERR_PTR(rc); |
| + goto out; |
| + } |
| |
| if (rc && cifs_sb->tcon->ipc) { |
| cFYI(1, ("ipc connection - fake read inode")); |
| @@ -700,13 +702,11 @@ struct inode *cifs_root_iget(struct supe |
| inode->i_uid = cifs_sb->mnt_uid; |
| inode->i_gid = cifs_sb->mnt_gid; |
| } else if (rc) { |
| - kfree(full_path); |
| - _FreeXid(xid); |
| iget_failed(inode); |
| - return ERR_PTR(rc); |
| + inode = ERR_PTR(rc); |
| } |
| |
| - |
| +out: |
| kfree(full_path); |
| /* can not call macro FreeXid here since in a void func |
| * TODO: This is no longer true |