summaryrefslogtreecommitdiff
path: root/kernel/src
diff options
context:
space:
mode:
authorAleksa Vuckovic <aleksav013@gmail.com>2022-12-04 20:12:57 +0100
committerAleksa Vuckovic <aleksav013@gmail.com>2022-12-04 20:12:57 +0100
commit57fc2b58f362a361188856ed73dbb7391df66938 (patch)
tree61d580e0bcb71e04754bc5d0f592339397ff20c3 /kernel/src
parenta36b01e05f09f642f261d42666af28a367fefc4e (diff)
kheap_free bug fixed
Diffstat (limited to 'kernel/src')
-rw-r--r--kernel/src/fs/ext2.c13
-rw-r--r--kernel/src/libk/list.c2
-rw-r--r--kernel/src/main.c3
-rw-r--r--kernel/src/mem/heap.c4
4 files changed, 18 insertions, 4 deletions
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, (&divided_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];