From 8dedd47b89639959f40d7544877bf22a052cd4af Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Mon, 13 Jul 2015 08:25:19 +0200 Subject: [PATCH] Fix incorrect return value for the macro() function fixes #9584 --- lib/icinga/macroprocessor.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/icinga/macroprocessor.cpp b/lib/icinga/macroprocessor.cpp index 177ef9d35..e6a72252b 100644 --- a/lib/icinga/macroprocessor.cpp +++ b/lib/icinga/macroprocessor.cpp @@ -278,10 +278,11 @@ Value MacroProcessor::InternalResolveMacros(const String& str, const ResolverLis } resolved_macro = resolved_arr; - } else + } else if (resolved_macro.IsString()) { resolved_macro = InternalResolveMacros(resolved_macro, resolvers, cr, missingMacro, EscapeCallback(), Dictionary::Ptr(), false, recursionLevel + 1); + } } if (!useResolvedMacros && found && resolvedMacros) @@ -290,7 +291,12 @@ Value MacroProcessor::InternalResolveMacros(const String& str, const ResolverLis if (escapeFn) resolved_macro = escapeFn(resolved_macro); - /* we're done if the value is an array */ + /* we're done if this is the only macro and there are no other non-macro parts in the string */ + if (pos_first == 0 && pos_second == str.GetLength() - 1) + return resolved_macro; + else if (resolved_macro.IsObjectType()) + BOOST_THROW_EXCEPTION(std::invalid_argument("Mixing both strings and non-strings in macros is not allowed.")); + if (resolved_macro.IsObjectType()) { /* don't allow mixing strings and arrays in macro strings */ if (pos_first != 0 || pos_second != str.GetLength() - 1) -- 2.40.0