2
0
Эх сурвалжийг харах

Fixed bug: wrong stack limit when entering a coroutine

When entering a coroutine, the computation of nCcalls added 'from->nci'
to correct for preallocated CallInfos, but 'nci' includes also the
Callinfos already used.
Roberto Ierusalimschy 5 жил өмнө
parent
commit
e1d8770f12
2 өөрчлөгдсөн 17 нэмэгдсэн , 1 устгасан
  1. 1 1
      ldo.c
  2. 16 0
      testes/cstack.lua

+ 1 - 1
ldo.c

@@ -674,7 +674,7 @@ LUA_API int lua_resume (lua_State *L, lua_State *from, int nargs,
   if (from == NULL)
     L->nCcalls = CSTACKTHREAD;
   else  /* correct 'nCcalls' for this thread */
-    L->nCcalls = getCcalls(from) + from->nci - L->nci - CSTACKCF;
+    L->nCcalls = getCcalls(from) - L->nci - CSTACKCF;
   if (L->nCcalls <= CSTACKERR)
     return resume_error(L, "C stack overflow", nargs);
   luai_userstateresume(L, nargs);

+ 16 - 0
testes/cstack.lua

@@ -105,6 +105,22 @@ do  print("testing stack-overflow in recursive 'gsub'")
   print("\tfinal count: ", count)
 end
 
+do   -- bug in 5.4.0
+  print("testing limits in coroutines inside deep calls")
+  count = 0
+  local lim = 1000
+  local function stack (n)
+    progress()
+    if n > 0 then return stack(n - 1) + 1
+    else coroutine.wrap(function ()
+           stack(lim)
+         end)()
+    end
+  end
+
+  print(xpcall(stack, function () return "ok" end, lim))
+end
+
 
 do  print("testing changes in C-stack limit")