]> granicus.if.org Git - icinga2/commitdiff
Fix missing config validator for command arguments 'set_if'
authorMichael Friedrich <michael.friedrich@netways.de>
Thu, 12 Mar 2015 17:05:58 +0000 (18:05 +0100)
committerMichael Friedrich <michael.friedrich@netways.de>
Fri, 20 Mar 2015 15:12:24 +0000 (16:12 +0100)
fixes #8724

lib/icinga/command.cpp

index 293ffd1e9966eb5a8440ca0da2fd537b199a7d39..6d6bafcd4cbb7aa9cd60771c5ae27dd93f5789e7 100644 (file)
@@ -72,19 +72,37 @@ void Command::ValidateArguments(const String& location, const Command::Ptr& obje
                if (arginfo.IsObjectType<Dictionary>()) {
                        Dictionary::Ptr argdict = arginfo;
 
-                       if (argdict->Contains("value"))
-                               argval = argdict->Get("value");
-               } else
+                       if (argdict->Contains("value")) {
+                               String argvalue = argdict->Get("value");
+
+                               if (!MacroProcessor::ValidateMacroString(argvalue)) {
+                                       BOOST_THROW_EXCEPTION(ScriptError("Validation failed for " +
+                                           location + ": Closing $ not found in macro format string '" + argvalue + "'.", object->GetDebugInfo()));
+                               }
+                       }
+
+                       if (argdict->Contains("set_if")) {
+                               String argsetif = argdict->Get("set_if");
+
+                               if (!MacroProcessor::ValidateMacroString(argsetif)) {
+                                       BOOST_THROW_EXCEPTION(ScriptError("Validation failed for " +
+                                           location + ": Closing $ not found in macro format string '" + argsetif + "'.", object->GetDebugInfo()));
+                               }
+                       }
+               } else if (arginfo.IsObjectType<Function>()) {
+                       continue; /* we cannot evaluate macros in functions */
+               } else {
                        argval = arginfo;
 
-               if (argval.IsEmpty())
-                       continue;
+                       if (argval.IsEmpty())
+                               continue;
 
-               String argstr = argval;
+                       String argstr = argval;
 
-               if (!MacroProcessor::ValidateMacroString(argstr)) {
-                       BOOST_THROW_EXCEPTION(ScriptError("Validation failed for " +
-                           location + ": Closing $ not found in macro format string '" + argstr + "'.", object->GetDebugInfo()));
+                       if (!MacroProcessor::ValidateMacroString(argstr)) {
+                               BOOST_THROW_EXCEPTION(ScriptError("Validation failed for " +
+                                   location + ": Closing $ not found in macro format string '" + argstr + "'.", object->GetDebugInfo()));
+                       }
                }
        }
 }