commit b529aefc531276775f8827052d5594749232cf07
parent d51022bf9e496ae4a7276b600d2755becc7d4323
Author: Roberto Ierusalimschy <roberto@inf.puc-rio.br>
Date: Wed, 12 Jun 2024 16:01:34 -0300
Bug: luaL_traceback may need more than 5 stack slots
Diffstat:
3 files changed, 20 insertions(+), 1 deletion(-)
diff --git 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
@@ -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
@@ -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