From a0129dbbbff8f26d8058ccc2a378e765e54e9fd4 Mon Sep 17 00:00:00 2001 From: rtri Date: Mon, 2 Sep 2019 17:59:46 +0200 Subject: [PATCH] fix segv if Lua handler is invalid --- rts/Lua/LuaDefs.h | 58 ++++++++++++++++++++++++----------------------- 1 file changed, 30 insertions(+), 28 deletions(-) diff --git a/rts/Lua/LuaDefs.h b/rts/Lua/LuaDefs.h index 85aa5c604c9..243c4e2443e 100644 --- a/rts/Lua/LuaDefs.h +++ b/rts/Lua/LuaDefs.h @@ -85,43 +85,45 @@ namespace { -#define DECL_LOAD_HANDLER(HandlerType, HandlerInstance) \ - bool HandlerType::LoadHandler() { \ - std::lock_guard lk(m_singleton); \ - \ - if (HandlerInstance != nullptr) \ - return (HandlerInstance->IsValid()); \ - if (!HandlerType::CanLoadHandler()) \ - return false; \ - \ - HandlerInstance = new HandlerType(); \ - HandlerInstance->CollectGarbage(true); \ - return (HandlerInstance->IsValid()); \ +#define DECL_LOAD_HANDLER(HandlerType, handlerInst) \ + bool HandlerType::LoadHandler() { \ + std::lock_guard lk(m_singleton); \ + \ + if (handlerInst != nullptr) \ + return (handlerInst->IsValid()); \ + if (!HandlerType::CanLoadHandler()) \ + return false; \ + \ + if (!(handlerInst = new HandlerType())->IsValid()) \ + return false; \ + \ + return (handlerInst->CollectGarbage(true), true); \ } -#define DECL_LOAD_SPLIT_HANDLER(HandlerType, HandlerInstance) \ - bool HandlerType::LoadHandler(bool onlySynced) { \ - std::lock_guard lk(m_singleton); \ - \ - if (HandlerInstance != nullptr) \ - return (HandlerInstance->IsValid()); \ - if (!HandlerType::CanLoadHandler()) \ - return false; \ - \ - HandlerInstance = new HandlerType(onlySynced); \ - HandlerInstance->CollectGarbage(true); \ - return (HandlerInstance->IsValid()); \ +#define DECL_LOAD_SPLIT_HANDLER(HandlerType, handlerInst) \ + bool HandlerType::LoadHandler(bool onlySynced) { \ + std::lock_guard lk(m_singleton); \ + \ + if (handlerInst != nullptr) \ + return (handlerInst->IsValid()); \ + if (!HandlerType::CanLoadHandler()) \ + return false; \ + \ + if (!(handlerInst = new HandlerType(onlySynced))->IsValid()) \ + return false; \ + \ + return (handlerInst->CollectGarbage(true), true); \ } -#define DECL_FREE_HANDLER(HandlerType, HandlerInstance) \ +#define DECL_FREE_HANDLER(HandlerType, handlerInst) \ bool HandlerType::FreeHandler() { \ std::lock_guard lk(m_singleton); \ \ - if (HandlerInstance == nullptr) \ + if (handlerInst == nullptr) \ return false; \ \ - auto* inst = HandlerInstance; \ - HandlerInstance = nullptr; \ + HandlerType* inst = handlerInst; \ + handlerInst = nullptr; \ inst->KillLua(true); \ delete inst; \ return true; \