about summary refs log tree commit diff
diff options
context:
space:
mode:
authorvan Hauser <vh@thc.org>2020-12-20 14:30:06 +0100
committervan Hauser <vh@thc.org>2020-12-20 14:30:06 +0100
commit98ee17bc47b1f1d4664be9955a72727fff8e51fa (patch)
tree5c49dd81c9ab6c47538350b53d8b1fd11abe3f6c
parenta6116ed533e5db74d654bedda9e747f87cbd8494 (diff)
downloadafl++-98ee17bc47b1f1d4664be9955a72727fff8e51fa.tar.gz
fix endless loop in afl-cc allow/blocklists starting a line with a comment
-rw-r--r--docs/Changelog.md8
-rw-r--r--include/config.h13
-rw-r--r--include/debug.h76
-rw-r--r--include/envs.h4
-rw-r--r--instrumentation/afl-gcc-pass.so.cc6
-rw-r--r--instrumentation/afl-llvm-common.cc6
-rw-r--r--src/afl-cc.c2
-rw-r--r--src/afl-fuzz-state.c3
-rw-r--r--src/afl-fuzz.c14
9 files changed, 80 insertions, 52 deletions
diff --git a/docs/Changelog.md b/docs/Changelog.md
index ebc514f3..28b7e723 100644
--- a/docs/Changelog.md
+++ b/docs/Changelog.md
@@ -10,9 +10,13 @@ sending a mail to <afl-users+subscribe@googlegroups.com>.
 
 
 ### Version ++3.01a (release)
-  - fix crash for very, very fast targets+systems, thanks for reporting @mhlakhani
+  - fix crash for very, very fast targets+systems (thanks to mhlakhani
+    for reporting)
   - added dummy Makefile to instrumentation/
-  - allow instrumenting LLVMFuzzerTestOneInput
+  - afl-cc
+    - allow instrumenting LLVMFuzzerTestOneInput
+    - fixed endless loop for allow/blocklist lines starting with a
+      comment (thanks to Zherya for reporting)
 
 
 ### Version ++3.00c (release)
diff --git a/include/config.h b/include/config.h
index d57ef223..e8a49270 100644
--- a/include/config.h
+++ b/include/config.h
@@ -37,14 +37,14 @@
  ******************************************************/
 
 /* console output colors: There are three ways to configure its behavior
- * 1. default: colored outputs fixed on: defined USE_COLOR && defined ALWAYS_COLORED
- *    The env var. AFL_NO_COLOR will have no effect
+ * 1. default: colored outputs fixed on: defined USE_COLOR && defined
+ * ALWAYS_COLORED The env var. AFL_NO_COLOR will have no effect
  * 2. defined USE_COLOR && !defined ALWAYS_COLORED
  *    -> depending on env var AFL_NO_COLOR=1 colors can be switched off
  *    at run-time. Default is to use colors.
  * 3. colored outputs fixed off: !defined USE_COLOR
  *    The env var. AFL_NO_COLOR will have no effect
-*/
+ */
 
 /* Comment out to disable terminal colors (note that this makes afl-analyze
    a lot less nice): */
@@ -52,9 +52,10 @@
 #define USE_COLOR
 
 #ifdef USE_COLOR
-/* Comment in to always enable terminal colors */
-/* Comment out to enable runtime controlled terminal colors via AFL_NO_COLOR */
-#define ALWAYS_COLORED  1
+  /* Comment in to always enable terminal colors */
+  /* Comment out to enable runtime controlled terminal colors via AFL_NO_COLOR
+   */
+  #define ALWAYS_COLORED 1
 #endif
 
 /* StatsD config
diff --git a/include/debug.h b/include/debug.h
index 7a1725b5..7f4a6be1 100644
--- a/include/debug.h
+++ b/include/debug.h
@@ -169,65 +169,77 @@
  ************************/
 
 #if defined USE_COLOR && !defined ALWAYS_COLORED
