about summary refs log tree commit diff
diff options
context:
space:
mode:
authorvan Hauser <vh@thc.org>2020-09-04 17:04:42 +0200
committervan Hauser <vh@thc.org>2020-09-04 17:04:42 +0200
commit6c715f1a69f91d4336023a8ba10fb4a7e126f9c2 (patch)
tree2b19a7d912fde4936b4cc9cfe279a8858c0738f0
parentfc19aa96f78cd33ce7d548bad5c7e4d3efa069d1 (diff)
downloadafl++-6c715f1a69f91d4336023a8ba10fb4a7e126f9c2.tar.gz
more changes to fuzzer_setup
-rw-r--r--docs/Changelog.md6
-rw-r--r--include/afl-fuzz.h2
-rw-r--r--include/common.h6
-rw-r--r--src/afl-common.c33
-rw-r--r--src/afl-fuzz-stats.c70
-rw-r--r--src/afl-fuzz.c3
6 files changed, 84 insertions, 36 deletions
diff --git a/docs/Changelog.md b/docs/Changelog.md
index d1ee9656..0d93ee1f 100644
--- a/docs/Changelog.md
+++ b/docs/Changelog.md
@@ -15,7 +15,7 @@ sending a mail to <afl-users+subscribe@googlegroups.com>.
     https://github.com/AFLplusplus/Grammar-Mutator
   - a few QOL changes for Apple and its outdated gmake
   - afl-fuzz:
-    - Fix for auto dictionary entries found during fuzzing to not throw out
+    - fix for auto dictionary entries found during fuzzing to not throw out
       a -x dictionary
     - added total execs done to plot file
     - AFL_MAX_DET_EXTRAS env variable added to control the amount of
@@ -25,11 +25,13 @@ sending a mail to <afl-users+subscribe@googlegroups.com>.
       timeout.
     - bugfix for cmplog that results in a heap overflow based on target data
       (thanks to the magma team for reporting!)
+    - write fuzzing setup into out/fuzzer_setup (environment variables and
+      command line)
   - custom mutators:
     - added afl_custom_fuzz_count/fuzz_count function to allow specifying
       the number of fuzz attempts for custom_fuzz
   - llvm_mode:
-    - Ported SanCov to LTO, and made it the default for LTO. better
+    - ported SanCov to LTO, and made it the default for LTO. better
       instrumentation locations
     - Further llvm 12 support (fast moving target like afl++ :-) )
     - deprecated LLVM SKIPSINGLEBLOCK env environment
diff --git a/include/afl-fuzz.h b/include/afl-fuzz.h
index e3c3d5aa..358cb5dc 100644
--- a/include/afl-fuzz.h
+++ b/include/afl-fuzz.h
@@ -945,7 +945,7 @@ void destroy_extras(afl_state_t *);
 
 /* Stats */
 
-void write_fuzzer_config_file(afl_state_t *);
+void write_setup_file(afl_state_t *, int, char **);
 void write_stats_file(afl_state_t *, double, double, double);
 void maybe_update_plot_file(afl_state_t *, double, double);
 void show_stats(afl_state_t *);
diff --git a/include/common.h b/include/common.h
index 87a7425b..c364ade0 100644
--- a/include/common.h
+++ b/include/common.h
@@ -110,5 +110,11 @@ u8 *u_stringify_time_diff(u8 *buf, u64 cur_ms, u64 event_ms);
 /* Reads the map size from ENV */
 u32 get_map_size(void);
 
+/* create a stream file */
+FILE *create_ffile(u8 *fn);
+
+/* create a file */
+s32 create_file(u8 *fn);
+
 #endif
 
diff --git a/src/afl-common.c b/src/afl-common.c
index 367dec72..d66440aa 100644
--- a/src/afl-common.c
+++ b/src/afl-common.c
@@ -877,3 +877,36 @@ u32 get_map_size(void) {
 
 }
 
+/* Create a stream file */
+
+FILE *create_ffile(u8 *fn) {
+
+  s32   fd;
+  FILE *f;
+
+  fd = open(fn, O_WRONLY | O_CREAT | O_TRUNC, 0600);
+
+  if (fd < 0) { PFATAL("Unable to create '%s'", fn); }
+
+  f = fdopen(fd, "w");
+
+  if (!f) { PFATAL("fdopen() failed"); }
+
+  return f;
+
+}
+
+/* Create a file */
+
+s32 create_file(u8 *fn) {
+
+  s32 fd;
+
+  fd = open(fn, O_WRONLY | O_CREAT | O_TRUNC, 0600);
+
+  if (fd < 0) { PFATAL("Unable to create '%s'", fn); }
+
+  return fd;
+
+}
+
diff --git a/src/afl-fuzz-stats.c b/src/afl-fuzz-stats.c
index b59a40e4..a84f1c7a 100644
--- a/src/afl-fuzz-stats.c
+++ b/src/afl-fuzz-stats.c
@@ -27,51 +27,57 @@
 #include "envs.h"
 #include <limits.h>
 
