mirror of
https://github.com/switchbrew/libnx.git
synced 2025-06-21 12:32:40 +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 bool g_hiddbgHdlsInitialized;
|
||||||
static TransferMemory g_hiddbgHdlsTmem;
|
static TransferMemory g_hiddbgHdlsTmem;
|
||||||
|
static void* g_hiddbgHdlsWorkmem;
|
||||||
|
|
||||||
static const u32 g_hiddbgDeviceTypeInternalTable[] = {
|
static const u32 g_hiddbgDeviceTypeInternalTable[] = {
|
||||||
BIT(20), // DeviceType 0 Invalid
|
BIT(20), // DeviceType 0 Invalid
|
||||||
@ -483,7 +484,10 @@ Result hiddbgAttachHdlsWorkBuffer(HiddbgHdlsSessionId *session_id, void *buffer,
|
|||||||
|
|
||||||
rc = _hiddbgAttachHdlsWorkBuffer(session_id, &g_hiddbgHdlsTmem);
|
rc = _hiddbgAttachHdlsWorkBuffer(session_id, &g_hiddbgHdlsTmem);
|
||||||
if (R_FAILED(rc)) tmemClose(&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;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -504,6 +508,7 @@ Result hiddbgReleaseHdlsWorkBuffer(HiddbgHdlsSessionId session_id) {
|
|||||||
rc = _hiddbgCmdInU64NoOut(session_id.id, 325);
|
rc = _hiddbgCmdInU64NoOut(session_id.id, 325);
|
||||||
|
|
||||||
tmemClose(&g_hiddbgHdlsTmem);
|
tmemClose(&g_hiddbgHdlsTmem);
|
||||||
|
g_hiddbgHdlsWorkmem = NULL;
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -525,7 +530,7 @@ Result hiddbgIsHdlsVirtualDeviceAttached(HiddbgHdlsSessionId session_id, HiddbgH
|
|||||||
if (out) {
|
if (out) {
|
||||||
*out = false;
|
*out = false;
|
||||||
if (hosversionBefore(9,0,0)) {
|
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++) {
|
for (s32 i=0; i<stateList->total_entries; i++) {
|
||||||
if (stateList->entries[i].handle.handle == handle.handle) {
|
if (stateList->entries[i].handle.handle == handle.handle) {
|
||||||
*out = true;
|
*out = true;
|
||||||
@ -534,7 +539,7 @@ Result hiddbgIsHdlsVirtualDeviceAttached(HiddbgHdlsSessionId session_id, HiddbgH
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (hosversionBefore(12,0,0)) {
|
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++) {
|
for (s32 i=0; i<stateList->total_entries; i++) {
|
||||||
if (stateList->entries[i].handle.handle == handle.handle) {
|
if (stateList->entries[i].handle.handle == handle.handle) {
|
||||||
*out = true;
|
*out = true;
|
||||||
@ -543,7 +548,7 @@ Result hiddbgIsHdlsVirtualDeviceAttached(HiddbgHdlsSessionId session_id, HiddbgH
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
HiddbgHdlsStateList *stateList = (HiddbgHdlsStateList*)(g_hiddbgHdlsTmem.src_addr);
|
HiddbgHdlsStateList *stateList = (HiddbgHdlsStateList*)g_hiddbgHdlsWorkmem;
|
||||||
for (s32 i=0; i<stateList->total_entries; i++) {
|
for (s32 i=0; i<stateList->total_entries; i++) {
|
||||||
if (stateList->entries[i].handle.handle == handle.handle) {
|
if (stateList->entries[i].handle.handle == handle.handle) {
|
||||||
*out = true;
|
*out = true;
|
||||||
@ -570,7 +575,7 @@ Result hiddbgDumpHdlsNpadAssignmentState(HiddbgHdlsSessionId session_id, HiddbgH
|
|||||||
rc = _hiddbgCmdInU64NoOut(session_id.id, 326);
|
rc = _hiddbgCmdInU64NoOut(session_id.id, 326);
|
||||||
|
|
||||||
if (R_FAILED(rc)) return rc;
|
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;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -592,16 +597,16 @@ Result hiddbgDumpHdlsStates(HiddbgHdlsSessionId session_id, HiddbgHdlsStateList
|
|||||||
if (state) {
|
if (state) {
|
||||||
if (hosversionBefore(9,0,0)) {
|
if (hosversionBefore(9,0,0)) {
|
||||||
HiddbgHdlsStateListV7 statev7;
|
HiddbgHdlsStateListV7 statev7;
|
||||||
memcpy(&statev7, g_hiddbgHdlsTmem.src_addr, sizeof(statev7));
|
memcpy(&statev7, g_hiddbgHdlsWorkmem, sizeof(statev7));
|
||||||
_hiddbgConvertHdlsStateListFromV7(state, &statev7);
|
_hiddbgConvertHdlsStateListFromV7(state, &statev7);
|
||||||
}
|
}
|
||||||
else if (hosversionBefore(12,0,0)) {
|
else if (hosversionBefore(12,0,0)) {
|
||||||
HiddbgHdlsStateListV9 statev9;
|
HiddbgHdlsStateListV9 statev9;
|
||||||
memcpy(&statev9, g_hiddbgHdlsTmem.src_addr, sizeof(statev9));
|
memcpy(&statev9, g_hiddbgHdlsWorkmem, sizeof(statev9));
|
||||||
_hiddbgConvertHdlsStateListFromV9(state, &statev9);
|
_hiddbgConvertHdlsStateListFromV9(state, &statev9);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
memcpy(state, g_hiddbgHdlsTmem.src_addr, sizeof(*state));
|
memcpy(state, g_hiddbgHdlsWorkmem, sizeof(*state));
|
||||||
}
|
}
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
@ -616,7 +621,7 @@ Result hiddbgApplyHdlsNpadAssignmentState(HiddbgHdlsSessionId session_id, const
|
|||||||
if (state==NULL)
|
if (state==NULL)
|
||||||
return MAKERESULT(Module_Libnx, LibnxError_BadInput);
|
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))
|
if (hosversionBefore(13,0,0))
|
||||||
return _hiddbgCmdInBoolNoOut(flag, 328);
|
return _hiddbgCmdInBoolNoOut(flag, 328);
|
||||||
@ -644,15 +649,15 @@ Result hiddbgApplyHdlsStateList(HiddbgHdlsSessionId session_id, const HiddbgHdls
|
|||||||
if (hosversionBefore(9,0,0)) {
|
if (hosversionBefore(9,0,0)) {
|
||||||
HiddbgHdlsStateListV7 statev7;
|
HiddbgHdlsStateListV7 statev7;
|
||||||
_hiddbgConvertHdlsStateListToV7(&statev7, state);
|
_hiddbgConvertHdlsStateListToV7(&statev7, state);
|
||||||
memcpy(g_hiddbgHdlsTmem.src_addr, &statev7, sizeof(statev7));
|
memcpy(g_hiddbgHdlsWorkmem, &statev7, sizeof(statev7));
|
||||||
}
|
}
|
||||||
else if (hosversionBefore(12,0,0)) {
|
else if (hosversionBefore(12,0,0)) {
|
||||||
HiddbgHdlsStateListV9 statev9;
|
HiddbgHdlsStateListV9 statev9;
|
||||||
_hiddbgConvertHdlsStateListToV9(&statev9, state);
|
_hiddbgConvertHdlsStateListToV9(&statev9, state);
|
||||||
memcpy(g_hiddbgHdlsTmem.src_addr, &statev9, sizeof(statev9));
|
memcpy(g_hiddbgHdlsWorkmem, &statev9, sizeof(statev9));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
memcpy(g_hiddbgHdlsTmem.src_addr, state, sizeof(*state));
|
memcpy(g_hiddbgHdlsWorkmem, state, sizeof(*state));
|
||||||
|
|
||||||
if (hosversionBefore(13,0,0))
|
if (hosversionBefore(13,0,0))
|
||||||
return _hiddbgCmdNoIO(329);
|
return _hiddbgCmdNoIO(329);
|
||||||
|
Loading…
Reference in New Issue
Block a user