diff --git a/rinja_parser/src/tests.rs b/rinja_parser/src/tests.rs index 468756c3..73d54ff8 100644 --- a/rinja_parser/src/tests.rs +++ b/rinja_parser/src/tests.rs @@ -1,5 +1,5 @@ use crate::node::{Lit, Whitespace, Ws}; -use crate::{Ast, Expr, Filter, InnerSyntax, Node, Num, StrLit, Syntax, WithSpan}; +use crate::{Ast, Expr, Filter, InnerSyntax, Node, Num, StrLit, Syntax, SyntaxBuilder, WithSpan}; impl WithSpan<'static, T> { fn no_span(inner: T) -> Self { @@ -1064,3 +1064,36 @@ fn fuzzed_filter_recursion() { const TEMPLATE: &str = include_str!("../tests/filter-recursion.txt"); assert!(Ast::from_str(TEMPLATE, None, &Syntax::default()).is_err()); } + +#[test] +fn fuzzed_excessive_syntax_lengths() { + let syntax = SyntaxBuilder { + name: "test", + block_start: Some("\0*DD\0\0"), + block_end: Some( + "\0]***NEWFILE\u{1f}***:7/v/.-3/\u{1b}/~~~~z~0/*:7/v/./t/t/.p//NEWVILE**::7/v", + ), + expr_start: Some("/."), + expr_end: None, + comment_start: Some(include_str!( + "../tests/excessive_syntax_lengths-comment-start.bin" + )), + comment_end: None, + } + .to_syntax() + .unwrap(); + + let (sender, receiver) = std::sync::mpsc::channel(); + let test = std::thread::spawn(move || { + let result = Ast::from_str( + include_str!("../tests/excessive_syntax_lengths-source.bin"), + None, + &syntax, + ); + sender.send(result).unwrap(); + }); + let _: Result, crate::ParseError> = receiver + .recv_timeout(std::time::Duration::from_secs(3)) + .expect("timeout"); + test.join().unwrap(); +} diff --git a/rinja_parser/tests/excessive_syntax_lengths-comment-start.bin b/rinja_parser/tests/excessive_syntax_lengths-comment-start.bin new file mode 100644 index 00000000..5e5897f2 Binary files /dev/null and b/rinja_parser/tests/excessive_syntax_lengths-comment-start.bin differ diff --git a/rinja_parser/tests/excessive_syntax_lengths-source.bin b/rinja_parser/tests/excessive_syntax_lengths-source.bin new file mode 100644 index 00000000..1244e8db Binary files /dev/null and b/rinja_parser/tests/excessive_syntax_lengths-source.bin differ