about summary refs log tree commit diff
diff options
context:
space:
mode:
-rwxr-xr-xqemu_mode/build_qemu_support.sh1
-rw-r--r--qemu_mode/patches/afl-qemu-common.h10
-rw-r--r--qemu_mode/patches/afl-qemu-cpu-translate-inl.h119
-rw-r--r--qemu_mode/patches/arm-translate-a64.diff64
-rw-r--r--qemu_mode/patches/arm-translate.diff20
-rw-r--r--qemu_mode/patches/i386-translate.diff2
-rw-r--r--src/afl-showmap.c12
-rw-r--r--src/third_party/libradamsa/libradamsa.c6
-rwxr-xr-xtest/test.sh22
9 files changed, 211 insertions, 45 deletions
diff --git a/qemu_mode/build_qemu_support.sh b/qemu_mode/build_qemu_support.sh
index 0413228c..79993ce2 100755
--- a/qemu_mode/build_qemu_support.sh
+++ b/qemu_mode/build_qemu_support.sh
@@ -153,6 +153,7 @@ patch -p1 <../patches/translate-all.diff || exit 1
 patch -p1 <../patches/tcg.diff || exit 1
 patch -p1 <../patches/i386-translate.diff || exit 1
 patch -p1 <../patches/arm-translate.diff || exit 1
+patch -p1 <../patches/arm-translate-a64.diff || exit 1
 patch -p1 <../patches/i386-ops_sse.diff || exit 1
 patch -p1 <../patches/i386-fpu_helper.diff || exit 1
 patch -p1 <../patches/softfloat.diff || exit 1
diff --git a/qemu_mode/patches/afl-qemu-common.h b/qemu_mode/patches/afl-qemu-common.h
index da3d563e..4303a5e6 100644
--- a/qemu_mode/patches/afl-qemu-common.h
+++ b/qemu_mode/patches/afl-qemu-common.h
@@ -39,10 +39,14 @@
 
 #define PERSISTENT_DEFAULT_MAX_CNT 1000
 
-#ifndef CPU_NB_REGS
-#define AFL_REGS_NUM 1000
-#else
+#ifdef CPU_NB_REGS
 #define AFL_REGS_NUM CPU_NB_REGS
+#elif TARGET_ARM
+#define AFL_REGS_NUM 32
+#elif TARGET_AARCH64
+#define AFL_REGS_NUM 32
+#else
+#define AFL_REGS_NUM 100
 #endif
 
 /* NeverZero */
