diff options
author | Nikolai Kosjar <nikolai.kosjar@theqtcompany.com> | 2015-05-11 12:31:53 +0200 |
---|---|---|
committer | Nikolai Kosjar <nikolai.kosjar@theqtcompany.com> | 2015-05-13 08:26:07 +0000 |
commit | e69d20e10bf040c78a98d42514453d990aa56217 (patch) | |
tree | 34bd19c98a9590d39536e52ae9b6c3c8a95f0a69 /src/libs/3rdparty/cplusplus/Parser.cpp | |
parent | 71a0d2ddf4b4e5f57806feaaea9c21af115e7183 (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.cpp | 15 |
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) |