If zalloc fails, one needs to free memory previously allocated in the function. This commit makes sure that we do not leak any memory.
Signed-off-by: Francois Berder <[email protected]> --- fs/ext4/ext4_common.c | 6 +++++- fs/ext4/ext4_journal.c | 4 +++- fs/ext4/ext4_write.c | 4 ++-- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/fs/ext4/ext4_common.c b/fs/ext4/ext4_common.c index 8e6531fa3f0..9e1d574e5b1 100644 --- a/fs/ext4/ext4_common.c +++ b/fs/ext4/ext4_common.c @@ -727,8 +727,12 @@ static int parse_path(char **arr, char *dirname) /* add each path entry after root */ while (token != NULL) { arr[i] = zalloc(strlen(token) + 1); - if (!arr[i]) + if (!arr[i]) { + while (i--) + free(arr[i]); + return -ENOMEM; + } memcpy(arr[i++], token, strlen(token)); token = strtok(NULL, "/"); } diff --git a/fs/ext4/ext4_journal.c b/fs/ext4/ext4_journal.c index 868a2c1804a..3a2e9f30c12 100644 --- a/fs/ext4/ext4_journal.c +++ b/fs/ext4/ext4_journal.c @@ -256,8 +256,10 @@ void ext4fs_push_revoke_blk(char *buffer) } node->content = zalloc(fs->blksz); - if (node->content == NULL) + if (!node->content) { + free(node); return; + } memcpy(node->content, buffer, fs->blksz); if (first_node == true) { diff --git a/fs/ext4/ext4_write.c b/fs/ext4/ext4_write.c index 5b290f0d80d..2b8ed1cd110 100644 --- a/fs/ext4/ext4_write.c +++ b/fs/ext4/ext4_write.c @@ -205,7 +205,7 @@ static void delete_double_indirect_block(struct ext2_inode *inode) di_buffer = zalloc(fs->blksz); if (!di_buffer) { printf("No memory\n"); - return; + goto fail; } dib_start_addr = di_buffer; blknr = le32_to_cpu(inode->b.blocks.double_indir_block); @@ -304,7 +304,7 @@ static void delete_triple_indirect_block(struct ext2_inode *inode) tigp_buffer = zalloc(fs->blksz); if (!tigp_buffer) { printf("No memory\n"); - return; + goto fail; } tib_start_addr = tigp_buffer; blknr = le32_to_cpu(inode->b.blocks.triple_indir_block); -- 2.43.0

