Fix Lua panic when error() message is not a string
authorPaul Ouellette <oue.paul18@gmail.com>
Sat, 6 Jun 2020 18:52:26 +0000 (14:52 -0400)
committersfan5 <sfan5@live.de>
Sun, 7 Jun 2020 16:14:40 +0000 (18:14 +0200)
src/script/cpp_api/s_base.cpp

index df07206d7dc1d378ba740929fc8dac97395ba1c4..f965975a37211fbf1a60e1ad6db1ab75f03e8857 100644 (file)
@@ -187,7 +187,9 @@ void ScriptApiBase::loadScript(const std::string &script_path)
        }
        ok = ok && !lua_pcall(L, 0, 0, error_handler);
        if (!ok) {
-               std::string error_msg = readParam<std::string>(L, -1);
+               const char *error_msg = lua_tostring(L, -1);
+               if (!error_msg)
+                       error_msg = "(error object is not a string)";
                lua_pop(L, 2); // Pop error message and error handler
                throw ModError("Failed to load and run script from " +
                                script_path + ":\n" + error_msg);
@@ -219,7 +221,9 @@ void ScriptApiBase::loadModFromMemory(const std::string &mod_name)
        if (ok)
                ok = !lua_pcall(L, 0, 0, error_handler);
        if (!ok) {
-               std::string error_msg = luaL_checkstring(L, -1);
+               const char *error_msg = lua_tostring(L, -1);
+               if (!error_msg)
+                       error_msg = "(error object is not a string)";
                lua_pop(L, 2); // Pop error message and error handler
                throw ModError("Failed to load and run mod \"" +
                                mod_name + "\":\n" + error_msg);