* 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.
This commit is contained in:
parent
4aa9245083
commit
450837bcc8
1 changed files with 10 additions and 1 deletions
|
@ -482,7 +482,16 @@ void printMsg_(Verbosity level, const format & f)
|
||||||
else if (logType == ltEscapes && level != lvlInfo)
|
else if (logType == ltEscapes && level != lvlInfo)
|
||||||
prefix = "\033[" + escVerbosity(level) + "s";
|
prefix = "\033[" + escVerbosity(level) + "s";
|
||||||
string s = (format("%1%%2%\n") % prefix % f.str()).str();
|
string s = (format("%1%%2%\n") % prefix % f.str()).str();
|
||||||
|
try {
|
||||||
writeToStderr((const unsigned char *) s.c_str(), s.size());
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue