From 26a38742f8a8bd703440b34d5d03dc7de7be7a14 Mon Sep 17 00:00:00 2001 From: Chris Mounce Date: Sat, 7 Jun 2025 12:41:19 -0700 Subject: [PATCH] Fix bug with literal_i() going beyond EOI --- src/peg/peg.rs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/peg/peg.rs b/src/peg/peg.rs index f17217b..c7a9317 100644 --- a/src/peg/peg.rs +++ b/src/peg/peg.rs @@ -108,7 +108,8 @@ pub mod backend { } fn literal_i(&mut self, s: &str) -> bool { - if self.input[self.offset..(self.offset + s.len())].eq_ignore_ascii_case(s) { + let range = self.offset..(self.offset + s.len()); + if range.end <= self.input.len() && self.input[range].eq_ignore_ascii_case(s) { self.offset += s.len(); true } else { @@ -216,6 +217,7 @@ mod tests { quoted = dq ("\\" ANY / !dq ANY)* dq; case_sensitivity = "Strict " ('a'..'z')+ ", loose "i ('a'..'z'i)+; + long_icase_str = "foo bar baz"i; @icase hex_config = "let " var_name " = 0x" ('a'..'f' / '0'..'9')+; @@ -322,6 +324,12 @@ mod tests { assert!(!parse(hex_config, "let BAR = 0xcafe")); } + #[test] + fn test_icase_eoi() { + assert!(parse(long_icase_str, "FOO BAR BAZ")); + assert!(!parse(long_icase_str, "FOO BAR BA")); + } + #[test] fn test_captures() { let mut p = ParseState::new("alice@example.com");