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:
parent
45e571035b
commit
2c1b860494
1 changed files with 22 additions and 18 deletions
|
@ -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);
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue