Don't freeze with unreadable processes

Don't freeze if an exiting process can't be read from. (Bug#19860).
This fixes a bug I introduced in
2014-07-08T07:24:07Z@eggert@cs.ucla.edu
"* process.c: Add sanity checks for file descriptors."
Dmitry Gutov did most of the legwork in finding the problem.
* src/process.c (wait_reading_process_output):
Treat non-running processes that can't be read from
the same as other non-running processes.
This commit is contained in:
Paul Eggert 2015-04-25 16:16:58 -07:00
parent 45e571035b
commit 2c1b860494

View file

@ -4785,37 +4785,41 @@ wait_reading_process_output (intmax_t time_limit, int nsecs, int read_kbd,
if (wait_proc && wait_proc->raw_status_new)
update_status (wait_proc);
if (wait_proc
&& wait_proc->infd >= 0
&& ! EQ (wait_proc->status, Qrun)
&& ! EQ (wait_proc->status, Qconnect))
{
bool read_some_bytes = false;
clear_waiting_for_input ();
XSETPROCESS (proc, wait_proc);
/* Read data from the process, until we exhaust it. */
while (true)
/* If data can be read from the process, do so until exhausted. */
if (wait_proc->infd >= 0)
{
int nread = read_process_output (proc, wait_proc->infd);
if (nread < 0)
XSETPROCESS (proc, wait_proc);
while (true)
{
if (errno == EIO || errno == EAGAIN)
break;
int nread = read_process_output (proc, wait_proc->infd);
if (nread < 0)
{
if (errno == EIO || errno == EAGAIN)
break;
#ifdef EWOULDBLOCK
if (errno == EWOULDBLOCK)
break;
if (errno == EWOULDBLOCK)
break;
#endif
}
else
{
if (got_some_input < nread)
got_some_input = nread;
if (nread == 0)
break;
read_some_bytes = true;
}
else
{
if (got_some_input < nread)
got_some_input = nread;
if (nread == 0)
break;
read_some_bytes = true;
}
}
}
if (read_some_bytes && do_display)
redisplay_preserve_echo_area (10);