:: commit 6ebc425c226a68ae35e0466752c70d49b58c44d2

mintsuki <mintsuki@protonmail.com> — 2022-01-08 18:35

parents: 30947f4d83

ext4: Fix bogus pmm_free() bugs. Fixes #146

diff --git a/stage23/fs/ext2.s2.c b/stage23/fs/ext2.s2.c
index 93ea837f..30770cac 100644
--- a/stage23/fs/ext2.s2.c
+++ b/stage23/fs/ext2.s2.c
@@ -350,7 +350,9 @@ bool ext2_open(struct ext2_file_handle *ret, struct volume *part, const char *pa
 }
 
 void ext2_close(struct ext2_file_handle *file) {
-    pmm_free(file->alloc_map, file->inode.i_blocks_count * sizeof(uint32_t));
+    if (file->alloc_map != NULL) {
+        pmm_free(file->alloc_map, file->inode.i_blocks_count * sizeof(uint32_t));
+    }
     pmm_free(file, sizeof(struct ext2_file_handle));
 }
 
@@ -358,12 +360,15 @@ void ext2_read(struct ext2_file_handle *file, void *buf, uint64_t loc, uint64_t
     inode_read(buf, loc, count, &file->inode, file, file->alloc_map);
 }
 
-static struct ext4_extent_header* ext4_find_leaf(struct ext4_extent_header* ext_block, uint32_t read_block, uint64_t block_size, struct volume *part) {
-    struct ext4_extent_idx* index;
-    void* buf = NULL;
+static struct ext4_extent_header *ext4_find_leaf(struct ext4_extent_header *ext_block, uint32_t read_block, uint64_t block_size, struct volume *part) {
+    struct ext4_extent_idx *index;
+
+    void *buf = ext_mem_alloc(block_size);
+    memcpy(buf, ext_block, block_size);
+    ext_block = buf;
 
-    while (1) {
-        index = (struct ext4_extent_idx*)((size_t)ext_block + 12);
+    for (;;) {
+        index = (struct ext4_extent_idx *)((size_t)ext_block + 12);
 
         #define EXT4_EXT_MAGIC 0xf30a
         if (ext_block->magic != EXT4_EXT_MAGIC)
@@ -375,7 +380,7 @@ static struct ext4_extent_header* ext4_find_leaf(struct ext4_extent_header* ext_
 
         int i;
         for (i = 0; i < ext_block->entries; i++) {
-            if(read_block < index[i].block)
+            if (read_block < index[i].block)
                 break;
         }
 
@@ -383,8 +388,7 @@ static struct ext4_extent_header* ext4_find_leaf(struct ext4_extent_header* ext_
             panic(false, "extent not found");
 
         uint64_t block = ((uint64_t)index[i].leaf_hi << 32) | index[i].leaf;
-        if(!buf)
-            buf = ext_mem_alloc(block_size);
+
         volume_read(part, buf, (block * block_size), block_size);
         ext_block = buf;
     }
@@ -408,7 +412,7 @@ static int inode_read(void *buf, uint64_t loc, uint64_t count,
             struct ext4_extent *ext;
             int i;
 
-            leaf = ext4_find_leaf((struct ext4_extent_header*)inode->i_blocks, block, fd->block_size, fd->part);
+            leaf = ext4_find_leaf((struct ext4_extent_header *)inode->i_blocks, block, fd->block_size, fd->part);
 
             if (!leaf)
                 panic(false, "invalid extent");
tab: 248 wrap: offon