diff --git a/files_test.patch b/files_test.patch index 035da1b..0cc9b4f 100644 --- a/files_test.patch +++ b/files_test.patch @@ -1,7 +1,9 @@ -Index: lua/files.lua -=================================================================== ---- lua.orig/testes/files.lua -+++ lua/testes/files.lua +--- + testes/files.lua | 12 +++++++++--- + 1 file changed, 9 insertions(+), 3 deletions(-) + +--- a/testes/files.lua ++++ b/testes/files.lua @@ -81,7 +81,7 @@ assert(io.output() ~= io.stdout) if not _port then -- invalid seek @@ -11,7 +13,7 @@ Index: lua/files.lua end assert(io.output():seek() == 0) -@@ -744,7 +744,7 @@ if not _port then +@@ -746,7 +746,7 @@ if not _port then {"exit 129", "exit", 129}, {"kill -s HUP $$", "signal", 1}, {"kill -s KILL $$", "signal", 9}, @@ -20,7 +22,7 @@ Index: lua/files.lua {progname .. ' -e " "', "ok"}, {progname .. ' -e "os.exit(0, true)"', "ok"}, {progname .. ' -e "os.exit(20, true)"', "exit", 20}, -@@ -757,6 +757,9 @@ if not _port then +@@ -759,6 +759,9 @@ if not _port then if v[2] == "ok" then assert(x and y == 'exit' and z == 0) else @@ -30,7 +32,7 @@ Index: lua/files.lua assert(not x and y == v[2]) -- correct status and 'what' -- correct code if known (but always different from 0) assert((v[3] == nil and z > 0) or v[3] == z) -@@ -791,6 +791,7 @@ assert(os.date(string.rep("%d", 1000), t +@@ -793,6 +796,7 @@ assert(os.date(string.rep("%d", 1000), t assert(os.date(string.rep("%", 200)) == string.rep("%", 100)) local function checkDateTable (t) @@ -38,7 +40,7 @@ Index: lua/files.lua _G.D = os.date("*t", t) assert(os.time(D) == t) load(os.date([[assert(D.year==%Y and D.month==%m and D.day==%d and -@@ -806,7 +806,9 @@ if not _port then +@@ -808,7 +812,9 @@ if not _port then checkDateTable(1) checkDateTable(1000) checkDateTable(0x7fffffff) diff --git a/lua-5.4.4-tests.tar.gz b/lua-5.4.4-tests.tar.gz deleted file mode 100644 index 9a141d7..0000000 --- a/lua-5.4.4-tests.tar.gz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:04d28355cd67a2299dfe5708b55a0ff221ccb1a3907a3113cc103ccc05ac6aad -size 134094 diff --git a/lua-5.4.4.tar.gz b/lua-5.4.4.tar.gz deleted file mode 100644 index 7b39052..0000000 --- a/lua-5.4.4.tar.gz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:164c7849653b80ae67bec4b7473b884bf5cc8d2dca05653475ec2ed27b9ebf61 -size 360876 diff --git a/lua-5.4.5-tests.tar.gz b/lua-5.4.5-tests.tar.gz new file mode 100644 index 0000000..226b0f0 --- /dev/null +++ b/lua-5.4.5-tests.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:856103e7298d354d870010b4966ce21281cbf3373abafd50231a98561bca793d +size 136198 diff --git a/lua-5.4.5.tar.gz b/lua-5.4.5.tar.gz new file mode 100644 index 0000000..f8d0b57 --- /dev/null +++ b/lua-5.4.5.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:59df426a3d50ea535a460a452315c4c0d4e1121ba72ff0bdde58c2ef31d6f444 +size 363316 diff --git a/lua-build-system.patch b/lua-build-system.patch index b4d5986..d957a1d 100644 --- a/lua-build-system.patch +++ b/lua-build-system.patch @@ -2,9 +2,15 @@ From: Enrico Tassi , Sergei Golovan + +- Update to 5.4.5: + - this is a bug-fix release. + - Lua 5.4.5 also contains several internal improvements and + includes a revised reference manual +- Remove upstreamed patches: + - luabugs1.patch + - luabugs10.patch + - luabugs11.patch + - luabugs2.patch + - luabugs6.patch + - luabugs7.patch + - luabugs8.patch + - luabugs9.patch + ------------------------------------------------------------------- Tue Apr 4 11:58:56 UTC 2023 - Callum Farmer diff --git a/lua54.spec b/lua54.spec index 2db321e..baa596a 100644 --- a/lua54.spec +++ b/lua54.spec @@ -1,5 +1,5 @@ # -# spec file for package lua54 +# spec file # # Copyright (c) 2023 SUSE LLC # @@ -15,6 +15,7 @@ # Please submit bugfixes or comments via https://bugs.opensuse.org/ # + %global flavor @BUILD_FLAVOR@%{nil} %if "%{flavor}" == "test" %define name_ext -test @@ -26,7 +27,7 @@ %define libname liblua5_4-5 Name: lua54%{name_ext} -Version: 5.4.4 +Version: 5.4.5 Release: 0 Summary: Small Embeddable Language with Procedural Syntax License: GPL-3.0-or-later @@ -44,17 +45,9 @@ Patch2: files_test.patch Patch3: main_test.patch Patch6: shared_link.patch # PATCH-FIX-UPSTREAM luabugsX.patch https://www.lua.org/bugs.html#5.4.4-X -Patch7: luabugs1.patch -Patch8: luabugs2.patch Patch9: luabugs3.patch Patch10: luabugs4.patch Patch11: luabugs5.patch -Patch12: luabugs6.patch -Patch13: luabugs7.patch -Patch14: luabugs8.patch -Patch15: luabugs9.patch -Patch16: luabugs10.patch -Patch17: luabugs11.patch # %if "%{flavor}" == "test" BuildRequires: lua54 @@ -65,7 +58,7 @@ BuildRequires: pkgconfig BuildRequires: readline-devel %endif Requires(post): update-alternatives -Requires(postun): update-alternatives +Requires(postun):update-alternatives Provides: lua = %{version} Obsoletes: lua < %{version} Provides: Lua(API) = %{major_version} @@ -90,7 +83,7 @@ Requires: %{libname} = %{version} Requires: %{name} = %{version} Requires: lua-macros Requires(post): update-alternatives -Requires(postun): update-alternatives +Requires(postun):update-alternatives Provides: lua-devel = %{version} Provides: Lua(devel) = %{major_version} Provides: pkgconfig(lua) = %{version} @@ -186,9 +179,9 @@ includedir=%{_includedir}/lua%{major_version} INSTALL_LMOD=%{_datadir}/lua/%{major_version} INSTALL_CMOD=%{_libdir}/lua/%{major_version} -Name: Lua %{major_version} +Name: Lua %{major_version} Description: An Extensible Extension Language -Version: %{version} +Version: %{version} Libs: -llua%{major_version} -lm Cflags: -I\${includedir} EOF @@ -213,6 +206,7 @@ ln -sf %{_sysconfdir}/alternatives/liblua.so %{buildroot}%{_libdir}/liblua.so touch %{buildroot}%{_sysconfdir}/alternatives/lua.pc ln -sf %{_sysconfdir}/alternatives/lua.pc %{buildroot}%{_libdir}/pkgconfig/lua.pc %else + %check cd testes LD_LIBRARY_PATH=%{_libdir} %{_bindir}/lua%{major_version} all.lua @@ -286,4 +280,5 @@ fi %doc doc/* %endif + %changelog diff --git a/luabugs1.patch b/luabugs1.patch deleted file mode 100644 index 70a3feb..0000000 --- a/luabugs1.patch +++ /dev/null @@ -1,94 +0,0 @@ -From 25b143dd34fb587d1e35290c4b25bc08954800e2 Mon Sep 17 00:00:00 2001 -From: Roberto Ierusalimschy -Date: Mon, 7 Feb 2022 10:16:35 -0300 -Subject: [PATCH] Bug: lua.c assumes that argv has at least one element - ---- - lua.c | 35 +++++++++++++++++++++++------------ - 1 file changed, 23 insertions(+), 12 deletions(-) - -diff --git a/lua.c b/lua.c -index 0f1900444..7f7dc2b22 100644 ---- a/src/lua.c -+++ b/src/lua.c -@@ -177,10 +177,11 @@ static void print_version (void) { - ** to the script (everything after 'script') go to positive indices; - ** other arguments (before the script name) go to negative indices. - ** If there is no script name, assume interpreter's name as base. -+** (If there is no interpreter's name either, 'script' is -1, so -+** table sizes are zero.) - */ - static void createargtable (lua_State *L, char **argv, int argc, int script) { - int i, narg; -- if (script == argc) script = 0; /* no script name? */ - narg = argc - (script + 1); /* number of positive indices */ - lua_createtable(L, narg, script + 1); - for (i = 0; i < argc; i++) { -@@ -268,14 +269,23 @@ static int handle_script (lua_State *L, char **argv) { - - /* - ** Traverses all arguments from 'argv', returning a mask with those --** needed before running any Lua code (or an error code if it finds --** any invalid argument). 'first' returns the first not-handled argument --** (either the script name or a bad argument in case of error). -+** needed before running any Lua code or an error code if it finds any -+** invalid argument. In case of error, 'first' is the index of the bad -+** argument. Otherwise, 'first' is -1 if there is no program name, -+** 0 if there is no script name, or the index of the script name. - */ - static int collectargs (char **argv, int *first) { - int args = 0; - int i; -- for (i = 1; argv[i] != NULL; i++) { -+ if (argv[0] != NULL) { /* is there a program name? */ -+ if (argv[0][0]) /* not empty? */ -+ progname = argv[0]; /* save it */ -+ } -+ else { /* no program name */ -+ *first = -1; -+ return 0; -+ } -+ for (i = 1; argv[i] != NULL; i++) { /* handle arguments */ - *first = i; - if (argv[i][0] != '-') /* not an option? */ - return args; /* stop handling options */ -@@ -316,7 +326,7 @@ static int collectargs (char **argv, int *first) { - return has_error; - } - } -- *first = i; /* no script name */ -+ *first = 0; /* no script name */ - return args; - } - -@@ -609,8 +619,8 @@ static int pmain (lua_State *L) { - char **argv = (char **)lua_touserdata(L, 2); - int script; - int args = collectargs(argv, &script); -+ int optlim = (script > 0) ? script : argc; /* first argv not an option */ - luaL_checkversion(L); /* check that interpreter has correct version */ -- if (argv[0] && argv[0][0]) progname = argv[0]; - if (args == has_error) { /* bad arg? */ - print_usage(argv[script]); /* 'script' has index of bad arg. */ - return 0; -@@ -628,14 +638,15 @@ static int pmain (lua_State *L) { - if (handle_luainit(L) != LUA_OK) /* run LUA_INIT */ - return 0; /* error running LUA_INIT */ - } -- if (!runargs(L, argv, script)) /* execute arguments -e and -l */ -+ if (!runargs(L, argv, optlim)) /* execute arguments -e and -l */ - return 0; /* something failed */ -- if (script < argc && /* execute main script (if there is one) */ -- handle_script(L, argv + script) != LUA_OK) -- return 0; -+ if (script > 0) { /* execute main script (if there is one) */ -+ if (handle_script(L, argv + script) != LUA_OK) -+ return 0; /* interrupt in case of error */ -+ } - if (args & has_i) /* -i option? */ - doREPL(L); /* do read-eval-print loop */ -- else if (script == argc && !(args & (has_e | has_v))) { /* no arguments? */ -+ else if (script < 1 && !(args & (has_e | has_v))) { /* no active option? */ - if (lua_stdin_is_tty()) { /* running in interactive mode? */ - print_version(); - doREPL(L); /* do read-eval-print loop */ diff --git a/luabugs10.patch b/luabugs10.patch deleted file mode 100644 index 64324f8..0000000 --- a/luabugs10.patch +++ /dev/null @@ -1,67 +0,0 @@ -From 02bab9fc258fe1cbc6088b1bd61193499d058eff Mon Sep 17 00:00:00 2001 -From: Roberto Ierusalimschy -Date: Wed, 8 Feb 2023 14:15:41 -0300 -Subject: [PATCH] Bug: Wrong line in error message for arith. errors - -It also causes 'L->top' to be wrong when the error happens, -triggering an 'assert'. ---- - lvm.c | 4 ++++ - testes/errors.lua | 8 ++++++++ - 2 files changed, 12 insertions(+) - -diff --git a/lvm.c b/lvm.c -index 2e84dc63c..8493a770c 100644 ---- a/src/lvm.c -+++ b/src/lvm.c -@@ -1410,6 +1410,7 @@ void luaV_execute (lua_State *L, CallInfo *ci) { - vmbreak; - } - vmcase(OP_MODK) { -+ savestate(L, ci); /* in case of division by 0 */ - op_arithK(L, luaV_mod, luaV_modf); - vmbreak; - } -@@ -1422,6 +1423,7 @@ void luaV_execute (lua_State *L, CallInfo *ci) { - vmbreak; - } - vmcase(OP_IDIVK) { -+ savestate(L, ci); /* in case of division by 0 */ - op_arithK(L, luaV_idiv, luai_numidiv); - vmbreak; - } -@@ -1470,6 +1472,7 @@ void luaV_execute (lua_State *L, CallInfo *ci) { - vmbreak; - } - vmcase(OP_MOD) { -+ savestate(L, ci); /* in case of division by 0 */ - op_arith(L, luaV_mod, luaV_modf); - vmbreak; - } -@@ -1482,6 +1485,7 @@ void luaV_execute (lua_State *L, CallInfo *ci) { - vmbreak; - } - vmcase(OP_IDIV) { /* floor division */ -+ savestate(L, ci); /* in case of division by 0 */ - op_arith(L, luaV_idiv, luai_numidiv); - vmbreak; - } -diff --git a/testes/errors.lua b/testes/errors.lua -index cf0ab5265..bf6f389d2 100644 ---- a/testes/errors.lua -+++ b/testes/errors.lua -@@ -444,6 +444,14 @@ if not b then - end - end]], 5) - -+ -+-- bug in 5.4.0 -+lineerror([[ -+ local a = 0 -+ local b = 1 -+ local c = b % a -+]], 3) -+ - do - -- Force a negative estimate for base line. Error in instruction 2 - -- (after VARARGPREP, GETGLOBAL), with first absolute line information diff --git a/luabugs11.patch b/luabugs11.patch deleted file mode 100644 index 63247ce..0000000 --- a/luabugs11.patch +++ /dev/null @@ -1,77 +0,0 @@ -From ab859fe59b464a038a45552921cb2b23892343af Mon Sep 17 00:00:00 2001 -From: Roberto Ierusalimschy -Date: Fri, 17 Mar 2023 15:52:09 -0300 -Subject: [PATCH] Bug: Loading a corrupted binary file can segfault - -The size of the list of upvalue names are stored separated from the -size of the list of upvalues, but they share the same array. ---- - ldump.c | 8 ++++++-- - lundump.c | 2 ++ - testes/calls.lua | 14 ++++++++++++++ - 3 files changed, 22 insertions(+), 2 deletions(-) - -diff --git a/ldump.c b/ldump.c -index f848b669c..f231691b7 100644 ---- a/src/ldump.c -+++ b/src/ldump.c -@@ -10,6 +10,7 @@ - #include "lprefix.h" - - -+#include - #include - - #include "lua.h" -@@ -55,8 +56,11 @@ static void dumpByte (DumpState *D, int y) { - } - - --/* dumpInt Buff Size */ --#define DIBS ((sizeof(size_t) * 8 / 7) + 1) -+/* -+** 'dumpSize' buffer size: each byte can store up to 7 bits. (The "+6" -+** rounds up the division.) -+*/ -+#define DIBS ((sizeof(size_t) * CHAR_BIT + 6) / 7) - - static void dumpSize (DumpState *D, size_t x) { - lu_byte buff[DIBS]; -diff --git a/lundump.c b/lundump.c -index aba93f828..02aed64fb 100644 ---- a/src/lundump.c -+++ b/src/lundump.c -@@ -248,6 +248,8 @@ static void loadDebug (LoadState *S, Proto *f) { - f->locvars[i].endpc = loadInt(S); - } - n = loadInt(S); -+ if (n != 0) /* does it have debug information? */ -+ n = f->sizeupvalues; /* must be this many */ - for (i = 0; i < n; i++) - f->upvalues[i].name = loadStringN(S, f); - } -diff --git a/testes/calls.lua b/testes/calls.lua -index a19385843..2d562a24a 100644 ---- a/testes/calls.lua -+++ b/testes/calls.lua -@@ -342,6 +342,20 @@ do -- another bug (in 5.4.0) - end - - -+do -- another bug (since 5.2) -+ -- corrupted binary dump: list of upvalue names is larger than number -+ -- of upvalues, overflowing the array of upvalues. -+ local code = -+ "\x1b\x4c\x75\x61\x54\x00\x19\x93\x0d\x0a\x1a\x0a\x04\x08\x08\x78\x56\z -+ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x77\x40\x00\x86\x40\z -+ \x74\x65\x6d\x70\x81\x81\x01\x00\x02\x82\x48\x00\x02\x00\xc7\x00\x01\z -+ \x00\x80\x80\x80\x82\x00\x00\x80\x81\x82\x78\x80\x82\x81\x86\x40\x74\z -+ \x65\x6d\x70" -+ -+ assert(load(code)) -- segfaults in previous versions -+end -+ -+ - x = string.dump(load("x = 1; return x")) - a = assert(load(read1(x), nil, "b")) - assert(a() == 1 and _G.x == 1) diff --git a/luabugs2.patch b/luabugs2.patch deleted file mode 100644 index 8839c1e..0000000 --- a/luabugs2.patch +++ /dev/null @@ -1,43 +0,0 @@ -From 1f3c6f4534c6411313361697d98d1145a1f030fa Mon Sep 17 00:00:00 2001 -From: Roberto Ierusalimschy -Date: Tue, 15 Feb 2022 12:28:46 -0300 -Subject: [PATCH] Bug: Lua can generate wrong code when _ENV is - ---- - lparser.c | 1 + - testes/attrib.lua | 10 ++++++++++ - 2 files changed, 11 insertions(+) - -diff --git a/lparser.c b/lparser.c -index 3abe3d751..a5cd55257 100644 ---- a/src/lparser.c -+++ b/src/lparser.c -@@ -468,6 +468,7 @@ static void singlevar (LexState *ls, expdesc *var) { - expdesc key; - singlevaraux(fs, ls->envn, var, 1); /* get environment variable */ - lua_assert(var->k != VVOID); /* this one must exist */ -+ luaK_exp2anyregup(fs, var); /* but could be a constant */ - codestring(&key, varname); /* key is variable name */ - luaK_indexed(fs, var, &key); /* env[varname] */ - } -diff --git a/testes/attrib.lua b/testes/attrib.lua -index b1076c768..83821c069 100644 ---- a/testes/attrib.lua -+++ b/testes/attrib.lua -@@ -434,6 +434,16 @@ a.aVeryLongName012345678901234567890123456789012345678901234567890123456789 == - 10) - - -+do -+ -- _ENV constant -+ local function foo () -+ local _ENV = 11 -+ X = "hi" -+ end -+ local st, msg = pcall(foo) -+ assert(not st and string.find(msg, "number")) -+end -+ - - -- test of large float/integer indices - diff --git a/luabugs3.patch b/luabugs3.patch index 7a72db4..d963b73 100644 --- a/luabugs3.patch +++ b/luabugs3.patch @@ -4,120 +4,17 @@ Date: Mon, 25 Apr 2022 14:42:51 -0300 Subject: [PATCH] Bug: Wrong code generation in bitwise operations --- - lcode.c | 16 ++++++++++------ - ltests.h | 7 +++++++ - testes/constructs.lua | 25 +++++++++++++++++++++++++ - 3 files changed, 42 insertions(+), 6 deletions(-) + src/lcode.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) -diff --git a/lcode.c b/lcode.c -index 06425a1db..cb724a090 100644 --- a/src/lcode.c +++ b/src/lcode.c -@@ -1391,7 +1391,10 @@ static void finishbinexpval (FuncState *fs, expdesc *e1, expdesc *e2, - */ - static void codebinexpval (FuncState *fs, OpCode op, - expdesc *e1, expdesc *e2, int line) { -- int v2 = luaK_exp2anyreg(fs, e2); /* both operands are in registers */ -+ int v2 = luaK_exp2anyreg(fs, e2); /* make sure 'e2' is in a register */ -+ /* 'e1' must be already in a register or it is a constant */ -+ lua_assert((VNIL <= e1->k && e1->k <= VKSTR) || -+ e1->k == VNONRELOC || e1->k == VRELOC); - lua_assert(OP_ADD <= op && op <= OP_SHR); - finishbinexpval(fs, e1, e2, op, v2, 0, line, OP_MMBIN, - cast(TMS, (op - OP_ADD) + TM_ADD)); -@@ -1478,7 +1481,7 @@ static void codecommutative (FuncState *fs, BinOpr op, - - - /* --** Code bitwise operations; they are all associative, so the function -+** Code bitwise operations; they are all commutative, so the function - ** tries to put an integer constant as the 2nd operand (a K operand). - */ +@@ -1531,7 +1531,7 @@ static void codecommutative (FuncState * static void codebitwise (FuncState *fs, BinOpr opr, -@@ -1486,11 +1489,11 @@ static void codebitwise (FuncState *fs, BinOpr opr, + expdesc *e1, expdesc *e2, int line) { int flip = 0; - int v2; - OpCode op; -- if (e1->k == VKINT && luaK_exp2RK(fs, e1)) { +- if (e1->k == VKINT) { + if (e1->k == VKINT && luaK_exp2K(fs, e1)) { swapexps(e1, e2); /* 'e2' will be the constant operand */ flip = 1; } -- else if (!(e2->k == VKINT && luaK_exp2RK(fs, e2))) { /* no constants? */ -+ else if (!(e2->k == VKINT && luaK_exp2K(fs, e2))) { /* no constants? */ - op = cast(OpCode, opr + OP_ADD); - codebinexpval(fs, op, e1, e2, line); /* all-register opcodes */ - return; -@@ -1551,7 +1554,7 @@ static void codeeq (FuncState *fs, BinOpr opr, expdesc *e1, expdesc *e2) { - op = OP_EQI; - r2 = im; /* immediate operand */ - } -- else if (luaK_exp2RK(fs, e2)) { /* 1st expression is constant? */ -+ else if (luaK_exp2RK(fs, e2)) { /* 2nd expression is constant? */ - op = OP_EQK; - r2 = e2->u.info; /* constant index */ - } -@@ -1611,7 +1614,8 @@ void luaK_infix (FuncState *fs, BinOpr op, expdesc *v) { - case OPR_SHL: case OPR_SHR: { - if (!tonumeral(v, NULL)) - luaK_exp2anyreg(fs, v); -- /* else keep numeral, which may be folded with 2nd operand */ -+ /* else keep numeral, which may be folded or used as an immediate -+ operand */ - break; - } - case OPR_EQ: case OPR_NE: { -diff --git a/ltests.h b/ltests.h -index cb3a0b480..ec520498b 100644 ---- a/testes/ltests/ltests.h -+++ b/testes/ltests/ltests.h -@@ -125,6 +125,13 @@ LUA_API void *debug_realloc (void *ud, void *block, - #define LUAI_USER_ALIGNMENT_T union { char b[sizeof(void*) * 8]; } - - -+/* -+** This one is not compatible with tests for opcode optimizations, -+** as it blocks some optimizations -+#define MAXINDEXRK 0 -+*/ -+ -+ - /* make stack-overflow tests run faster */ - #undef LUAI_MAXSTACK - #define LUAI_MAXSTACK 50000 -diff --git a/testes/constructs.lua b/testes/constructs.lua -index a74a8c041..0d9ec92d7 100644 ---- a/testes/constructs.lua -+++ b/testes/constructs.lua -@@ -103,6 +103,31 @@ do -- test old bug (first name could not be an `upvalue') - local a; function f(x) x={a=1}; x={x=1}; x={G=1} end - end - -+ -+do -- bug since 5.4.0 -+ -- create code with a table using more than 256 constants -+ local code = {"local x = {"} -+ for i = 1, 257 do -+ code[#code + 1] = i .. ".1," -+ end -+ code[#code + 1] = "};" -+ code = table.concat(code) -+ -+ -- add "ret" to the end of that code and checks that -+ -- it produces the expected value "val" -+ local function check (ret, val) -+ local code = code .. ret -+ code = load(code) -+ assert(code() == val) -+ end -+ -+ check("return (1 ~ (2 or 3))", 1 ~ 2) -+ check("return (1 | (2 or 3))", 1 | 2) -+ check("return (1 + (2 or 3))", 1 + 2) -+ check("return (1 << (2 or 3))", 1 << 2) -+end -+ -+ - function f (i) - if type(i) ~= 'number' then return i,'jojo'; end; - if i > 0 then return i, f(i-1); end; diff --git a/luabugs4.patch b/luabugs4.patch index 68f0053..ce3a5f1 100644 --- a/luabugs4.patch +++ b/luabugs4.patch @@ -11,48 +11,16 @@ the message handler), the code should use stack slots with parsimony. This commit fixes the bug "Lua-stack overflow when C stack overflows while handling an error". --- - ldebug.c | 5 ++++- - lvm.c | 6 ++++-- - 2 files changed, 8 insertions(+), 3 deletions(-) + src/lvm.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) -diff --git a/ldebug.c b/ldebug.c -index a716d95e2..fa15eaf68 100644 ---- a/src/ldebug.c -+++ b/src/ldebug.c -@@ -824,8 +824,11 @@ l_noret luaG_runerror (lua_State *L, const char *fmt, ...) { - va_start(argp, fmt); - msg = luaO_pushvfstring(L, fmt, argp); /* format message */ - va_end(argp); -- if (isLua(ci)) /* if Lua function, add source:line information */ -+ if (isLua(ci)) { /* if Lua function, add source:line information */ - luaG_addinfo(L, msg, ci_func(ci)->p->source, getcurrentline(ci)); -+ setobjs2s(L, L->top - 2, L->top - 1); /* remove 'msg' from the stack */ -+ L->top--; -+ } - luaG_errormsg(L); - } - -diff --git a/lvm.c b/lvm.c -index e8c2e9627..cd992aada 100644 --- a/src/lvm.c +++ b/src/lvm.c -@@ -656,8 +656,10 @@ void luaV_concat (lua_State *L, int total) { - /* collect total length and number of strings */ - for (n = 1; n < total && tostring(L, s2v(top - n - 1)); n++) { - size_t l = vslen(s2v(top - n - 1)); -- if (l_unlikely(l >= (MAX_SIZE/sizeof(char)) - tl)) -+ if (l_unlikely(l >= (MAX_SIZE/sizeof(char)) - tl)) { -+ L->top = top - total; /* pop strings to avoid wasting stack */ - luaG_runerror(L, "string length overflow"); -+ } - tl += l; - } - if (tl <= LUAI_MAXSHORTLEN) { /* is result a short string? */ -@@ -672,7 +674,7 @@ void luaV_concat (lua_State *L, int total) { +@@ -674,7 +674,7 @@ void luaV_concat (lua_State *L, int tota setsvalue2s(L, top - n, ts); /* create result */ } - total -= n-1; /* got 'n' strings to create 1 new */ -- L->top -= n-1; /* popped 'n' strings and pushed one */ + total -= n - 1; /* got 'n' strings to create one new */ +- L->top.p -= n - 1; /* popped 'n' strings and pushed one */ + L->top = top - (n - 1); /* popped 'n' strings and pushed one */ } while (total > 1); /* repeat until only 1 result left */ } diff --git a/luabugs5.patch b/luabugs5.patch index 3bf9ca0..5aa983a 100644 --- a/luabugs5.patch +++ b/luabugs5.patch @@ -4,137 +4,16 @@ Date: Wed, 25 May 2022 17:41:39 -0300 Subject: [PATCH] Bug: 'lua_settop' may use an invalid pointer to stack --- - lapi.c | 5 ++--- - ldo.c | 12 ++++++------ - lfunc.c | 5 +++-- - lfunc.h | 2 +- - testes/locals.lua | 22 ++++++++++++++++++++++ - 5 files changed, 34 insertions(+), 12 deletions(-) + src/lfunc.c | 1 + + 1 file changed, 1 insertion(+) -diff --git a/lapi.c b/lapi.c -index 352a385a3..5833c7b0a 100644 ---- a/src/lapi.c -+++ b/src/lapi.c -@@ -197,7 +197,7 @@ LUA_API void lua_settop (lua_State *L, int idx) { - newtop = L->top + diff; - if (diff < 0 && L->tbclist >= newtop) { - lua_assert(hastocloseCfunc(ci->nresults)); -- luaF_close(L, newtop, CLOSEKTOP, 0); -+ newtop = luaF_close(L, newtop, CLOSEKTOP, 0); - } - L->top = newtop; /* correct top only after closing any upvalue */ - lua_unlock(L); -@@ -210,8 +210,7 @@ LUA_API void lua_closeslot (lua_State *L, int idx) { - level = index2stack(L, idx); - api_check(L, hastocloseCfunc(L->ci->nresults) && L->tbclist == level, - "no variable to close at given level"); -- luaF_close(L, level, CLOSEKTOP, 0); -- level = index2stack(L, idx); /* stack may be moved */ -+ level = luaF_close(L, level, CLOSEKTOP, 0); - setnilvalue(s2v(level)); - lua_unlock(L); - } -diff --git a/ldo.c b/ldo.c -index 5aa6d59d4..13498905f 100644 ---- a/src/ldo.c -+++ b/src/ldo.c -@@ -430,14 +430,15 @@ l_sinline void moveresults (lua_State *L, StkId res, int nres, int wanted) { - break; - default: /* two/more results and/or to-be-closed variables */ - if (hastocloseCfunc(wanted)) { /* to-be-closed variables? */ -- ptrdiff_t savedres = savestack(L, res); - L->ci->callstatus |= CIST_CLSRET; /* in case of yields */ - L->ci->u2.nres = nres; -- luaF_close(L, res, CLOSEKTOP, 1); -+ res = luaF_close(L, res, CLOSEKTOP, 1); - L->ci->callstatus &= ~CIST_CLSRET; -- if (L->hookmask) /* if needed, call hook after '__close's */ -+ if (L->hookmask) { /* if needed, call hook after '__close's */ -+ ptrdiff_t savedres = savestack(L, res); - rethook(L, L->ci, nres); -- res = restorestack(L, savedres); /* close and hook can move stack */ -+ res = restorestack(L, savedres); /* hook can move stack */ -+ } - wanted = decodeNresults(wanted); - if (wanted == LUA_MULTRET) - wanted = nres; /* we want all results */ -@@ -654,8 +655,7 @@ static int finishpcallk (lua_State *L, CallInfo *ci) { - else { /* error */ - StkId func = restorestack(L, ci->u2.funcidx); - L->allowhook = getoah(ci->callstatus); /* restore 'allowhook' */ -- luaF_close(L, func, status, 1); /* can yield or raise an error */ -- func = restorestack(L, ci->u2.funcidx); /* stack may be moved */ -+ func = luaF_close(L, func, status, 1); /* can yield or raise an error */ - luaD_seterrorobj(L, status, func); - luaD_shrinkstack(L); /* restore stack size in case of overflow */ - setcistrecst(ci, LUA_OK); /* clear original status */ -diff --git a/lfunc.c b/lfunc.c -index f5889a21d..3ed65de2b 100644 --- a/src/lfunc.c +++ b/src/lfunc.c -@@ -223,9 +223,9 @@ static void poptbclist (lua_State *L) { - - /* - ** Close all upvalues and to-be-closed variables up to the given stack --** level. -+** level. Return restored 'level'. - */ --void luaF_close (lua_State *L, StkId level, int status, int yy) { -+StkId luaF_close (lua_State *L, StkId level, int status, int yy) { - ptrdiff_t levelrel = savestack(L, level); - luaF_closeupval(L, level); /* first, close the upvalues */ - while (L->tbclist >= level) { /* traverse tbc's down to that level */ -@@ -234,6 +234,7 @@ void luaF_close (lua_State *L, StkId level, int status, int yy) { - prepcallclosemth(L, tbc, status, yy); /* close variable */ - level = restorestack(L, levelrel); +@@ -204,6 +204,7 @@ void luaF_closeupval (lua_State *L, StkI + luaC_barrier(L, uv, slot); + } } + return level; } -diff --git a/lfunc.h b/lfunc.h -index dc1cebccd..3d296971e 100644 ---- a/src/lfunc.h -+++ b/src/lfunc.h -@@ -54,7 +54,7 @@ LUAI_FUNC void luaF_initupvals (lua_State *L, LClosure *cl); - LUAI_FUNC UpVal *luaF_findupval (lua_State *L, StkId level); - LUAI_FUNC void luaF_newtbcupval (lua_State *L, StkId level); - LUAI_FUNC void luaF_closeupval (lua_State *L, StkId level); --LUAI_FUNC void luaF_close (lua_State *L, StkId level, int status, int yy); -+LUAI_FUNC StkId luaF_close (lua_State *L, StkId level, int status, int yy); - LUAI_FUNC void luaF_unlinkupval (UpVal *uv); - LUAI_FUNC void luaF_freeproto (lua_State *L, Proto *f); - LUAI_FUNC const char *luaF_getlocalname (const Proto *func, int local_number, -diff --git a/testes/locals.lua b/testes/locals.lua -index 62a88df57..ddb75054f 100644 ---- a/testes/locals.lua -+++ b/testes/locals.lua -@@ -592,6 +592,28 @@ end - - if rawget(_G, "T") then - -+ do -+ -- bug in 5.4.3 -+ -- 'lua_settop' may use a pointer to stack invalidated by 'luaF_close' -+ -+ -- reduce stack size -+ collectgarbage(); collectgarbage(); collectgarbage() -+ -+ -- force a stack reallocation -+ local function loop (n) -+ if n < 400 then loop(n + 1) end -+ end -+ -+ -- close metamethod will reallocate the stack -+ local o = setmetatable({}, {__close = function () loop(0) end}) -+ -+ local script = [[toclose 2; settop 1; return 1]] -+ -+ assert(T.testC(script, o) == script) -+ -+ end -+ -+ - -- memory error inside closing function - local function foo () - local y = func2close(function () T.alloccount() end) diff --git a/luabugs6.patch b/luabugs6.patch deleted file mode 100644 index 2847814..0000000 --- a/luabugs6.patch +++ /dev/null @@ -1,77 +0,0 @@ -From 997f11f54322883c3181225f29d101a597f31730 Mon Sep 17 00:00:00 2001 -From: Roberto Ierusalimschy -Date: Wed, 24 Aug 2022 17:36:47 -0300 -Subject: [PATCH] Bug: 'break' may not properly close variable in a 'for' loop - -Function 'leaveblock' was generating "break" label before removing -variables from the closing block. If 'createlabel' created a 'close' -instruction (which it did when matching a goto/break that exited -the scope of an upvalue), that instruction would use the wrong level. ---- - lparser.c | 16 ++++++++-------- - testes/locals.lua | 20 ++++++++++++++++++++ - 2 files changed, 28 insertions(+), 8 deletions(-) - -diff --git a/lparser.c b/lparser.c -index a5cd55257..fe693b571 100644 ---- a/src/lparser.c -+++ b/src/lparser.c -@@ -674,19 +674,19 @@ static void leaveblock (FuncState *fs) { - LexState *ls = fs->ls; - int hasclose = 0; - int stklevel = reglevel(fs, bl->nactvar); /* level outside the block */ -- if (bl->isloop) /* fix pending breaks? */ -+ removevars(fs, bl->nactvar); /* remove block locals */ -+ lua_assert(bl->nactvar == fs->nactvar); /* back to level on entry */ -+ if (bl->isloop) /* has to fix pending breaks? */ - hasclose = createlabel(ls, luaS_newliteral(ls->L, "break"), 0, 0); -- if (!hasclose && bl->previous && bl->upval) -+ if (!hasclose && bl->previous && bl->upval) /* still need a 'close'? */ - luaK_codeABC(fs, OP_CLOSE, stklevel, 0, 0); -- fs->bl = bl->previous; -- removevars(fs, bl->nactvar); -- lua_assert(bl->nactvar == fs->nactvar); - fs->freereg = stklevel; /* free registers */ - ls->dyd->label.n = bl->firstlabel; /* remove local labels */ -- if (bl->previous) /* inner block? */ -- movegotosout(fs, bl); /* update pending gotos to outer block */ -+ fs->bl = bl->previous; /* current block now is previous one */ -+ if (bl->previous) /* was it a nested block? */ -+ movegotosout(fs, bl); /* update pending gotos to enclosing block */ - else { -- if (bl->firstgoto < ls->dyd->gt.n) /* pending gotos in outer block? */ -+ if (bl->firstgoto < ls->dyd->gt.n) /* still pending gotos? */ - undefgoto(ls, &ls->dyd->gt.arr[bl->firstgoto]); /* error */ - } - } -diff --git a/testes/locals.lua b/testes/locals.lua -index ddb75054f..d50beaa52 100644 ---- a/testes/locals.lua -+++ b/testes/locals.lua -@@ -360,6 +360,26 @@ do - end - - -+do -+ -- bug in 5.4.4: 'break' may generate wrong 'close' instruction when -+ -- leaving a loop block. -+ -+ local closed = false -+ -+ local o1 = setmetatable({}, {__close=function() closed = true end}) -+ -+ local function test() -+ for k, v in next, {}, nil, o1 do -+ local function f() return k end -- create an upvalue -+ break -+ end -+ assert(closed) -+ end -+ -+ test() -+end -+ -+ - do print("testing errors in __close") - - -- original error is in __close diff --git a/luabugs7.patch b/luabugs7.patch deleted file mode 100644 index 3f3062a..0000000 --- a/luabugs7.patch +++ /dev/null @@ -1,118 +0,0 @@ -From a1f77a234a053da46b06d5d4be00ffb30d3eb45b Mon Sep 17 00:00:00 2001 -From: Roberto Ierusalimschy -Date: Tue, 23 Aug 2022 16:06:23 -0300 -Subject: [PATCH] Bug: set correct pause when (re)entering gen. collection. - ---- - lgc.c | 63 +++++++++++++++++++++++++++++------------------------------ - 1 file changed, 31 insertions(+), 32 deletions(-) - -diff --git a/lgc.c b/lgc.c -index 42a73d813..317ea4508 100644 ---- a/src/lgc.c -+++ b/src/lgc.c -@@ -1041,7 +1041,25 @@ void luaC_checkfinalizer (lua_State *L, GCObject *o, Table *mt) { - ** ======================================================= - */ - --static void setpause (global_State *g); -+ -+/* -+** Set the "time" to wait before starting a new GC cycle; cycle will -+** start when memory use hits the threshold of ('estimate' * pause / -+** PAUSEADJ). (Division by 'estimate' should be OK: it cannot be zero, -+** because Lua cannot even start with less than PAUSEADJ bytes). -+*/ -+static void setpause (global_State *g) { -+ l_mem threshold, debt; -+ int pause = getgcparam(g->gcpause); -+ l_mem estimate = g->GCestimate / PAUSEADJ; /* adjust 'estimate' */ -+ lua_assert(estimate > 0); -+ threshold = (pause < MAX_LMEM / estimate) /* overflow? */ -+ ? estimate * pause /* no overflow */ -+ : MAX_LMEM; /* overflow; truncate to maximum */ -+ debt = gettotalbytes(g) - threshold; -+ if (debt > 0) debt = 0; -+ luaE_setdebt(g, debt); -+} - - - /* -@@ -1285,6 +1303,15 @@ static void atomic2gen (lua_State *L, global_State *g) { - } - - -+/* -+** Set debt for the next minor collection, which will happen when -+** memory grows 'genminormul'%. -+*/ -+static void setminordebt (global_State *g) { -+ luaE_setdebt(g, -(cast(l_mem, (gettotalbytes(g) / 100)) * g->genminormul)); -+} -+ -+ - /* - ** Enter generational mode. Must go until the end of an atomic cycle - ** to ensure that all objects are correctly marked and weak tables -@@ -1297,6 +1324,7 @@ static lu_mem entergen (lua_State *L, global_State *g) { - luaC_runtilstate(L, bitmask(GCSpropagate)); /* start new cycle */ - numobjs = atomic(L); /* propagates all and then do the atomic stuff */ - atomic2gen(L, g); -+ setminordebt(g); /* set debt assuming next cycle will be minor */ - return numobjs; - } - -@@ -1342,15 +1370,6 @@ static lu_mem fullgen (lua_State *L, global_State *g) { - } - - --/* --** Set debt for the next minor collection, which will happen when --** memory grows 'genminormul'%. --*/ --static void setminordebt (global_State *g) { -- luaE_setdebt(g, -(cast(l_mem, (gettotalbytes(g) / 100)) * g->genminormul)); --} -- -- - /* - ** Does a major collection after last collection was a "bad collection". - ** -@@ -1422,8 +1441,8 @@ static void genstep (lua_State *L, global_State *g) { - lu_mem numobjs = fullgen(L, g); /* do a major collection */ - if (gettotalbytes(g) < majorbase + (majorinc / 2)) { - /* collected at least half of memory growth since last major -- collection; keep doing minor collections */ -- setminordebt(g); -+ collection; keep doing minor collections. */ -+ lua_assert(g->lastatomic == 0); - } - else { /* bad collection */ - g->lastatomic = numobjs; /* signal that last collection was bad */ -@@ -1449,26 +1468,6 @@ static void genstep (lua_State *L, global_State *g) { - */ - - --/* --** Set the "time" to wait before starting a new GC cycle; cycle will --** start when memory use hits the threshold of ('estimate' * pause / --** PAUSEADJ). (Division by 'estimate' should be OK: it cannot be zero, --** because Lua cannot even start with less than PAUSEADJ bytes). --*/ --static void setpause (global_State *g) { -- l_mem threshold, debt; -- int pause = getgcparam(g->gcpause); -- l_mem estimate = g->GCestimate / PAUSEADJ; /* adjust 'estimate' */ -- lua_assert(estimate > 0); -- threshold = (pause < MAX_LMEM / estimate) /* overflow? */ -- ? estimate * pause /* no overflow */ -- : MAX_LMEM; /* overflow; truncate to maximum */ -- debt = gettotalbytes(g) - threshold; -- if (debt > 0) debt = 0; -- luaE_setdebt(g, debt); --} -- -- - /* - ** Enter first sweep phase. - ** The call to 'sweeptolive' makes the pointer point to an object diff --git a/luabugs8.patch b/luabugs8.patch deleted file mode 100644 index f7dfbc9..0000000 --- a/luabugs8.patch +++ /dev/null @@ -1,148 +0,0 @@ -From a1089b415a3f5c753aa1b40758ffdaf28d5701b0 Mon Sep 17 00:00:00 2001 -From: Roberto Ierusalimschy -Date: Fri, 23 Sep 2022 10:41:16 -0300 -Subject: [PATCH] Bug: 'utf8.codes' accepts spurious continuation bytes - ---- - lutf8lib.c | 27 ++++++++++++++++----------- - testes/utf8.lua | 12 +++++++++++- - 2 files changed, 27 insertions(+), 12 deletions(-) - -diff --git a/lutf8lib.c b/lutf8lib.c -index e7bf098f6..3a5b9bc38 100644 ---- a/src/lutf8lib.c -+++ b/src/lutf8lib.c -@@ -25,6 +25,9 @@ - - #define MAXUTF 0x7FFFFFFFu - -+ -+#define MSGInvalid "invalid UTF-8 code" -+ - /* - ** Integer type for decoded UTF-8 values; MAXUTF needs 31 bits. - */ -@@ -35,7 +38,8 @@ typedef unsigned long utfint; - #endif - - --#define iscont(p) ((*(p) & 0xC0) == 0x80) -+#define iscont(c) (((c) & 0xC0) == 0x80) -+#define iscontp(p) iscont(*(p)) - - - /* from strlib */ -@@ -65,7 +69,7 @@ static const char *utf8_decode (const char *s, utfint *val, int strict) { - int count = 0; /* to count number of continuation bytes */ - for (; c & 0x40; c <<= 1) { /* while it needs continuation bytes... */ - unsigned int cc = (unsigned char)s[++count]; /* read next byte */ -- if ((cc & 0xC0) != 0x80) /* not a continuation byte? */ -+ if (!iscont(cc)) /* not a continuation byte? */ - return NULL; /* invalid byte sequence */ - res = (res << 6) | (cc & 0x3F); /* add lower 6 bits from cont. byte */ - } -@@ -140,7 +144,7 @@ static int codepoint (lua_State *L) { - utfint code; - s = utf8_decode(s, &code, !lax); - if (s == NULL) -- return luaL_error(L, "invalid UTF-8 code"); -+ return luaL_error(L, MSGInvalid); - lua_pushinteger(L, code); - n++; - } -@@ -190,16 +194,16 @@ static int byteoffset (lua_State *L) { - "position out of bounds"); - if (n == 0) { - /* find beginning of current byte sequence */ -- while (posi > 0 && iscont(s + posi)) posi--; -+ while (posi > 0 && iscontp(s + posi)) posi--; - } - else { -- if (iscont(s + posi)) -+ if (iscontp(s + posi)) - return luaL_error(L, "initial position is a continuation byte"); - if (n < 0) { - while (n < 0 && posi > 0) { /* move back */ - do { /* find beginning of previous character */ - posi--; -- } while (posi > 0 && iscont(s + posi)); -+ } while (posi > 0 && iscontp(s + posi)); - n++; - } - } -@@ -208,7 +212,7 @@ static int byteoffset (lua_State *L) { - while (n > 0 && posi < (lua_Integer)len) { - do { /* find beginning of next character */ - posi++; -- } while (iscont(s + posi)); /* (cannot pass final '\0') */ -+ } while (iscontp(s + posi)); /* (cannot pass final '\0') */ - n--; - } - } -@@ -226,15 +230,15 @@ static int iter_aux (lua_State *L, int strict) { - const char *s = luaL_checklstring(L, 1, &len); - lua_Unsigned n = (lua_Unsigned)lua_tointeger(L, 2); - if (n < len) { -- while (iscont(s + n)) n++; /* skip continuation bytes */ -+ while (iscontp(s + n)) n++; /* go to next character */ - } - if (n >= len) /* (also handles original 'n' being negative) */ - return 0; /* no more codepoints */ - else { - utfint code; - const char *next = utf8_decode(s + n, &code, strict); -- if (next == NULL) -- return luaL_error(L, "invalid UTF-8 code"); -+ if (next == NULL || iscontp(next)) -+ return luaL_error(L, MSGInvalid); - lua_pushinteger(L, n + 1); - lua_pushinteger(L, code); - return 2; -@@ -253,7 +257,8 @@ static int iter_auxlax (lua_State *L) { - - static int iter_codes (lua_State *L) { - int lax = lua_toboolean(L, 2); -- luaL_checkstring(L, 1); -+ const char *s = luaL_checkstring(L, 1); -+ luaL_argcheck(L, !iscontp(s), 1, MSGInvalid); - lua_pushcfunction(L, lax ? iter_auxlax : iter_auxstrict); - lua_pushvalue(L, 1); - lua_pushinteger(L, 0); -diff --git a/testes/utf8.lua b/testes/utf8.lua -index 461e223c7..7472cfd05 100644 ---- a/testes/utf8.lua -+++ b/testes/utf8.lua -@@ -97,9 +97,15 @@ do -- error indication in utf8.len - assert(not a and b == p) - end - check("abc\xE3def", 4) -- check("汉字\x80", #("汉字") + 1) - check("\xF4\x9F\xBF", 1) - check("\xF4\x9F\xBF\xBF", 1) -+ -- spurious continuation bytes -+ check("汉字\x80", #("汉字") + 1) -+ check("\x80hello", 1) -+ check("hel\x80lo", 4) -+ check("汉字\xBF", #("汉字") + 1) -+ check("\xBFhello", 1) -+ check("hel\xBFlo", 4) - end - - -- errors in utf8.codes -@@ -112,12 +118,16 @@ do - end - errorcodes("ab\xff") - errorcodes("\u{110000}") -+ errorcodes("in\x80valid") -+ errorcodes("\xbfinvalid") -+ errorcodes("αλφ\xBFα") - - -- calling interation function with invalid arguments - local f = utf8.codes("") - assert(f("", 2) == nil) - assert(f("", -1) == nil) - assert(f("", math.mininteger) == nil) -+ - end - - -- error in initial position for offset diff --git a/luabugs9.patch b/luabugs9.patch deleted file mode 100644 index c92cf1f..0000000 --- a/luabugs9.patch +++ /dev/null @@ -1,102 +0,0 @@ -From 1e64c1391f9a14115b5cc82066dbf545ae73ee27 Mon Sep 17 00:00:00 2001 -From: Roberto Ierusalimschy -Date: Tue, 25 Oct 2022 16:44:06 -0300 -Subject: [PATCH] Bug: stack overflow with nesting of coroutine.close - ---- - lcorolib.c | 4 ++-- - lstate.c | 3 ++- - ltests.c | 2 +- - lua.h | 2 +- - manual/manual.of | 7 ++++++- - testes/cstack.lua | 26 ++++++++++++++++++++++++++ - 6 files changed, 38 insertions(+), 6 deletions(-) - -diff --git a/lcorolib.c b/lcorolib.c -index 785a1e81a..40b880b14 100644 ---- a/src/lcorolib.c -+++ b/src/lcorolib.c -@@ -76,7 +76,7 @@ static int luaB_auxwrap (lua_State *L) { - if (l_unlikely(r < 0)) { /* error? */ - int stat = lua_status(co); - if (stat != LUA_OK && stat != LUA_YIELD) { /* error in the coroutine? */ -- stat = lua_resetthread(co); /* close its tbc variables */ -+ stat = lua_resetthread(co, L); /* close its tbc variables */ - lua_assert(stat != LUA_OK); - lua_xmove(co, L, 1); /* move error message to the caller */ - } -@@ -172,7 +172,7 @@ static int luaB_close (lua_State *L) { - int status = auxstatus(L, co); - switch (status) { - case COS_DEAD: case COS_YIELD: { -- status = lua_resetthread(co); -+ status = lua_resetthread(co, L); - if (status == LUA_OK) { - lua_pushboolean(L, 1); - return 1; -diff --git a/lstate.c b/lstate.c -index 1ffe1a0f7..4b5c10008 100644 ---- a/src/lstate.c -+++ b/src/lstate.c -@@ -343,9 +343,10 @@ int luaE_resetthread (lua_State *L, int status) { - } - - --LUA_API int lua_resetthread (lua_State *L) { -+LUA_API int lua_resetthread (lua_State *L, lua_State *from) { - int status; - lua_lock(L); -+ L->nCcalls = (from) ? getCcalls(from) : 0; - status = luaE_resetthread(L, L->status); - lua_unlock(L); - return status; -diff --git a/lua.h b/lua.h -index 219784cc0..bfba4d1e1 100644 ---- a/src/lua.h -+++ b/src/lua.h -@@ -153,7 +153,7 @@ extern const char lua_ident[]; - LUA_API lua_State *(lua_newstate) (lua_Alloc f, void *ud); - LUA_API void (lua_close) (lua_State *L); - LUA_API lua_State *(lua_newthread) (lua_State *L); --LUA_API int (lua_resetthread) (lua_State *L); -+LUA_API int (lua_resetthread) (lua_State *L, lua_State *from); - - LUA_API lua_CFunction (lua_atpanic) (lua_State *L, lua_CFunction panicf); - -diff --git a/testes/cstack.lua b/testes/cstack.lua -index ca76c8729..97afe9fd0 100644 ---- a/testes/cstack.lua -+++ b/testes/cstack.lua -@@ -84,6 +84,32 @@ do -- bug in 5.4.0 - end - - -+do -- bug since 5.4.0 -+ local count = 0 -+ print("chain of 'coroutine.close'") -+ -- create N coroutines forming a list so that each one, when closed, -+ -- closes the previous one. (With a large enough N, previous Lua -+ -- versions crash in this test.) -+ local coro = false -+ for i = 1, 1000 do -+ local previous = coro -+ coro = coroutine.create(function() -+ local cc = setmetatable({}, {__close=function() -+ count = count + 1 -+ if previous then -+ assert(coroutine.close(previous)) -+ end -+ end}) -+ coroutine.yield() -- leaves 'cc' pending to be closed -+ end) -+ assert(coroutine.resume(coro)) -- start it and run until it yields -+ end -+ local st, msg = coroutine.close(coro) -+ assert(not st and string.find(msg, "C stack overflow")) -+ print("final count: ", count) -+end -+ -+ - do - print("nesting of resuming yielded coroutines") - local count = 0 diff --git a/main_test.patch b/main_test.patch index 6ca0618..6978f1b 100644 --- a/main_test.patch +++ b/main_test.patch @@ -1,6 +1,10 @@ +--- + testes/main.lua | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + --- a/testes/main.lua +++ b/testes/main.lua -@@ -47,7 +47,7 @@ +@@ -47,7 +47,7 @@ local function checkprogout (s) assert(string.sub(s, -1) == "\n") local t = getoutput() for line in string.gmatch(s, ".-\n") do @@ -8,8 +12,8 @@ + -- assert(string.find(t, line, 1, true)) end end - -@@ -307,11 +307,11 @@ + +@@ -367,11 +367,11 @@ a = 2 ]] RUN([[lua -e "%s" -i < %s > %s]], prompt, prog, out) local t = getoutput() @@ -23,6 +27,6 @@ +-- 2a = 2 +-- 3 +-- ]], 1, true)) - - + + -- test for error objects diff --git a/shared_link.patch b/shared_link.patch index e835219..4ce2df2 100644 --- a/shared_link.patch +++ b/shared_link.patch @@ -1,28 +1,23 @@ +--- + src/ldebug.h | 2 +- + src/lmem.h | 2 +- + src/lundump.h | 2 +- + 3 files changed, 3 insertions(+), 3 deletions(-) + --- a/src/ldebug.h +++ b/src/ldebug.h @@ -36,7 +36,7 @@ #endif - - + + -LUAI_FUNC int luaG_getfuncline (const Proto *f, int pc); +LUA_API int luaG_getfuncline (const Proto *f, int pc); LUAI_FUNC const char *luaG_findlocal (lua_State *L, CallInfo *ci, int n, StkId *pos); LUAI_FUNC l_noret luaG_typeerror (lua_State *L, const TValue *o, ---- a/src/lundump.h -+++ b/src/lundump.h -@@ -30,7 +30,7 @@ - LUAI_FUNC LClosure* luaU_undump (lua_State* L, ZIO* Z, const char* name); - - /* dump one chunk; from ldump.c */ --LUAI_FUNC int luaU_dump (lua_State* L, const Proto* f, lua_Writer w, -+LUA_API int luaU_dump (lua_State* L, const Proto* f, lua_Writer w, - void* data, int strip); - - #endif --- a/src/lmem.h +++ b/src/lmem.h -@@ -81,7 +81,7 @@ +@@ -81,7 +81,7 @@ LUAI_FUNC void *luaM_realloc_ (lua_State size_t size); LUAI_FUNC void *luaM_saferealloc_ (lua_State *L, void *block, size_t oldsize, size_t size); @@ -31,3 +26,14 @@ LUAI_FUNC void *luaM_growaux_ (lua_State *L, void *block, int nelems, int *size, int size_elem, int limit, const char *what); +--- a/src/lundump.h ++++ b/src/lundump.h +@@ -30,7 +30,7 @@ + LUAI_FUNC LClosure* luaU_undump (lua_State* L, ZIO* Z, const char* name); + + /* dump one chunk; from ldump.c */ +-LUAI_FUNC int luaU_dump (lua_State* L, const Proto* f, lua_Writer w, ++LUA_API int luaU_dump (lua_State* L, const Proto* f, lua_Writer w, + void* data, int strip); + + #endif