diff options
author | Ye Bin <yebin10@huawei.com> | 2022-09-21 14:40:39 +0800 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2022-09-30 23:46:54 -0400 |
commit | 7069d105c1f15c442b68af43f7fde784f3126739 (patch) | |
tree | b9e3d7039d65874e0509e182fa60babf6a7435de /fs/ext4 | |
parent | 9305721a309fa1bd7c194e0d4a2335bf3b29dca4 (diff) |
ext4: fix potential memory leak in ext4_fc_record_regions()
As krealloc may return NULL, in this case 'state->fc_regions' may not be
freed by krealloc, but 'state->fc_regions' already set NULL. Then will
lead to 'state->fc_regions' memory leak.
Cc: stable@kernel.org
Signed-off-by: Ye Bin <yebin10@huawei.com>
Reviewed-by: Jan Kara <jack@suse.cz>
Link: https://lore.kernel.org/r/20220921064040.3693255-3-yebin10@huawei.com
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Diffstat (limited to 'fs/ext4')
-rw-r--r-- | fs/ext4/fast_commit.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/fs/ext4/fast_commit.c b/fs/ext4/fast_commit.c index 9555ab816d7d..5ab58cb4ce8d 100644 --- a/fs/ext4/fast_commit.c +++ b/fs/ext4/fast_commit.c @@ -1679,15 +1679,17 @@ int ext4_fc_record_regions(struct super_block *sb, int ino, if (replay && state->fc_regions_used != state->fc_regions_valid) state->fc_regions_used = state->fc_regions_valid; if (state->fc_regions_used == state->fc_regions_size) { + struct ext4_fc_alloc_region *fc_regions; + state->fc_regions_size += EXT4_FC_REPLAY_REALLOC_INCREMENT; - state->fc_regions = krealloc( - state->fc_regions, - state->fc_regions_size * - sizeof(struct ext4_fc_alloc_region), - GFP_KERNEL); - if (!state->fc_regions) + fc_regions = krealloc(state->fc_regions, + state->fc_regions_size * + sizeof(struct ext4_fc_alloc_region), + GFP_KERNEL); + if (!fc_regions) return -ENOMEM; + state->fc_regions = fc_regions; } region = &state->fc_regions[state->fc_regions_used++]; region->ino = ino; |