Kernel: Do 2 validations in annotate_mapping syscall outside a spinlock
This commit is contained in:
parent
bedd90b1f0
commit
08de5abc6d
Notes:
sideshowbarker
2024-07-16 23:46:53 +09:00
Author: https://github.com/supercomputer7 Commit: https://github.com/SerenityOS/serenity/commit/08de5abc6d Pull-request: https://github.com/SerenityOS/serenity/pull/17096 Reviewed-by: https://github.com/linusg
1 changed files with 5 additions and 6 deletions
|
@ -575,11 +575,13 @@ ErrorOr<FlatPtr> Process::sys$allocate_tls(Userspace<char const*> initial_data,
|
|||
ErrorOr<FlatPtr> Process::sys$annotate_mapping(Userspace<void*> address, int flags)
|
||||
{
|
||||
VERIFY_NO_PROCESS_BIG_LOCK(this);
|
||||
if (flags == to_underlying(VirtualMemoryRangeFlags::None))
|
||||
return EINVAL;
|
||||
|
||||
if (!Memory::is_user_address(address.vaddr()))
|
||||
return EFAULT;
|
||||
|
||||
return address_space().with([&](auto& space) -> ErrorOr<FlatPtr> {
|
||||
if (flags == to_underlying(VirtualMemoryRangeFlags::None))
|
||||
return EINVAL;
|
||||
|
||||
if (space->enforces_syscall_regions() && (flags & to_underlying(VirtualMemoryRangeFlags::SyscallCode)))
|
||||
return EPERM;
|
||||
|
||||
|
@ -588,9 +590,6 @@ ErrorOr<FlatPtr> Process::sys$annotate_mapping(Userspace<void*> address, int fla
|
|||
return 0;
|
||||
}
|
||||
|
||||
if (!Memory::is_user_address(address.vaddr()))
|
||||
return EFAULT;
|
||||
|
||||
auto* region = space->find_region_containing(Memory::VirtualRange { address.vaddr(), 1 });
|
||||
if (!region)
|
||||
return EINVAL;
|
||||
|
|
Loading…
Add table
Reference in a new issue