From 49659b9c268b85591edd659738e96092330593a8 Mon Sep 17 00:00:00 2001 From: Florian Festi Date: Thu, 18 Jul 2024 13:04:28 +0200 Subject: [PATCH] Reset recursion depth for error message MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit $ rpm --define 'aaa %[%aaa]' --eval '%aaa' let to a core dump due to a stack overflow. This was cause by the generation of the error message failing due to being too deep in the recursion of the macro expansion - creating more error messages. Resetting the depth counter allows rendering the error message. As we are failing and breaking off the parse run this is fine to do. Thanks to Miro HronĨok for reporting Resolves: #3197 --- rpmio/macro.c | 4 +++- tests/rpmmacro.at | 22 ++++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/rpmio/macro.c b/rpmio/macro.c index b2fb1326de..3f34f718ea 100644 --- a/rpmio/macro.c +++ b/rpmio/macro.c @@ -447,9 +447,11 @@ static int mbInit(rpmMacroBuf mb, MacroExpansionData *med, size_t slen) if (slen > 0) mb->buf.reserve(slen); if (++mb->depth > max_macro_depth) { + mb->depth--; + /* ensure error message can be rendered */ + mb->mc->depth = 0; rpmMacroBufErr(mb, 1, _("Too many levels of recursion in macro expansion. It is likely caused by recursive macro declaration.\n")); - mb->depth--; return -1; } med->tpos = mb->buf.size(); /* save expansion pointer for printExpand */ diff --git a/tests/rpmmacro.at b/tests/rpmmacro.at index a31242e9c6..6cf0be61fa 100644 --- a/tests/rpmmacro.at +++ b/tests/rpmmacro.at @@ -133,6 +133,28 @@ runroot rpm --define "this that" --define "that_that foo" --eval '%{expand:%{%{t ]) RPMTEST_CLEANUP +AT_SETUP([recursive macro]) +AT_KEYWORDS([macros]) +RPMTEST_CHECK([ +runroot rpm --define 'aaa %aaa' --eval '%aaa' +], +[1], +[], +[error: Too many levels of recursion in macro expansion. It is likely caused by recursive macro declaration. +]) +RPMTEST_CLEANUP + +AT_SETUP([recursive expression]) +AT_KEYWORDS([macros]) +RPMTEST_CHECK([ +runroot rpm --define 'aaa %\\[%aaa\\]' --eval '%aaa' +], +[1], +[], +[error: Too many levels of recursion in macro expansion. It is likely caused by recursive macro declaration. +]) +RPMTEST_CLEANUP + AT_SETUP([parametrized macro 1]) AT_KEYWORDS([macros]) RPMTEST_CHECK([