From b529aefc531276775f8827052d5594749232cf07 Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Wed, 12 Jun 2024 16:02:01 -0300 Subject: [PATCH] Bug: luaL_traceback may need more than 5 stack slots --- lauxlib.c | 1 + ltests.c | 5 +++++ testes/errors.lua | 15 ++++++++++++++- 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/lauxlib.c b/lauxlib.c index d742fd27..5f8e8f42 100644 --- a/lauxlib.c +++ b/lauxlib.c @@ -80,6 +80,7 @@ static int pushglobalfuncname (lua_State *L, lua_Debug *ar) { int top = lua_gettop(L); lua_getinfo(L, "f", ar); /* push function */ lua_getfield(L, LUA_REGISTRYINDEX, LUA_LOADED_TABLE); + luaL_checkstack(L, 6, "not enough stack"); /* slots for 'findfield' */ if (findfield(L, top + 1, 2)) { const char *name = lua_tostring(L, -1); if (strncmp(name, LUA_GNAME ".", 3) == 0) { /* name start with '_G.'? */ diff --git a/ltests.c b/ltests.c index 57df10e1..1f69fe03 100644 --- a/ltests.c +++ b/ltests.c @@ -1733,6 +1733,11 @@ static int runC (lua_State *L, lua_State *L1, const char *pc) { int nres; status = lua_resume(lua_tothread(L1, i), L, getnum, &nres); } + else if EQ("traceback") { + const char *msg = getstring; + int level = getnum; + luaL_traceback(L1, L1, msg, level); + } else if EQ("return") { int n = getnum; if (L1 != L) { diff --git a/testes/errors.lua b/testes/errors.lua index 01cfe906..80d91a92 100644 --- a/testes/errors.lua +++ b/testes/errors.lua @@ -91,7 +91,7 @@ end if not T then (Message or print) - ('\n >>> testC not active: skipping memory message test <<<\n') + ('\n >>> testC not active: skipping tests for messages in C <<<\n') else print "testing memory error message" local a = {} @@ -104,6 +104,19 @@ else end) T.totalmem(0) assert(not st and msg == "not enough" .. " memory") + + -- stack space for luaL_traceback (bug in 5.4.6) + local res = T.testC[[ + # push 16 elements on the stack + pushnum 1; pushnum 1; pushnum 1; pushnum 1; pushnum 1; + pushnum 1; pushnum 1; pushnum 1; pushnum 1; pushnum 1; + pushnum 1; pushnum 1; pushnum 1; pushnum 1; pushnum 1; + pushnum 1; + # traceback should work with 4 remaining slots + traceback xuxu 1; + return 1 + ]] + assert(string.find(res, "xuxu.-main chunk")) end