mirror of
				https://git.h3cjp.net/H3cJP/citra.git
				synced 2025-11-04 09:05:08 +00:00 
			
		
		
		
	Merge pull request #1343 from lioncash/mutex
kernel/svc: Handle invalid address cases within svcArbitrateLock() and svcArbitrateUnlock()
This commit is contained in:
		
						commit
						733c47623b
					
				| 
						 | 
				
			
			@ -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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue