diff options
author | René Kijewski <rene.kijewski@fu-berlin.de> | 2023-09-28 17:09:29 +0200 |
---|---|---|
committer | Dirkjan Ochtman <dirkjan@ochtman.nl> | 2023-09-28 17:28:26 +0200 |
commit | 238e4bbad7712ccc3a3ea4a5b09c63bd147c692e (patch) | |
tree | 6cf335c2365a99115d931e4657576d902526bdb1 /askama_parser | |
parent | 36f4442978674a79aaebefcd4f04c7bfe6fe54c4 (diff) | |
download | askama-238e4bbad7712ccc3a3ea4a5b09c63bd147c692e.tar.gz askama-238e4bbad7712ccc3a3ea4a5b09c63bd147c692e.tar.bz2 askama-238e4bbad7712ccc3a3ea4a5b09c63bd147c692e.zip |
Limit nesting in parser nodes, too
Diffstat (limited to 'askama_parser')
-rw-r--r-- | askama_parser/src/lib.rs | 15 | ||||
-rw-r--r-- | askama_parser/src/node.rs | 12 |
2 files changed, 23 insertions, 4 deletions
diff --git a/askama_parser/src/lib.rs b/askama_parser/src/lib.rs index de88a20..3428735 100644 --- a/askama_parser/src/lib.rs +++ b/askama_parser/src/lib.rs @@ -255,6 +255,7 @@ fn path_or_identifier(i: &str) -> IResult<&str, PathOrIdentifier<'_>> { struct State<'a> { syntax: &'a Syntax<'a>, loop_depth: Cell<usize>, + level: Cell<Level>, } impl<'a> State<'a> { @@ -262,9 +263,19 @@ impl<'a> State<'a> { State { syntax, loop_depth: Cell::new(0), + level: Cell::new(Level::default()), } } + fn nest<'b>(&self, i: &'b str) -> Result<(), nom::Err<nom::error::Error<&'b str>>> { + self.level.set(self.level.get().nest(i)?); + Ok(()) + } + + fn leave(&self) { + self.level.set(self.level.get().leave()); + } + fn tag_block_start<'i>(&self, i: &'i str) -> IResult<&'i str, &'i str> { tag(self.syntax.block_start)(i) } @@ -337,5 +348,9 @@ impl Level { Ok(Level(self.0 + 1)) } + fn leave(&self) -> Self { + Level(self.0 - 1) + } + const MAX_DEPTH: u8 = 64; } diff --git a/askama_parser/src/node.rs b/askama_parser/src/node.rs index f25f25a..1909f6c 100644 --- a/askama_parser/src/node.rs +++ b/askama_parser/src/node.rs @@ -47,7 +47,7 @@ impl<'a> Node<'a> { } fn parse(i: &'a str, s: &State<'_>) -> IResult<&'a str, Self> { - let mut p = tuple(( + let mut p = delimited( |i| s.tag_block_start(i), alt(( map(Call::parse, Self::Call), @@ -65,9 +65,13 @@ impl<'a> Node<'a> { |i| Self::r#continue(i, s), )), cut(|i| s.tag_block_end(i)), - )); - let (i, (_, contents, _)) = p(i)?; - Ok((i, contents)) + ); + + s.nest(i)?; + let result = p(i); + s.leave(); + + result } fn r#break(i: &'a str, s: &State<'_>) -> IResult<&'a str, Self> { |