]> git.sesse.net Git - casparcg/commitdiff
[scene] Fixed infinite loop in expression parsing.
authorHelge Norberg <helge.norberg@svt.se>
Wed, 8 Mar 2017 17:17:30 +0000 (18:17 +0100)
committerHelge Norberg <helge.norberg@svt.se>
Wed, 8 Mar 2017 17:17:30 +0000 (18:17 +0100)
core/producer/scene/expression_parser.cpp

index 27156db264b63574428e00283938487224ece864..a0153af1bc7f901be612751d4fff45db052d0cbe 100644 (file)
@@ -395,6 +395,8 @@ boost::any parse_variable(
 
 struct op
 {
+       static const int MAX_PRECEDENCE = 100;
+
        enum class op_type
        {
                UNARY,
@@ -890,13 +892,16 @@ boost::any parse_expression(
                CASPAR_THROW_EXCEPTION(user_error()
                                << msg_info(L"Expected expression" + at_position(cursor, str)));
 
-       int precedence = 1;
-
-       while (tokens.size() > 1)
+       for (int precedence = 1; tokens.size() > 1 && precedence < op::MAX_PRECEDENCE; ++precedence)
        {
-               resolve_operators(precedence++, tokens);
+               resolve_operators(precedence, tokens);
        }
 
+       if (tokens.size() > 1)
+               CASPAR_THROW_EXCEPTION(user_error()
+                               << msg_info(L"Expected operator" + at_position(cursor, str)));
+
+
        return as_binding(tokens.at(0));
 }