From c065c5f2f9c1ab0bf2c2ff27b64f4a4a51542e16 Mon Sep 17 00:00:00 2001 From: Christian Duerr Date: Thu, 17 Dec 2020 01:05:40 +0000 Subject: [PATCH] Fix invalid ESC escape sequence parsing This strictens the ESC escape sequence parser to prevent invalid intermediates from being ignored. Previously the parser would just look at the first intermediate without validating that the rest of them is empty. If an escape like `\e(#0` is used now, it will no longer be accepted as `\e(0` since the intermediate `#` is also present. --- CHANGELOG.md | 1 + alacritty_terminal/src/ansi.rs | 44 +++++++++++++++++----------------- 2 files changed, 23 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e98ae125..37f208af 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -37,6 +37,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - No live config update when starting Alacritty with a broken configuration file - PTY not drained to the end with the `--hold` flag enabled - High CPU usage on BSD with live config reload enabled +- Alacritty not discarding invalid escape sequences starting with ESC ### Removed diff --git a/alacritty_terminal/src/ansi.rs b/alacritty_terminal/src/ansi.rs index 4c50495c..21f0ec45 100644 --- a/alacritty_terminal/src/ansi.rs +++ b/alacritty_terminal/src/ansi.rs @@ -1131,12 +1131,12 @@ where } macro_rules! configure_charset { - ($charset:path, $intermediate:expr) => {{ - let index: CharsetIndex = match $intermediate { - Some(b'(') => CharsetIndex::G0, - Some(b')') => CharsetIndex::G1, - Some(b'*') => CharsetIndex::G2, - Some(b'+') => CharsetIndex::G3, + ($charset:path, $intermediates:expr) => {{ + let index: CharsetIndex = match $intermediates { + [b'('] => CharsetIndex::G0, + [b')'] => CharsetIndex::G1, + [b'*'] => CharsetIndex::G2, + [b'+'] => CharsetIndex::G3, _ => { unhandled!(); return; @@ -1146,27 +1146,27 @@ where }}; } - match (byte, intermediates.get(0)) { - (b'B', intermediate) => configure_charset!(StandardCharset::Ascii, intermediate), - (b'D', None) => self.handler.linefeed(), - (b'E', None) => { + match (byte, intermediates) { + (b'B', intermediates) => configure_charset!(StandardCharset::Ascii, intermediates), + (b'D', []) => self.handler.linefeed(), + (b'E', []) => { self.handler.linefeed(); self.handler.carriage_return(); }, - (b'H', None) => self.handler.set_horizontal_tabstop(), - (b'M', None) => self.handler.reverse_index(), - (b'Z', None) => self.handler.identify_terminal(self.writer, None), - (b'c', None) => self.handler.reset_state(), - (b'0', intermediate) => { - configure_charset!(StandardCharset::SpecialCharacterAndLineDrawing, intermediate) + (b'H', []) => self.handler.set_horizontal_tabstop(), + (b'M', []) => self.handler.reverse_index(), + (b'Z', []) => self.handler.identify_terminal(self.writer, None), + (b'c', []) => self.handler.reset_state(), + (b'0', intermediates) => { + configure_charset!(StandardCharset::SpecialCharacterAndLineDrawing, intermediates) }, - (b'7', None) => self.handler.save_cursor_position(), - (b'8', Some(b'#')) => self.handler.decaln(), - (b'8', None) => self.handler.restore_cursor_position(), - (b'=', None) => self.handler.set_keypad_application_mode(), - (b'>', None) => self.handler.unset_keypad_application_mode(), + (b'7', []) => self.handler.save_cursor_position(), + (b'8', [b'#']) => self.handler.decaln(), + (b'8', []) => self.handler.restore_cursor_position(), + (b'=', []) => self.handler.set_keypad_application_mode(), + (b'>', []) => self.handler.unset_keypad_application_mode(), // String terminator, do nothing (parser handles as string terminator). - (b'\\', None) => (), + (b'\\', []) => (), _ => unhandled!(), } }