From 890c647e0f21023a05628d604afcaa8a3713f2aa Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sat, 11 Sep 2021 02:34:55 +0200 Subject: [PATCH] Kernel: Fix off-by-one in Memory::is_user_range() check This function was checking 1 byte after the provided range, which caused it to reject valid userspace ranges that happened to end exactly at the top of the user address space. This fixes a long-standing issue with mysterious Optional errors in Coredump::write_regions(). (It happened when trying to add a memory region at the very top of the address space to a coredump.) --- Kernel/Memory/MemoryManager.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Kernel/Memory/MemoryManager.h b/Kernel/Memory/MemoryManager.h index c8fa06dba6..9309ad02fa 100644 --- a/Kernel/Memory/MemoryManager.h +++ b/Kernel/Memory/MemoryManager.h @@ -302,7 +302,11 @@ inline bool is_user_range(VirtualAddress vaddr, size_t size) { if (vaddr.offset(size) < vaddr) return false; - return is_user_address(vaddr) && is_user_address(vaddr.offset(size)); + if (!is_user_address(vaddr)) + return false; + if (size <= 1) + return true; + return is_user_address(vaddr.offset(size - 1)); } inline bool is_user_range(VirtualRange const& range)