From b306f240a4a3ef4a8f5797734457572e0026cc0c Mon Sep 17 00:00:00 2001 From: Tom Date: Fri, 21 Aug 2020 21:55:08 -0600 Subject: [PATCH] Kernel: Fix kmalloc memory corruption Rather than hardcoding where the kmalloc pool should be, place it at the end of the kernel image instead. This avoids corrupting global variables or other parts of the kernel as it grows. Fixes #3257 --- Kernel/Heap/kmalloc.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Kernel/Heap/kmalloc.cpp b/Kernel/Heap/kmalloc.cpp index 5936b3641b..df2f4dd23b 100644 --- a/Kernel/Heap/kmalloc.cpp +++ b/Kernel/Heap/kmalloc.cpp @@ -40,6 +40,7 @@ #include #include #include +#include #define SANITIZE_KMALLOC @@ -48,13 +49,16 @@ struct AllocationHeader { u8 data[0]; }; -#define BASE_PHYSICAL (0xc0000000 + (4 * MiB)) #define CHUNK_SIZE 32 #define POOL_SIZE (3 * MiB) - -#define ETERNAL_BASE_PHYSICAL (0xc0000000 + (2 * MiB)) #define ETERNAL_RANGE_SIZE (2 * MiB) +// We need to make sure to not stomp on global variables or other parts +// of the kernel image! +extern u32 end_of_kernel_bss; +#define ETERNAL_BASE_PHYSICAL ((u8*)PAGE_ROUND_UP(&end_of_kernel_bss)) +#define BASE_PHYSICAL (ETERNAL_BASE_PHYSICAL + ETERNAL_RANGE_SIZE) + static u8 alloc_map[POOL_SIZE / CHUNK_SIZE / 8]; size_t g_kmalloc_bytes_allocated = 0;