Increase max AST depth and throw error if exceeded (#3250)

Co-authored-by: keinflue <>
This commit is contained in:
keinflue 2021-05-06 09:43:15 +00:00 committed by GitHub
parent 14ea8d7e68
commit c9a9b56e0e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 5 additions and 3 deletions

View File

@ -35,7 +35,7 @@
// How many compileExpression recursions are allowed?
// For practical code this could be endless. But in some special torture test
// there needs to be a limit.
static const int AST_MAX_DEPTH = 50;
static const int AST_MAX_DEPTH = 100;
TokenList::TokenList(const Settings* settings) :
@ -707,7 +707,9 @@ static void compileUnaryOp(Token *&tok, AST_state& state, void(*f)(Token *&tok,
if (f) {
tok = tok->next();
state.depth++;
if (tok && state.depth <= AST_MAX_DEPTH)
if (state.depth > AST_MAX_DEPTH)
throw InternalError(tok, "maximum AST depth exceeded", InternalError::AST);
if (tok)
f(tok, state);
state.depth--;
}
@ -1315,7 +1317,7 @@ static void compileComma(Token *&tok, AST_state& state)
static void compileExpression(Token *&tok, AST_state& state)
{
if (state.depth > AST_MAX_DEPTH)
return; // ticket #5592
throw InternalError(tok, "maximum AST depth exceeded", InternalError::AST); // ticket #5592
if (tok)
compileComma(tok, state);
}