Avoid killing Zed when terminating terminal process before process group is set by shell (#52542)

Max Brunsfeld created

Release Notes:

- Fixed a bug where killing a terminal process in the agent panel would
sometimes kill Zed itself.

Change summary

crates/terminal/src/pty_info.rs | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)

Detailed changes

crates/terminal/src/pty_info.rs 🔗

@@ -36,11 +36,19 @@ impl ProcessIdGetter {
     }
 
     fn pid(&self) -> Option<Pid> {
+        // Negative pid means error.
+        // Zero pid means no foreground process group is set on the PTY yet.
+        // Avoid killing the current process by returning a zero pid.
         let pid = unsafe { libc::tcgetpgrp(self.handle) };
-        if pid < 0 {
+        if pid > 0 {
+            return Some(Pid::from_u32(pid as u32));
+        }
+
+        if self.fallback_pid > 0 {
             return Some(Pid::from_u32(self.fallback_pid));
         }
-        Some(Pid::from_u32(pid as u32))
+
+        None
     }
 }