From a304199836ef37af6912a1da6f9b6cad33466a84 Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Wed, 17 Jun 2020 10:36:42 -0300 Subject: 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. --- lstate.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/lstate.c b/lstate.c index d2e924d5..4434211a 100644 --- 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; -- cgit v1.2.3-55-g6feb