Skip to content

Commit

Permalink
ext4: Fix potential memory leak in ext4_fill_super
Browse files Browse the repository at this point in the history
Under heavy memory pressure we may hit out of memory
situation and as result kstrdup'ed options will not be
freed. Fix it.

Signed-off-by: Cyrill Gorcunov <[email protected]>
Signed-off-by: "Theodore Ts'o" <[email protected]>
  • Loading branch information
cyrillos authored and tytso committed Jul 27, 2010
1 parent 0c095c7 commit dcc7dae
Showing 1 changed file with 5 additions and 3 deletions.
8 changes: 5 additions & 3 deletions fs/ext4/super.c
Original file line number Diff line number Diff line change
Expand Up @@ -2550,7 +2550,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
struct inode *root;
char *cp;
const char *descr;
int ret = -EINVAL;
int ret = -ENOMEM;
int blocksize;
unsigned int db_count;
unsigned int i;
Expand All @@ -2561,13 +2561,13 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)

sbi = kzalloc(sizeof(*sbi), GFP_KERNEL);
if (!sbi)
return -ENOMEM;
goto out_free_orig;

sbi->s_blockgroup_lock =
kzalloc(sizeof(struct blockgroup_lock), GFP_KERNEL);
if (!sbi->s_blockgroup_lock) {
kfree(sbi);
return -ENOMEM;
goto out_free_orig;
}
sb->s_fs_info = sbi;
sbi->s_mount_opt = 0;
Expand All @@ -2584,6 +2584,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
for (cp = sb->s_id; (cp = strchr(cp, '/'));)
*cp = '!';

ret = -EINVAL;
blocksize = sb_min_blocksize(sb, EXT4_MIN_BLOCK_SIZE);
if (!blocksize) {
ext4_msg(sb, KERN_ERR, "unable to set blocksize");
Expand Down Expand Up @@ -3190,6 +3191,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
kfree(sbi->s_blockgroup_lock);
kfree(sbi);
lock_kernel();
out_free_orig:
kfree(orig_data);
return ret;
}
Expand Down

0 comments on commit dcc7dae

Please sign in to comment.