summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel/svc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/hle/kernel/svc.cpp')
-rw-r--r--src/core/hle/kernel/svc.cpp30
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
578 return ERR_INVALID_SIZE; 578 return ERR_INVALID_SIZE;
579 } 579 }
580 580
581 if (!IsValidAddressRange(addr, size)) {
582 return ERR_INVALID_ADDRESS_STATE;
583 }
584
581 const auto permissions_type = static_cast<MemoryPermission>(permissions); 585 const auto permissions_type = static_cast<MemoryPermission>(permissions);
582 if (permissions_type != MemoryPermission::Read && 586 if (permissions_type != MemoryPermission::Read &&
583 permissions_type != MemoryPermission::ReadWrite) { 587 permissions_type != MemoryPermission::ReadWrite) {
@@ -591,8 +595,14 @@ static ResultCode MapSharedMemory(Handle shared_memory_handle, VAddr addr, u64 s
591 return ERR_INVALID_HANDLE; 595 return ERR_INVALID_HANDLE;
592 } 596 }
593 597
594 return shared_memory->Map(Core::CurrentProcess(), addr, permissions_type, 598 auto* const current_process = Core::CurrentProcess();
595 MemoryPermission::DontCare); 599 const auto& vm_manager = current_process->VMManager();
600
601 if (!vm_manager.IsWithinASLRRegion(addr, size)) {
602 return ERR_INVALID_MEMORY_RANGE;
603 }
604
605 return shared_memory->Map(current_process, addr, permissions_type, MemoryPermission::DontCare);
596} 606}
597 607
598static ResultCode UnmapSharedMemory(Handle shared_memory_handle, VAddr addr, u64 size) { 608static ResultCode UnmapSharedMemory(Handle shared_memory_handle, VAddr addr, u64 size) {
@@ -607,10 +617,24 @@ static ResultCode UnmapSharedMemory(Handle shared_memory_handle, VAddr addr, u64
607 return ERR_INVALID_SIZE; 617 return ERR_INVALID_SIZE;
608 } 618 }
609 619
620 if (!IsValidAddressRange(addr, size)) {
621 return ERR_INVALID_ADDRESS_STATE;
622 }
623
610 auto& kernel = Core::System::GetInstance().Kernel(); 624 auto& kernel = Core::System::GetInstance().Kernel();
611 auto shared_memory = kernel.HandleTable().Get<SharedMemory>(shared_memory_handle); 625 auto shared_memory = kernel.HandleTable().Get<SharedMemory>(shared_memory_handle);
626 if (!shared_memory) {
627 return ERR_INVALID_HANDLE;
628 }
629
630 auto* const current_process = Core::CurrentProcess();
631 const auto& vm_manager = current_process->VMManager();
632
633 if (!vm_manager.IsWithinASLRRegion(addr, size)) {
634 return ERR_INVALID_MEMORY_RANGE;
635 }
612 636
613 return shared_memory->Unmap(Core::CurrentProcess(), addr); 637 return shared_memory->Unmap(current_process, addr);
614} 638}
615 639
616/// Query process memory 640/// Query process memory