Skip to content

Commit

Permalink
Kernel: Always reject never-userspace addresses before checking regions
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
awesomekling committed Dec 31, 2019
1 parent 8a0ef92 commit c9ec415
Showing 1 changed file with 11 additions and 0 deletions.
11 changes: 11 additions & 0 deletions Kernel/VM/MemoryManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -584,20 +584,31 @@ void MemoryManager::unquickmap_page()
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
{
if (!is_user_address(vaddr))
return false;
auto* region = user_region_from_vaddr(const_cast<Process&>(process), vaddr);
return region && region->is_user_accessible() && region->is_stack();
}

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);
return region && region->is_user_accessible() && region->is_readable();
}

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);
return region && region->is_user_accessible() && region->is_writable();
}
Expand Down

0 comments on commit c9ec415

Please sign in to comment.