From: Francois Berder Date: Mon, 15 Dec 2025 11:34:16 +0000 (+0100) Subject: fs: ext4fs: Free memory while handling errors X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cec36b777a56b61c347447c12e61a9d1c425f396;p=thirdparty%2Fu-boot.git fs: ext4fs: Free memory while handling errors 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 Fixes: ed34f34dbaf2 ("ext4fs write support") Acked-by: Quentin Schulz --- 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);