summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Lioncash2018-09-13 20:16:43 -0400
committerGravatar Lioncash2018-09-13 23:07:23 -0400
commitaccd1f17e451dfe23350055b5c1377846f3dce77 (patch)
tree8a4b6896a20ab7823e2ebe9a97e39af4b27295c7 /src
parentkernel/svc: Sanitize addresses and sizes within svcMapMemory() and svcUnmapMe... (diff)
downloadyuzu-accd1f17e451dfe23350055b5c1377846f3dce77.tar.gz
yuzu-accd1f17e451dfe23350055b5c1377846f3dce77.tar.xz
yuzu-accd1f17e451dfe23350055b5c1377846f3dce77.zip
kernel/svc: Sanitize addresses, permissions, and sizes within svcMapSharedMemory() and svcUnmapSharedMemory()
Part of the checking done by the kernel is to check if the given address and size are 4KB aligned, as well as checking if the size isn't zero. It also only allows mapping shared memory as readable or read/write, but nothing else, and so we shouldn't allow mapping as anything else either.
Diffstat (limited to 'src')
-rw-r--r--src/core/hle/kernel/svc.cpp42
1 files changed, 25 insertions, 17 deletions
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp
index 3eb77812e..d19182639 100644
--- a/src/core/hle/kernel/svc.cpp
+++ b/src/core/hle/kernel/svc.cpp
@@ -444,35 +444,43 @@ static ResultCode MapSharedMemory(Handle shared_memory_handle, VAddr addr, u64 s
444 "called, shared_memory_handle=0x{:X}, addr=0x{:X}, size=0x{:X}, permissions=0x{:08X}", 444 "called, shared_memory_handle=0x{:X}, addr=0x{:X}, size=0x{:X}, permissions=0x{:08X}",
445 shared_memory_handle, addr, size, permissions); 445 shared_memory_handle, addr, size, permissions);
446 446
447 if (!Is4KBAligned(addr)) {
448 return ERR_INVALID_ADDRESS;
449 }
450
451 if (size == 0 || !Is4KBAligned(size)) {
452 return ERR_INVALID_SIZE;
453 }
454
455 const auto permissions_type = static_cast<MemoryPermission>(permissions);
456 if (permissions_type != MemoryPermission::Read &&
457 permissions_type != MemoryPermission::ReadWrite) {
458 LOG_ERROR(Kernel_SVC, "Invalid permissions=0x{:08X}", permissions);
459 return ERR_INVALID_MEMORY_PERMISSIONS;
460 }
461
447 auto& kernel = Core::System::GetInstance().Kernel(); 462 auto& kernel = Core::System::GetInstance().Kernel();
448 auto shared_memory = kernel.HandleTable().Get<SharedMemory>(shared_memory_handle); 463 auto shared_memory = kernel.HandleTable().Get<SharedMemory>(shared_memory_handle);
449 if (!shared_memory) { 464 if (!shared_memory) {
450 return ERR_INVALID_HANDLE; 465 return ERR_INVALID_HANDLE;
451 } 466 }
452 467
453 MemoryPermission permissions_type = static_cast<MemoryPermission>(permissions); 468 return shared_memory->Map(Core::CurrentProcess().get(), addr, permissions_type,
454 switch (permissions_type) { 469 MemoryPermission::DontCare);
455 case MemoryPermission::Read:
456 case MemoryPermission::Write:
457 case MemoryPermission::ReadWrite:
458 case MemoryPermission::Execute:
459 case MemoryPermission::ReadExecute:
460 case MemoryPermission::WriteExecute:
461 case MemoryPermission::ReadWriteExecute:
462 case MemoryPermission::DontCare:
463 return shared_memory->Map(Core::CurrentProcess().get(), addr, permissions_type,
464 MemoryPermission::DontCare);
465 default:
466 LOG_ERROR(Kernel_SVC, "unknown permissions=0x{:08X}", permissions);
467 }
468
469 return RESULT_SUCCESS;
470} 470}
471 471
472static ResultCode UnmapSharedMemory(Handle shared_memory_handle, VAddr addr, u64 size) { 472static ResultCode UnmapSharedMemory(Handle shared_memory_handle, VAddr addr, u64 size) {
473 LOG_WARNING(Kernel_SVC, "called, shared_memory_handle=0x{:08X}, addr=0x{:X}, size=0x{:X}", 473 LOG_WARNING(Kernel_SVC, "called, shared_memory_handle=0x{:08X}, addr=0x{:X}, size=0x{:X}",
474 shared_memory_handle, addr, size); 474 shared_memory_handle, addr, size);
475 475
476 if (!Is4KBAligned(addr)) {
477 return ERR_INVALID_ADDRESS;
478 }
479
480 if (size == 0 || !Is4KBAligned(size)) {
481 return ERR_INVALID_SIZE;
482 }
483
476 auto& kernel = Core::System::GetInstance().Kernel(); 484 auto& kernel = Core::System::GetInstance().Kernel();
477 auto shared_memory = kernel.HandleTable().Get<SharedMemory>(shared_memory_handle); 485 auto shared_memory = kernel.HandleTable().Get<SharedMemory>(shared_memory_handle);
478 486