-#include <unistd.h>
-#pragma GCC diagnostic ignored "-Wformat-security"
-static inline const char * colorfilter(const char * x) {
+  #include <unistd.h>
+  #pragma GCC diagnostic ignored "-Wformat-security"
+static inline const char *colorfilter(const char *x) {
+
   static int once = 1;
   static int disabled = 0;
 
   if (once) {
+
     /* when there is no tty -> we always want filtering
      * when AFL_NO_UI is set filtering depends on AFL_NO_COLOR
      * otherwise we want always colors
      */
-    disabled = isatty(2) && (!getenv("AFL_NO_UI") || (!getenv("AFL_NO_COLOR") && !getenv("AFL_NO_COLOUR")));
+    disabled =
+        isatty(2) && (!getenv("AFL_NO_UI") ||
+                      (!getenv("AFL_NO_COLOR") && !getenv("AFL_NO_COLOUR")));
     once = 0;
+
   }
+
   if (likely(disabled)) return x;
 
   static char monochromestring[4096];
-  char *d = monochromestring;
-  int in_seq = 0;
+  char *      d = monochromestring;
+  int         in_seq = 0;
+
+  while (*x) {
 
-  while(*x) {
     if (in_seq && *x == 'm') {
+
       in_seq = 0;
+
     } else {
+
       if (!in_seq && *x == '\x1b') { in_seq = 1; }
-      if (!in_seq) {
-        *d++ = *x;
-      }
+      if (!in_seq) { *d++ = *x; }
+
     }
+
     ++x;
+
   }
 
   *d = '\0';
   return monochromestring;
+
 }
+
 #else
-#define colorfilter(x) x /* no filtering necessary */
+  #define colorfilter(x) x                        /* no filtering necessary */
 #endif
 
 /* macro magic to transform the first parameter to SAYF
  * through colorfilter which strips coloring */
-#define GET_MACRO(_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,\
-_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,\
-_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,\
-_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,\
-NAME,...) NAME
-
-#define SAYF(...) GET_MACRO(__VA_ARGS__, \
-SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, \
-SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, \
-SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, \
-SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, \
-SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, \
-SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, \
-SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, \
-SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_1)(__VA_ARGS__)
-
-#define SAYF_1(x)  MY_SAYF(colorfilter(x))
-#define SAYF_N(x,...)  MY_SAYF(colorfilter(x), __VA_ARGS__)
+#define GET_MACRO(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, \
+                  _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26,  \
+                  _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38,  \
+                  _39, _40, NAME, ...)                                         \
+  NAME
+
+#define SAYF(...)                                                           \
+  GET_MACRO(__VA_ARGS__, SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N,    \
+            SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, \
+            SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, \
+            SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, \
+            SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, \
+            SAYF_N, SAYF_1)                                                 \
+  (__VA_ARGS__)
+
+#define SAYF_1(x) MY_SAYF(colorfilter(x))
+#define SAYF_N(x, ...) MY_SAYF(colorfilter(x), __VA_ARGS__)
 
 /* Just print stuff to the appropriate stream. */
 #ifdef MESSAGES_TO_STDOUT
@@ -282,7 +294,7 @@ SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_1)(__VA_ARGS__)
   do {                                                                   \
                                                                          \
     SAYF(bSTOP RESET_G1 CURSOR_SHOW cRST cLRD                            \
-         "\n[-] PROGRAM ABORT : " cRST x);                               \
+         "\n[-] PROGRAM ABORT : " cRST   x);                               \
     SAYF(cLRD "\n         Location : " cRST "%s(), %s:%u\n\n", __func__, \
          __FILE__, __LINE__);                                            \
     exit(1);                                                             \
@@ -295,7 +307,7 @@ SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_1)(__VA_ARGS__)
   do {                                                                   \
                                                                          \
     SAYF(bSTOP RESET_G1 CURSOR_SHOW cRST cLRD                            \
-         "\n[-] PROGRAM ABORT : " cRST x);                               \
+         "\n[-] PROGRAM ABORT : " cRST   x);                               \
     SAYF(cLRD "\n    Stop location : " cRST "%s(), %s:%u\n\n", __func__, \
          __FILE__, __LINE__);                                            \
     abort();                                                             \
@@ -309,7 +321,7 @@ SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_1)(__VA_ARGS__)
                                                                        \
     fflush(stdout);                                                    \
     SAYF(bSTOP RESET_G1 CURSOR_SHOW cRST cLRD                          \
-         "\n[-]  SYSTEM ERROR : " cRST x);                             \
+         "\n[-]  SYSTEM ERROR : " cRST   x);                             \
     SAYF(cLRD "\n    Stop location : " cRST "%s(), %s:%u\n", __func__, \
          __FILE__, __LINE__);                                          \
     SAYF(cLRD "       OS message : " cRST "%s\n", strerror(errno));    \
