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  | 8 +++++++-
 fs/ext4/ext4_journal.c | 4 +++-
 fs/ext4/ext4_write.c   | 2 ++
 3 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/fs/ext4/ext4_common.c b/fs/ext4/ext4_common.c
index 8e6531fa3f0..f48a8ca48d3 100644
--- a/fs/ext4/ext4_common.c
+++ b/fs/ext4/ext4_common.c
@@ -727,8 +727,14 @@ 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]) {
+                       int j;
+
+                       for (j = 0; j < i; j++)
+                               free(arr[j]);
+
                        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..20d4e47fd38 100644
--- a/fs/ext4/ext4_write.c
+++ b/fs/ext4/ext4_write.c
@@ -204,6 +204,7 @@ static void delete_double_indirect_block(struct ext2_inode 
*inode)
        if (inode->b.blocks.double_indir_block != 0) {
                di_buffer = zalloc(fs->blksz);
                if (!di_buffer) {
+                       free(journal_buffer);
                        printf("No memory\n");
                        return;
                }
@@ -303,6 +304,7 @@ static void delete_triple_indirect_block(struct ext2_inode 
*inode)
        if (inode->b.blocks.triple_indir_block != 0) {
                tigp_buffer = zalloc(fs->blksz);
                if (!tigp_buffer) {
+                       free(journal_buffer);
                        printf("No memory\n");
                        return;
                }
-- 
2.43.0

Reply via email to