aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/3rdparty/cplusplus/Parser.cpp
diff options
context:
space:
mode:
authorNikolai Kosjar <nikolai.kosjar@theqtcompany.com>2015-05-11 12:31:53 +0200
committerNikolai Kosjar <nikolai.kosjar@theqtcompany.com>2015-05-13 08:26:07 +0000
commite69d20e10bf040c78a98d42514453d990aa56217 (patch)
tree34bd19c98a9590d39536e52ae9b6c3c8a95f0a69 /src/libs/3rdparty/cplusplus/Parser.cpp
parent71a0d2ddf4b4e5f57806feaaea9c21af115e7183 (diff)
C++: Limit parsing of initializer clauses
...to prevent out of memory crash for generated tables. Change-Id: I8f9f51829fcce5bccfe0dba8852023f8dd7d6e37 Task-number: QTCREATORBUG-14390 Reviewed-by: Eike Ziller <eike.ziller@theqtcompany.com> Reviewed-by: Erik Verbruggen <erik.verbruggen@theqtcompany.com>
Diffstat (limited to 'src/libs/3rdparty/cplusplus/Parser.cpp')
-rw-r--r--src/libs/3rdparty/cplusplus/Parser.cpp15
1 files changed, 13 insertions, 2 deletions
diff --git a/src/libs/3rdparty/cplusplus/Parser.cpp b/src/libs/3rdparty/cplusplus/Parser.cpp
index 4f44d61465..7c330ce330 100644
--- a/src/libs/3rdparty/cplusplus/Parser.cpp
+++ b/src/libs/3rdparty/cplusplus/Parser.cpp
@@ -42,6 +42,7 @@
#define CPLUSPLUS_NO_DEBUG_RULE
#define MAX_EXPRESSION_DEPTH 100
#define MAX_STATEMENT_DEPTH 100
+#define MAX_INITIALIZER_CLAUSE_DEPTH 2000
using namespace CPlusPlus;
@@ -2785,6 +2786,8 @@ bool Parser::parseInitializerList0x(ExpressionListAST *&node)
ExpressionListAST **expression_list_ptr = &node;
ExpressionAST *expression = 0;
+ _initializerClauseDepth.push(1);
+
if (parseInitializerClause0x(expression)) {
*expression_list_ptr = new (_pool) ExpressionListAST;
(*expression_list_ptr)->value = expression;
@@ -2793,7 +2796,11 @@ bool Parser::parseInitializerList0x(ExpressionListAST *&node)
if (_languageFeatures.cxx11Enabled && LA() == T_DOT_DOT_DOT && (LA(2) == T_COMMA || LA(2) == T_RBRACE || LA(2) == T_RPAREN))
consumeToken(); // ### create an argument pack
- while (LA() == T_COMMA && LA(2) != T_RBRACE) {
+ for (++_initializerClauseDepth.top();
+ LA() == T_COMMA
+ && LA(2) != T_RBRACE
+ && _initializerClauseDepth.top() <= MAX_INITIALIZER_CLAUSE_DEPTH;
+ ++_initializerClauseDepth.top()) {
consumeToken(); // consume T_COMMA
if (parseInitializerClause0x(expression)) {
@@ -2808,7 +2815,11 @@ bool Parser::parseInitializerList0x(ExpressionListAST *&node)
}
}
- return true;
+ const bool result = _initializerClauseDepth.top() <= MAX_INITIALIZER_CLAUSE_DEPTH;
+ _initializerClauseDepth.pop();
+ if (!result)
+ warning(cursor(), "Reached parse limit for initializer clause");
+ return result;
}
bool Parser::parseBracedInitList0x(ExpressionAST *&node)