From f962fb038665b61cbe51871d9a4aca288150dd17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 19 Jan 2025 16:45:48 +0100 Subject: [PATCH] Enable checking the format string, fix some issues --- Core/HLE/HLE.h | 13 ++++++++----- Core/HLE/sceDmac.cpp | 6 +++--- Core/HLE/sceKernelAlarm.cpp | 2 +- Core/HLE/sceKernelHeap.cpp | 13 ++++++------- Core/HLE/sceKernelMemory.cpp | 2 +- Core/HLE/sceKernelModule.cpp | 4 ++-- Core/HLE/sceKernelThread.cpp | 9 +++++---- Core/HLE/scePsmf.cpp | 4 ++-- 8 files changed, 28 insertions(+), 25 deletions(-) diff --git a/Core/HLE/HLE.h b/Core/HLE/HLE.h index 60c872e518..85ffe639e7 100644 --- a/Core/HLE/HLE.h +++ b/Core/HLE/HLE.h @@ -171,18 +171,21 @@ void hleDoLogInternal(Log t, LogLevel level, u64 res, const char *file, int line template [[nodiscard]] -T hleDoLog(Log t, LogLevel level, T res, const char *file, int line, const char *reportTag, char retmask, const char *reason, ...) { +#ifdef __GNUC__ +__attribute__((format(printf, 8, 9))) +#endif +T hleDoLog(Log t, LogLevel level, T res, const char *file, int line, const char *reportTag, char retmask, const char *reasonFmt, ...) { if ((int)level > MAX_LOGLEVEL || !GenericLogEnabled(level, t)) { return res; } char formatted_reason[4096] = {0}; - if (reason != nullptr) { + if (reasonFmt != nullptr) { va_list args; - va_start(args, reason); + va_start(args, reasonFmt); formatted_reason[0] = ':'; formatted_reason[1] = ' '; - vsnprintf(formatted_reason + 2, sizeof(formatted_reason) - 3, reason, args); + vsnprintf(formatted_reason + 2, sizeof(formatted_reason) - 3, reasonFmt, args); formatted_reason[sizeof(formatted_reason) - 1] = '\0'; va_end(args); } @@ -194,7 +197,7 @@ T hleDoLog(Log t, LogLevel level, T res, const char *file, int line, const char } else if (std::is_signed::value) { fmtRes = (s64)res; } - hleDoLogInternal(t, level, fmtRes, file, line, reportTag, retmask, reason, formatted_reason); + hleDoLogInternal(t, level, fmtRes, file, line, reportTag, retmask, reasonFmt, formatted_reason); return res; } diff --git a/Core/HLE/sceDmac.cpp b/Core/HLE/sceDmac.cpp index edac28977c..5e02b1de47 100644 --- a/Core/HLE/sceDmac.cpp +++ b/Core/HLE/sceDmac.cpp @@ -96,14 +96,14 @@ static u32 sceDmacTryMemcpy(u32 dst, u32 src, u32 size) { return hleLogError(Log::HLE, SCE_KERNEL_ERROR_INVALID_SIZE, "invalid size"); } if (!Memory::IsValidAddress(dst) || !Memory::IsValidAddress(src)) { - return hleLogError(Log::HLE, SCE_KERNEL_ERROR_INVALID_POINTER, "invalid address", dst, src, size); + return hleLogError(Log::HLE, SCE_KERNEL_ERROR_INVALID_POINTER, "invalid address"); } if (dst + size >= 0x80000000 || src + size >= 0x80000000 || size >= 0x80000000) { - return hleLogError(Log::HLE, SCE_KERNEL_ERROR_PRIV_REQUIRED, "illegal size", dst, src, size); + return hleLogError(Log::HLE, SCE_KERNEL_ERROR_PRIV_REQUIRED, "illegal size"); } if (dmacMemcpyDeadline > CoreTiming::GetTicks()) { - return hleLogDebug(Log::HLE, SCE_KERNEL_ERROR_BUSY, "busy", dst, src, size); + return hleLogDebug(Log::HLE, SCE_KERNEL_ERROR_BUSY, "busy"); } return hleLogDebug(Log::HLE, __DmacMemcpy(dst, src, size)); diff --git a/Core/HLE/sceKernelAlarm.cpp b/Core/HLE/sceKernelAlarm.cpp index b5d6a41296..5fa76a1986 100644 --- a/Core/HLE/sceKernelAlarm.cpp +++ b/Core/HLE/sceKernelAlarm.cpp @@ -197,7 +197,7 @@ int sceKernelReferAlarmStatus(SceUID uid, u32 infoPtr) u32 error; PSPAlarm *alarm = kernelObjects.Get(uid, error); if (!alarm) { - return hleLogError(Log::sceKernel, error, "invalid alarm", uid, infoPtr); + return hleLogError(Log::sceKernel, error, "invalid alarm"); } if (!Memory::IsValidAddress(infoPtr)) diff --git a/Core/HLE/sceKernelHeap.cpp b/Core/HLE/sceKernelHeap.cpp index a781a2ec0b..66b263d386 100644 --- a/Core/HLE/sceKernelHeap.cpp +++ b/Core/HLE/sceKernelHeap.cpp @@ -76,7 +76,7 @@ static int sceKernelAllocHeapMemory(int heapId, int size) { u32 error; KernelHeap *heap = kernelObjects.Get(heapId, error); if (!heap) - return hleLogError(Log::sceKernel, error, "sceKernelAllocHeapMemory(%d): invalid heapId", heapId); + return hleLogError(Log::sceKernel, error, "invalid heapId"); // There's 8 bytes at the end of every block, reserved. u32 memSize = KERNEL_HEAP_BLOCK_HEADER_SIZE + size; @@ -88,7 +88,7 @@ static int sceKernelDeleteHeap(int heapId) { u32 error; KernelHeap *heap = kernelObjects.Get(heapId, error); if (!heap) - return hleLogError(Log::sceKernel, error, "sceKernelDeleteHeap(%d): invalid heapId", heapId); + return hleLogError(Log::sceKernel, error, "invalid heapId"); // Not using heap->partitionId here for backwards compatibility with old save states. BlockAllocator *allocator = BlockAllocatorFromAddr(heap->address); @@ -124,22 +124,21 @@ static int sceKernelFreeHeapMemory(int heapId, u32 block) { u32 error; KernelHeap* heap = kernelObjects.Get(heapId, error); if (!heap) - return hleLogError(Log::sceKernel, error, "sceKernelFreeHeapMemory(%d): invalid heapId", heapId); + return hleLogError(Log::sceKernel, error, "invalid heapId"); if (block == 0) { - return hleLogSuccessInfoI(Log::sceKernel, 0, "sceKernelFreeHeapMemory(%d): heapId,0: block", heapId); + return hleLogSuccessInfoI(Log::sceKernel, 0, "heapId,0: block"); } if (!heap->alloc.FreeExact(block)) { return hleLogError(Log::sceKernel, SCE_KERNEL_ERROR_INVALID_POINTER, "invalid pointer %08x", block); } - return hleLogSuccessInfoI(Log::sceKernel, 0, "sceKernelFreeHeapMemory(%d): heapId, block", heapId, block); - + return hleLogSuccessInfoI(Log::sceKernel, 0, "heapId, block"); } static int sceKernelAllocHeapMemoryWithOption(int heapId, u32 memSize, u32 paramsPtr) { u32 error; KernelHeap* heap = kernelObjects.Get(heapId, error); if (!heap) - return hleLogError(Log::sceKernel, error, "sceKernelFreeHeapMemory(%d): invalid heapId", heapId); + return hleLogError(Log::sceKernel, error, "invalid heapId"); u32 grain = 4; // 0 is ignored. if (paramsPtr != 0) { diff --git a/Core/HLE/sceKernelMemory.cpp b/Core/HLE/sceKernelMemory.cpp index a17783255b..a9729b9840 100644 --- a/Core/HLE/sceKernelMemory.cpp +++ b/Core/HLE/sceKernelMemory.cpp @@ -707,7 +707,7 @@ int sceKernelDeleteFpl(SceUID uid) u32 error; FPL *fpl = kernelObjects.Get(uid, error); if (!fpl) { - return hleLogDebug(Log::sceKernel, error, "invalid fpl", uid); + return hleLogDebug(Log::sceKernel, error, "invalid fpl"); } bool wokeThreads = __KernelClearFplThreads(fpl, SCE_KERNEL_ERROR_WAIT_DELETE); diff --git a/Core/HLE/sceKernelModule.cpp b/Core/HLE/sceKernelModule.cpp index 3cb20cc50f..fec40ab21d 100644 --- a/Core/HLE/sceKernelModule.cpp +++ b/Core/HLE/sceKernelModule.cpp @@ -2054,7 +2054,7 @@ int sceKernelLoadExec(const char *filename, u32 paramPtr) { s64 size = (s64)info.size; if (!size) { - return hleLogError(Log::Loader, SCE_KERNEL_ERROR_ILLEGAL_OBJECT, "File is size 0", filename); + return hleLogError(Log::Loader, SCE_KERNEL_ERROR_ILLEGAL_OBJECT, "File is size 0"); } DEBUG_LOG(Log::sceModule, "sceKernelLoadExec(name=%s,...): loading %s", filename, exec_filename.c_str()); @@ -2549,7 +2549,7 @@ u32 sceKernelFindModuleByName(const char *name) } } } - return hleLogWarning(Log::sceModule, 0, "Module Not Found", name); + return hleLogWarning(Log::sceModule, 0, "Module Not Found"); } static u32 sceKernelLoadModuleByID(u32 id, u32 flags, u32 lmoptionPtr) diff --git a/Core/HLE/sceKernelThread.cpp b/Core/HLE/sceKernelThread.cpp index 47baf6cf63..cdb566bf71 100644 --- a/Core/HLE/sceKernelThread.cpp +++ b/Core/HLE/sceKernelThread.cpp @@ -2936,15 +2936,16 @@ int sceKernelReferCallbackStatus(SceUID cbId, u32 statusAddr) { u32 sceKernelExtendThreadStack(u32 size, u32 entryAddr, u32 entryParameter) { - if (size < 512) - return hleReportError(Log::sceKernel, SCE_KERNEL_ERROR_ILLEGAL_STACK_SIZE, "xxx", "stack size too small"); + if (size < 512) { + return hleReportError(Log::sceKernel, SCE_KERNEL_ERROR_ILLEGAL_STACK_SIZE, "stack size too small"); + } PSPThread *thread = __GetCurrentThread(); if (!thread) - return hleReportError(Log::sceKernel, -1, "xxx", "not on a thread?"); + return hleReportError(Log::sceKernel, -1, "not on a thread?"); if (!thread->PushExtendedStack(size)) - return hleReportError(Log::sceKernel, SCE_KERNEL_ERROR_NO_MEMORY, "xxx", "could not allocate new stack"); + return hleReportError(Log::sceKernel, SCE_KERNEL_ERROR_NO_MEMORY, "could not allocate new stack"); // The stack has been changed now, so it's do or die time. diff --git a/Core/HLE/scePsmf.cpp b/Core/HLE/scePsmf.cpp index 291ce2d31c..19212665af 100644 --- a/Core/HLE/scePsmf.cpp +++ b/Core/HLE/scePsmf.cpp @@ -975,7 +975,7 @@ static u32 scePsmfVerifyPsmf(u32 psmfAddr) } int version = Memory::Read_U32(psmfAddr + PSMF_STREAM_VERSION_OFFSET); if (version < 0) { - return hleLogError(Log::ME, ERROR_PSMF_NOT_FOUND, "bad version %08x", psmfAddr, version); + return hleLogError(Log::ME, ERROR_PSMF_NOT_FOUND, "bad version at %08x: %d", psmfAddr + PSMF_STREAM_VERSION_OFFSET, version); } // Kurohyou 2 (at least the demo) uses an uninitialized value that happens to be zero on the PSP. // It appears to be written by scePsmfVerifyPsmf(), so we write some bytes into the stack here. @@ -1997,7 +1997,7 @@ static int __PsmfPlayerFinish(u32 psmfPlayer) { return hleLogError(Log::ME, ERROR_PSMFPLAYER_INVALID_STATUS); } if (psmfplayer->status != PSMF_PLAYER_STATUS_PLAYING) { - return hleReportError(Log::ME, ERROR_PSMFPLAYER_INVALID_STATUS, "unexpected status %d", psmfPlayer, psmfplayer->status); + return hleReportError(Log::ME, ERROR_PSMFPLAYER_INVALID_STATUS, "unexpected status %d", psmfplayer->status); } psmfplayer->status = PSMF_PLAYER_STATUS_PLAYING_FINISHED;