瀏覽代碼

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.
Roberto Ierusalimschy 5 年之前
父節點
當前提交
a304199836
共有 1 個文件被更改,包括 4 次插入5 次删除
  1. 4 5
      lstate.c

+ 4 - 5
lstate.c

@@ -362,19 +362,18 @@ int lua_resetthread (lua_State *L) {
   CallInfo *ci;
   CallInfo *ci;
   int status;
   int status;
   lua_lock(L);
   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' */
   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? */
   if (status != CLOSEPROTECT)  /* real errors? */
     luaD_seterrorobj(L, status, L->stack + 1);
     luaD_seterrorobj(L, status, L->stack + 1);
   else {
   else {
     status = LUA_OK;
     status = LUA_OK;
     L->top = L->stack + 1;
     L->top = L->stack + 1;
   }
   }
-  ci->callstatus = CIST_C;
-  ci->func = L->stack;
   ci->top = L->top + LUA_MINSTACK;
   ci->top = L->top + LUA_MINSTACK;
-  L->ci = ci;
   L->status = status;
   L->status = status;
   lua_unlock(L);
   lua_unlock(L);
   return status;
   return status;