Skip to content

Commit

Permalink
Revert "termio/exec: fix SIGPIPE crash when reader exits early"
Browse files Browse the repository at this point in the history
This reverts commit 3e24e96.
  • Loading branch information
mitchellh committed Jan 9, 2025
1 parent 12ce9f2 commit 6ef757a
Showing 1 changed file with 9 additions and 16 deletions.
25 changes: 9 additions & 16 deletions src/termio/Exec.zig
Original file line number Diff line number Diff line change
Expand Up @@ -179,11 +179,8 @@ pub fn threadExit(self: *Exec, td: *termio.Termio.ThreadData) void {
// Quit our read thread after exiting the subprocess so that
// we don't get stuck waiting for data to stop flowing if it is
// a particularly noisy process.
if (exec.read_thread_pipe) |pipe| {
posix.close(pipe);
// Tell deinit that we've already closed the pipe
exec.read_thread_pipe = null;
}
_ = posix.write(exec.read_thread_pipe, "x") catch |err|
log.warn("error writing to read thread quit pipe err={}", .{err});

if (comptime builtin.os.tag == .windows) {
// Interrupt the blocking read so the thread can see the quit message
Expand Down Expand Up @@ -642,7 +639,7 @@ pub const ThreadData = struct {

/// Reader thread state
read_thread: std.Thread,
read_thread_pipe: ?posix.fd_t,
read_thread_pipe: posix.fd_t,
read_thread_fd: posix.fd_t,

/// The timer to detect termios state changes.
Expand All @@ -655,8 +652,7 @@ pub const ThreadData = struct {
termios_mode: ptypkg.Mode = .{},

pub fn deinit(self: *ThreadData, alloc: Allocator) void {
// If the pipe isn't closed, close it.
if (self.read_thread_pipe) |pipe| posix.close(pipe);
posix.close(self.read_thread_pipe);

// Clear our write pools. We know we aren't ever going to do
// any more IO since we stop our data stream below so we can just
Expand Down Expand Up @@ -1437,12 +1433,9 @@ pub const ReadThread = struct {
};

// This happens on macOS instead of WouldBlock when the
// child process dies. It's equivalent to NotOpenForReading
// so we can just exit.
if (n == 0) {
log.info("io reader exiting", .{});
return;
}
// child process dies. To be safe, we just break the loop
// and let our poll happen.
if (n == 0) break;

// log.info("DATA: {d}", .{n});
@call(.always_inline, termio.Termio.processOutput, .{ io, buf[0..n] });
Expand All @@ -1454,8 +1447,8 @@ pub const ReadThread = struct {
return;
};

// If our quit fd is closed, we're done.
if (pollfds[1].revents & posix.POLL.HUP != 0) {
// If our quit fd is set, we're done.
if (pollfds[1].revents & posix.POLL.IN != 0) {
log.info("read thread got quit signal", .{});
return;
}
Expand Down

0 comments on commit 6ef757a

Please sign in to comment.