Clean up stack after script_get_backtrace (#7854)
authorMichael Muller <mmuller@enduden.com>
Wed, 28 Nov 2018 19:01:01 +0000 (14:01 -0500)
committerSmallJoker <SmallJoker@users.noreply.github.com>
Wed, 28 Nov 2018 19:01:01 +0000 (20:01 +0100)
script_get_backtrace() was leaving its return value on the stack, corrupting
subsequent lua operations for functions that did not immediately return.

This problem can specifically be observed in the case of multiple "groupcaps"
entries, each of which provides the legacy "maxwear" property.  These cause a
backtrace and thus pollute the stack for the following lua_next() call.

src/script/common/c_internal.cpp

index be9691ef44c42523c8017e98dc75a5f155667fb7..f792b6218126201781a6a234aeda4b55e6f409fc 100644 (file)
@@ -27,7 +27,9 @@ std::string script_get_backtrace(lua_State *L)
 {
        lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_BACKTRACE);
        lua_call(L, 0, 1);
-       return luaL_checkstring(L, -1);
+       std::string result = luaL_checkstring(L, -1);
+       lua_pop(L, 1);
+       return result;
 }
 
 int script_exception_wrapper(lua_State *L, lua_CFunction f)