lua

A copy of the Lua development repository
Log | Files | Refs | README

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:
Mldo.c | 2+-
Mtestes/cstack.lua | 16++++++++++++++++
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")