From 688e4dd14e9f4b34fc6e0276380878a0aa8d3be5 Mon Sep 17 00:00:00 2001 From: yellows8 Date: Sun, 24 Nov 2024 16:46:45 -0500 Subject: [PATCH] hiddbg: Fixed crash when accessing Hdls tmem. Closes #653. --- nx/source/services/hiddbg.c | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/nx/source/services/hiddbg.c b/nx/source/services/hiddbg.c index 9b82709ec..31060a2f5 100644 --- a/nx/source/services/hiddbg.c +++ b/nx/source/services/hiddbg.c @@ -9,6 +9,7 @@ static Service g_hiddbgSrv; static bool g_hiddbgHdlsInitialized; static TransferMemory g_hiddbgHdlsTmem; +static void* g_hiddbgHdlsWorkmem; static const u32 g_hiddbgDeviceTypeInternalTable[] = { BIT(20), // DeviceType 0 Invalid @@ -483,7 +484,10 @@ Result hiddbgAttachHdlsWorkBuffer(HiddbgHdlsSessionId *session_id, void *buffer, rc = _hiddbgAttachHdlsWorkBuffer(session_id, &g_hiddbgHdlsTmem); if (R_FAILED(rc)) tmemClose(&g_hiddbgHdlsTmem); - if (R_SUCCEEDED(rc)) g_hiddbgHdlsInitialized = true; + if (R_SUCCEEDED(rc)) { + g_hiddbgHdlsInitialized = true; + g_hiddbgHdlsWorkmem = buffer; + } return rc; } @@ -504,6 +508,7 @@ Result hiddbgReleaseHdlsWorkBuffer(HiddbgHdlsSessionId session_id) { rc = _hiddbgCmdInU64NoOut(session_id.id, 325); tmemClose(&g_hiddbgHdlsTmem); + g_hiddbgHdlsWorkmem = NULL; return rc; } @@ -525,7 +530,7 @@ Result hiddbgIsHdlsVirtualDeviceAttached(HiddbgHdlsSessionId session_id, HiddbgH if (out) { *out = false; if (hosversionBefore(9,0,0)) { - HiddbgHdlsStateListV7 *stateList = (HiddbgHdlsStateListV7*)(g_hiddbgHdlsTmem.src_addr); + HiddbgHdlsStateListV7 *stateList = (HiddbgHdlsStateListV7*)g_hiddbgHdlsWorkmem; for (s32 i=0; itotal_entries; i++) { if (stateList->entries[i].handle.handle == handle.handle) { *out = true; @@ -534,7 +539,7 @@ Result hiddbgIsHdlsVirtualDeviceAttached(HiddbgHdlsSessionId session_id, HiddbgH } } else if (hosversionBefore(12,0,0)) { - HiddbgHdlsStateListV9 *stateList = (HiddbgHdlsStateListV9*)(g_hiddbgHdlsTmem.src_addr); + HiddbgHdlsStateListV9 *stateList = (HiddbgHdlsStateListV9*)g_hiddbgHdlsWorkmem; for (s32 i=0; itotal_entries; i++) { if (stateList->entries[i].handle.handle == handle.handle) { *out = true; @@ -543,7 +548,7 @@ Result hiddbgIsHdlsVirtualDeviceAttached(HiddbgHdlsSessionId session_id, HiddbgH } } else { - HiddbgHdlsStateList *stateList = (HiddbgHdlsStateList*)(g_hiddbgHdlsTmem.src_addr); + HiddbgHdlsStateList *stateList = (HiddbgHdlsStateList*)g_hiddbgHdlsWorkmem; for (s32 i=0; itotal_entries; i++) { if (stateList->entries[i].handle.handle == handle.handle) { *out = true; @@ -570,7 +575,7 @@ Result hiddbgDumpHdlsNpadAssignmentState(HiddbgHdlsSessionId session_id, HiddbgH rc = _hiddbgCmdInU64NoOut(session_id.id, 326); if (R_FAILED(rc)) return rc; - if (state) memcpy(state, g_hiddbgHdlsTmem.src_addr, sizeof(*state)); + if (state) memcpy(state, g_hiddbgHdlsWorkmem, sizeof(*state)); return rc; } @@ -592,16 +597,16 @@ Result hiddbgDumpHdlsStates(HiddbgHdlsSessionId session_id, HiddbgHdlsStateList if (state) { if (hosversionBefore(9,0,0)) { HiddbgHdlsStateListV7 statev7; - memcpy(&statev7, g_hiddbgHdlsTmem.src_addr, sizeof(statev7)); + memcpy(&statev7, g_hiddbgHdlsWorkmem, sizeof(statev7)); _hiddbgConvertHdlsStateListFromV7(state, &statev7); } else if (hosversionBefore(12,0,0)) { HiddbgHdlsStateListV9 statev9; - memcpy(&statev9, g_hiddbgHdlsTmem.src_addr, sizeof(statev9)); + memcpy(&statev9, g_hiddbgHdlsWorkmem, sizeof(statev9)); _hiddbgConvertHdlsStateListFromV9(state, &statev9); } else - memcpy(state, g_hiddbgHdlsTmem.src_addr, sizeof(*state)); + memcpy(state, g_hiddbgHdlsWorkmem, sizeof(*state)); } return rc; } @@ -616,7 +621,7 @@ Result hiddbgApplyHdlsNpadAssignmentState(HiddbgHdlsSessionId session_id, const if (state==NULL) return MAKERESULT(Module_Libnx, LibnxError_BadInput); - memcpy(g_hiddbgHdlsTmem.src_addr, state, sizeof(*state)); + memcpy(g_hiddbgHdlsWorkmem, state, sizeof(*state)); if (hosversionBefore(13,0,0)) return _hiddbgCmdInBoolNoOut(flag, 328); @@ -644,15 +649,15 @@ Result hiddbgApplyHdlsStateList(HiddbgHdlsSessionId session_id, const HiddbgHdls if (hosversionBefore(9,0,0)) { HiddbgHdlsStateListV7 statev7; _hiddbgConvertHdlsStateListToV7(&statev7, state); - memcpy(g_hiddbgHdlsTmem.src_addr, &statev7, sizeof(statev7)); + memcpy(g_hiddbgHdlsWorkmem, &statev7, sizeof(statev7)); } else if (hosversionBefore(12,0,0)) { HiddbgHdlsStateListV9 statev9; _hiddbgConvertHdlsStateListToV9(&statev9, state); - memcpy(g_hiddbgHdlsTmem.src_addr, &statev9, sizeof(statev9)); + memcpy(g_hiddbgHdlsWorkmem, &statev9, sizeof(statev9)); } else - memcpy(g_hiddbgHdlsTmem.src_addr, state, sizeof(*state)); + memcpy(g_hiddbgHdlsWorkmem, state, sizeof(*state)); if (hosversionBefore(13,0,0)) return _hiddbgCmdNoIO(329);