summaryrefslogtreecommitdiff
path: root/backport-Fix-a-segfault-on-a-non-stringable-argument-to-macro.patch
blob: 541c6c3dad348096612503ed350f3244a4e53f36 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
From 856ddc334174fd37fe4ce81bc9f9f11a08cf6c81 Mon Sep 17 00:00:00 2001
From: Panu Matilainen <pmatilai@redhat.com>
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 "<lua>"]:1: bad argument #3 to 'defined' (cannot convert to string)
+]])
 AT_CLEANUP
 
 AT_SETUP([lua macros recursion])
-- 
2.27.0