Skip to content

Commit

Permalink
hiddbg: Fixed crash when accessing Hdls tmem. Closes #653.
Browse files Browse the repository at this point in the history
  • Loading branch information
yellows8 committed Nov 24, 2024
1 parent d4f5f4b commit 688e4dd
Showing 1 changed file with 17 additions and 12 deletions.
29 changes: 17 additions & 12 deletions nx/source/services/hiddbg.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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;
}

Expand All @@ -504,6 +508,7 @@ Result hiddbgReleaseHdlsWorkBuffer(HiddbgHdlsSessionId session_id) {
rc = _hiddbgCmdInU64NoOut(session_id.id, 325);

tmemClose(&g_hiddbgHdlsTmem);
g_hiddbgHdlsWorkmem = NULL;
return rc;
}

Expand All @@ -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; i<stateList->total_entries; i++) {
if (stateList->entries[i].handle.handle == handle.handle) {
*out = true;
Expand All @@ -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; i<stateList->total_entries; i++) {
if (stateList->entries[i].handle.handle == handle.handle) {
*out = true;
Expand All @@ -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; i<stateList->total_entries; i++) {
if (stateList->entries[i].handle.handle == handle.handle) {
*out = true;
Expand All @@ -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;
}

Expand All @@ -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;
}
Expand All @@ -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);
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit 688e4dd

Please sign in to comment.