-/* Open file for writing */
-
-inline FILE *open_file(const char *fn) {
-
-  s32   fd;
-  FILE *f;
-
-  fd = open(fn, O_WRONLY | O_CREAT | O_TRUNC, 0600);
+/* Write fuzzer setup file */
 
-  if (fd < 0) { PFATAL("Unable to create '%s'", fn); }
+void write_setup_file(afl_state_t *afl, int argc, char **argv) {
 
-  f = fdopen(fd, "w");
+  char *val;
+  u8    fn[PATH_MAX];
+  snprintf(fn, PATH_MAX, "%s/fuzzer_setup", afl->out_dir);
+  FILE *f = create_ffile(fn);
 
-  if (!f) { PFATAL("fdopen() failed"); }
+  fprintf(f, "# environment variables:\n");
+  u32 s_afl_env =
+      sizeof(afl_environment_variables) / sizeof(afl_environment_variables[0]) -
+      1;
+  for (u32 i = 0; i < s_afl_env; i++) {
 
-  return f;
+    if ((val = getenv(afl_environment_variables[i])) != NULL) {
 
-}
+      fprintf(f, "%s=%s\n", afl_environment_variables[i], val);
 
-/* Write fuzzer setup file */
+    }
 
-void write_fuzzer_config_file(afl_state_t *afl) {
+  }
 
-  u8    fn[PATH_MAX];
-  FILE *f;
+  fprintf(f, "# command line:\n");
 
-  snprintf(fn, PATH_MAX, "%s/fuzzer_config", afl->out_dir);
-  f = open_file(fn);
+  s32    i;
+  size_t j;
+  for (i = 0; i < argc; i++) {
 
-  char *val;
+    if (i) fprintf(f, " ");
+    if (index(argv[i], '\'')) {
 
-  uint32_t s_afl_env =
-      sizeof(afl_environment_variables) / sizeof(afl_environment_variables[0]) -
-      1;
-  for (uint32_t i = 0; i < s_afl_env; i++) {
+      fprintf(f, "'");
+      for (j = 0; j < strlen(argv[i]); j++)
+        if (argv[i][j] == '\'')
+          fprintf(f, "'\"'\"'");
+        else
+          fprintf(f, "%c", argv[i][j]);
+      fprintf(f, "'");
 
-    if ((val = getenv(afl_environment_variables[i])) != NULL) {
+    } else {
 
-      fprintf(f, "%s=%s\n", afl_environment_variables[i], val);
+      fprintf(f, "'%s'", argv[i]);
 
     }
 
   }
+  fprintf(f, "\n");
 
   fclose(f);
+  (void)(afl_environment_deprecated);
 
 }
 
@@ -84,13 +90,13 @@ void write_stats_file(afl_state_t *afl, double bitmap_cvg, double stability,
   struct rusage rus;
 #endif
 
-  unsigned long long int cur_time = get_cur_time();
-  u32                    t_bytes = count_non_255_bytes(afl, afl->virgin_bits);
-  u8                     fn[PATH_MAX];
-  FILE *                 f;
+  u64   cur_time = get_cur_time();
+  u32   t_bytes = count_non_255_bytes(afl, afl->virgin_bits);
+  u8    fn[PATH_MAX];
+  FILE *f;
 
   snprintf(fn, PATH_MAX, "%s/fuzzer_stats", afl->out_dir);
-  f = open_file(fn);
+  f = create_ffile(fn);
 
   /* Keep last values in case we're called from another context
      where exec/sec stats and such are not readily available. */
@@ -209,7 +215,7 @@ void write_stats_file(afl_state_t *afl, double bitmap_cvg, double stability,
 
   if (afl->debug) {
 
-    uint32_t i = 0;
+    u32 i = 0;
     fprintf(f, "virgin_bytes     :");
     for (i = 0; i < afl->fsrv.map_size; i++) {
 
diff --git a/src/afl-fuzz.c b/src/afl-fuzz.c
index e9ea8b62..c12d5db5 100644
--- a/src/afl-fuzz.c
+++ b/src/afl-fuzz.c
@@ -1128,6 +1128,8 @@ int main(int argc, char **argv_orig, char **envp) {
 
   setup_custom_mutators(afl);
 
+  write_setup_file(afl, argc, argv);
+
   setup_cmdline_file(afl, argv + optind);
 
   read_testcases(afl);
@@ -1274,7 +1276,6 @@ int main(int argc, char **argv_orig, char **envp) {
 
   seek_to = find_start_position(afl);
 
-  write_fuzzer_config_file(afl);
   write_stats_file(afl, 0, 0, 0);
   maybe_update_plot_file(afl, 0, 0);
   save_auto(afl);