]> granicus.if.org Git - icinga2/commitdiff
Fix config parser ignoring forbidden "ignore" in template definition
authorMichael Friedrich <michael.friedrich@netways.de>
Thu, 2 Jul 2015 15:51:52 +0000 (17:51 +0200)
committerMichael Friedrich <michael.friedrich@netways.de>
Thu, 2 Jul 2015 15:53:34 +0000 (17:53 +0200)
fixes #9535

lib/config/config_parser.yy
lib/config/configcompiler.hpp

index cf1a03a308c96a7db021458ee4b3776634b89aa6..de353ada68431ee11272bea0c0e7eecfbe0d2b4d 100644 (file)
@@ -338,6 +338,7 @@ object:
        {
                context->m_ObjectAssign.push(true);
                context->m_SeenAssign.push(false);
+               context->m_SeenIgnore.push(false);
                context->m_Assign.push(NULL);
                context->m_Ignore.push(NULL);
        }
@@ -355,6 +356,9 @@ object:
                bool seen_assign = context->m_SeenAssign.top();
                context->m_SeenAssign.pop();
 
+               bool seen_ignore = context->m_SeenIgnore.top();
+               context->m_SeenIgnore.pop();
+
                Expression *ignore = context->m_Ignore.top();
                context->m_Ignore.pop();
 
@@ -373,6 +377,9 @@ object:
                                filter = new LogicalAndExpression(assign, rex, DebugInfoRange(@2, @5));
                        } else
                                filter = assign;
+               } else if (seen_ignore) {
+                       if (!ObjectRule::IsValidSourceType(type))
+                               BOOST_THROW_EXCEPTION(ScriptError("object rule 'ignore' cannot be used for type '" + type + "'", DebugInfoRange(@2, @4)));
                }
 
                $$ = new ObjectExpression(abstract, type, $4, filter, context->GetZone(), $5, $6, DebugInfoRange(@2, @5));
@@ -478,6 +485,8 @@ lterm: library
                if ((context->m_Apply.empty() || !context->m_Apply.top()) && (context->m_ObjectAssign.empty() || !context->m_ObjectAssign.top()))
                        BOOST_THROW_EXCEPTION(ScriptError("'ignore' keyword not valid in this context.", @$));
 
+               context->m_SeenIgnore.top() = true;
+
                if (context->m_Ignore.top())
                        context->m_Ignore.top() = new LogicalOrExpression(context->m_Ignore.top(), $3, @$);
                else
@@ -919,6 +928,7 @@ apply:
        {
                context->m_Apply.push(true);
                context->m_SeenAssign.push(false);
+               context->m_SeenIgnore.push(false);
                context->m_Assign.push(NULL);
                context->m_Ignore.push(NULL);
                context->m_FKVar.push("");
index 981c447440f90fb90772d5b539fc2cdee79f397c..f0a429b29f07a435c44f3caa6bdc0525cc2db34e 100644 (file)
@@ -126,6 +126,7 @@ public:
        std::stack<bool> m_Apply;
        std::stack<bool> m_ObjectAssign;
        std::stack<bool> m_SeenAssign;
+       std::stack<bool> m_SeenIgnore;
        std::stack<Expression *> m_Assign;
        std::stack<Expression *> m_Ignore;
        std::stack<String> m_FKVar;