changeset 1768:096a66e45212

Fix fuzzing stderr override on os x
author Matt Johnston <matt@ucc.asn.au>
date Mon, 26 Oct 2020 23:44:43 +0800
parents 3e1e1f82eba6
children 0e178f767ada
files fuzz.h fuzz/fuzz-common.c
diffstat 2 files changed, 17 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/fuzz.h	Mon Oct 26 23:31:24 2020 +0800
+++ b/fuzz.h	Mon Oct 26 23:44:43 2020 +0800
@@ -74,18 +74,24 @@
     int recv_dumpfd;
 
     // avoid filling fuzzing logs, this points to /dev/null
-    FILE *stderr;
+    FILE *fake_stderr;
 };
 
 extern struct dropbear_fuzz_options fuzz;
 
+/* guard for when fuzz.h is included by fuzz-common.c */
+#ifndef FUZZ_NO_REPLACE_STDERR
+
 /* This is a bodge but seems to work.
  glibc stdio.h has the comment 
  "C89/C99 say they're macros.  Make them happy." */
+/* OS X has it as a macro */
 #ifdef stderr
 #undef stderr
 #endif
-#define stderr (fuzz.stderr)
+#define stderr (fuzz.fake_stderr)
+
+#endif /* FUZZ_NO_REPLACE_STDERR */
 
 #endif // DROPBEAR_FUZZ
 
--- a/fuzz/fuzz-common.c	Mon Oct 26 23:31:24 2020 +0800
+++ b/fuzz/fuzz-common.c	Mon Oct 26 23:44:43 2020 +0800
@@ -1,7 +1,6 @@
 #include "includes.h"
 
 #include "includes.h"
-#include "fuzz.h"
 #include "dbutil.h"
 #include "runopts.h"
 #include "crypto_desc.h"
@@ -11,8 +10,14 @@
 #include "atomicio.h"
 #include "fuzz-wrapfd.h"
 
+#define FUZZ_NO_REPLACE_STDERR
+#include "fuzz.h"
+
 /* fuzz.h redefines stderr, we don't want that here */
+#ifdef origstderr
 #undef stderr
+#define stderr origstderr
+#endif // origstderr
 
 struct dropbear_fuzz_options fuzz;
 
@@ -23,7 +28,7 @@
 // This runs automatically before main, due to contructor attribute in fuzz.h
 void fuzz_early_setup(void) {
     /* Set stderr to point to normal stderr by default */
-    fuzz.stderr = stderr;
+    fuzz.fake_stderr = stderr;
 }
 
 void fuzz_common_setup(void) {
@@ -50,8 +55,8 @@
     else 
     {
         fprintf(stderr, "Dropbear fuzzer: Disabling stderr output\n");
-        fuzz.stderr = fopen("/dev/null", "w");
-        assert(fuzz.stderr);
+        fuzz.fake_stderr = fopen("/dev/null", "w");
+        assert(fuzz.fake_stderr);
     }
 }