diff options
-rw-r--r-- | CHANGELOG.md | 4 | ||||
-rw-r--r-- | src/lib.rs | 27 |
2 files changed, 29 insertions, 2 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 8b3e5dc..212b2ff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,10 @@ CHANGELOG ========= +## [Unreleased] + +- Out of bounds when parsing a DCS with more than 16 parameters + ## 0.7.0 - Fix params reset between escapes @@ -202,8 +202,12 @@ impl Parser { Action::Print => performer.print(byte as char), Action::Execute => performer.execute(byte), Action::Hook => { - self.params[self.num_params] = self.param; - self.num_params += 1; + if self.num_params == MAX_PARAMS { + self.ignoring = true; + } else { + self.params[self.num_params] = self.param; + self.num_params += 1; + } performer.hook(self.params(), self.intermediates(), self.ignoring, byte as char); }, @@ -583,6 +587,25 @@ mod tests { } #[test] + fn parse_dcs_max_params() { + static INPUT: &[u8] = b"\x1bP1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;p\x1b"; + let mut dispatcher = DcsDispatcher::default(); + let mut parser = Parser::new(); + + for byte in INPUT { + parser.advance(&mut dispatcher, *byte); + } + + // Check that flag is set and thus osc_dispatch assertions ran. + assert!(dispatcher.ignore); + assert!(dispatcher.dispatched_dcs); + assert_eq!(dispatcher.params.len(), MAX_PARAMS); + for param in dispatcher.params.iter() { + assert_eq!(*param, 1); + } + } + + #[test] fn osc_bell_terminated() { static INPUT: &[u8] = b"\x1b]11;ff/00/ff\x07"; let mut dispatcher = OscDispatcher::default(); |