Messages in this thread Patch in this message | | | From | Sudip Mukherjee <> | Subject | [PATCH 4/5] fs: efs: fix possible memory leak | Date | Thu, 12 Feb 2015 14:32:21 +0530 |
| |
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 <sudip@vectorindia.org> --- 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
| |