diff options
author | Lioncash <mathew1800@gmail.com> | 2018-10-18 04:39:21 +0200 |
---|---|---|
committer | Lioncash <mathew1800@gmail.com> | 2018-10-18 08:01:21 +0200 |
commit | 33830aa65ac58a03a91de9ac4fc8d91fe28f6d4e (patch) | |
tree | 54ec4efc8021d87b2d5110c9aa047d5a8f5d3fe0 /src/core/hle/kernel/svc.cpp | |
parent | Merge pull request #1444 from ogniK5377/better-hid (diff) | |
download | yuzu-33830aa65ac58a03a91de9ac4fc8d91fe28f6d4e.tar yuzu-33830aa65ac58a03a91de9ac4fc8d91fe28f6d4e.tar.gz yuzu-33830aa65ac58a03a91de9ac4fc8d91fe28f6d4e.tar.bz2 yuzu-33830aa65ac58a03a91de9ac4fc8d91fe28f6d4e.tar.lz yuzu-33830aa65ac58a03a91de9ac4fc8d91fe28f6d4e.tar.xz yuzu-33830aa65ac58a03a91de9ac4fc8d91fe28f6d4e.tar.zst yuzu-33830aa65ac58a03a91de9ac4fc8d91fe28f6d4e.zip |
Diffstat (limited to 'src/core/hle/kernel/svc.cpp')
-rw-r--r-- | src/core/hle/kernel/svc.cpp | 30 |
1 files changed, 27 insertions, 3 deletions
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index d08b84bde..d3971a25e 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp @@ -578,6 +578,10 @@ static ResultCode MapSharedMemory(Handle shared_memory_handle, VAddr addr, u64 s return ERR_INVALID_SIZE; } + if (!IsValidAddressRange(addr, size)) { + return ERR_INVALID_ADDRESS_STATE; + } + const auto permissions_type = static_cast<MemoryPermission>(permissions); if (permissions_type != MemoryPermission::Read && permissions_type != MemoryPermission::ReadWrite) { @@ -591,8 +595,14 @@ static ResultCode MapSharedMemory(Handle shared_memory_handle, VAddr addr, u64 s return ERR_INVALID_HANDLE; } - return shared_memory->Map(Core::CurrentProcess(), addr, permissions_type, - MemoryPermission::DontCare); + auto* const current_process = Core::CurrentProcess(); + const auto& vm_manager = current_process->VMManager(); + + if (!vm_manager.IsWithinASLRRegion(addr, size)) { + return ERR_INVALID_MEMORY_RANGE; + } + + return shared_memory->Map(current_process, addr, permissions_type, MemoryPermission::DontCare); } static ResultCode UnmapSharedMemory(Handle shared_memory_handle, VAddr addr, u64 size) { @@ -607,10 +617,24 @@ static ResultCode UnmapSharedMemory(Handle shared_memory_handle, VAddr addr, u64 return ERR_INVALID_SIZE; } + if (!IsValidAddressRange(addr, size)) { + return ERR_INVALID_ADDRESS_STATE; + } + auto& kernel = Core::System::GetInstance().Kernel(); auto shared_memory = kernel.HandleTable().Get<SharedMemory>(shared_memory_handle); + if (!shared_memory) { + return ERR_INVALID_HANDLE; + } + + auto* const current_process = Core::CurrentProcess(); + const auto& vm_manager = current_process->VMManager(); + + if (!vm_manager.IsWithinASLRRegion(addr, size)) { + return ERR_INVALID_MEMORY_RANGE; + } - return shared_memory->Unmap(Core::CurrentProcess(), addr); + return shared_memory->Unmap(current_process, addr); } /// Query process memory |