diff options
| -rw-r--r-- | src/core/hle/kernel/mutex.cpp | 4 | ||||
| -rw-r--r-- | src/core/hle/kernel/svc.cpp | 8 | 
2 files changed, 10 insertions, 2 deletions
diff --git a/src/core/hle/kernel/mutex.cpp b/src/core/hle/kernel/mutex.cpp index 36bf0b677..51f4544be 100644 --- a/src/core/hle/kernel/mutex.cpp +++ b/src/core/hle/kernel/mutex.cpp @@ -62,7 +62,7 @@ ResultCode Mutex::TryAcquire(HandleTable& handle_table, VAddr address, Handle ho                               Handle requesting_thread_handle) {      // The mutex address must be 4-byte aligned      if ((address % sizeof(u32)) != 0) { -        return ResultCode(ErrorModule::Kernel, ErrCodes::InvalidAddress); +        return ERR_INVALID_ADDRESS;      }      SharedPtr<Thread> holding_thread = handle_table.Get<Thread>(holding_thread_handle); @@ -100,7 +100,7 @@ ResultCode Mutex::TryAcquire(HandleTable& handle_table, VAddr address, Handle ho  ResultCode Mutex::Release(VAddr address) {      // The mutex address must be 4-byte aligned      if ((address % sizeof(u32)) != 0) { -        return ResultCode(ErrorModule::Kernel, ErrCodes::InvalidAddress); +        return ERR_INVALID_ADDRESS;      }      auto [thread, num_waiters] = GetHighestPriorityMutexWaitingThread(GetCurrentThread(), address); diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index c5c1697ee..371fc439e 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp @@ -280,6 +280,10 @@ static ResultCode ArbitrateLock(Handle holding_thread_handle, VAddr mutex_addr,                "requesting_current_thread_handle=0x{:08X}",                holding_thread_handle, mutex_addr, requesting_thread_handle); +    if (Memory::IsKernelVirtualAddress(mutex_addr)) { +        return ERR_INVALID_ADDRESS_STATE; +    } +      auto& handle_table = Core::System::GetInstance().Kernel().HandleTable();      return Mutex::TryAcquire(handle_table, mutex_addr, holding_thread_handle,                               requesting_thread_handle); @@ -289,6 +293,10 @@ static ResultCode ArbitrateLock(Handle holding_thread_handle, VAddr mutex_addr,  static ResultCode ArbitrateUnlock(VAddr mutex_addr) {      LOG_TRACE(Kernel_SVC, "called mutex_addr=0x{:X}", mutex_addr); +    if (Memory::IsKernelVirtualAddress(mutex_addr)) { +        return ERR_INVALID_ADDRESS_STATE; +    } +      return Mutex::Release(mutex_addr);  }  | 
