diff options
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 | |||
| 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 | ||
| 598 | static ResultCode UnmapSharedMemory(Handle shared_memory_handle, VAddr addr, u64 size) { | 608 | 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 | |||
| 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 |