]> granicus.if.org Git - icinga2/commitdiff
Fix parser error when using new-lines in dictionaries
authorGunnar Beutner <gunnar@beutner.name>
Wed, 23 Sep 2015 14:37:21 +0000 (16:37 +0200)
committerGunnar Beutner <gunnar@beutner.name>
Wed, 23 Sep 2015 14:37:21 +0000 (16:37 +0200)
fixes #10204

lib/config/config_lexer.ll
lib/config/config_parser.yy
lib/config/configcompiler.cpp
lib/config/configcompiler.hpp
test/config-ops.cpp

index f03ea8e83c3af3bfaf141210e03656bc803c4695..94d99e4389224e5a81ce29428179993638011f4d 100644 (file)
@@ -240,9 +240,9 @@ in                          return T_IN;
 \>                             return T_GREATER_THAN;
 }
 
-\(                             { yyextra->m_IgnoreNewlines++; return '('; }
-\)                             { yyextra->m_IgnoreNewlines--; return ')'; }
-[\r\n]+                                { yycolumn -= strlen(yytext) - 1; if (!yyextra->m_IgnoreNewlines) { return T_NEWLINE; } }
+\(                             { yyextra->m_IgnoreNewlines.push(true); return '('; }
+\)                             { yyextra->m_IgnoreNewlines.pop(); return ')'; }
+[\r\n]+                                { yycolumn -= strlen(yytext) - 1; if (!yyextra->m_IgnoreNewlines.top()) { return T_NEWLINE; } }
 <<EOF>>                                { if (!yyextra->m_Eof) { yyextra->m_Eof = true; return T_NEWLINE; } else { yyterminate(); } }
 .                              return yytext[0];
 
index 120a89f82e177572792ee7c8895c1e0cbdc3d64b..07d014a7141e835581a33889a7e36285f35b2cd7 100644 (file)
@@ -240,9 +240,13 @@ Expression *ConfigCompiler::Compile(void)
 
        //yydebug = 1;
 
+       m_IgnoreNewlines.push(false);
+
        if (yyparse(&llist, this) != 0)
                return NULL;
 
+       m_IgnoreNewlines.pop();
+
        std::vector<Expression *> dlist;
        typedef std::pair<Expression *, EItemInfo> EListItem;
        int num = 0;
@@ -612,11 +616,13 @@ rterm_array: '['
 
 rterm_scope_require_side_effect: '{'
        {
+               context->m_IgnoreNewlines.push(false);
                context->m_OpenBraces++;
        }
        statements '}'
        {
                context->m_OpenBraces--;
+               context->m_IgnoreNewlines.pop();
                std::vector<Expression *> dlist;
                typedef std::pair<Expression *, EItemInfo> EListItem;
                int num = 0;
@@ -633,11 +639,13 @@ rterm_scope_require_side_effect: '{'
 
 rterm_scope: '{'
        {
+               context->m_IgnoreNewlines.push(false);
                context->m_OpenBraces++;
        }
        statements '}'
        {
                context->m_OpenBraces--;
+               context->m_IgnoreNewlines.pop();
                std::vector<Expression *> dlist;
                typedef std::pair<Expression *, EItemInfo> EListItem;
                int num = 0;
index 0be38a9ccf2310d4a49188f7730b30837a33dc95..de91cb88344989a32a3ed511b4a61e2a6e4ea5fa 100644 (file)
@@ -44,7 +44,7 @@ std::map<String, std::vector<ZoneFragment> > ConfigCompiler::m_ZoneDirs;
 ConfigCompiler::ConfigCompiler(const String& path, std::istream *input,
     const String& zone, const String& package)
        : m_Path(path), m_Input(input), m_Zone(zone), m_Package(package),
-         m_Eof(false), m_OpenBraces(0), m_IgnoreNewlines(0)
+         m_Eof(false), m_OpenBraces(0)
 {
        InitializeScanner();
 }
index 85cb6cceddc2534734afe96651ce4a27d609492d..b216b12a198d07c8b79250d4ace38d86a1cf48b8 100644 (file)
@@ -141,10 +141,10 @@ public:
        bool m_Eof;
        int m_OpenBraces;
 
-       int m_IgnoreNewlines;
        std::ostringstream m_LexBuffer;
        CompilerDebugInfo m_LocationBegin;
 
+       std::stack<bool> m_IgnoreNewlines;
        std::stack<bool> m_Apply;
        std::stack<bool> m_ObjectAssign;
        std::stack<bool> m_SeenAssign;
index 227abe4b1ba0d6ae0c129d8becef61c13ebd248e..41f500c93bf2669fe60acda167f28e55eceb8246 100644 (file)
@@ -204,6 +204,10 @@ BOOST_AUTO_TEST_CASE(simple)
        expr = ConfigCompiler::CompileText("<test>", "\"\\'test\"");
        BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
        delete expr;
+
+       expr = ConfigCompiler::CompileText("<test>", "({ a = 3\nb = 3 })");
+       BOOST_CHECK(expr->Evaluate(frame).GetValue().IsObjectType<Dictionary>());
+       delete expr;
 }
 
 BOOST_AUTO_TEST_CASE(advanced)