]> git.eshelyaron.com Git - emacs.git/commitdiff
Don’t ignore stderr failure when ADDRESS_SANITIZER
authorPaul Eggert <eggert@cs.ucla.edu>
Sun, 7 Jul 2019 00:41:52 +0000 (17:41 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Sun, 7 Jul 2019 00:43:11 +0000 (17:43 -0700)
* src/emacs.c (close_output_streams): Move from here ...
* src/sysdep.c: ... to here, where it really belongs anyway.
When ADDRESS_SANITIZER, fflush stderr and check for ferror,
to catch stderr output errors even in this case.

src/emacs.c
src/sysdep.c
src/sysstdio.h

index 32bb57e27251b4e90b00a913a5cf94aa9fa0efd8..fc1a4beec509d09728aad1d6fa5db8bce8807337 100644 (file)
@@ -29,8 +29,6 @@ along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.  */
 #include <sys/stat.h>
 #include <unistd.h>
 
-#include <close-stream.h>
-
 #define MAIN_PROGRAM
 #include "lisp.h"
 #include "sysstdio.h"
@@ -661,24 +659,6 @@ argmatch (char **argv, int argc, const char *sstr, const char *lstr,
     }
 }
 
-/* Close standard output and standard error, reporting any write
-   errors as best we can.  This is intended for use with atexit.  */
-static void
-close_output_streams (void)
-{
-  if (close_stream (stdout) != 0)
-    {
-      emacs_perror ("Write error to standard output");
-      _exit (EXIT_FAILURE);
-    }
-
-  /* Do not close stderr if addresses are being sanitized, as the
-     sanitizer might report to stderr after this function is
-     invoked.  */
-  if (!ADDRESS_SANITIZER && close_stream (stderr) != 0)
-    _exit (EXIT_FAILURE);
-}
-
 #ifdef HAVE_PDUMPER
 
 static const char *
index 4f89e8aba10694c9fc93df402df73d2e8266e577..48eebb594f72578e08b047bd2cef635a1afaeeb8 100644 (file)
@@ -30,6 +30,7 @@ along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.  */
 #include <unistd.h>
 
 #include <c-ctype.h>
+#include <close-stream.h>
 #include <pathmax.h>
 #include <utimens.h>
 
@@ -2768,6 +2769,25 @@ safe_strsignal (int code)
   return signame;
 }
 \f
+/* Close standard output and standard error, reporting any write
+   errors as best we can.  This is intended for use with atexit.  */
+void
+close_output_streams (void)
+{
+  if (close_stream (stdout) != 0)
+    {
+      emacs_perror ("Write error to standard output");
+      _exit (EXIT_FAILURE);
+    }
+
+  /* Do not close stderr if addresses are being sanitized, as the
+     sanitizer might report to stderr after this function is invoked.  */
+  if (ADDRESS_SANITIZER
+      ? fflush_unlocked (stderr) != 0 || ferror (stderr)
+      : close_stream (stderr) != 0)
+    _exit (EXIT_FAILURE);
+}
+\f
 #ifndef DOS_NT
 /* For make-serial-process  */
 int
index 3ff1d6a572a1e4bf1d77bd23047e51125c5c94d6..a2364c4e1fb26778c27265c1fd9c99d107d9c604 100644 (file)
@@ -24,6 +24,7 @@ along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.  */
 #include <stdio.h>
 
 extern FILE *emacs_fopen (char const *, char const *);
+extern void close_output_streams (void);
 
 #if O_BINARY
 # define FOPEN_BINARY "b"