From c2e857775617e75306bcb98969dd06ee7d0feacb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 13 Jan 2020 23:28:18 +0100 Subject: [PATCH] Loader: If the module range is bad, don't get stuck trying to scan for functions. Better crash immediately (although that's also not ideal). --- Core/HLE/sceKernelModule.cpp | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/Core/HLE/sceKernelModule.cpp b/Core/HLE/sceKernelModule.cpp index ec6c9f96cd..87eeab4b15 100644 --- a/Core/HLE/sceKernelModule.cpp +++ b/Core/HLE/sceKernelModule.cpp @@ -1334,16 +1334,21 @@ static Module *__KernelLoadELFFromPtr(const u8 *ptr, size_t elfSize, u32 loadAdd if (scan && codeSections.empty()) { u32 scanStart = module->textStart; u32 scanEnd = module->textEnd; - // Skip the exports and imports sections, they're not code. - if (scanEnd >= std::min(modinfo->libent, modinfo->libstub)) { - insertSymbols = MIPSAnalyst::ScanForFunctions(scanStart, std::min(modinfo->libent, modinfo->libstub) - 4, insertSymbols); - scanStart = std::min(modinfo->libentend, modinfo->libstubend); + + if (Memory::IsValidRange(scanStart, scanEnd - scanStart)) { + // Skip the exports and imports sections, they're not code. + if (scanEnd >= std::min(modinfo->libent, modinfo->libstub)) { + insertSymbols = MIPSAnalyst::ScanForFunctions(scanStart, std::min(modinfo->libent, modinfo->libstub) - 4, insertSymbols); + scanStart = std::min(modinfo->libentend, modinfo->libstubend); + } + if (scanEnd >= std::max(modinfo->libent, modinfo->libstub)) { + insertSymbols = MIPSAnalyst::ScanForFunctions(scanStart, std::max(modinfo->libent, modinfo->libstub) - 4, insertSymbols); + scanStart = std::max(modinfo->libentend, modinfo->libstubend); + } + insertSymbols = MIPSAnalyst::ScanForFunctions(scanStart, scanEnd, insertSymbols); + } else { + ERROR_LOG(LOADER, "Bad text scan range %08x-%08x", scanStart, scanEnd); } - if (scanEnd >= std::max(modinfo->libent, modinfo->libstub)) { - insertSymbols = MIPSAnalyst::ScanForFunctions(scanStart, std::max(modinfo->libent, modinfo->libstub) - 4, insertSymbols); - scanStart = std::max(modinfo->libentend, modinfo->libstubend); - } - insertSymbols = MIPSAnalyst::ScanForFunctions(scanStart, scanEnd, insertSymbols); } if (scan) {