catch deeply nested CQL2 text filters#576
Open
cportele wants to merge 1 commit into
Open
Conversation
The cql2-text parser (ANTLR) and the subsequent tree visit both recurse with the nesting depth of the expression, and parse() only caught ParseCancellationException. A filter with a few thousand nested parentheses in the (uncapped) `filter` query parameter therefore overflowed the stack and crashed the request thread. The cql2-json path is already bounded by Jackson's nesting limit. Add a complexity guard before parsing: reject filters over a maximum length and those nesting parentheses beyond a maximum depth (measured outside string literals, so parentheses in a literal value do not count). Also catch StackOverflowError at the parse boundary as a safety net and surface it as a CqlParseException instead of a crash. Adds CqlTextParserComplexitySpec.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The cql2-text parser (ANTLR) and the subsequent tree visit both recurse with the nesting depth of the expression, and parse() only caught ParseCancellationException. A filter with a few thousand nested parentheses in the (uncapped)
filterquery parameter therefore overflowed the stack and crashed the request thread. The cql2-json path is already bounded by Jackson's nesting limit.Add a complexity guard before parsing: reject filters over a maximum length and those nesting parentheses beyond a maximum depth (measured outside string literals, so parentheses in a literal value do not count). Also catch StackOverflowError at the parse boundary as a safety net and surface it as a CqlParseException instead of a crash.
Adds CqlTextParserComplexitySpec.