diff --git a/Library/Homebrew/sandbox.rb b/Library/Homebrew/sandbox.rb index 9e30f01657..7d79ad04bd 100644 --- a/Library/Homebrew/sandbox.rb +++ b/Library/Homebrew/sandbox.rb @@ -115,17 +115,25 @@ class Sandbox end write_to_pty = proc do + # Don't hang if stdin is not able to be used - throw EIO instead. + old_ttin = trap(:TTIN, "IGNORE") + # Update the window size whenever the parent terminal's window size changes. old_winch = trap(:WINCH, &winch) winch.call(nil) - stdin_thread = Thread.new { IO.copy_stream($stdin, w) } + stdin_thread = Thread.new do + IO.copy_stream($stdin, w) + rescue Errno::EIO + # stdin is unavailable - move on. + end r.each_char { |c| print(c) } Process.wait(pid) ensure stdin_thread&.kill + trap(:TTIN, old_ttin) trap(:WINCH, old_winch) end @@ -134,7 +142,13 @@ class Sandbox # mode while we copy the input/output of the process spawned in the # PTY. After we've finished copying to/from the PTY process, io.raw # will restore the stdin TTY to its original state. - $stdin.raw(&write_to_pty) + begin + # Ignore SIGTTOU as setting raw mode will hang if the process is in the background. + old_ttou = trap(:TTOU, "IGNORE") + $stdin.raw(&write_to_pty) + ensure + trap(:TTOU, old_ttou) + end else write_to_pty.call end