aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2025-01-16 16:25:11 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2025-01-16 16:25:11 -0300
commitf5e55be2a0ce64066c1b0554675633b92c91fafb (patch)
treeef50204da94f49c8f788aad5f94557ed873b1fb6
parent9f0c0fe0de64bc41efea73a2da881ff0a1036a03 (diff)
downloadlua-f5e55be2a0ce64066c1b0554675633b92c91fafb.tar.gz
lua-f5e55be2a0ce64066c1b0554675633b92c91fafb.tar.bz2
lua-f5e55be2a0ce64066c1b0554675633b92c91fafb.zip
Bug: Missing error status in panic functionv5.4
'luaD_throw' may call 'luaE_resetthread', which returns an error code but clears 'L->status'; so, 'luaD_throw' should set that status again.
-rw-r--r--ldo.c1
-rw-r--r--ltests.c3
-rw-r--r--testes/api.lua4
3 files changed, 8 insertions, 0 deletions
diff --git a/ldo.c b/ldo.c
index ea052950..958b1b7d 100644
--- a/ldo.c
+++ b/ldo.c
@@ -120,6 +120,7 @@ l_noret luaD_throw (lua_State *L, int errcode) {
120 else { /* thread has no error handler */ 120 else { /* thread has no error handler */
121 global_State *g = G(L); 121 global_State *g = G(L);
122 errcode = luaE_resetthread(L, errcode); /* close all upvalues */ 122 errcode = luaE_resetthread(L, errcode); /* close all upvalues */
123 L->status = errcode;
123 if (g->mainthread->errorJmp) { /* main thread has a handler? */ 124 if (g->mainthread->errorJmp) { /* main thread has a handler? */
124 setobjs2s(L, g->mainthread->top.p++, L->top.p - 1); /* copy error obj. */ 125 setobjs2s(L, g->mainthread->top.p++, L->top.p - 1); /* copy error obj. */
125 luaD_throw(g->mainthread, errcode); /* re-throw in main thread */ 126 luaD_throw(g->mainthread, errcode); /* re-throw in main thread */
diff --git a/ltests.c b/ltests.c
index a27cdb07..af0f43e2 100644
--- a/ltests.c
+++ b/ltests.c
@@ -1655,6 +1655,9 @@ static int runC (lua_State *L, lua_State *L1, const char *pc) {
1655 int level = getnum; 1655 int level = getnum;
1656 luaL_traceback(L1, L1, msg, level); 1656 luaL_traceback(L1, L1, msg, level);
1657 } 1657 }
1658 else if EQ("threadstatus") {
1659 lua_pushstring(L1, statcodes[lua_status(L1)]);
1660 }
1658 else if EQ("return") { 1661 else if EQ("return") {
1659 int n = getnum; 1662 int n = getnum;
1660 if (L1 != L) { 1663 if (L1 != L) {
diff --git a/testes/api.lua b/testes/api.lua
index 752ff18f..eab3059b 100644
--- a/testes/api.lua
+++ b/testes/api.lua
@@ -399,6 +399,10 @@ do
399 -- trivial error 399 -- trivial error
400 assert(T.checkpanic("pushstring hi; error") == "hi") 400 assert(T.checkpanic("pushstring hi; error") == "hi")
401 401
402 -- thread status inside panic (bug in 5.4.4)
403 assert(T.checkpanic("pushstring hi; error", "threadstatus; return 2") ==
404 "ERRRUN")
405
402 -- using the stack inside panic 406 -- using the stack inside panic
403 assert(T.checkpanic("pushstring hi; error;", 407 assert(T.checkpanic("pushstring hi; error;",
404 [[checkstack 5 XX 408 [[checkstack 5 XX