torerr: Try harder to flush raw assert messages before process termination

Some platforms (macOS, maybe others?) can swallow the last write before an
abort. This issue is probably caused by a race condition between write
buffer cache flushing, and process termination. So we write an extra
newline, to make sure that the message always gets through.

Fixes bug 31571; bugfix on 0.3.5.1-alpha.
This commit is contained in:
teor 2019-08-30 21:17:56 +10:00
parent 65a1d86491
commit c55591825f
No known key found for this signature in database
GPG Key ID: 10FEAA0E7075672A
2 changed files with 14 additions and 1 deletions

7
changes/bug31571 Normal file
View File

@ -0,0 +1,7 @@
o Minor bugfixes (error handling):
- Report the tor version whenever an assertion fails. Previously, we only
reported the Tor version on some crashes, and some non-fatal assertions.
Fixes bug 31571; bugfix on 0.3.5.1-alpha.
- On abort, try harder to flush the output buffers of log messages. On
some platforms (macOS), log messages can be discarded when the process
terminates. Fixes bug 31571; bugfix on 0.3.5.1-alpha.

View File

@ -146,13 +146,19 @@ tor_raw_assertion_failed_msg_(const char *file, int line, const char *expr,
format_dec_number_sigsafe(line, linebuf, sizeof(linebuf));
tor_log_err_sigsafe("INTERNAL ERROR: Raw assertion failed in ",
get_tor_backtrace_version(), " at ",
file, ":", linebuf, ": ", expr, NULL);
file, ":", linebuf, ": ", expr, "\n", NULL);
if (msg) {
tor_log_err_sigsafe_write(msg);
tor_log_err_sigsafe_write("\n");
}
dump_stack_symbols_to_error_fds();
/* Some platforms (macOS, maybe others?) can swallow the last write before an
* abort. This issue is probably caused by a race condition between write
* buffer cache flushing, and process termination. So we write an extra
* newline, to make sure that the message always gets through. */
tor_log_err_sigsafe_write("\n");
}
/* As format_{hex,dex}_number_sigsafe, but takes a <b>radix</b> argument