From 2fe11694235fb0ce636c4078a59284608bad1dfa Mon Sep 17 00:00:00 2001 From: piepie62 Date: Sun, 14 Apr 2019 23:12:14 -0700 Subject: [PATCH 1/5] Improve cheat execution parameters and handle CRLF properly --- sysmodules/rosalina/source/menus/cheats.c | 50 ++++++++--------------- 1 file changed, 16 insertions(+), 34 deletions(-) diff --git a/sysmodules/rosalina/source/menus/cheats.c b/sysmodules/rosalina/source/menus/cheats.c index 8667f79..e32d321 100644 --- a/sysmodules/rosalina/source/menus/cheats.c +++ b/sysmodules/rosalina/source/menus/cheats.c @@ -48,9 +48,8 @@ typedef struct CheatDescription { u32 active; u32 valid; - u32 keyActivated; - u32 keyCombo; - char name[40]; + char hasKeyCode; + char name[39]; u32 codesCount; u64 codes[0]; } CheatDescription; @@ -110,7 +109,6 @@ typedef struct CheatState CheatState cheat_state = { 0 }; u8 cheatCount = 0; -u8 hasKeyActivated = 0; u64 cheatTitleInfo = -1ULL; char failureReason[64]; @@ -840,6 +838,7 @@ static Result Cheat_MapMemoryAndApplyCheat(u32 pid, CheatDescription* const chea } else { + sprintf(failureReason, "Debug process failed"); svcCloseHandle(processHandle); } } @@ -865,8 +864,7 @@ static CheatDescription* Cheat_AllocCheat() cheat->active = 0; cheat->valid = 1; cheat->codesCount = 0; - cheat->keyActivated = 0; - cheat->keyCombo = 0; + cheat->hasKeyCode = 0; cheat->name[0] = '\0'; cheats[cheatCount] = cheat; @@ -883,7 +881,7 @@ static void Cheat_AddCode(CheatDescription* cheat, u64 code) } } -static Result Cheat_ReadLine(char* line) +static Result Cheat_ReadLine(char* line, u32 lineSize) { Result res = 0; @@ -895,7 +893,13 @@ static Result Cheat_ReadLine(char* line) res = c ? 0 : -1; if (R_SUCCEEDED(res) && c != '\0') { - if (c == '\n' || c == '\r' || idx >= 1023) + if (c == '\r' && cheatFileBuffer[cheatFilePos] == '\n') + { + cheatFilePos++; + line[idx++] = '\0'; + return idx; + } + else if (c == '\n' || idx >= lineSize - 1) { line[idx++] = '\0'; return idx; @@ -1002,7 +1006,6 @@ static void Cheat_LoadCheatsIntoMemory(u64 titleId) { cheatCount = 0; cheatTitleInfo = titleId; - hasKeyActivated = 0; char path[64] = { 0 }; sprintf(path, "/luma/titles/%016llX/cheats.txt", titleId); @@ -1037,7 +1040,7 @@ static void Cheat_LoadCheatsIntoMemory(u64 titleId) cheatFilePos = 0; do { - res = Cheat_ReadLine(line); + res = Cheat_ReadLine(line, 1024); if (R_SUCCEEDED(res)) { s32 lineLen = strnlen(line, 1023); @@ -1057,12 +1060,7 @@ static void Cheat_LoadCheatsIntoMemory(u64 titleId) Cheat_AddCode(cheat, tmp); if (((tmp >> 32) & 0xFFFFFFFF) == 0xDD000000) { - if (tmp & 0xFFFFFFFF) - { - // Not empty key code - cheat->keyCombo |= (tmp & 0xFFF); - cheat->keyActivated = 1; - } + cheat->hasKeyCode = 1; } } } @@ -1134,28 +1132,21 @@ void Cheat_ApplyCheats(void) if (!titleId) { cheatCount = 0; - hasKeyActivated = 0; return; } if (titleId != cheatTitleInfo) { cheatCount = 0; - hasKeyActivated = 0; return; } - u32 keys = HID_PAD & 0xFFF; for (int i = 0; i < cheatCount; i++) { - if (cheats[i]->active && !(cheats[i]->keyActivated)) + if (cheats[i]->active) { Cheat_MapMemoryAndApplyCheat(pid, cheats[i]); } - else if (cheats[i]->active && cheats[i]->keyActivated && (cheats[i]->keyCombo & keys) == keys) - { - Cheat_MapMemoryAndApplyCheat(pid, cheats[i]); - } } } @@ -1217,7 +1208,7 @@ void RosalinaMenu_Cheats(void) char buf[65] = { 0 }; s32 j = page * CHEATS_PER_MENU_PAGE + i; const char * checkbox = (cheats[j]->active ? "(x) " : "( ) "); - const char * keyAct = (cheats[j]->keyActivated ? "*" : " "); + const char * keyAct = (cheats[j]->hasKeyCode ? "*" : " "); sprintf(buf, "%s%s%s", checkbox, keyAct, cheats[j]->name); Draw_DrawString(30, 30 + i * SPACING_Y, cheats[j]->valid ? COLOR_WHITE : COLOR_RED, buf); @@ -1253,15 +1244,6 @@ void RosalinaMenu_Cheats(void) { r = Cheat_MapMemoryAndApplyCheat(pid, cheats[selected]); } - hasKeyActivated = 0; - for (int i = 0; i < cheatCount; i++) - { - if (cheats[i]->active && cheats[i]->keyActivated) - { - hasKeyActivated = 1; - break; - } - } } else if (pressed & BUTTON_DOWN) selected++; From ff86ed2e77c3d94b60e5421d66c9234e1c0e322a Mon Sep 17 00:00:00 2001 From: piepie62 Date: Mon, 15 Apr 2019 03:41:25 -0700 Subject: [PATCH 2/5] Add bounds checking --- sysmodules/rosalina/source/menus/cheats.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sysmodules/rosalina/source/menus/cheats.c b/sysmodules/rosalina/source/menus/cheats.c index e32d321..5adfe4b 100644 --- a/sysmodules/rosalina/source/menus/cheats.c +++ b/sysmodules/rosalina/source/menus/cheats.c @@ -887,13 +887,13 @@ static Result Cheat_ReadLine(char* line, u32 lineSize) char c = '\0'; u32 idx = 0; - while (R_SUCCEEDED(res)) + while (R_SUCCEEDED(res) && cheatFilePos < sizeof(cheatFileBuffer)) { c = cheatFileBuffer[cheatFilePos++]; res = c ? 0 : -1; if (R_SUCCEEDED(res) && c != '\0') { - if (c == '\r' && cheatFileBuffer[cheatFilePos] == '\n') + if (c == '\r' && cheatFilePos < sizeof(cheatFileBuffer) && cheatFileBuffer[cheatFilePos] == '\n') { cheatFilePos++; line[idx++] = '\0'; From eab9a31dff03159c954be3af5cf2d057262af6f7 Mon Sep 17 00:00:00 2001 From: piepie62 Date: Mon, 15 Apr 2019 13:08:53 -0700 Subject: [PATCH 3/5] Fix reading past the end of a file --- sysmodules/rosalina/source/ifile.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sysmodules/rosalina/source/ifile.c b/sysmodules/rosalina/source/ifile.c index 18d8c00..430620a 100644 --- a/sysmodules/rosalina/source/ifile.c +++ b/sysmodules/rosalina/source/ifile.c @@ -71,7 +71,7 @@ Result IFile_Read(IFile *file, u64 *total, void *buffer, u32 len) while (1) { res = FSFILE_Read(file->handle, &read, file->pos, buf, left); - if (R_FAILED(res)) + if (R_FAILED(res) || read == 0) { break; } From 4285736286a43974eb5b56a08f8e6a6b39bf1289 Mon Sep 17 00:00:00 2001 From: TuxSH Date: Sun, 21 Apr 2019 12:15:50 +0200 Subject: [PATCH 4/5] fix layeredfs regression --- sysmodules/loader/source/patcher.c | 2 +- sysmodules/loader/source/romfsredir.s | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sysmodules/loader/source/patcher.c b/sysmodules/loader/source/patcher.c index 0a3970a..9e13cc0 100644 --- a/sysmodules/loader/source/patcher.c +++ b/sysmodules/loader/source/patcher.c @@ -530,7 +530,7 @@ static inline bool patchLayeredFs(u64 progId, u8 *code, u32 size, u32 textSize, romfsRedirPatchSubstituted1 = *(u32 *)(code + fsOpenFileDirectly); romfsRedirPatchHook1 = MAKE_BRANCH(payloadOffset + (u32)&romfsRedirPatchHook1 - (u32)romfsRedirPatch, fsOpenFileDirectly + 4); - romfsRedirPatchSubstituted1 = *(u32 *)(code + fsTryOpenFile); + romfsRedirPatchSubstituted2 = *(u32 *)(code + fsTryOpenFile); romfsRedirPatchHook2 = MAKE_BRANCH(payloadOffset + (u32)&romfsRedirPatchHook2 - (u32)romfsRedirPatch, fsTryOpenFile + 4); romfsRedirPatchCustomPath = pathAddress; romfsRedirPatchFsMountArchive = 0x100000 + fsMountArchive; diff --git a/sysmodules/loader/source/romfsredir.s b/sysmodules/loader/source/romfsredir.s index b31a3dd..20e9f64 100644 --- a/sysmodules/loader/source/romfsredir.s +++ b/sysmodules/loader/source/romfsredir.s @@ -23,7 +23,7 @@ romfsRedirPatch: .word 0xdead0002 @ Substituted opcode .global romfsRedirPatchHook2 romfsRedirPatchHook2: - .word 0xdead0002 @ Branch to hooked function + .word 0xdead0003 @ Branch to hooked function @ Mounts the archive and registers it as 'lf:' mountArchive: @@ -31,7 +31,7 @@ romfsRedirPatch: bne romfsRedirPatchSubstituted1 stmfd sp!, {r0-r4, lr} sub sp, sp, #4 - adr r1, romfsRedirPatchArchiveId + ldr r1, romfsRedirPatchArchiveId mov r0, sp ldr r4, romfsRedirPatchFsMountArchive blx r4 From 5d3585a33d4365664faa8bead3cd2a1f2967b397 Mon Sep 17 00:00:00 2001 From: TuxSH Date: Sun, 21 Apr 2019 18:00:29 +0200 Subject: [PATCH 5/5] fix gdb control C regression --- sysmodules/rosalina/source/gdb.c | 5 --- sysmodules/rosalina/source/gdb/debug.c | 3 ++ sysmodules/rosalina/source/gdb/server.c | 46 ++++++++++++++++--------- 3 files changed, 33 insertions(+), 21 deletions(-) diff --git a/sysmodules/rosalina/source/gdb.c b/sysmodules/rosalina/source/gdb.c index b33f991..3a0c144 100644 --- a/sysmodules/rosalina/source/gdb.c +++ b/sysmodules/rosalina/source/gdb.c @@ -143,9 +143,6 @@ void GDB_DetachFromProcess(GDBContext *ctx) memset(ctx->threadListData, 0, sizeof(ctx->threadListData)); ctx->threadListDataPos = 0; - svcClearEvent(ctx->processAttachedEvent); - ctx->eventToWaitFor = ctx->processAttachedEvent; - //svcSignalEvent(server->statusUpdated); /* @@ -184,8 +181,6 @@ void GDB_DetachFromProcess(GDBContext *ctx) ctx->currentHioRequestTargetAddr = 0; memset(&ctx->currentHioRequest, 0, sizeof(PackedGdbHioRequest)); - - ctx->state = GDB_STATE_CONNECTED; } Result GDB_CreateProcess(GDBContext *ctx, const FS_ProgramInfo *progInfo, u32 launchFlags) diff --git a/sysmodules/rosalina/source/gdb/debug.c b/sysmodules/rosalina/source/gdb/debug.c index e7d6a2c..fca49eb 100644 --- a/sysmodules/rosalina/source/gdb/debug.c +++ b/sysmodules/rosalina/source/gdb/debug.c @@ -45,6 +45,9 @@ static void GDB_DetachImmediatelyExtended(GDBContext *ctx) RecursiveLock_Lock(&ctx->lock); ctx->state = GDB_STATE_DETACHING; + svcClearEvent(ctx->processAttachedEvent); + ctx->eventToWaitFor = ctx->processAttachedEvent; + svcClearEvent(ctx->parent->statusUpdateReceived); svcSignalEvent(ctx->parent->statusUpdated); RecursiveLock_Unlock(&ctx->lock); diff --git a/sysmodules/rosalina/source/gdb/server.c b/sysmodules/rosalina/source/gdb/server.c index 1d5c872..ed00161 100644 --- a/sysmodules/rosalina/source/gdb/server.c +++ b/sysmodules/rosalina/source/gdb/server.c @@ -192,6 +192,8 @@ int GDB_AcceptClient(GDBContext *ctx) int GDB_CloseClient(GDBContext *ctx) { RecursiveLock_Lock(&ctx->lock); + svcClearEvent(ctx->processAttachedEvent); + ctx->eventToWaitFor = ctx->processAttachedEvent; svcClearEvent(ctx->parent->statusUpdateReceived); svcSignalEvent(ctx->parent->statusUpdated); // note: monitor will be waiting for lock RecursiveLock_Unlock(&ctx->lock); @@ -199,8 +201,20 @@ int GDB_CloseClient(GDBContext *ctx) svcWaitSynchronization(ctx->parent->statusUpdateReceived, -1LL); RecursiveLock_Lock(&ctx->lock); - GDB_DetachFromProcess(ctx); + if (ctx->state >= GDB_STATE_ATTACHED) + GDB_DetachFromProcess(ctx); + + ctx->localPort = 0; + ctx->enableExternalMemoryAccess = false; + ctx->flags = 0; ctx->state = GDB_STATE_DISCONNECTED; + + ctx->catchThreadEvents = false; + + memset(&ctx->latestDebugEvent, 0, sizeof(DebugEventInfo)); + memset(ctx->memoryOsInfoXmlData, 0, sizeof(ctx->memoryOsInfoXmlData)); + memset(ctx->processesOsInfoXmlData, 0, sizeof(ctx->processesOsInfoXmlData)); + RecursiveLock_Unlock(&ctx->lock); return 0; } @@ -260,19 +274,7 @@ GDBContext *GDB_GetClient(GDBServer *server, u16 port) void GDB_ReleaseClient(GDBServer *server, GDBContext *ctx) { (void)server; - RecursiveLock_Lock(&ctx->lock); - ctx->localPort = 0; - ctx->enableExternalMemoryAccess = false; - ctx->flags = 0; - ctx->state = GDB_STATE_DISCONNECTED; - - ctx->catchThreadEvents = false; - - memset(&ctx->latestDebugEvent, 0, sizeof(DebugEventInfo)); - memset(ctx->memoryOsInfoXmlData, 0, sizeof(ctx->memoryOsInfoXmlData)); - memset(ctx->processesOsInfoXmlData, 0, sizeof(ctx->processesOsInfoXmlData)); - - RecursiveLock_Unlock(&ctx->lock); + (void)ctx; } static const struct @@ -344,9 +346,20 @@ int GDB_DoPacket(GDBContext *ctx) else ret = 0; - RecursiveLock_Unlock(&ctx->lock); if(ctx->state == GDB_STATE_DETACHING) - return (ctx->flags & GDB_FLAG_EXTENDED_REMOTE) ? ret : -1; + { + if(ctx->flags & GDB_FLAG_EXTENDED_REMOTE) + { + ctx->state = GDB_STATE_CONNECTED; + RecursiveLock_Unlock(&ctx->lock); + return ret; + } + else + { + RecursiveLock_Unlock(&ctx->lock); + return -1; + } + } if((oldFlags & GDB_FLAG_PROCESS_CONTINUING) && !(ctx->flags & GDB_FLAG_PROCESS_CONTINUING)) { @@ -356,5 +369,6 @@ int GDB_DoPacket(GDBContext *ctx) else if(!(oldFlags & GDB_FLAG_PROCESS_CONTINUING) && (ctx->flags & GDB_FLAG_PROCESS_CONTINUING)) svcSignalEvent(ctx->continuedEvent); + RecursiveLock_Unlock(&ctx->lock); return ret; }