浏览代码

Kernel: Always reject never-userspace addresses before checking regions

At the moment, addresses below 8MB and above 3GB are never accessible
to userspace, so just reject them without even looking at the current
process's memory regions.
Andreas Kling 5 年之前
父节点
当前提交
c9ec415e2f
共有 1 个文件被更改,包括 11 次插入0 次删除
  1. 11 0
      Kernel/VM/MemoryManager.cpp

+ 11 - 0
Kernel/VM/MemoryManager.cpp

@@ -584,20 +584,31 @@ void MemoryManager::unquickmap_page()
     m_quickmap_in_use = false;
     m_quickmap_in_use = false;
 }
 }
 
 
+static inline bool is_user_address(VirtualAddress vaddr)
+{
+    return vaddr.get() >= (8 * MB) && vaddr.get() < 0xc0000000;
+}
+
 bool MemoryManager::validate_user_stack(const Process& process, VirtualAddress vaddr) const
 bool MemoryManager::validate_user_stack(const Process& process, VirtualAddress vaddr) const
 {
 {
+    if (!is_user_address(vaddr))
+        return false;
     auto* region = user_region_from_vaddr(const_cast<Process&>(process), vaddr);
     auto* region = user_region_from_vaddr(const_cast<Process&>(process), vaddr);
     return region && region->is_user_accessible() && region->is_stack();
     return region && region->is_user_accessible() && region->is_stack();
 }
 }
 
 
 bool MemoryManager::validate_user_read(const Process& process, VirtualAddress vaddr) const
 bool MemoryManager::validate_user_read(const Process& process, VirtualAddress vaddr) const
 {
 {
+    if (!is_user_address(vaddr))
+        return false;
     auto* region = user_region_from_vaddr(const_cast<Process&>(process), vaddr);
     auto* region = user_region_from_vaddr(const_cast<Process&>(process), vaddr);
     return region && region->is_user_accessible() && region->is_readable();
     return region && region->is_user_accessible() && region->is_readable();
 }
 }
 
 
 bool MemoryManager::validate_user_write(const Process& process, VirtualAddress vaddr) const
 bool MemoryManager::validate_user_write(const Process& process, VirtualAddress vaddr) const
 {
 {
+    if (!is_user_address(vaddr))
+        return false;
     auto* region = user_region_from_vaddr(const_cast<Process&>(process), vaddr);
     auto* region = user_region_from_vaddr(const_cast<Process&>(process), vaddr);
     return region && region->is_user_accessible() && region->is_writable();
     return region && region->is_user_accessible() && region->is_writable();
 }
 }