]> Savannah Git Hosting - gnulib.git/commitdiff
closeout: don’t close stderr when sanitizing
authorPaul Eggert <eggert@cs.ucla.edu>
Fri, 19 May 2017 15:52:38 +0000 (08:52 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Fri, 19 May 2017 15:56:01 +0000 (08:56 -0700)
* NEWS: Document this.
* lib/closeout.c (__has_feature): New macro, if not already defined.
(SANITIZE_ADDRESS): New constant.
(close_stdout): Don’t close stderr if sanitizing addresses.

ChangeLog
NEWS
lib/closeout.c

index 3dce45ea6b070942fbe22d8538ca3bc5d8519122..4794685a91fc665d0eae037fe93cc0f38a3e642c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2017-05-19  Paul Eggert  <eggert@cs.ucla.edu>
+
+       closeout: don’t close stderr when sanitizing
+       * NEWS: Document this.
+       * lib/closeout.c (__has_feature): New macro, if not already defined.
+       (SANITIZE_ADDRESS): New constant.
+       (close_stdout): Don’t close stderr if sanitizing addresses.
+
 2017-05-19  Bruno Haible  <bruno@clisp.org>
 
        get-rusage-data tests: Avoid failure on Linux/glibc.
diff --git a/NEWS b/NEWS
index bd40347174c879a671f8e9f6881f8fe28185e5cc..b75ca01427f6f5e5e6b64b9a3f1700ec36b7918c 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -42,6 +42,10 @@ User visible incompatible changes
 
 Date        Modules         Changes
 
+2017-05-19  closeout        close_stdout longer closes stderr when addresses
+                            are being sanitized, as the sanitizer outputs to
+                            stderr afterwards.
+
 2017-02-16  binary-io       On MS-DOS and OS/2, set_binary_mode now fails
                             on ttys, and sets errno == EINVAL.
 
index a23388f9c71e9ce92ed295d28f38991b9bf65eda..2a3f79152d45390a03c1daece623fd17a0f7f276 100644 (file)
 #include "exitfail.h"
 #include "quotearg.h"
 
+#ifndef __has_feature
+# define __has_feature(a) false
+#endif
+
+#if defined __SANITIZE_ADDRESS__ || __has_feature (address_sanitizer)
+enum { SANITIZE_ADDRESS = true };
+#else
+enum { SANITIZE_ADDRESS = false };
+#endif
+
 static const char *file_name;
 
 /* Set the file name to be reported in the event an error is detected
@@ -119,6 +129,8 @@ close_stdout (void)
       _exit (exit_failure);
     }
 
-   if (close_stream (stderr) != 0)
-     _exit (exit_failure);
+  /* Close stderr only if not sanitizing, as sanitizers may report to
+     stderr after this function returns.  */
+  if (!SANITIZE_ADDRESS && close_stream (stderr) != 0)
+    _exit (exit_failure);
 }