From 12198f925539151e6519aa12bdc7d3c8dbc63809 Mon Sep 17 00:00:00 2001 From: Stephen Miller <56742918+StevenMiller123@users.noreply.github.com> Date: Mon, 23 Jun 2025 03:32:43 -0500 Subject: [PATCH] libkernel: Check returned module in sceKernelGetModuleInfoFromAddr (#3147) * Error if the module doesn't exist Fixes another thing kalaposfos found * Fix error returns Based on 11.00 libkernel decomp. --- src/core/libraries/kernel/process.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/core/libraries/kernel/process.cpp b/src/core/libraries/kernel/process.cpp index 8a37e78d5..e22509a3a 100644 --- a/src/core/libraries/kernel/process.cpp +++ b/src/core/libraries/kernel/process.cpp @@ -103,7 +103,7 @@ s32 PS4_SYSV_ABI sceKernelGetModuleInfoForUnwind(VAddr addr, s32 flags, auto* linker = Common::Singleton::Instance(); auto* module = linker->FindByAddress(addr); if (!module) { - return ORBIS_KERNEL_ERROR_EFAULT; + return ORBIS_KERNEL_ERROR_ESRCH; } const auto mod_info = module->GetModuleInfoEx(); @@ -118,11 +118,23 @@ s32 PS4_SYSV_ABI sceKernelGetModuleInfoForUnwind(VAddr addr, s32 flags, return ORBIS_OK; } -int PS4_SYSV_ABI sceKernelGetModuleInfoFromAddr(VAddr addr, int flags, +s32 PS4_SYSV_ABI sceKernelGetModuleInfoFromAddr(VAddr addr, s32 flags, Core::OrbisKernelModuleInfoEx* info) { + if (flags >= 3) { + std::memset(info, 0, sizeof(Core::OrbisKernelModuleInfoEx)); + return ORBIS_KERNEL_ERROR_EINVAL; + } + if (info == nullptr) { + return ORBIS_KERNEL_ERROR_EFAULT; + } + LOG_INFO(Lib_Kernel, "called addr = {:#x}, flags = {:#x}", addr, flags); auto* linker = Common::Singleton::Instance(); auto* module = linker->FindByAddress(addr); + if (!module) { + return ORBIS_KERNEL_ERROR_ESRCH; + } + *info = module->GetModuleInfoEx(); return ORBIS_OK; }