aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Duerr <contact@christianduerr.com>2020-03-01 23:25:37 +0000
committerGitHub <noreply@github.com>2020-03-02 02:25:37 +0300
commitcb3b717258d97fd05cd8be2676ad87bbf12b7511 (patch)
treec4c59b5624c9765a45650d6bc2d6cdbddc4f51b3
parent9e2fc2f4cd2db13f4f751fa7f21cf13629f9df32 (diff)
downloadr-alacritty-vte-cb3b717258d97fd05cd8be2676ad87bbf12b7511.tar.gz
r-alacritty-vte-cb3b717258d97fd05cd8be2676ad87bbf12b7511.tar.bz2
r-alacritty-vte-cb3b717258d97fd05cd8be2676ad87bbf12b7511.zip
Fix OOB in DCS parser
This resolves an issue with parsing of DCS escapes, where it would try to write parameters beyond the maximum parameter count limit. Fixes #50.
-rw-r--r--CHANGELOG.md4
-rw-r--r--src/lib.rs27
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
diff --git a/src/lib.rs b/src/lib.rs
index af1682e..30708ca 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -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();