From ffff9109c34a1e9575104e879320b24028b816d0 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Tue, 1 Sep 2026 05:14:07 -0700 Subject: [PATCH 1/2] cmux-tui: reap child when reaper thread spawn fails --- cmux-tui/crates/cmux-tui-core/src/surface.rs | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/cmux-tui/crates/cmux-tui-core/src/surface.rs b/cmux-tui/crates/cmux-tui-core/src/surface.rs index 1ac55ea399a1..eb999cb8d0ff 100644 --- a/cmux-tui/crates/cmux-tui-core/src/surface.rs +++ b/cmux-tui/crates/cmux-tui-core/src/surface.rs @@ -2563,9 +2563,13 @@ impl Surface { // Child reaper: retain the native status and rendezvous with PTY EOF // so final output is visible before the mux observes completion. - std::thread::Builder::new().name(format!("surface-{id}-wait")).spawn({ + let child_slot = Arc::new(Mutex::new(Some(child))); + let child_for_reaper = child_slot.clone(); + let reaper = std::thread::Builder::new().name(format!("surface-{id}-wait")).spawn({ let surface = surface.clone(); move || { + let mut child = + child_for_reaper.lock().unwrap().take().expect("child reaper owns child"); let exit = wait_for_native_child_status(child.as_mut()); if let Some(pty) = surface.as_pty() { *pty.exit.lock().unwrap() = Some(exit); @@ -2573,7 +2577,14 @@ impl Surface { close_local_terminal_master_after_exit(&surface); publish_local_exit_if_ready(&surface); } - })?; + }); + if let Err(error) = reaper { + if let Some(mut child) = child_slot.lock().unwrap().take() { + let _ = child.kill(); + let _ = child.wait(); + } + return Err(error.into()); + } Ok(surface) } From 4b9c086e4c9e869b46eb9cf9454a85149110ca25 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Tue, 1 Sep 2026 05:55:11 -0700 Subject: [PATCH 2/2] cmux-tui: close PTY master on reaper spawn failure --- cmux-tui/crates/cmux-tui-core/src/surface.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/cmux-tui/crates/cmux-tui-core/src/surface.rs b/cmux-tui/crates/cmux-tui-core/src/surface.rs index eb999cb8d0ff..dac1b8cc87e3 100644 --- a/cmux-tui/crates/cmux-tui-core/src/surface.rs +++ b/cmux-tui/crates/cmux-tui-core/src/surface.rs @@ -2583,6 +2583,7 @@ impl Surface { let _ = child.kill(); let _ = child.wait(); } + close_local_terminal_master_after_exit(&surface); return Err(error.into()); }