>From 34810ab4f9990a8de1e503fdf6b485d8eeea1601 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Sat, 13 Jul 2019 16:42:18 -0700 Subject: [PATCH] Avoid interleaving stderr lines when shutting down * src/emacs.c (shut_down_emacs) [!DOS_NT]: Avoid interleaving to stderr in the usual case, by using a single write and by appending a newline. * src/sysdep.c (emacs_backtrace) [HAVE_BACKTRACE_SYMBOLS_FD]: Omit newline since shut_down_emacs now does that. --- src/emacs.c | 38 ++++++++++++++++++++++---------------- src/sysdep.c | 2 +- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/src/emacs.c b/src/emacs.c index 9c93748a0f..ad661a081b 100644 --- a/src/emacs.c +++ b/src/emacs.c @@ -2454,23 +2454,29 @@ shut_down_emacs (int sig, Lisp_Object stuff) /* If we are controlling the terminal, reset terminal modes. */ #ifndef DOS_NT - { - pid_t pgrp = getpgrp (); - pid_t tpgrp = tcgetpgrp (0); - if ((tpgrp != -1) && tpgrp == pgrp) - { - reset_all_sys_modes (); - if (sig && sig != SIGTERM) - { - static char const format[] = "Fatal error %d: "; - char buf[sizeof format - 2 + INT_STRLEN_BOUND (int)]; - int buflen = sprintf (buf, format, sig); - char const *sig_desc = safe_strsignal (sig); + pid_t tpgrp = tcgetpgrp (STDIN_FILENO); + if (tpgrp != -1 && tpgrp == getpgrp ()) + { + reset_all_sys_modes (); + if (sig && sig != SIGTERM) + { + static char const fmt[] = "Fatal error %d: %n%s\n"; + char buf[max ((sizeof fmt - sizeof "%d%n%s\n" + + INT_STRLEN_BOUND (int) + 1), + min (PIPE_BUF, MAX_ALLOCA))]; + char const *sig_desc = safe_strsignal (sig); + int nlen; + int buflen = snprintf (buf, sizeof buf, fmt, sig, &nlen, sig_desc); + if (0 <= buflen && buflen < sizeof buf) emacs_write (STDERR_FILENO, buf, buflen); - emacs_write (STDERR_FILENO, sig_desc, strlen (sig_desc)); - } - } - } + else + { + emacs_write (STDERR_FILENO, buf, nlen); + emacs_write (STDERR_FILENO, sig_desc, strlen (sig_desc)); + emacs_write (STDERR_FILENO, fmt + sizeof fmt - 2, 1); + } + } + } #else fflush (stdout); reset_all_sys_modes (); diff --git a/src/sysdep.c b/src/sysdep.c index 9301405943..f7478253a3 100644 --- a/src/sysdep.c +++ b/src/sysdep.c @@ -2436,7 +2436,7 @@ emacs_backtrace (int backtrace_limit) if (npointers) { - emacs_write (STDERR_FILENO, "\nBacktrace:\n", 12); + emacs_write (STDERR_FILENO, "Backtrace:\n", 11); backtrace_symbols_fd (buffer, npointers, STDERR_FILENO); if (bounded_limit < npointers) emacs_write (STDERR_FILENO, "...\n", 4); -- 2.17.1