Don’t ignore stderr failure when ADDRESS_SANITIZER

* 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.
This commit is contained in:
Paul Eggert 2019-07-06 17:41:52 -07:00
parent 851535f587
commit b39f5e6c9c
3 changed files with 21 additions and 20 deletions

View 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 *

View 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;
}
/* 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);
}
#ifndef DOS_NT
/* For make-serial-process */
int

View 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"