commit a304199836ef37af6912a1da6f9b6cad33466a84
parent 6d7cd31feec58011a593cf732274a33dcc1bcb53
Author: Roberto Ierusalimschy <roberto@inf.puc-rio.br>
Date: Wed, 17 Jun 2020 10:36:15 -0300
Detail in 'lua_resetthread'
'lua_resetthread' should reset the CallInfo list before calling
'luaF_close'. luaF_close can call functions, and those functions
should not run with dead functions still in the CallInfo list.
Diffstat:
1 file changed, 4 insertions(+), 5 deletions(-)
diff --git a/lstate.c b/lstate.c
@@ -362,19 +362,18 @@ int lua_resetthread (lua_State *L) {
CallInfo *ci;
int status;
lua_lock(L);
- ci = &L->base_ci;
- status = luaF_close(L, L->stack, CLOSEPROTECT);
+ L->ci = ci = &L->base_ci; /* unwind CallInfo list */
setnilvalue(s2v(L->stack)); /* 'function' entry for basic 'ci' */
+ ci->func = L->stack;
+ ci->callstatus = CIST_C;
+ status = luaF_close(L, L->stack, CLOSEPROTECT);
if (status != CLOSEPROTECT) /* real errors? */
luaD_seterrorobj(L, status, L->stack + 1);
else {
status = LUA_OK;
L->top = L->stack + 1;
}
- ci->callstatus = CIST_C;
- ci->func = L->stack;
ci->top = L->top + LUA_MINSTACK;
- L->ci = ci;
L->status = status;
lua_unlock(L);
return status;