Skip to contentSkip to conversation

fs, ext4: Fix potential memory leak in ext4_fill_super

PATCH In review Cyrill Gorcunov 2 participants 2 messages Jun 16, 2010 – Jul 27, 2010 ext4 file system

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 fs, 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.

---
 fs/ext4/super.c |    8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)
fs/ext4/super.c +5 -3
Index: linux-2.6.git/fs/ext4/super.c
=====================================================================
@@ -2448,7 +2448,7 @@ static int ext4_fill_super(struct super_
 	struct inode *root;
 	char *cp;
 	const char *descr;
-	int ret = -EINVAL;
+	int ret = -ENOMEM;
 	int blocksize;
 	unsigned int db_count;
 	unsigned int i;
@@ -2459,13 +2459,13 @@ static int ext4_fill_super(struct super_
 
 	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;
@@ -2482,6 +2482,7 @@ static int ext4_fill_super(struct super_
 	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");
@@ -3093,6 +3094,7 @@ out_fail:
 	kfree(sbi->s_blockgroup_lock);
 	kfree(sbi);
 	lock_kernel();
+out_free_orig:
 	kfree(orig_data);
 	return ret;
 }
maintainer
#1 lore raw
Quoted 5 lines · Cyrill Gorcunov

Under heavy memory pressure we may hit out of memory situation and as result kstrdup'ed options will not be freed. Fix it.

Thanks, I've added this to the ext4 tree.

- Ted