peepmatic: Implement maximum nesting level in parser

So that we don't blow the stack.

Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=24705
This commit is contained in:
Nick Fitzgerald
2020-08-06 16:03:16 -07:00
parent 174159a552
commit aad086899c

View File

@@ -429,6 +429,13 @@ where
DynAstRef<'a, TOperator>: From<&'a TOperand>,
{
fn parse(p: Parser<'a>) -> ParseResult<Self> {
// Don't blow the stack with this recursive parser. We don't expect
// nesting to ever get very deep, so it isn't worth refactoring this
// code to be non-recursive.
if p.parens_depth() > 25 {
return Err(p.error("module nesting too deep"));
}
let span = p.cur_span();
p.parens(|p| {
let operator = p.parse()?;
@@ -816,6 +823,9 @@ mod test {
"$var",
"$CONST",
"(ishl $x $(log2 $C))",
// Nesting too deep.
"(iadd (iadd (iadd (iadd (iadd (iadd (iadd (iadd (iadd (iadd (iadd (iadd (iadd (iadd (iadd (iadd (iadd (iadd (iadd (iadd (iadd (iadd (iadd (iadd (iadd (iadd (iadd (iadd (iadd (iadd (iadd (iadd (iadd (iadd (iadd (iadd (iadd (iadd (iadd (iadd (iadd (iadd (iadd (iadd (iadd (iadd (iadd (iadd (iadd (iadd))))))))))))))))))))))))))))))))))))))))))))))))))",
}
}
parse_operation_rhs<Operation<TestOperator, Rhs<TestOperator>>> {