commit e1d8770f12542d34a3e32b825c95b93f8a341ee1
parent 0f1cd0eba99ea6d383e75b9ae488d00ad541c210
Author: Roberto Ierusalimschy <roberto@inf.puc-rio.br>
Date: Mon, 13 Jul 2020 13:38:35 -0300
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.
Diffstat:
2 files changed, 17 insertions(+), 1 deletion(-)
diff --git a/ldo.c b/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);
diff --git a/testes/cstack.lua b/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")