From f537f4943c133aa86e721f3dca706fcad68577d5 Mon Sep 17 00:00:00 2001 From: Ilari Liusvaara Date: Sun, 5 Apr 2020 20:55:44 +0300 Subject: [PATCH] Lua: Guard against Lua returning non-string error Turns out that if Lua throws e.g. a table as error, tostring (and tolstring) returns NULL. And trying to print NULL into message stream causes it to hang). Guard against tolstring returning NULL, and print (null) instead of trying to print the NULL pointer. --- include/library/lua-base.hpp | 14 ++++++++++++++ src/lua/ibind.cpp | 2 +- src/lua/lua.cpp | 7 ++++--- src/lua/memory.cpp | 2 +- 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/include/library/lua-base.hpp b/include/library/lua-base.hpp index 0902bd12..8ccbdbaf 100644 --- a/include/library/lua-base.hpp +++ b/include/library/lua-base.hpp @@ -319,6 +319,20 @@ public: return std::string(f, f + len); } /** + * Read slot as string. + * + * Parameter argindex: The stack index. + * Returns: The string. + */ + std::string as_string(int argindex) + { + if(isnone(argindex)) return "(none)"; + size_t len; + const char* f = lua_tolstring(lua_handle, argindex, &len); + if(!f) return "(null)"; + return std::string(f, f + len); + } +/** * Get a boolean argument. * * Parameter argindex: The stack index. diff --git a/src/lua/ibind.cpp b/src/lua/ibind.cpp index 7abe08e8..bdf5664f 100644 --- a/src/lua/ibind.cpp +++ b/src/lua/ibind.cpp @@ -37,7 +37,7 @@ public: int r = L.pcall(1, 0, 0); std::string err; if(r == LUA_ERRRUN) - err = L.get_string(-1, "Lua command callback"); + err = L.as_string(-1); else if(r == LUA_ERRMEM) err = "Out of memory"; else if(r == LUA_ERRERR) diff --git a/src/lua/lua.cpp b/src/lua/lua.cpp index 519beceb..71f5ed93 100644 --- a/src/lua/lua.cpp +++ b/src/lua/lua.cpp @@ -533,8 +533,7 @@ bool lua_state::run_lua_fragment() return false; int t = L.load(read_lua_fragment, &luareader_fragment, "run_lua_fragment", "t"); if(t == LUA_ERRSYNTAX) { - messages << "Can't run Lua: Internal syntax error: " << L.tostring(-1) - << std::endl; + messages << "Can't run Lua: Internal syntax error: " << L.as_string(-1) << std::endl; L.pop(1); return false; } @@ -547,7 +546,9 @@ bool lua_state::run_lua_fragment() int r = L.pcall(0, 0, 0); recursive_flag = false; if(r == LUA_ERRRUN) { - messages << "Error running Lua hunk: " << L.tostring(-1) << std::endl; + auto msgptr = L.tostring(-1); + if(!msgptr) msgptr = "(null)"; + messages << "Error running Lua hunk: " << L.as_string(-1) << std::endl; L.pop(1); result = false; } diff --git a/src/lua/memory.cpp b/src/lua/memory.cpp index c7b7b4fd..36615eb0 100644 --- a/src/lua/memory.cpp +++ b/src/lua/memory.cpp @@ -178,7 +178,7 @@ namespace if(!ret) return; switch(ret) { case LUA_ERRRUN: - messages << "Error in Lua memory callback: " << L.get_string(-1, "errhnd") << std::endl; + messages << "Error in Lua memory callback: " << L.as_string(-1) << std::endl; L.pop(1); return; case LUA_ERRMEM: -- 2.11.4.GIT