diff --git a/lstate.c b/lstate.c index 92d5165a..d4bc53eb 100644 --- a/lstate.c +++ b/lstate.c @@ -388,7 +388,7 @@ LUA_API lua_State *lua_newstate (lua_Alloc f, void *ud) { preinit_thread(L, g); g->allgc = obj2gco(L); /* by now, only object is the main thread */ L->next = NULL; - g->Cstacklimit = L->nCcalls = LUAI_MAXCSTACK; + g->Cstacklimit = L->nCcalls = LUAI_MAXCSTACK + CSTACKERR; g->frealloc = f; g->ud = ud; g->warnf = NULL; diff --git a/ltests.h b/ltests.h index 0ae6afc4..8c8de476 100644 --- a/ltests.h +++ b/ltests.h @@ -31,7 +31,7 @@ /* compiled with -O0, Lua uses a lot of C stack space... */ #undef LUAI_MAXCSTACK -#define LUAI_MAXCSTACK (400 + CSTACKERR) +#define LUAI_MAXCSTACK 400 /* to avoid warnings, and to make sure value is really unused */ #define UNUSED(x) (x=0, (void)(x)) diff --git a/luaconf.h b/luaconf.h index 39840e39..72018855 100644 --- a/luaconf.h +++ b/luaconf.h @@ -47,7 +47,7 @@ ** (It will crash with a limit too high.) */ #if !defined(LUAI_MAXCSTACK) -#define LUAI_MAXCSTACK 2200 +#define LUAI_MAXCSTACK 2000 #endif diff --git a/testes/cstack.lua b/testes/cstack.lua index c7aa740f..2a55ce21 100644 --- a/testes/cstack.lua +++ b/testes/cstack.lua @@ -4,15 +4,29 @@ local debug = require "debug" print"testing C-stack overflow detection" - -local origlimit = debug.setCstacklimit(400) -print("current stack limit: " .. origlimit) -debug.setCstacklimit(origlimit) +print"If this test craches, see its file ('cstack.lua')" -- Segmentation faults in these tests probably result from a C-stack --- overflow. To avoid these errors, recompile Lua with a smaller --- value for the constant 'LUAI_MAXCCALLS' or else ensure a larger --- stack for the program. +-- overflow. To avoid these errors, you can use the function +-- 'debug.setCstacklimit' to set a smaller limit for the use of +-- C stack by Lua. After finding a reliable limit, you might want +-- to recompile Lua with this limit as the value for +-- the constant 'LUAI_MAXCCALLS', which defines the default limit. +-- (The default limit is printed by this test.) +-- Alternatively, you can ensure a larger stack for the program. + +-- For Linux, a limit up to 30_000 seems Ok. Windows cannot go much +-- higher than 2_000. + + +local origlimit = debug.setCstacklimit(400) +print("default stack limit: " .. origlimit) + +-- change this value for different limits for this test suite +local currentlimit = origlimit +debug.setCstacklimit(currentlimit) +print("current stack limit: " .. currentlimit) + local function checkerror (msg, f, ...) local s, err = pcall(f, ...) @@ -104,7 +118,7 @@ do print("testing changes in C-stack limit") return n end - assert(debug.setCstacklimit(400) == origlimit) + assert(debug.setCstacklimit(400) == currentlimit) local lim400 = check() -- a very low limit (given that the several calls to arive here) local lowlimit = 38