mirror of
https://github.com/switchbrew/libnx.git
synced 2025-06-20 20:22:38 +02:00
hiddbg: Fixed crash when accessing Hdls tmem. Closes #653.
This commit is contained in:
parent
d4f5f4b145
commit
688e4dd14e
@ -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; i<stateList->total_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; i<stateList->total_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; i<stateList->total_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);
|
||||
|
Loading…
Reference in New Issue
Block a user