From 054be5025762c5e1c7e853c4fa5d7eed8da1727f Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Fri, 16 Sep 2016 18:52:42 +0200 Subject: [PATCH] printMsg(): Don't check for interrupts Having the logger function potentially throw exceptions is Heisenbuggy. --- src/libutil/logging.cc | 12 +++++------- src/libutil/util.cc | 16 ++++++++-------- src/libutil/util.hh | 4 ++-- 3 files changed, 15 insertions(+), 17 deletions(-) diff --git a/src/libutil/logging.cc b/src/libutil/logging.cc index 15bb1e175..0229ba472 100644 --- a/src/libutil/logging.cc +++ b/src/libutil/logging.cc @@ -60,14 +60,12 @@ void warnOnce(bool & haveWarned, const FormatOrString & fs) void writeToStderr(const string & s) { try { - writeFull(STDERR_FILENO, s); + writeFull(STDERR_FILENO, s, false); } catch (SysError & e) { - /* Ignore failing writes to stderr if we're in an exception - handler, otherwise throw an exception. We need to ignore - write errors in exception handlers to ensure that cleanup - code runs to completion if the other side of stderr has - been closed unexpectedly. */ - if (!std::uncaught_exception()) throw; + /* Ignore failing writes to stderr. We need to ignore write + errors to ensure that cleanup code that logs to stderr runs + to completion if the other side of stderr has been closed + unexpectedly. */ } } diff --git a/src/libutil/util.cc b/src/libutil/util.cc index 87e97c20f..8e029fb48 100644 --- a/src/libutil/util.cc +++ b/src/libutil/util.cc @@ -474,24 +474,24 @@ void readFull(int fd, unsigned char * buf, size_t count) } -void writeFull(int fd, const unsigned char * buf, size_t count) +void writeFull(int fd, const unsigned char * buf, size_t count, bool allowInterrupts) { while (count) { - checkInterrupt(); ssize_t res = write(fd, (char *) buf, count); - if (res == -1) { - if (errno == EINTR) continue; + if (res == -1 && errno != EINTR) throw SysError("writing to file"); + if (res > 0) { + count -= res; + buf += res; } - count -= res; - buf += res; + if (allowInterrupts) checkInterrupt(); } } -void writeFull(int fd, const string & s) +void writeFull(int fd, const string & s, bool allowInterrupts) { - writeFull(fd, (const unsigned char *) s.data(), s.size()); + writeFull(fd, (const unsigned char *) s.data(), s.size(), allowInterrupts); } diff --git a/src/libutil/util.hh b/src/libutil/util.hh index 7aeca0edc..9bf548326 100644 --- a/src/libutil/util.hh +++ b/src/libutil/util.hh @@ -120,8 +120,8 @@ void replaceSymlink(const Path & target, const Path & link); /* Wrappers arount read()/write() that read/write exactly the requested number of bytes. */ void readFull(int fd, unsigned char * buf, size_t count); -void writeFull(int fd, const unsigned char * buf, size_t count); -void writeFull(int fd, const string & s); +void writeFull(int fd, const unsigned char * buf, size_t count, bool allowInterrupts = true); +void writeFull(int fd, const string & s, bool allowInterrupts = true); MakeError(EndOfFile, Error)