From e8a9615204c0410c11678723ab3e6fe679f99683 Mon Sep 17 00:00:00 2001 From: Rtur2003 Date: Sun, 7 Dec 2025 19:07:07 +0300 Subject: [PATCH] Prevented longjmp into an uninitialised buffer during plugin faults by tracking when the hook jump buffer is actually primed; a missing/invalid buffer now skips the jump and falls back to crash reporting --- src/managers/HookSystemManager.cpp | 5 +++++ src/managers/HookSystemManager.hpp | 1 + 2 files changed, 6 insertions(+) diff --git a/src/managers/HookSystemManager.cpp b/src/managers/HookSystemManager.cpp index a5623f08b..26507f32f 100644 --- a/src/managers/HookSystemManager.cpp +++ b/src/managers/HookSystemManager.cpp @@ -50,6 +50,7 @@ void CHookSystemManager::emit(std::vector* const callbacks, SCal continue; try { + m_hookFaultJumpBufReady = true; if (!setjmp(m_hookFaultJumpBuf)) { if (SP fn = cb.fn.lock()) (*fn)(fn.get(), info, data); @@ -63,7 +64,11 @@ void CHookSystemManager::emit(std::vector* const callbacks, SCal // TODO: this works only once...? faultyHandles.push_back(cb.handle); Debug::log(ERR, "[hookSystem] Hook from plugin {:x} caused a SIGSEGV, queueing for unloading.", rc(cb.handle)); + } catch (...) { + faultyHandles.push_back(cb.handle); + Debug::log(ERR, "[hookSystem] Hook from plugin {:x} caused an unknown fault, queueing for unloading.", rc(cb.handle)); } + m_hookFaultJumpBufReady = false; } if (needsDeadCleanup) diff --git a/src/managers/HookSystemManager.hpp b/src/managers/HookSystemManager.hpp index 647e96703..c5ac9df9a 100644 --- a/src/managers/HookSystemManager.hpp +++ b/src/managers/HookSystemManager.hpp @@ -51,6 +51,7 @@ class CHookSystemManager { std::vector* getVecForEvent(const std::string& event); bool m_currentEventPlugin = false; + bool m_hookFaultJumpBufReady = false; jmp_buf m_hookFaultJumpBuf; private: