Harden terminal reconnect packet handling
This commit is contained in:
+21
-5
@@ -5679,19 +5679,21 @@ fn stale_mouse_report_maybe_incomplete(bytes: &[u8], offset: usize) -> bool {
|
||||
[0x1b] | [0x1b, b'['] | [0x1b, b'[', b'<'] => true,
|
||||
[0x1b, b'[', b'M', ..] if rest.len() < 6 => true,
|
||||
[0x1b, b'[', b'<', params @ ..] | [0x1b, b'[', params @ ..]
|
||||
if params_are_mouse_prefix(params) =>
|
||||
if params_are_mouse_prefix(params, 2) =>
|
||||
{
|
||||
true
|
||||
}
|
||||
[0x9b] | [0x9b, b'<'] => true,
|
||||
[0x9b, b'M', ..] if rest.len() < 5 => true,
|
||||
[0x9b, b'<', params @ ..] | [0x9b, params @ ..] if params_are_mouse_prefix(params) => true,
|
||||
params if params_are_mouse_prefix(params) => true,
|
||||
[0x9b, b'<', params @ ..] | [0x9b, params @ ..] if params_are_mouse_prefix(params, 2) => {
|
||||
true
|
||||
}
|
||||
params if params_are_mouse_prefix(params, 2) => true,
|
||||
_ => false,
|
||||
}
|
||||
}
|
||||
|
||||
fn params_are_mouse_prefix(params: &[u8]) -> bool {
|
||||
fn params_are_mouse_prefix(params: &[u8], min_semicolons: usize) -> bool {
|
||||
let mut semicolons = 0usize;
|
||||
let mut saw_digit = false;
|
||||
for byte in params {
|
||||
@@ -5701,7 +5703,7 @@ fn params_are_mouse_prefix(params: &[u8]) -> bool {
|
||||
_ => return false,
|
||||
}
|
||||
}
|
||||
saw_digit && semicolons >= 1
|
||||
saw_digit && semicolons >= min_semicolons
|
||||
}
|
||||
|
||||
async fn flush_startup_input_if_ready(
|
||||
@@ -8529,6 +8531,20 @@ mod tests {
|
||||
assert_eq!(strip_stale_mouse_reports(b"10m"), b"");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn numeric_semicolon_input_survives_stale_filter() {
|
||||
assert_eq!(strip_stale_mouse_reports(b"123;"), b"123;");
|
||||
assert_eq!(strip_stale_mouse_reports(b"12;34"), b"12;34");
|
||||
assert_eq!(strip_stale_mouse_reports(b"echo 1;"), b"echo 1;");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn incomplete_three_field_mouse_prefix_is_suppressed() {
|
||||
assert_eq!(strip_stale_mouse_reports(b"35;152;"), b"");
|
||||
assert_eq!(strip_stale_mouse_reports(b"\x1b[<35;152;"), b"");
|
||||
assert_eq!(strip_stale_mouse_reports(b"\x9b35;152;"), b"");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn stale_focus_reports_are_stripped_from_pending_input() {
|
||||
assert_eq!(strip_stale_mouse_reports(b"\x1b[Ihello\x1b[O"), b"hello");
|
||||
|
||||
Reference in New Issue
Block a user