diff --git a/qemu_mode/patches/afl-qemu-cpu-translate-inl.h b/qemu_mode/patches/afl-qemu-cpu-translate-inl.h
index 06e73831..2b9472b8 100644
--- a/qemu_mode/patches/afl-qemu-cpu-translate-inl.h
+++ b/qemu_mode/patches/afl-qemu-cpu-translate-inl.h
@@ -67,7 +67,7 @@ static void afl_compcov_log_64(target_ulong cur_loc, target_ulong arg1,
                                target_ulong arg2) {
 
   register uintptr_t idx = cur_loc;
-
+  
   if ((arg1 & 0xff00000000000000) == (arg2 & 0xff00000000000000)) {
 
     INC_AFL_AREA(idx + 6);
@@ -258,63 +258,72 @@ static void callback_to_persistent_hook(void) {
 
 }
 
-static void i386_restore_state_for_persistent(TCGv *cpu_regs) {
+static void gpr_saving(TCGv *cpu_regs, int regs_num) {
 
-  if (persistent_save_gpr) {
+  int      i;
+  TCGv_ptr gpr_sv;
 
-    int      i;
-    TCGv_ptr gpr_sv;
+  TCGv_ptr first_pass_ptr = tcg_const_ptr(&persistent_first_pass);
+  TCGv     first_pass = tcg_temp_local_new();
+  TCGv     one = tcg_const_tl(1);
+  tcg_gen_ld8u_tl(first_pass, first_pass_ptr, 0);
 
-    TCGv_ptr first_pass_ptr = tcg_const_ptr(&persistent_first_pass);
-    TCGv     first_pass = tcg_temp_local_new();
-    TCGv     one = tcg_const_tl(1);
-    tcg_gen_ld8u_tl(first_pass, first_pass_ptr, 0);
+  TCGLabel *lbl_restore_gpr = gen_new_label();
+  tcg_gen_brcond_tl(TCG_COND_NE, first_pass, one, lbl_restore_gpr);
 
-    TCGLabel *lbl_restore_gpr = gen_new_label();
-    tcg_gen_brcond_tl(TCG_COND_NE, first_pass, one, lbl_restore_gpr);
+  // save GPR registers
+  for (i = 0; i < regs_num; ++i) {
 
-    // save GRP registers
-    for (i = 0; i < AFL_REGS_NUM; ++i) {
+    gpr_sv = tcg_const_ptr(&persistent_saved_gpr[i]);
+    tcg_gen_st_tl(cpu_regs[i], gpr_sv, 0);
 
-      gpr_sv = tcg_const_ptr(&persistent_saved_gpr[i]);
-      tcg_gen_st_tl(cpu_regs[i], gpr_sv, 0);
+  }
 
-    }
+  gen_set_label(lbl_restore_gpr);
 
-    gen_set_label(lbl_restore_gpr);
+  tcg_gen_afl_call0(&afl_persistent_loop);
 
-    tcg_gen_afl_call0(&afl_persistent_loop);
+  if (afl_persistent_hook_ptr) tcg_gen_afl_call0(callback_to_persistent_hook);
 
-    if (afl_persistent_hook_ptr) tcg_gen_afl_call0(callback_to_persistent_hook);
+  // restore GPR registers
+  for (i = 0; i < regs_num; ++i) {
 
-    // restore GRP registers
-    for (i = 0; i < AFL_REGS_NUM; ++i) {
+    gpr_sv = tcg_const_ptr(&persistent_saved_gpr[i]);
+    tcg_gen_ld_tl(cpu_regs[i], gpr_sv, 0);
 
-      gpr_sv = tcg_const_ptr(&persistent_saved_gpr[i]);
-      tcg_gen_ld_tl(cpu_regs[i], gpr_sv, 0);
+  }
 
-    }
+  tcg_temp_free_ptr(first_pass_ptr);
+  tcg_temp_free(first_pass);
+  tcg_temp_free(one);
 
-    tcg_temp_free(first_pass);
+}
+
+
+static void restore_state_for_persistent(TCGv *cpu_regs, int regs_num, int sp) {
+
+  if (persistent_save_gpr) {
+
+    gpr_saving(cpu_regs, regs_num);
 
   } else if (afl_persistent_ret_addr == 0) {
 
     TCGv_ptr stack_off_ptr = tcg_const_ptr(&persistent_stack_offset);
     TCGv     stack_off = tcg_temp_new();
     tcg_gen_ld_tl(stack_off, stack_off_ptr, 0);
-    tcg_gen_sub_tl(cpu_regs[R_ESP], cpu_regs[R_ESP], stack_off);
+    tcg_gen_sub_tl(cpu_regs[sp], cpu_regs[sp], stack_off);
     tcg_temp_free(stack_off);
 
   }
 
 }
 
-#define AFL_QEMU_TARGET_i386_SNIPPET                                          \
+#define AFL_QEMU_TARGET_I386_SNIPPET                                          \
   if (is_persistent) {                                                        \
                                                                               \
     if (s->pc == afl_persistent_addr) {                                       \
                                                                               \
-      i386_restore_state_for_persistent(cpu_regs);                            \
+      restore_state_for_persistent(cpu_regs, AFL_REGS_NUM, R_ESP);            \
       /*tcg_gen_afl_call0(log_x86_saved_gpr);                                 \
       tcg_gen_afl_call0(log_x86_sp_content);*/                                \
                                                                               \
@@ -322,6 +331,7 @@ static void i386_restore_state_for_persistent(TCGv *cpu_regs) {
                                                                               \
         TCGv_ptr paddr = tcg_const_ptr(afl_persistent_addr);                  \
         tcg_gen_st_tl(paddr, cpu_regs[R_ESP], persisent_retaddr_offset);      \
+        tcg_temp_free_ptr(paddr);                                             \
                                                                               \
       }                                                                       \
                                                                               \
@@ -337,3 +347,56 @@ static void i386_restore_state_for_persistent(TCGv *cpu_regs) {
                                                                               \
   }
 
+// SP = 13, LINK = 14
+
+#define AFL_QEMU_TARGET_ARM_SNIPPET                                           \
+  if (is_persistent) {                                                        \
+                                                                              \
+    if (dc->pc == afl_persistent_addr) {                                      \
+                                                                              \
+      if (persistent_save_gpr) gpr_saving(cpu_R, AFL_REGS_NUM);               \
+                                                                              \
+      if (afl_persistent_ret_addr == 0) {                                     \
+                                                                              \
+        TCGv_ptr paddr = tcg_const_ptr(afl_persistent_addr);                  \
+        tcg_gen_mov_i32(cpu_R[14], paddr);                                    \
+        tcg_temp_free_ptr(paddr);                                             \
+                                                                              \
+      }                                                                       \
+                                                                              \
+      if (!persistent_save_gpr) tcg_gen_afl_call0(&afl_persistent_loop);      \
+                                                                              \
+    } else if (afl_persistent_ret_addr && dc->pc == afl_persistent_ret_addr) {\
+                                                                              \
+      gen_bx_im(dc, afl_persistent_addr);                                     \
+                                                                              \
+    }                                                                         \
+                                                                              \
+  }
+
+// SP = 31, LINK = 30
+
+#define AFL_QEMU_TARGET_ARM64_SNIPPET                                         \
+  if (is_persistent) {                                                        \
+                                                                              \
+    if (s->pc == afl_persistent_addr) {                                       \
+                                                                              \
+      if (persistent_save_gpr) gpr_saving(cpu_X, AFL_REGS_NUM);               \
+                                                                              \
+      if (afl_persistent_ret_addr == 0) {                                     \
+                                                                              \
+        TCGv_ptr paddr = tcg_const_ptr(afl_persistent_addr);                  \
+        tcg_gen_mov_i32(cpu_X[30], paddr);                                    \
+        tcg_temp_free_ptr(paddr);                                             \
+                                                                              \
+      }                                                                       \
+                                                                              \
+      if (!persistent_save_gpr) tcg_gen_afl_call0(&afl_persistent_loop);      \
+                                                                              \
+    } else if (afl_persistent_ret_addr && s->pc == afl_persistent_ret_addr) { \
+                                                                              \
+      gen_goto_tb(s, 0, afl_persistent_addr);                                 \
+                                                                              \
+    }                                                                         \
+                                                                              \
+  }
diff --git a/qemu_mode/patches/arm-translate-a64.diff b/qemu_mode/patches/arm-translate-a64.diff
new file mode 100644
index 00000000..83856217
--- /dev/null
+++ b/qemu_mode/patches/arm-translate-a64.diff
@@ -0,0 +1,64 @@
+diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
+index fd36425..992bf17 100644
+--- a/target/arm/translate-a64.c
++++ b/target/arm/translate-a64.c
+@@ -39,6 +39,8 @@
+ #include "translate-a64.h"
+ #include "qemu/atomic128.h"
+ 
++#include "../patches/afl-qemu-cpu-translate-inl.h"
++
+ static TCGv_i64 cpu_X[32];
+ static TCGv_i64 cpu_pc;
+ 
+@@ -3365,6 +3367,12 @@ static void disas_add_sub_imm(DisasContext *s, uint32_t insn)
+         return;
+     }
+ 
++    if (rd == 31 && sub_op) { // cmp xX, imm
++      TCGv_i64 tcg_imm = tcg_const_i64(imm);
++      afl_gen_compcov(s->pc, tcg_rn, tcg_imm, is_64bit ? MO_64 : MO_32, 1);
++      tcg_temp_free_i64(tcg_imm);
++    }
++
+     tcg_result = tcg_temp_new_i64();
+     if (!setflags) {
+         if (sub_op) {
+@@ -3972,6 +3980,9 @@ static void disas_add_sub_ext_reg(DisasContext *s, uint32_t insn)
+ 
+     tcg_rm = read_cpu_reg(s, rm, sf);
+     ext_and_shift_reg(tcg_rm, tcg_rm, option, imm3);
++    
++    if (rd == 31 && sub_op) // cmp xX, xY
++      afl_gen_compcov(s->pc, tcg_rn, tcg_rm, sf ? MO_64 : MO_32, 0);
+ 
+     tcg_result = tcg_temp_new_i64();
+ 
+@@ -4037,6 +4048,9 @@ static void disas_add_sub_reg(DisasContext *s, uint32_t insn)
+ 
+     shift_reg_imm(tcg_rm, tcg_rm, sf, shift_type, imm6);
+ 
++    if (rd == 31 && sub_op) // cmp xX, xY
++      afl_gen_compcov(s->pc, tcg_rn, tcg_rm, sf ? MO_64 : MO_32, 0);
++
+     tcg_result = tcg_temp_new_i64();
+ 
+     if (!setflags) {
+@@ -4246,6 +4260,8 @@ static void disas_cc(DisasContext *s, uint32_t insn)
+         tcg_y = cpu_reg(s, y);
+     }
+     tcg_rn = cpu_reg(s, rn);
++    
++    afl_gen_compcov(s->pc, tcg_rn, tcg_y, sf ? MO_64 : MO_32, is_imm);
+ 
+     /* Set the flags for the new comparison.  */
+     tcg_tmp = tcg_temp_new_i64();
+@@ -13317,6 +13333,8 @@ static void disas_data_proc_simd_fp(DisasContext *s, uint32_t insn)
+ static void disas_a64_insn(CPUARMState *env, DisasContext *s)
+ {
+     uint32_t insn;
++    
++    AFL_QEMU_TARGET_ARM64_SNIPPET
+ 
+     insn = arm_ldl_code(env, s->pc, s->sctlr_b);
+     s->insn = insn;
diff --git a/qemu_mode/patches/arm-translate.diff b/qemu_mode/patches/arm-translate.diff
index 58b4a873..daa5d43b 100644
--- a/qemu_mode/patches/arm-translate.diff
+++ b/qemu_mode/patches/arm-translate.diff
@@ -1,5 +1,5 @@
 diff --git a/target/arm/translate.c b/target/arm/translate.c
-index 7c4675ff..0f0928b6 100644
+index 7c4675f..e3d999a 100644
 --- a/target/arm/translate.c
 +++ b/target/arm/translate.c
 @@ -59,6 +59,8 @@
@@ -132,3 +132,21 @@ index 7c4675ff..0f0928b6 100644
              rd = 16;
              break;
          case 0xb: /* cmn */
+@@ -13233,6 +13247,8 @@ static void arm_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
+         return;
+     }
+ 
++    AFL_QEMU_TARGET_ARM_SNIPPET
++
+     insn = arm_ldl_code(env, dc->pc, dc->sctlr_b);
+     dc->insn = insn;
+     dc->pc += 4;
+@@ -13301,6 +13317,8 @@ static void thumb_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
+         return;
+     }
+ 
++    AFL_QEMU_TARGET_ARM_SNIPPET
++
+     insn = arm_lduw_code(env, dc->pc, dc->sctlr_b);
+     is_16bit = thumb_insn_is_16bit(dc, insn);
+     dc->pc += 2;
diff --git a/qemu_mode/patches/i386-translate.diff b/qemu_mode/patches/i386-translate.diff
index 00337e2c..8ccd6f4e 100644
--- a/qemu_mode/patches/i386-translate.diff
+++ b/qemu_mode/patches/i386-translate.diff
@@ -35,7 +35,7 @@ index 0dd5fbe4..a23da128 100644
      rex_w = -1;
      rex_r = 0;
  
-+    AFL_QEMU_TARGET_i386_SNIPPET
++    AFL_QEMU_TARGET_I386_SNIPPET
 +
   next_byte:
      b = x86_ldub_code(env, s);
diff --git a/src/afl-showmap.c b/src/afl-showmap.c
index 9c146771..1686a750 100644
--- a/src/afl-showmap.c
+++ b/src/afl-showmap.c
@@ -925,6 +925,9 @@ int main(int argc, char** argv) {
     struct dirent* dir_ent;
     int            done = 0;
     u8             infile[4096], outfile[4096];
+#if !defined(DT_REG)
+    struct stat    statbuf;
+#endif
 
     dev_null_fd = open("/dev/null", O_RDWR);
     if (dev_null_fd < 0) PFATAL("Unable to open /dev/null");
@@ -970,9 +973,18 @@ int main(int argc, char** argv) {
 
       if (dir_ent->d_name[0] == '.')
         continue;  // skip anything that starts with '.'
+
+#if defined(DT_REG) /* Posix and Solaris do not know d_type and DT_REG */
       if (dir_ent->d_type != DT_REG) continue;  // only regular files
+#endif
 
       snprintf(infile, sizeof(infile), "%s/%s", in_dir, dir_ent->d_name);
+
+#if !defined(DT_REG) /* use stat() */
+      if (-1 == stat(infile, &statbuf)
+          || !S_ISREG(statbuf.st_mode)) continue;
+#endif
+
       snprintf(outfile, sizeof(outfile), "%s/%s", out_file, dir_ent->d_name);
 
       if (read_file(infile)) {
diff --git a/src/third_party/libradamsa/libradamsa.c b/src/third_party/libradamsa/libradamsa.c
index be3050b1..f3677fa7 100644
--- a/src/third_party/libradamsa/libradamsa.c
+++ b/src/third_party/libradamsa/libradamsa.c
@@ -2405,7 +2405,11 @@ static word prim_sys(word op, word a, word b, word c) {
             EOPNOTSUPP, EOVERFLOW, EOWNERDEAD, EPERM, EPIPE, EPROTO, EPROTONOSUPPORT, EPROTOTYPE,
             ERANGE, EROFS, ESPIPE, ESRCH, ESTALE, ETIME, ETIMEDOUT, ETXTBSY,
             EWOULDBLOCK, EXDEV, SEEK_SET, SEEK_CUR, SEEK_END, O_EXEC, O_RDONLY, O_RDWR,
-            O_SEARCH, O_WRONLY, O_APPEND, O_CLOEXEC, O_CREAT, O_DIRECTORY, O_DSYNC, O_EXCL,
+            O_SEARCH, O_WRONLY, O_APPEND, O_CLOEXEC, O_CREAT,
+#if defined O_DIRECTORY
+                                                              O_DIRECTORY,
+#endif
+                                                                           O_DSYNC, O_EXCL,
             O_NOCTTY, O_NOFOLLOW, O_NONBLOCK, O_RSYNC, O_SYNC, O_TRUNC, O_TTY_INIT, O_ACCMODE,
             FD_CLOEXEC, F_DUPFD, F_DUPFD_CLOEXEC, F_GETFD, F_SETFD, F_GETFL, F_SETFL, F_GETOWN,
             F_SETOWN, F_GETLK, F_SETLK, F_SETLKW, F_RDLCK, F_UNLCK, F_WRLCK, CLOCK_MONOTONIC,
diff --git a/test/test.sh b/test/test.sh
index db197cf2..d9374f96 100755
--- a/test/test.sh
+++ b/test/test.sh
@@ -1,18 +1,18 @@
 #!/bin/sh
 
 #
-# Ensure we have: test, type, diff -q, grep -aqE
+# Ensure we have: test, type, diff, grep -qE
 #
 test -z "" 2> /dev/null || { echo Error: test command not found ; exit 1 ; }
 GREP=`type grep > /dev/null 2>&1 && echo OK`
 test "$GREP" = OK || { echo Error: grep command not found ; exit 1 ; }
-echo foobar | grep -aqE 'asd|oob' 2> /dev/null || { echo Error: grep command does not support -q, -a and/or -E option ; exit 1 ; }
+echo foobar | grep -qE 'asd|oob' 2> /dev/null || { echo Error: grep command does not support -q and/or -E option ; exit 1 ; }
 echo 1 > test.1
 echo 1 > test.2
 OK=OK
-diff -q test.1 test.2 >/dev/null 2>&1 || OK=
+diff test.1 test.2 >/dev/null 2>&1 || OK=
 rm -f test.1 test.2
-test -z "$OK" && { echo Error: diff -q is not working ; exit 1 ; }
+test -z "$OK" && { echo Error: diff is not working ; exit 1 ; }
 test -z "$LLVM_CONFIG" && LLVM_CONFIG=llvm-config
 
 
@@ -21,7 +21,7 @@ $ECHO \\101 2>&1 | grep -qE '^A' || {
   ECHO=
   test -e /bin/printf && {
     ECHO="/bin/printf %b\\n"
-    $ECHO '\\101' 2>&1 | grep -qE '^A' || ECHO=
+    $ECHO "\\101" 2>&1 | grep -qE '^A' || ECHO=
   }
 }
 test -z "$ECHO" && { printf Error: printf command does not support octal character codes ; exit 1 ; }
@@ -84,7 +84,7 @@ test "$SYS" = "i686" -o "$SYS" = "x86_64" -o "$SYS" = "amd64" -o "$SYS" = "i86pc
     echo 0 | ../afl-showmap -m ${MEM_LIMIT} -o test-instr.plain.0 -r -- ./test-instr.plain > /dev/null 2>&1
     ../afl-showmap -m ${MEM_LIMIT} -o test-instr.plain.1 -r -- ./test-instr.plain < /dev/null > /dev/null 2>&1
     test -e test-instr.plain.0 -a -e test-instr.plain.1 && {
-      diff -q test-instr.plain.0 test-instr.plain.1 > /dev/null 2>&1 && {
+      diff test-instr.plain.0 test-instr.plain.1 > /dev/null 2>&1 && {
         $ECHO "$RED[!] ${AFL_GCC} instrumentation should be different on different input but is not"
         CODE=1
       } || {
@@ -111,7 +111,7 @@ test "$SYS" = "i686" -o "$SYS" = "x86_64" -o "$SYS" = "amd64" -o "$SYS" = "i86pc
     CODE=1
   }
   test -e test-compcov.harden && {
-    grep -Eqa 'stack_chk_fail|fstack-protector-all|fortified' test-compcov.harden > /dev/null 2>&1 && {
+    grep -Eq 'stack_chk_fail|fstack-protector-all|fortified' test-compcov.harden > /dev/null 2>&1 && {
       $ECHO "$GREEN[+] ${AFL_GCC} hardened mode succeeded and is working"
     } || {
       $ECHO "$RED[!] ${AFL_GCC} hardened mode is not hardened"
@@ -203,7 +203,7 @@ test -e ../afl-clang-fast -a -e ../split-switches-pass.so && {
     echo 0 | ../afl-showmap -m ${MEM_LIMIT} -o test-instr.plain.0 -r -- ./test-instr.plain > /dev/null 2>&1
     ../afl-showmap -m ${MEM_LIMIT} -o test-instr.plain.1 -r -- ./test-instr.plain < /dev/null > /dev/null 2>&1
     test -e test-instr.plain.0 -a -e test-instr.plain.1 && {
-      diff -q test-instr.plain.0 test-instr.plain.1 > /dev/null 2>&1 && {
+      diff test-instr.plain.0 test-instr.plain.1 > /dev/null 2>&1 && {
         $ECHO "$RED[!] llvm_mode instrumentation should be different on different input but is not"
         CODE=1
       } || {
@@ -226,7 +226,7 @@ test -e ../afl-clang-fast -a -e ../split-switches-pass.so && {
     CODE=1
   }
   test -e test-compcov.harden && {
-    grep -Eqa 'stack_chk_fail|fstack-protector-all|fortified' test-compcov.harden > /dev/null 2>&1 && {
+    grep -Eq 'stack_chk_fail|fstack-protector-all|fortified' test-compcov.harden > /dev/null 2>&1 && {
       $ECHO "$GREEN[+] llvm_mode hardened mode succeeded and is working"
     } || {
       $ECHO "$RED[!] llvm_mode hardened mode is not hardened"
@@ -366,7 +366,7 @@ test -e ../afl-gcc-fast -a -e ../afl-gcc-rt.o && {
     echo 0 | ../afl-showmap -m ${MEM_LIMIT} -o test-instr.plain.0 -r -- ./test-instr.plain.gccpi > /dev/null 2>&1
     ../afl-showmap -m ${MEM_LIMIT} -o test-instr.plain.1 -r -- ./test-instr.plain.gccpi < /dev/null > /dev/null 2>&1
     test -e test-instr.plain.0 -a -e test-instr.plain.1 && {
-      diff -q test-instr.plain.0 test-instr.plain.1 > /dev/null 2>&1 && {
+      diff test-instr.plain.0 test-instr.plain.1 > /dev/null 2>&1 && {
         $ECHO "$RED[!] gcc_plugin instrumentation should be different on different input but is not"
         CODE=1
       } || { 
@@ -391,7 +391,7 @@ test -e ../afl-gcc-fast -a -e ../afl-gcc-rt.o && {
   }
 
   test -e test-compcov.harden.gccpi && {
-    grep -Eqa 'stack_chk_fail|fstack-protector-all|fortified' test-compcov.harden.gccpi > /dev/null 2>&1 && {
+    grep -Eq 'stack_chk_fail|fstack-protector-all|fortified' test-compcov.harden.gccpi > /dev/null 2>&1 && {
       $ECHO "$GREEN[+] gcc_plugin hardened mode succeeded and is working"
     } || {
       $ECHO "$RED[!] gcc_plugin hardened mode is not hardened"