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;