ext4: Fix potential memory leak in ext4_fill_super
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 <gorcunov@openvz.org> Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
This commit is contained in:
parent
0c095c7f11
commit
dcc7dae3cb
@ -2550,7 +2550,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
|
|||||||
struct inode *root;
|
struct inode *root;
|
||||||
char *cp;
|
char *cp;
|
||||||
const char *descr;
|
const char *descr;
|
||||||
int ret = -EINVAL;
|
int ret = -ENOMEM;
|
||||||
int blocksize;
|
int blocksize;
|
||||||
unsigned int db_count;
|
unsigned int db_count;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
@ -2561,13 +2561,13 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
|
|||||||
|
|
||||||
sbi = kzalloc(sizeof(*sbi), GFP_KERNEL);
|
sbi = kzalloc(sizeof(*sbi), GFP_KERNEL);
|
||||||
if (!sbi)
|
if (!sbi)
|
||||||
return -ENOMEM;
|
goto out_free_orig;
|
||||||
|
|
||||||
sbi->s_blockgroup_lock =
|
sbi->s_blockgroup_lock =
|
||||||
kzalloc(sizeof(struct blockgroup_lock), GFP_KERNEL);
|
kzalloc(sizeof(struct blockgroup_lock), GFP_KERNEL);
|
||||||
if (!sbi->s_blockgroup_lock) {
|
if (!sbi->s_blockgroup_lock) {
|
||||||
kfree(sbi);
|
kfree(sbi);
|
||||||
return -ENOMEM;
|
goto out_free_orig;
|
||||||
}
|
}
|
||||||
sb->s_fs_info = sbi;
|
sb->s_fs_info = sbi;
|
||||||
sbi->s_mount_opt = 0;
|
sbi->s_mount_opt = 0;
|
||||||
@ -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, '/'));)
|
for (cp = sb->s_id; (cp = strchr(cp, '/'));)
|
||||||
*cp = '!';
|
*cp = '!';
|
||||||
|
|
||||||
|
ret = -EINVAL;
|
||||||
blocksize = sb_min_blocksize(sb, EXT4_MIN_BLOCK_SIZE);
|
blocksize = sb_min_blocksize(sb, EXT4_MIN_BLOCK_SIZE);
|
||||||
if (!blocksize) {
|
if (!blocksize) {
|
||||||
ext4_msg(sb, KERN_ERR, "unable to set blocksize");
|
ext4_msg(sb, KERN_ERR, "unable to set blocksize");
|
||||||
@ -3190,6 +3191,7 @@ out_fail:
|
|||||||
kfree(sbi->s_blockgroup_lock);
|
kfree(sbi->s_blockgroup_lock);
|
||||||
kfree(sbi);
|
kfree(sbi);
|
||||||
lock_kernel();
|
lock_kernel();
|
||||||
|
out_free_orig:
|
||||||
kfree(orig_data);
|
kfree(orig_data);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user