summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel/svc.cpp
diff options
context:
space:
mode:
authorGravatar bunnei2018-10-18 21:50:45 -0400
committerGravatar GitHub2018-10-18 21:50:45 -0400
commitfdd82b754ae4c4525459864659b3408a503bb211 (patch)
tree5614fc367c78a769937a47d66026c3a6190aa7a7 /src/core/hle/kernel/svc.cpp
parentMerge pull request #1511 from lioncash/content (diff)
parentsvc: Check for word alignment of addresses within svcArbitrateLock/svcArbitra... (diff)
downloadyuzu-fdd82b754ae4c4525459864659b3408a503bb211.tar.gz
yuzu-fdd82b754ae4c4525459864659b3408a503bb211.tar.xz
yuzu-fdd82b754ae4c4525459864659b3408a503bb211.zip
Merge pull request #1523 from lioncash/lock
svc: Add missing error checks in svcArbitrateLock/svcArbitrateUnlock
Diffstat (limited to 'src/core/hle/kernel/svc.cpp')
-rw-r--r--src/core/hle/kernel/svc.cpp24
1 files changed, 15 insertions, 9 deletions
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp
index d08b84bde..d3c9d50b5 100644
--- a/src/core/hle/kernel/svc.cpp
+++ b/src/core/hle/kernel/svc.cpp
@@ -8,6 +8,7 @@
8#include <mutex> 8#include <mutex>
9#include <vector> 9#include <vector>
10 10
11#include "common/alignment.h"
11#include "common/assert.h" 12#include "common/assert.h"
12#include "common/logging/log.h" 13#include "common/logging/log.h"
13#include "common/microprofile.h" 14#include "common/microprofile.h"
@@ -36,9 +37,6 @@
36 37
37namespace Kernel { 38namespace Kernel {
38namespace { 39namespace {
39constexpr bool Is4KBAligned(VAddr address) {
40 return (address & 0xFFF) == 0;
41}
42 40
43// Checks if address + size is greater than the given address 41// Checks if address + size is greater than the given address
44// This can return false if the size causes an overflow of a 64-bit type 42// This can return false if the size causes an overflow of a 64-bit type
@@ -69,11 +67,11 @@ bool IsInsideNewMapRegion(const VMManager& vm, VAddr address, u64 size) {
69// in the same order. 67// in the same order.
70ResultCode MapUnmapMemorySanityChecks(const VMManager& vm_manager, VAddr dst_addr, VAddr src_addr, 68ResultCode MapUnmapMemorySanityChecks(const VMManager& vm_manager, VAddr dst_addr, VAddr src_addr,
71 u64 size) { 69 u64 size) {
72 if (!Is4KBAligned(dst_addr) || !Is4KBAligned(src_addr)) { 70 if (!Common::Is4KBAligned(dst_addr) || !Common::Is4KBAligned(src_addr)) {
73 return ERR_INVALID_ADDRESS; 71 return ERR_INVALID_ADDRESS;
74 } 72 }
75 73
76 if (size == 0 || !Is4KBAligned(size)) { 74 if (size == 0 || !Common::Is4KBAligned(size)) {
77 return ERR_INVALID_SIZE; 75 return ERR_INVALID_SIZE;
78 } 76 }
79 77
@@ -352,6 +350,10 @@ static ResultCode ArbitrateLock(Handle holding_thread_handle, VAddr mutex_addr,
352 return ERR_INVALID_ADDRESS_STATE; 350 return ERR_INVALID_ADDRESS_STATE;
353 } 351 }
354 352
353 if (!Common::IsWordAligned(mutex_addr)) {
354 return ERR_INVALID_ADDRESS;
355 }
356
355 auto& handle_table = Core::System::GetInstance().Kernel().HandleTable(); 357 auto& handle_table = Core::System::GetInstance().Kernel().HandleTable();
356 return Mutex::TryAcquire(handle_table, mutex_addr, holding_thread_handle, 358 return Mutex::TryAcquire(handle_table, mutex_addr, holding_thread_handle,
357 requesting_thread_handle); 359 requesting_thread_handle);
@@ -365,6 +367,10 @@ static ResultCode ArbitrateUnlock(VAddr mutex_addr) {
365 return ERR_INVALID_ADDRESS_STATE; 367 return ERR_INVALID_ADDRESS_STATE;
366 } 368 }
367 369
370 if (!Common::IsWordAligned(mutex_addr)) {
371 return ERR_INVALID_ADDRESS;
372 }
373
368 return Mutex::Release(mutex_addr); 374 return Mutex::Release(mutex_addr);
369} 375}
370 376
@@ -570,11 +576,11 @@ static ResultCode MapSharedMemory(Handle shared_memory_handle, VAddr addr, u64 s
570 "called, shared_memory_handle=0x{:X}, addr=0x{:X}, size=0x{:X}, permissions=0x{:08X}", 576 "called, shared_memory_handle=0x{:X}, addr=0x{:X}, size=0x{:X}, permissions=0x{:08X}",
571 shared_memory_handle, addr, size, permissions); 577 shared_memory_handle, addr, size, permissions);
572 578
573 if (!Is4KBAligned(addr)) { 579 if (!Common::Is4KBAligned(addr)) {
574 return ERR_INVALID_ADDRESS; 580 return ERR_INVALID_ADDRESS;
575 } 581 }
576 582
577 if (size == 0 || !Is4KBAligned(size)) { 583 if (size == 0 || !Common::Is4KBAligned(size)) {
578 return ERR_INVALID_SIZE; 584 return ERR_INVALID_SIZE;
579 } 585 }
580 586
@@ -599,11 +605,11 @@ static ResultCode UnmapSharedMemory(Handle shared_memory_handle, VAddr addr, u64
599 LOG_WARNING(Kernel_SVC, "called, shared_memory_handle=0x{:08X}, addr=0x{:X}, size=0x{:X}", 605 LOG_WARNING(Kernel_SVC, "called, shared_memory_handle=0x{:08X}, addr=0x{:X}, size=0x{:X}",
600 shared_memory_handle, addr, size); 606 shared_memory_handle, addr, size);
601 607
602 if (!Is4KBAligned(addr)) { 608 if (!Common::Is4KBAligned(addr)) {
603 return ERR_INVALID_ADDRESS; 609 return ERR_INVALID_ADDRESS;
604 } 610 }
605 611
606 if (size == 0 || !Is4KBAligned(size)) { 612 if (size == 0 || !Common::Is4KBAligned(size)) {
607 return ERR_INVALID_SIZE; 613 return ERR_INVALID_SIZE;
608 } 614 }
609 615