]> 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)
committerGunnar Beutner <gunnar@beutner.name>
Mon, 13 Jul 2015 09:01:19 +0000 (11:01 +0200)
fixes #9535

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

index f84d4d5e56d1a8cc4a1f985e0400b4c797dd3399..611dae1856a3580aa39584857254e092686e3c22 100644 (file)
@@ -456,6 +456,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);
        }
@@ -473,6 +474,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();
 
@@ -491,6 +495,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));
@@ -600,6 +607,8 @@ lterm: type
                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
@@ -1041,6 +1050,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 b1f7697a8294757f6fa8948df69288dda2705499..e3b692c23f0832339a8aaded96d60216866bf20b 100644 (file)
@@ -130,6 +130,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;