Fix for issue where a file may be incompletely read on receipt of a signal.

This commit is contained in:
ridiculousfish 2013-04-07 14:52:16 -07:00
parent 3f172d13b2
commit 42497d9932

View file

@ -3627,22 +3627,23 @@ static int read_ni(int fd, const io_chain_t &io)
{ {
if (errno == EINTR) if (errno == EINTR)
{ {
/* We got a signal, just keep going */ /* We got a signal, just keep going. Be sure that we call insert() below because we may get data as well as EINTR. */
continue; clearerr(in_stream);
} }
else if ((errno == EAGAIN || errno == EWOULDBLOCK) && make_fd_blocking(des) == 0) else if ((errno == EAGAIN || errno == EWOULDBLOCK) && make_fd_blocking(des) == 0)
{ {
/* We succeeded in making the fd blocking, try again */ /* We succeeded in making the fd blocking, keep going */
continue; clearerr(in_stream);
} }
else
{
/* Fatal error */ /* Fatal error */
debug(1, _(L"Error while reading from file descriptor")); debug(1, _(L"Error while reading from file descriptor"));
/* Reset buffer on error. We won't evaluate incomplete files. */ /* Reset buffer on error. We won't evaluate incomplete files. */
acc.clear(); acc.clear();
break; break;
}
} }
acc.insert(acc.end(), buff, buff + c); acc.insert(acc.end(), buff, buff + c);