diff options
| -rw-r--r-- | kernel/include/libk/list.h | 3 | ||||
| -rw-r--r-- | kernel/src/fs/ext2.c | 13 | ||||
| -rw-r--r-- | kernel/src/libk/list.c | 2 | ||||
| -rw-r--r-- | kernel/src/main.c | 3 | ||||
| -rw-r--r-- | kernel/src/mem/heap.c | 4 |
5 files changed, 21 insertions, 4 deletions
diff --git a/kernel/include/libk/list.h b/kernel/include/libk/list.h index 1cd9928..690f3d7 100644 --- a/kernel/include/libk/list.h +++ b/kernel/include/libk/list.h @@ -31,6 +31,9 @@ void free_node(list_t* head); #define list_for_each_entry_prev(pos, head, member) \ for (pos = container_of(head->prev, typeof(*pos), member); pos != container_of(head, typeof(*pos), member); pos = container_of(pos->member.prev, typeof(*pos), member)) +#define list_for_each_entry_del(pos, head, member) \ + for (pos = container_of(head->next, typeof(*pos), member); pos != container_of(head, typeof(*pos), member); free_node(&pos->list), pos = container_of(head->next, typeof(*pos), member)) + #define list_is_empty(pos) \ (pos == pos->next) diff --git a/kernel/src/fs/ext2.c b/kernel/src/fs/ext2.c index 2f003ef..751cf64 100644 --- a/kernel/src/fs/ext2.c +++ b/kernel/src/fs/ext2.c @@ -225,6 +225,13 @@ uint32_t path_to_inode(const char* path) curr_path = list_prev_entry(curr_path, list); } + path_t* pos; + list_for_each_entry_del(pos, (÷d_path->list), list) { + kfree(pos->name); + kfree(pos); + } + kfree(divided_path); + return inode; } @@ -240,6 +247,12 @@ void ls(uint32_t inode) list_for_each_entry(pos, (&dir->list), list) { printf("inode: %d, name: %s\n", pos->ext2_dentry.inode, pos->ext2_dentry.name); } + + list_for_each_entry_del(pos, (&dir->list), list) { + kfree(pos->ext2_dentry.name); + kfree(pos); + } + kfree(dir); } void print(uint32_t inode) diff --git a/kernel/src/libk/list.c b/kernel/src/libk/list.c index cb916ab..21dac16 100644 --- a/kernel/src/libk/list.c +++ b/kernel/src/libk/list.c @@ -11,7 +11,7 @@ void add_to_list(list_t* head, list_t* prev, list_t* next) void free_node(list_t* head) { - if (head->prev == head->next) { + if (list_is_empty(head)) { head = NULL; return; } diff --git a/kernel/src/main.c b/kernel/src/main.c index ee240ae..2b4be32 100644 --- a/kernel/src/main.c +++ b/kernel/src/main.c @@ -32,7 +32,8 @@ int kernel_main(mb2_tag_header* multiboot_bootinfo, uint32_t multiboot_magic) // framebuffer is enabled from this point mmap_t* pos; list_for_each_entry(pos, (&mmap.list), list) { - printf("base_addr: 0x%x\n", pos->mmap_entry.base_addr); + mb2_tag_mmap_entry entry = pos->mmap_entry; + printf("base_addr: 0x%x, length: 0x%x, reserved: %d, type: %d\n", entry.base_addr, entry.length, entry.reserved, entry.type); } init_keyboard(); diff --git a/kernel/src/mem/heap.c b/kernel/src/mem/heap.c index 539328c..b49eefb 100644 --- a/kernel/src/mem/heap.c +++ b/kernel/src/mem/heap.c @@ -100,11 +100,11 @@ void kheap_free(kheap_t* kheap, void* pointer) { kheapblock_t* kheapblock; for (kheapblock = kheap->fblock; kheapblock; kheapblock = kheapblock->next) { - if ((uintptr_t)(pointer) > (uintptr_t)kheapblock && (uintptr_t)kheapblock + sizeof(kheapblock_t) + kheapblock->size) { + if ((uintptr_t)(pointer) > (uintptr_t)kheapblock && (uintptr_t)(pointer) < (uintptr_t)kheapblock + sizeof(kheapblock_t) + kheapblock->size) { // found block // get index of bitmap entry - uintptr_t pointer_offset = (uintptr_t)pointer - (uintptr_t)&kheapblock[1]; + uintptr_t pointer_offset = (uintptr_t)pointer - (uintptr_t)&kheapblock[0]; uint32_t bi = (uint32_t)pointer_offset / kheapblock->bsize; uint8_t* bm = (uint8_t*)&kheapblock[1]; uint8_t id = bm[bi]; |
