aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEmulatedSeasons <89668582+EmulatedSeasons@users.noreply.github.com>2025-01-21 19:30:30 -0500
committerEmulatedSeasons <89668582+EmulatedSeasons@users.noreply.github.com>2025-01-21 19:30:30 -0500
commit360a38f3be9c7e45c407ff65736d8098f5ca658b (patch)
treee122382abdc8c278e1c4d19cfa6f8939eb627b65
parent0cfee3a1a16d3b04829a646b94e45685ee878876 (diff)
added magic value to attempt to deal with potential double freesHEADmaster
-rw-r--r--kernel/kernel.cpp1
-rw-r--r--kernel/mm/pmm.cpp16
2 files changed, 16 insertions, 1 deletions
diff --git a/kernel/kernel.cpp b/kernel/kernel.cpp
index 3801082..1ac9d45 100644
--- a/kernel/kernel.cpp
+++ b/kernel/kernel.cpp
@@ -112,6 +112,7 @@ extern "C" void _start() {
printf("hhdm offset: %lx\n", _hhdm_offset);
pmm_init(memmap_request.response);
+ draw_pixel(100, 100, 0x0000ff);
uint64_t tester = page_alloc();
printf("tester: %lx\n", tester);
diff --git a/kernel/mm/pmm.cpp b/kernel/mm/pmm.cpp
index 685f038..d25e673 100644
--- a/kernel/mm/pmm.cpp
+++ b/kernel/mm/pmm.cpp
@@ -2,8 +2,13 @@
#include <kernel.h>
#include <stdio.h>
+#define PAGE_SIZE 0x1000ul
+// makes sure double frees aren't happening (probably)
+#define PMM_MAGIC_NUM 0xE1321ul
+
struct freelist {
freelist* next = nullptr;
+ uint64_t magic_num;
};
freelist* head = nullptr;
@@ -15,8 +20,9 @@ void pmm_init(limine_memmap_response* memmap) {
if (memmap->entries[i]->type == LIMINE_MEMMAP_USABLE) {
printf("%d\n", i);
// iterates through all addresses
- for (uint64_t addr = memmap->entries[i]->base; addr < (memmap->entries[i]->length + memmap->entries[i]->base); addr += 0x1000ul) {
+ for (uint64_t addr = memmap->entries[i]->base; addr < (memmap->entries[i]->length + memmap->entries[i]->base); addr += PAGE_SIZE) {
freelist* temp = (freelist*)(addr + _hhdm_offset);
+ temp->magic_num = PMM_MAGIC_NUM;
if (head) {
temp->next = head;
head = temp;
@@ -33,12 +39,20 @@ void pmm_init(limine_memmap_response* memmap) {
uint64_t page_alloc() {
freelist* alloced = head;
+ alloced->magic_num = 0;
head = head->next;
return (uint64_t)alloced;
}
void page_free(uint64_t page) {
freelist* freed = (freelist*)page;
+
+ // double free check
+ if (freed->magic_num == PMM_MAGIC_NUM) {
+ return;
+ }
+
freed->next = head;
+ freed->magic_num = PMM_MAGIC_NUM;
head = freed;
} \ No newline at end of file