Make minetest abort on lua panic
authorRogier <rogier777@gmail.com>
Mon, 25 Jul 2016 16:43:15 +0000 (18:43 +0200)
committerparamat <mat.gregory@virginmedia.com>
Sat, 24 Dec 2016 00:18:45 +0000 (00:18 +0000)
Currently, lua does a regular exit() after a lua panic, which can make
a problem hard to debug. Invoking FATAL_ERROR() instead will print
some useful information, and abort() minetest, so that a debugger can
be used to analyze the situation.

src/script/cpp_api/s_base.cpp
src/script/cpp_api/s_base.h

index 679a517ee0b84c9c4685b9abf69126560ceb05ab..cbe5735a77ae9d657e75eee48478999a8be02207 100644 (file)
@@ -40,6 +40,7 @@ extern "C" {
 
 #include <stdio.h>
 #include <cstdarg>
+#include <sstream>
 
 
 class ModNameStorer
@@ -77,6 +78,8 @@ ScriptApiBase::ScriptApiBase() :
        m_luastack = luaL_newstate();
        FATAL_ERROR_IF(!m_luastack, "luaL_newstate() failed");
 
+       lua_atpanic(m_luastack, &luaPanic);
+
        luaL_openlibs(m_luastack);
 
        // Make the ScriptApiBase* accessible to ModApiBase
@@ -120,6 +123,16 @@ ScriptApiBase::~ScriptApiBase()
        lua_close(m_luastack);
 }
 
+int ScriptApiBase::luaPanic(lua_State *L)
+{
+       std::ostringstream oss;
+       oss << "LUA PANIC: unprotected error in call to Lua API ("
+               << lua_tostring(L, -1) << ")";
+       FATAL_ERROR(oss.str().c_str());
+       // NOTREACHED
+       return 0;
+}
+
 void ScriptApiBase::loadMod(const std::string &script_path,
                const std::string &mod_name)
 {
index f52474f00c75bada14ec9a8d21089b16eaa87f38..c27235255499334ef6c50ff132a8e21bdf39d3cd 100644 (file)
@@ -118,6 +118,8 @@ protected:
 #endif
 
 private:
+       static int luaPanic(lua_State *L);
+
        lua_State*      m_luastack;
 
        Server*         m_server;