From 42497d99325d5f27a90cc82e4e445c1252f87e7c Mon Sep 17 00:00:00 2001 From: ridiculousfish Date: Sun, 7 Apr 2013 14:52:16 -0700 Subject: [PATCH] Fix for issue where a file may be incompletely read on receipt of a signal. --- reader.cpp | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/reader.cpp b/reader.cpp index c664c4f63..ee3daaaac 100644 --- a/reader.cpp +++ b/reader.cpp @@ -3627,22 +3627,23 @@ static int read_ni(int fd, const io_chain_t &io) { if (errno == EINTR) { - /* We got a signal, just keep going */ - continue; + /* We got a signal, just keep going. Be sure that we call insert() below because we may get data as well as EINTR. */ + clearerr(in_stream); } else if ((errno == EAGAIN || errno == EWOULDBLOCK) && make_fd_blocking(des) == 0) { - /* We succeeded in making the fd blocking, try again */ - continue; + /* We succeeded in making the fd blocking, keep going */ + clearerr(in_stream); } - - /* Fatal error */ - debug(1, _(L"Error while reading from file descriptor")); - - /* Reset buffer on error. We won't evaluate incomplete files. */ - acc.clear(); - break; + else + { + /* Fatal error */ + debug(1, _(L"Error while reading from file descriptor")); + /* Reset buffer on error. We won't evaluate incomplete files. */ + acc.clear(); + break; + } } acc.insert(acc.end(), buff, buff + c);