about summary refs log tree commit diff
path: root/src/libutil
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2010-10-04T11·23+0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2010-10-04T11·23+0000
commit450837bcc887a47260817611d01c22e35aba92b6 (patch)
treeaf0f81ed0572373b84a0642e87f4b702d124a250 /src/libutil
parent4aa92450832e87018513a2453e39858fab00833a (diff)
* In printMsg(), 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.

Diffstat (limited to 'src/libutil')
-rw-r--r--src/libutil/util.cc11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/libutil/util.cc b/src/libutil/util.cc
index c79ce1041c..32c8fce9a1 100644
--- a/src/libutil/util.cc
+++ b/src/libutil/util.cc
@@ -482,7 +482,16 @@ void printMsg_(Verbosity level, const format & f)
     else if (logType == ltEscapes && level != lvlInfo)
         prefix = "\033[" + escVerbosity(level) + "s";
     string s = (format("%1%%2%\n") % prefix % f.str()).str();
-    writeToStderr((const unsigned char *) s.c_str(), s.size());
+    try {
+        writeToStderr((const unsigned char *) s.c_str(), s.size());
+    } 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;
+    }
 }