From b88a347ebaa75c917e17f3f37c8eef8a82a6c011 Mon Sep 17 00:00:00 2001 From: DuProcess <273172371+DuProcess@users.noreply.github.com> Date: Fri, 17 Jul 2026 18:02:27 -0400 Subject: [PATCH] Fail safely on Windows console mode errors --- src/bin/dosh-client.rs | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/src/bin/dosh-client.rs b/src/bin/dosh-client.rs index 8685992..e49bf97 100644 --- a/src/bin/dosh-client.rs +++ b/src/bin/dosh-client.rs @@ -10565,9 +10565,17 @@ impl RawMode { fn enter() -> Result { flush_local_terminal_input(); enable_raw_mode()?; + #[cfg(windows)] + let console_modes = match WindowsConsoleModeGuard::enter() { + Ok(guard) => guard, + Err(err) => { + let _ = disable_raw_mode(); + return Err(err); + } + }; let raw = Self { #[cfg(windows)] - console_modes: WindowsConsoleModeGuard::enter(), + console_modes, }; flush_local_terminal_input(); drain_local_terminal_input(); @@ -10614,7 +10622,7 @@ struct WindowsConsoleModeGuard { #[cfg(windows)] impl WindowsConsoleModeGuard { - fn enter() -> Self { + fn enter() -> Result { unsafe { use windows_sys::Win32::Foundation::INVALID_HANDLE_VALUE; use windows_sys::Win32::System::Console::{ @@ -10630,8 +10638,9 @@ impl WindowsConsoleModeGuard { None } else { let desired = windows_vt_input_mode(original); - if desired != original { - let _ = SetConsoleMode(input_handle, desired); + if desired != original && SetConsoleMode(input_handle, desired) == 0 { + return Err(std::io::Error::last_os_error()) + .context("enable Windows virtual-terminal input mode"); } Some((input_handle, original)) } @@ -10646,14 +10655,18 @@ impl WindowsConsoleModeGuard { None } else { let desired = windows_vt_output_mode(original); - if desired != original { - let _ = SetConsoleMode(output_handle, desired); + if desired != original && SetConsoleMode(output_handle, desired) == 0 { + let err = std::io::Error::last_os_error(); + if let Some((handle, mode)) = input { + let _ = SetConsoleMode(handle, mode); + } + return Err(err).context("enable Windows virtual-terminal output mode"); } Some((output_handle, original)) } }; - Self { input, output } + Ok(Self { input, output }) } }