diff --git a/include/envs.h b/include/envs.h
index f16e61f0..e4e49c4d 100644
--- a/include/envs.h
+++ b/include/envs.h
@@ -78,8 +78,8 @@ static char *afl_environment_variables[] = {
     "AFL_LLVM_CTX",
     "AFL_LLVM_DICT2FILE",
     "AFL_LLVM_DOCUMENT_IDS",
-    "AFL_LLVM_INSTRUMENT",
     "AFL_LLVM_INSTRIM_LOOPHEAD",
+    "AFL_LLVM_INSTRUMENT",
     "AFL_LLVM_LTO_AUTODICTIONARY",
     "AFL_LLVM_AUTODICTIONARY",
     "AFL_LLVM_SKIPSINGLEBLOCK",
@@ -103,7 +103,7 @@ static char *afl_environment_variables[] = {
     "AFL_NO_ARITH",
     "AFL_NO_AUTODICT",
     "AFL_NO_BUILTIN",
-#if defined USE_COLOR && ! defined ALWAYS_COLORED
+#if defined USE_COLOR && !defined ALWAYS_COLORED
     "AFL_NO_COLOR",
     "AFL_NO_COLOUR",
 #endif
diff --git a/instrumentation/afl-gcc-pass.so.cc b/instrumentation/afl-gcc-pass.so.cc
index c95ead8f..25437609 100644
--- a/instrumentation/afl-gcc-pass.so.cc
+++ b/instrumentation/afl-gcc-pass.so.cc
@@ -622,10 +622,11 @@ struct afl_pass : gimple_opt_pass {
             allowListFiles.push_back(line);
           else
             allowListFunctions.push_back(line);
-          getline(fileStream, line);
 
         }
 
+        getline(fileStream, line);
+
       }
 
       if (debug)
@@ -696,10 +697,11 @@ struct afl_pass : gimple_opt_pass {
             denyListFiles.push_back(line);
           else
             denyListFunctions.push_back(line);
-          getline(fileStream, line);
 
         }
 
+        getline(fileStream, line);
+
       }
 
       if (debug)
diff --git a/instrumentation/afl-llvm-common.cc b/instrumentation/afl-llvm-common.cc
index 557939fd..a27c4069 100644
--- a/instrumentation/afl-llvm-common.cc
+++ b/instrumentation/afl-llvm-common.cc
@@ -168,10 +168,11 @@ void initInstrumentList() {
           allowListFiles.push_back(line);
         else
           allowListFunctions.push_back(line);
-        getline(fileStream, line);
 
       }
 
+      getline(fileStream, line);
+
     }
 
     if (debug)
@@ -242,10 +243,11 @@ void initInstrumentList() {
           denyListFiles.push_back(line);
         else
           denyListFunctions.push_back(line);
-        getline(fileStream, line);
 
       }
 
+      getline(fileStream, line);
+
     }
 
     if (debug)
diff --git a/src/afl-cc.c b/src/afl-cc.c
index 2aeb2178..8593f9b8 100644
--- a/src/afl-cc.c
+++ b/src/afl-cc.c
@@ -1432,7 +1432,7 @@ int main(int argc, char **argv, char **envp) {
             "  AFL_LLVM_LAF_SPLIT_FLOATS: cascaded comparisons on floats\n"
             "  AFL_LLVM_LAF_TRANSFORM_COMPARES: cascade comparisons for string "
             "functions\n"
-            "  AFL_LLVM_INSTRUMENT_ALLOW/AFL_LLVM_INSTRUMENT_DENY: enable "
+            "  AFL_LLVM_ALLOWLIST/AFL_LLVM_DENYLIST: enable "
             "instrument allow/\n"
             "    deny listing (selective instrumentation)\n");
 
diff --git a/src/afl-fuzz-state.c b/src/afl-fuzz-state.c
index e863c4c7..7053572b 100644
--- a/src/afl-fuzz-state.c
+++ b/src/afl-fuzz-state.c
@@ -401,7 +401,8 @@ void read_afl_environment(afl_state_t *afl, char **envp) {
             afl->afl_env.afl_crash_exitcode =
                 (u8 *)get_afl_env(afl_environment_variables[i]);
 
-#if defined USE_COLOR && ! defined ALWAYS_COLORED
+#if defined USE_COLOR && !defined ALWAYS_COLORED
+
           } else if (!strncmp(env, "AFL_NO_COLOR",
 
                               afl_environment_variable_len)) {
diff --git a/src/afl-fuzz.c b/src/afl-fuzz.c
index e0d46f7e..2af374f2 100644
--- a/src/afl-fuzz.c
+++ b/src/afl-fuzz.c
@@ -157,7 +157,8 @@ static void usage(u8 *argv0, int more_help) {
   if (more_help > 1) {
 
 #if defined USE_COLOR && !defined ALWAYS_COLORED
-  #define DYN_COLOR "AFL_NO_COLOR or AFL_NO_COLOUR: switch colored console output off\n"
+  #define DYN_COLOR \
+    "AFL_NO_COLOR or AFL_NO_COLOUR: switch colored console output off\n"
 #else
   #define DYN_COLOR
 #endif
@@ -307,11 +308,16 @@ int main(int argc, char **argv_orig, char **envp) {
   struct timeval  tv;
   struct timezone tz;
 
-#if defined USE_COLOR && defined ALWAYS_COLORED
+  #if defined USE_COLOR && defined ALWAYS_COLORED
   if (getenv("AFL_NO_COLOR") || getenv("AFL_NO_COLOUR")) {
-     WARNF("Setting AFL_NO_COLOR has no effect (colors are configured on at compile time)");
+
+    WARNF(
+        "Setting AFL_NO_COLOR has no effect (colors are configured on at "
+        "compile time)");
+
   }
-#endif
+
+  #endif
 
   char **argv = argv_cpy_dup(argc, argv_orig);