From 0e73aa36c8ed90d833656746182efb8ab636e1a5 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sun, 27 Jan 2019 10:17:56 +0100 Subject: [PATCH] Kernel: Unbreak symbolication yet another time. --- Kernel/Process.cpp | 23 +++++++++++++++++------ Kernel/kmalloc.cpp | 2 +- Kernel/kmalloc.h | 2 +- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp index 37fdd3a226..89fabe84ae 100644 --- a/Kernel/Process.cpp +++ b/Kernel/Process.cpp @@ -1597,14 +1597,19 @@ void sleep(dword ticks) sched_yield(); } +static bool is_inside_kernel_code(LinearAddress laddr) +{ + // FIXME: What if we're indexing into the ksym with the highest address though? + return laddr.get() >= ksym_lowest_address && laddr.get() <= ksym_highest_address; +} + bool Process::validate_read_from_kernel(LinearAddress laddr) const { // We check extra carefully here since the first 4MB of the address space is identity-mapped. // This code allows access outside of the known used address ranges to get caught. InterruptDisabler disabler; - // FIXME: What if we're indexing into the ksym with the highest address though? - if (laddr.get() >= ksym_lowest_address && laddr.get() <= ksym_highest_address) + if (is_inside_kernel_code(laddr)) return true; if (is_kmalloc_address(laddr.as_ptr())) return true; @@ -1613,8 +1618,12 @@ bool Process::validate_read_from_kernel(LinearAddress laddr) const bool Process::validate_read(const void* address, size_t size) const { - if (isRing0()) - return true; + if (isRing0()) { + if (is_inside_kernel_code(LinearAddress((dword)address))) + return true; + if (is_kmalloc_address(address)) + return true; + } ASSERT(size); if (!size) return false; @@ -1629,8 +1638,10 @@ bool Process::validate_read(const void* address, size_t size) const bool Process::validate_write(void* address, size_t size) const { - if (isRing0()) - return true; + if (isRing0()) { + if (is_kmalloc_address(address)) + return true; + } ASSERT(size); if (!size) return false; diff --git a/Kernel/kmalloc.cpp b/Kernel/kmalloc.cpp index c22b7ca0ca..a61a1b48a0 100644 --- a/Kernel/kmalloc.cpp +++ b/Kernel/kmalloc.cpp @@ -38,7 +38,7 @@ volatile size_t kmalloc_sum_eternal = 0; static byte* s_next_eternal_ptr; static byte* s_end_of_eternal_range; -bool is_kmalloc_address(void* ptr) +bool is_kmalloc_address(const void* ptr) { if (ptr >= (byte*)ETERNAL_BASE_PHYSICAL && ptr < s_next_eternal_ptr) return true; diff --git a/Kernel/kmalloc.h b/Kernel/kmalloc.h index 8c4a1522eb..82c47e3354 100644 --- a/Kernel/kmalloc.h +++ b/Kernel/kmalloc.h @@ -10,7 +10,7 @@ void* kmalloc_aligned(size_t, size_t alignment) __attribute__ ((malloc)); void kfree(void*); void kfree_aligned(void*); -bool is_kmalloc_address(void*); +bool is_kmalloc_address(const void*); extern volatile size_t sum_alloc; extern volatile size_t sum_free;