diff --git a/src/lua/utils.c b/src/lua/utils.c index bf9508f41412794cc1a4540f3322457bee577f83..a48d2c96475b4fb66b7fec03f9f671bd09899b43 100644 --- a/src/lua/utils.c +++ b/src/lua/utils.c @@ -910,7 +910,15 @@ lbox_error(lua_State *L) { struct error *e = diag_last_error(&fiber()->diag); assert(e != NULL); + /* + * gh-1955 luaL_pusherror allocates Lua objects, thus it may trigger + * GC. GC may invoke finalizers which are arbitrary Lua code, + * potentially invalidating last error object, hence error_ref + * below. + */ + error_ref(e); luaL_pusherror(L, e); + error_unref(e); lua_error(L); assert(0); /* unreachable */ return 0;