From cf99ee44a5863f2f828e459c7316b1e80fc50569 Mon Sep 17 00:00:00 2001 From: hongjinghao Date: Tue, 5 Sep 2023 11:09:48 +0800 Subject: [PATCH] Fix a segfault on a non-stringable argument to macro call from Lua --- ...n-a-non-stringable-argument-to-macro.patch | 58 +++++++++++++++++++ rpm.spec | 6 +- 2 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 backport-Fix-a-segfault-on-a-non-stringable-argument-to-macro.patch diff --git a/backport-Fix-a-segfault-on-a-non-stringable-argument-to-macro.patch b/backport-Fix-a-segfault-on-a-non-stringable-argument-to-macro.patch new file mode 100644 index 0000000..c612611 --- /dev/null +++ b/backport-Fix-a-segfault-on-a-non-stringable-argument-to-macro.patch @@ -0,0 +1,58 @@ +From 856ddc334174fd37fe4ce81bc9f9f11a08cf6c81 Mon Sep 17 00:00:00 2001 +From: Panu Matilainen +Date: Fri, 17 Mar 2023 12:53:42 +0200 +Subject: [PATCH] Fix a segfault on a non-stringable argument to macro call + from Lua + +When natively calling a parametric macro from Lua, with the arguments +inside a table, we can't assume lua_tostring() always succeeds as it +can fail eg on a table. Report the error instead of crashing in argvAdd(), +and add a test as well. +--- + rpmio/rpmlua.c | 9 +++++++-- + tests/rpmmacro.at | 9 +++++++++ + 2 files changed, 16 insertions(+), 2 deletions(-) + +diff --git a/rpmio/rpmlua.c b/rpmio/rpmlua.c +index 6c42af792..0e3685713 100644 +--- a/rpmio/rpmlua.c ++++ b/rpmio/rpmlua.c +@@ -1178,8 +1178,13 @@ static int mc_call(lua_State *L) + + for (int i = 1; i <= nitem; i++) { + lua_rawgeti(L, 1, i); +- argvAdd(&argv, lua_tostring(L, -1)); +- lua_pop(L, 1); ++ const char *s= lua_tostring(L, -1); ++ if (s) { ++ argvAdd(&argv, s); ++ lua_pop(L, 1); ++ } else { ++ luaL_argerror(L, i, "cannot convert to string"); ++ } + } + + if (rpmExpandThisMacro(*mc, name, argv, &buf, 0) >= 0) { +diff --git a/tests/rpmmacro.at b/tests/rpmmacro.at +index 55b7d5fa5..22d873e81 100644 +--- a/tests/rpmmacro.at ++++ b/tests/rpmmacro.at +@@ -713,6 +713,15 @@ nil + 1:%{?aaa} 2:%{yyy} + that + ]) ++ ++AT_CHECK([[ ++runroot rpm \ ++ --eval "%{lua:macros.defined({1,2,{}})}" ++]], ++[1], ++[], ++[[error: lua script failed: [string ""]:1: bad argument #3 to 'defined' (cannot convert to string) ++]]) + AT_CLEANUP + + AT_SETUP([lua macros recursion]) +-- +2.33.0 + diff --git a/rpm.spec b/rpm.spec index 26fad0a..4dc2241 100644 --- a/rpm.spec +++ b/rpm.spec @@ -1,6 +1,6 @@ Name: rpm Version: 4.18.1 -Release: 4 +Release: 5 Summary: RPM Package Manager License: GPLv2+ URL: http://www.rpm.org/ @@ -27,6 +27,7 @@ Patch6005: backport-Fix-possible-null-pointer-reference-in-ndb.patch Patch6006: backport-Fix-rpmDigestBundleFinal-and-Update-return-code-on-i.patch Patch6007: backport-Actually-return-an-error-in-parseScript-if-parsing-f.patch Patch6008: backport-Check-inside-root-when-querying-for-files.patch +Patch6009: backport-Fix-a-segfault-on-a-non-stringable-argument-to-macro.patch Patch9000: Add-digest-list-plugin.patch Patch9001: Add-IMA-digest-list-support.patch @@ -309,6 +310,9 @@ make clean %exclude %{_mandir}/man8/rpmspec.8.gz %changelog +* Tue Sep 5 2023 hongjinghao - 4.18.1-5 +- Fix a segfault on a non-stringable argument to macro call from Lua + * Tue Aug 29 2023 renhongxun - 4.18.1-4 - Check inside --root when querying for files