From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755402AbbBLJCr (ORCPT ); Thu, 12 Feb 2015 04:02:47 -0500 Received: from mail-pa0-f44.google.com ([209.85.220.44]:46052 "EHLO mail-pa0-f44.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755166AbbBLJCl (ORCPT ); Thu, 12 Feb 2015 04:02:41 -0500 From: Sudip Mukherjee To: Andrew Morton Cc: Sudip Mukherjee , linux-kernel@vger.kernel.org Subject: [PATCH 4/5] fs: efs: fix possible memory leak Date: Thu, 12 Feb 2015 14:32:21 +0530 Message-Id: <1423731742-31383-4-git-send-email-sudipm.mukherjee@gmail.com> X-Mailer: git-send-email 1.8.1.2 In-Reply-To: <1423731742-31383-1-git-send-email-sudipm.mukherjee@gmail.com> References: <1423731742-31383-1-git-send-email-sudipm.mukherjee@gmail.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org we are allocating memory for struct efs_sb_info, but afterwards when we are returning with error we are not releasing the memory. Signed-off-by: Sudip Mukherjee --- fs/efs/super.c | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/fs/efs/super.c b/fs/efs/super.c index 6026bd4..e1037aa 100644 --- a/fs/efs/super.c +++ b/fs/efs/super.c @@ -233,6 +233,7 @@ static int efs_fill_super(struct super_block *s, void *d, int silent) struct efs_sb_info *sb; struct buffer_head *bh; struct inode *root; + int ret = -EINVAL; sb = kzalloc(sizeof(struct efs_sb_info), GFP_KERNEL); if (!sb) @@ -243,7 +244,7 @@ static int efs_fill_super(struct super_block *s, void *d, int silent) if (!sb_set_blocksize(s, EFS_BLOCKSIZE)) { pr_err("device does not support %d byte blocks\n", EFS_BLOCKSIZE); - return -EINVAL; + goto err_out; } /* read the vh (volume header) block */ @@ -251,7 +252,7 @@ static int efs_fill_super(struct super_block *s, void *d, int silent) if (!bh) { pr_err("cannot read volume header\n"); - return -EINVAL; + goto err_out; } /* @@ -262,14 +263,13 @@ static int efs_fill_super(struct super_block *s, void *d, int silent) sb->fs_start = efs_validate_vh((struct volume_header *) bh->b_data); brelse(bh); - if (sb->fs_start == -1) { - return -EINVAL; - } + if (sb->fs_start == -1) + goto err_out; bh = sb_bread(s, sb->fs_start + EFS_SUPER); if (!bh) { pr_err("cannot read superblock\n"); - return -EINVAL; + goto err_out; } if (efs_validate_super(sb, (struct efs_super *) bh->b_data)) { @@ -278,7 +278,7 @@ static int efs_fill_super(struct super_block *s, void *d, int silent) sb->fs_start + EFS_SUPER); #endif brelse(bh); - return -EINVAL; + goto err_out; } brelse(bh); @@ -293,16 +293,22 @@ static int efs_fill_super(struct super_block *s, void *d, int silent) root = efs_iget(s, EFS_ROOTINODE); if (IS_ERR(root)) { pr_err("get root inode failed\n"); - return PTR_ERR(root); + ret = PTR_ERR(root); + goto err_out; } s->s_root = d_make_root(root); if (!(s->s_root)) { pr_err("get root dentry failed\n"); - return -ENOMEM; + ret = -ENOMEM; + goto err_out; } return 0; + +err_out: + kfree(sb); + return ret; } static struct dentry *efs_mount(struct file_system_type *fs_type, -- 1.8.1.2