]> git.eshelyaron.com Git - emacs.git/commitdiff
Avoid interleaving stderr lines when shutting down
authorPaul Eggert <eggert@cs.ucla.edu>
Sat, 13 Jul 2019 23:42:18 +0000 (16:42 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Sat, 13 Jul 2019 23:53:21 +0000 (16:53 -0700)
* 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
src/sysdep.c

index 9c93748a0f524ec3e1c7fa1599608bbd33402fb2..ad661a081b5e1af441288d97d69863df901a8d37 100644 (file)
@@ -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 ();
index 9301405943b41c44c97b89b2023bcead6c0ab28a..f7478253a3555c4f01b892c98a01137caa7381be 100644 (file)
@@ -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);