IOS/ES: Add SetUid exception for the Wii U Transfer Tool

The ES sysmodule in IOS62 (v6430) has an exception for the
Wii U Transfer Tool in the SetUid function.

If the active title is the Wii U Transfer Tool, then calling SetUid
is always allowed. (The UID is still checked first, though.)

Fixes https://bugs.dolphin-emu.org/issues/10985
This commit is contained in:
Léo Lam 2020-01-05 18:06:10 +01:00
parent f35f4f2bf0
commit c1f9bfce30
1 changed files with 16 additions and 3 deletions

View File

@ -168,13 +168,26 @@ static bool UpdateUIDAndGID(Kernel& kernel, const IOS::ES::TMDReader& tmd)
return true; return true;
} }
static ReturnCode CheckIsAllowedToSetUID(Kernel& kernel, const u32 caller_uid) static ReturnCode CheckIsAllowedToSetUID(Kernel& kernel, const u32 caller_uid,
const IOS::ES::TMDReader& active_tmd)
{ {
IOS::ES::UIDSys uid_map{kernel.GetFS()}; IOS::ES::UIDSys uid_map{kernel.GetFS()};
const u32 system_menu_uid = uid_map.GetOrInsertUIDForTitle(Titles::SYSTEM_MENU); const u32 system_menu_uid = uid_map.GetOrInsertUIDForTitle(Titles::SYSTEM_MENU);
if (!system_menu_uid) if (!system_menu_uid)
return ES_SHORT_READ; return ES_SHORT_READ;
return caller_uid == system_menu_uid ? IPC_SUCCESS : ES_EINVAL;
if (caller_uid == system_menu_uid)
return IPC_SUCCESS;
if (kernel.GetVersion() == 62)
{
const bool is_wiiu_transfer_tool =
active_tmd.IsValid() && (active_tmd.GetTitleId() | 0xFF) == 0x00010001'484353ff;
if (is_wiiu_transfer_tool)
return IPC_SUCCESS;
}
return ES_EINVAL;
} }
IPCCommandResult ES::SetUID(u32 uid, const IOCtlVRequest& request) IPCCommandResult ES::SetUID(u32 uid, const IOCtlVRequest& request)
@ -184,7 +197,7 @@ IPCCommandResult ES::SetUID(u32 uid, const IOCtlVRequest& request)
const u64 title_id = Memory::Read_U64(request.in_vectors[0].address); const u64 title_id = Memory::Read_U64(request.in_vectors[0].address);
const s32 ret = CheckIsAllowedToSetUID(m_ios, uid); const s32 ret = CheckIsAllowedToSetUID(m_ios, uid, m_title_context.tmd);
if (ret < 0) if (ret < 0)
{ {
ERROR_LOG(IOS_ES, "SetUID: Permission check failed with error %d", ret); ERROR_LOG(IOS_ES, "SetUID: Permission check failed with error %d", ret);