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.
This commit is contained in:
Ilari Liusvaara 2020-04-05 20:55:44 +03:00
parent 1b582c8fbd
commit f537f4943c
4 changed files with 20 additions and 5 deletions

View file

@ -318,6 +318,20 @@ public:
(stringfmt() << "argument #" << argindex << " to " << fname << " must be string").throwex();
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.
*

View file

@ -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)

View file

@ -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;
}

View file

@ -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: