aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorhexcoder <hexcoder-@users.noreply.github.com>2021-05-31 19:18:24 +0200
committerGitHub <noreply@github.com>2021-05-31 19:18:24 +0200
commit97a1f89881878db9bd6b4cd666b3447a63818dcf (patch)
tree46e844356f7cf88c08f9f9907caa11656a24f416 /src
parentb246de789105750558f3d6f884ba61e54cb98441 (diff)
parent1a2da67ed0505c9ac0aa1048ba3d607f3c1aa639 (diff)
downloadafl++-97a1f89881878db9bd6b4cd666b3447a63818dcf.tar.gz
Merge branch 'dev' into going_atomic
Diffstat (limited to 'src')
-rw-r--r--src/afl-cc.c32
-rw-r--r--src/afl-common.c4
-rw-r--r--src/afl-forkserver.c13
-rw-r--r--src/afl-fuzz-bitmap.c2
-rw-r--r--src/afl-fuzz-cmplog.c2
-rw-r--r--src/afl-fuzz-extras.c14
-rw-r--r--src/afl-fuzz-init.c102
-rw-r--r--src/afl-fuzz-mutators.c48
-rw-r--r--src/afl-fuzz-one.c10
-rw-r--r--src/afl-fuzz-python.c2
-rw-r--r--src/afl-fuzz-run.c12
-rw-r--r--src/afl-fuzz-state.c18
-rw-r--r--src/afl-fuzz-stats.c21
-rw-r--r--src/afl-fuzz.c142
-rw-r--r--src/afl-ld-lto.c11
-rw-r--r--src/afl-showmap.c136
16 files changed, 396 insertions, 173 deletions
diff --git a/src/afl-cc.c b/src/afl-cc.c
index 132f5f83..6be6e165 100644
--- a/src/afl-cc.c
+++ b/src/afl-cc.c
@@ -560,12 +560,14 @@ static void edit_params(u32 argc, char **argv, char **envp) {
if (lto_mode && !have_c) {
u8 *ld_path = strdup(AFL_REAL_LD);
- if (!*ld_path) ld_path = "ld.lld";
+ if (!ld_path || !*ld_path) { ld_path = strdup("ld.lld"); }
+ if (!ld_path) { PFATAL("Could not allocate mem for ld_path"); }
#if defined(AFL_CLANG_LDPATH) && LLVM_MAJOR >= 12
cc_params[cc_par_cnt++] = alloc_printf("--ld-path=%s", ld_path);
#else
cc_params[cc_par_cnt++] = alloc_printf("-fuse-ld=%s", ld_path);
#endif
+ free(ld_path);
cc_params[cc_par_cnt++] = "-Wl,--allow-multiple-definition";
@@ -1222,6 +1224,14 @@ int main(int argc, char **argv, char **envp) {
if (strncmp(argv[i], "--afl", 5) == 0) {
+ if (!strcmp(argv[i], "--afl_noopt") || !strcmp(argv[i], "--afl-noopt")) {
+
+ passthrough = 1;
+ argv[i] = "-g"; // we have to overwrite it, -g is always good
+ continue;
+
+ }
+
if (compiler_mode)
WARNF(
"--afl-... compiler mode supersedes the AFL_CC_COMPILER and "
@@ -1572,7 +1582,12 @@ int main(int argc, char **argv, char **envp) {
else if (have_gcc_plugin)
compiler_mode = GCC_PLUGIN;
else if (have_gcc)
+#ifdef __APPLE__
+ // on OSX clang masquerades as GCC
+ compiler_mode = CLANG;
+#else
compiler_mode = GCC;
+#endif
else if (have_lto)
compiler_mode = LTO;
else
@@ -1594,7 +1609,12 @@ int main(int argc, char **argv, char **envp) {
}
- if (compiler_mode == CLANG) { instrument_mode = INSTRUMENT_CLANG; }
+ if (compiler_mode == CLANG) {
+
+ instrument_mode = INSTRUMENT_CLANG;
+ setenv(CLANG_ENV_VAR, "1", 1); // used by afl-as
+
+ }
if (argc < 2 || strncmp(argv[1], "-h", 2) == 0) {
@@ -1628,7 +1648,7 @@ int main(int argc, char **argv, char **envp) {
" yes\n"
" [LLVM] llvm: %s%s\n"
" PCGUARD %s yes yes module yes yes "
- "extern\n"
+ "yes\n"
" CLASSIC %s no yes module yes yes "
"yes\n"
" - NORMAL\n"
@@ -1810,6 +1830,12 @@ int main(int argc, char **argv, char **envp) {
"If anything fails - be sure to read README.lto.md!\n");
#endif
+ SAYF(
+ "\nYou can supply --afl-noopt to not instrument, like AFL_NOOPT. "
+ "(this is helpful\n"
+ "in some build systems if you do not want to instrument "
+ "everything.\n");
+
}
SAYF(
diff --git a/src/afl-common.c b/src/afl-common.c
index 0fb1462e..8826de70 100644
--- a/src/afl-common.c
+++ b/src/afl-common.c
@@ -1110,6 +1110,10 @@ u32 get_map_size(void) {
if (map_size % 64) { map_size = (((map_size >> 6) + 1) << 6); }
+ } else if (getenv("AFL_SKIP_BIN_CHECK")) {
+
+ map_size = MAP_SIZE;
+
}
return map_size;
diff --git a/src/afl-forkserver.c b/src/afl-forkserver.c
index 727e7f8d..3d472b36 100644
--- a/src/afl-forkserver.c
+++ b/src/afl-forkserver.c
@@ -416,7 +416,8 @@ void afl_fsrv_start(afl_forkserver_t *fsrv, char **argv,
struct rlimit r;
- if (!fsrv->cmplog_binary && fsrv->qemu_mode == false) {
+ if (!fsrv->cmplog_binary && fsrv->qemu_mode == false &&
+ fsrv->frida_mode == false) {
unsetenv(CMPLOG_SHM_ENV_VAR); // we do not want that in non-cmplog fsrv
@@ -450,8 +451,12 @@ void afl_fsrv_start(afl_forkserver_t *fsrv, char **argv,
/* Dumping cores is slow and can lead to anomalies if SIGKILL is delivered
before the dump is complete. */
- // r.rlim_max = r.rlim_cur = 0;
- // setrlimit(RLIMIT_CORE, &r); /* Ignore errors */
+ if (!fsrv->debug) {
+
+ r.rlim_max = r.rlim_cur = 0;
+ setrlimit(RLIMIT_CORE, &r); /* Ignore errors */
+
+ }
/* Isolate the process and configure standard descriptors. If out_file is
specified, stdin is /dev/null; otherwise, out_fd is cloned instead. */
@@ -1089,7 +1094,7 @@ void afl_fsrv_write_to_testcase(afl_forkserver_t *fsrv, u8 *buf, size_t len) {
#endif
- if (likely(fsrv->use_shmem_fuzz && fsrv->shmem_fuzz)) {
+ if (likely(fsrv->use_shmem_fuzz)) {
if (unlikely(len > MAX_FILE)) len = MAX_FILE;
diff --git a/src/afl-fuzz-bitmap.c b/src/afl-fuzz-bitmap.c
index 3d0228db..97f10e6f 100644
--- a/src/afl-fuzz-bitmap.c
+++ b/src/afl-fuzz-bitmap.c
@@ -397,7 +397,7 @@ u8 *describe_op(afl_state_t *afl, u8 new_bits, size_t max_description_len) {
/* Write a message accompanying the crash directory :-) */
-static void write_crash_readme(afl_state_t *afl) {
+void write_crash_readme(afl_state_t *afl) {
u8 fn[PATH_MAX];
s32 fd;
diff --git a/src/afl-fuzz-cmplog.c b/src/afl-fuzz-cmplog.c
index 27c6c413..c2e9c80f 100644
--- a/src/afl-fuzz-cmplog.c
+++ b/src/afl-fuzz-cmplog.c
@@ -35,7 +35,7 @@ void cmplog_exec_child(afl_forkserver_t *fsrv, char **argv) {
if (fsrv->qemu_mode) { setenv("AFL_DISABLE_LLVM_INSTRUMENTATION", "1", 0); }
- if (!fsrv->qemu_mode && argv[0] != fsrv->cmplog_binary) {
+ if (!fsrv->qemu_mode && !fsrv->frida_mode && argv[0] != fsrv->cmplog_binary) {
argv[0] = fsrv->cmplog_binary;
diff --git a/src/afl-fuzz-extras.c b/src/afl-fuzz-extras.c
index 6091db15..584241d4 100644
--- a/src/afl-fuzz-extras.c
+++ b/src/afl-fuzz-extras.c
@@ -130,6 +130,20 @@ void load_extras_file(afl_state_t *afl, u8 *fname, u32 *min_len, u32 *max_len,
}
+ /* Skip [number] */
+
+ if (*lptr == '[') {
+
+ do {
+
+ ++lptr;
+
+ } while (*lptr >= '0' && *lptr <= '9');
+
+ if (*lptr == ']') { ++lptr; }
+
+ }
+
/* Skip whitespace and = signs. */
while (isspace(*lptr) || *lptr == '=') {
diff --git a/src/afl-fuzz-init.c b/src/afl-fuzz-init.c
index b6bfbc29..88b5bc02 100644
--- a/src/afl-fuzz-init.c
+++ b/src/afl-fuzz-init.c
@@ -113,7 +113,7 @@ void bind_to_free_cpu(afl_state_t *afl) {
u8 lockfile[PATH_MAX] = "";
s32 i;
- if (afl->afl_env.afl_no_affinity) {
+ if (afl->afl_env.afl_no_affinity && !afl->afl_env.afl_try_affinity) {
if (afl->cpu_to_bind != -1) {
@@ -130,10 +130,21 @@ void bind_to_free_cpu(afl_state_t *afl) {
if (!bind_cpu(afl, afl->cpu_to_bind)) {
- FATAL(
- "Could not bind to requested CPU %d! Make sure you passed a valid "
- "-b.",
- afl->cpu_to_bind);
+ if (afl->afl_env.afl_try_affinity) {
+
+ WARNF(
+ "Could not bind to requested CPU %d! Make sure you passed a valid "
+ "-b.",
+ afl->cpu_to_bind);
+
+ } else {
+
+ FATAL(
+ "Could not bind to requested CPU %d! Make sure you passed a valid "
+ "-b.",
+ afl->cpu_to_bind);
+
+ }
}
@@ -420,11 +431,14 @@ void bind_to_free_cpu(afl_state_t *afl) {
"Uh-oh, looks like all %d CPU cores on your system are allocated to\n"
" other instances of afl-fuzz (or similar CPU-locked tasks). "
"Starting\n"
- " another fuzzer on this machine is probably a bad plan, but if "
- "you are\n"
- " absolutely sure, you can set AFL_NO_AFFINITY and try again.\n",
- afl->cpu_core_count);
- FATAL("No more free CPU cores");
+ " another fuzzer on this machine is probably a bad plan.\n"
+ "%s",
+ afl->cpu_core_count,
+ afl->afl_env.afl_try_affinity ? ""
+ : " If you are sure, you can set "
+ "AFL_NO_AFFINITY and try again.\n");
+
+ if (!afl->afl_env.afl_try_affinity) { FATAL("No more free CPU cores"); }
}
@@ -823,7 +837,6 @@ void perform_dry_run(afl_state_t *afl) {
struct queue_entry *q;
u32 cal_failures = 0, idx;
- u8 * skip_crashes = afl->afl_env.afl_skip_crashes;
u8 * use_mem;
for (idx = 0; idx < afl->queued_paths; idx++) {
@@ -923,27 +936,6 @@ void perform_dry_run(afl_state_t *afl) {
if (afl->crash_mode) { break; }
- if (skip_crashes) {
-
- if (afl->fsrv.uses_crash_exitcode) {
-
- WARNF(
- "Test case results in a crash or AFL_CRASH_EXITCODE %d "
- "(skipping)",
- (int)(s8)afl->fsrv.crash_exitcode);
-
- } else {
-
- WARNF("Test case results in a crash (skipping)");
-
- }
-
- q->cal_failed = CAL_CHANCES;
- ++cal_failures;
- break;
-
- }
-
if (afl->fsrv.mem_limit) {
u8 val_buf[STRINGIFY_VAL_SIZE_MAX];
@@ -1044,18 +1036,16 @@ void perform_dry_run(afl_state_t *afl) {
/* Remove from fuzzing queue but keep for splicing */
- struct queue_entry *p = afl->queue;
-
- if (!p->was_fuzzed) {
+ if (!q->was_fuzzed) {
- p->was_fuzzed = 1;
+ q->was_fuzzed = 1;
--afl->pending_not_fuzzed;
--afl->active_paths;
}
- p->disabled = 1;
- p->perf_score = 0;
+ q->disabled = 1;
+ q->perf_score = 0;
u32 i = 0;
while (unlikely(i < afl->queued_paths && afl->queue_buf[i] &&
@@ -1119,14 +1109,12 @@ void perform_dry_run(afl_state_t *afl) {
if (cal_failures == afl->queued_paths) {
- FATAL("All test cases time out%s, giving up!",
- skip_crashes ? " or crash" : "");
+ FATAL("All test cases time out or crash, giving up!");
}
- WARNF("Skipped %u test cases (%0.02f%%) due to timeouts%s.", cal_failures,
- ((double)cal_failures) * 100 / afl->queued_paths,
- skip_crashes ? " or crashes" : "");
+ WARNF("Skipped %u test cases (%0.02f%%) due to timeouts or crashes.",
+ cal_failures, ((double)cal_failures) * 100 / afl->queued_paths);
if (cal_failures * 5 > afl->queued_paths) {
@@ -1294,9 +1282,13 @@ void pivot_inputs(afl_state_t *afl) {
if (src_str && sscanf(src_str + 1, "%06u", &src_id) == 1) {
- struct queue_entry *s = afl->queue_buf[src_id];
+ if (src_id < afl->queued_paths) {
+
+ struct queue_entry *s = afl->queue_buf[src_id];
+
+ if (s) { q->depth = s->depth + 1; }
- if (s) { q->depth = s->depth + 1; }
+ }
if (afl->max_depth < q->depth) { afl->max_depth = q->depth; }
@@ -2031,7 +2023,7 @@ void setup_dirs_fds(afl_state_t *afl) {
fprintf(
afl->fsrv.plot_file,
- "# unix_time, cycles_done, cur_path, paths_total, "
+ "# relative_time, cycles_done, cur_path, paths_total, "
"pending_total, pending_favs, map_size, unique_crashes, "
"unique_hangs, max_depth, execs_per_sec, total_execs, edges_found\n");
@@ -2726,11 +2718,15 @@ void check_binary(afl_state_t *afl, u8 *fname) {
" When source code is not available, you may be able to leverage "
"QEMU\n"
" mode support. Consult the README.md for tips on how to enable "
- "this.\n"
+ "this.\n\n"
+
+ " If your target is an instrumented binary (e.g. with zafl, "
+ "retrowrite,\n"
+ " etc.) then set 'AFL_SKIP_BIN_CHECK=1'\n\n"
" (It is also possible to use afl-fuzz as a traditional, "
- "non-instrumented fuzzer.\n"
- " For that, you can use the -n option - but expect much worse "
+ "non-instrumented\n"
+ " fuzzer. For that use the -n option - but expect much worse "
"results.)\n",
doc_path);
@@ -2774,6 +2770,14 @@ void check_binary(afl_state_t *afl, u8 *fname) {
WARNF("AFL_PERSISTENT is no longer supported and may misbehave!");
+ } else if (getenv("AFL_FRIDA_PERSISTENT_ADDR")) {
+
+ OKF("FRIDA Persistent mode configuration options detected.");
+ setenv(PERSIST_ENV_VAR, "1", 1);
+ afl->persistent_mode = 1;
+
+ afl->shmem_testcase_mode = 1;
+
}
if (afl->fsrv.frida_mode ||
diff --git a/src/afl-fuzz-mutators.c b/src/afl-fuzz-mutators.c
index a47b4f5f..e27d6fae 100644
--- a/src/afl-fuzz-mutators.c
+++ b/src/afl-fuzz-mutators.c
@@ -308,9 +308,11 @@ struct custom_mutator *load_custom_mutator(afl_state_t *afl, const char *fn) {
u8 trim_case_custom(afl_state_t *afl, struct queue_entry *q, u8 *in_buf,
struct custom_mutator *mutator) {
- u8 needs_write = 0, fault = 0;
+ u8 fault = 0;
u32 trim_exec = 0;
u32 orig_len = q->len;
+ u32 out_len = 0;
+ u8 *out_buf = NULL;
u8 val_buf[STRINGIFY_VAL_SIZE_MAX];
@@ -397,27 +399,33 @@ u8 trim_case_custom(afl_state_t *afl, struct queue_entry *q, u8 *in_buf,
if (likely(retlen && cksum == q->exec_cksum)) {
- q->len = retlen;
- memcpy(in_buf, retbuf, retlen);
-
/* Let's save a clean trace, which will be needed by
- update_bitmap_score once we're done with the trimming stuff. */
+ update_bitmap_score once we're done with the trimming stuff.
+ Use out_buf NULL check to make this only happen once per trim. */
- if (!needs_write) {
+ if (!out_buf) {
- needs_write = 1;
memcpy(afl->clean_trace_custom, afl->fsrv.trace_bits,
afl->fsrv.map_size);
}
+ if (afl_realloc((void **)&out_buf, retlen) == NULL) {
+
+ FATAL("can not allocate memory for trim");
+
+ }
+
+ out_len = retlen;
+ memcpy(out_buf, retbuf, retlen);
+
/* Tell the custom mutator that the trimming was successful */
afl->stage_cur = mutator->afl_custom_post_trim(mutator->data, 1);
if (afl->not_on_tty && afl->debug) {
SAYF("[Custom Trimming] SUCCESS: %u/%u iterations (now at %u bytes)",
- afl->stage_cur, afl->stage_max, q->len);
+ afl->stage_cur, afl->stage_max, out_len);
}
@@ -450,16 +458,10 @@ u8 trim_case_custom(afl_state_t *afl, struct queue_entry *q, u8 *in_buf,
}
- if (afl->not_on_tty && afl->debug) {
-
- SAYF("[Custom Trimming] DONE: %u bytes -> %u bytes", orig_len, q->len);
-
- }
-
- /* If we have made changes to in_buf, we also need to update the on-disk
+ /* If we have made changes, we also need to update the on-disk
version of the test case. */
- if (needs_write) {
+ if (out_buf) {
s32 fd;
@@ -469,16 +471,28 @@ u8 trim_case_custom(afl_state_t *afl, struct queue_entry *q, u8 *in_buf,
if (fd < 0) { PFATAL("Unable to create '%s'", q->fname); }
- ck_write(fd, in_buf, q->len, q->fname);
+ ck_write(fd, out_buf, out_len, q->fname);
close(fd);
+ /* Update the queue's knowledge of length as soon as we write the file.
+ We do this here so that exit/error cases that *don't* update the file
+ also don't update q->len. */
+ q->len = out_len;
+
memcpy(afl->fsrv.trace_bits, afl->clean_trace_custom, afl->fsrv.map_size);
update_bitmap_score(afl, q);
}
+ if (afl->not_on_tty && afl->debug) {
+
+ SAYF("[Custom Trimming] DONE: %u bytes -> %u bytes", orig_len, q->len);
+
+ }
+
abort_trimming:
+ if (out_buf) afl_free(out_buf);
afl->bytes_trim_out += q->len;
return fault;
diff --git a/src/afl-fuzz-one.c b/src/afl-fuzz-one.c
index d72d4145..4a3e7f33 100644
--- a/src/afl-fuzz-one.c
+++ b/src/afl-fuzz-one.c
@@ -562,7 +562,7 @@ u8 fuzz_one_original(afl_state_t *afl) {
if (afl->cmplog_lvl == 3 ||
(afl->cmplog_lvl == 2 && afl->queue_cur->tc_ref) ||
!(afl->fsrv.total_execs % afl->queued_paths) ||
- get_cur_time() - afl->last_path_time > 300000) {
+ get_cur_time() - afl->last_path_time > 300000) { // 300 seconds
if (input_to_state_stage(afl, in_buf, out_buf, len)) {
@@ -2013,7 +2013,7 @@ havoc_stage:
}
- if (unlikely(get_cur_time() - afl->last_path_time > 5000 &&
+ if (unlikely(get_cur_time() - afl->last_path_time > 5000 /* 5 seconds */ &&
afl->ready_for_splicing_count > 1)) {
/* add expensive havoc cases here if there is no findings in the last 5s */
@@ -3010,13 +3010,13 @@ static u8 mopt_common_fuzzing(afl_state_t *afl, MOpt_globals_t MOpt_globals) {
u8 res = trim_case(afl, afl->queue_cur, in_buf);
orig_in = in_buf = queue_testcase_get(afl, afl->queue_cur);
- if (res == FSRV_RUN_ERROR) {
+ if (unlikely(res == FSRV_RUN_ERROR)) {
FATAL("Unable to execute target application");
}
- if (afl->stop_soon) {
+ if (unlikely(afl->stop_soon)) {
++afl->cur_skipped_paths;
goto abandon_entry;
@@ -3060,7 +3060,7 @@ static u8 mopt_common_fuzzing(afl_state_t *afl, MOpt_globals_t MOpt_globals) {
if (afl->cmplog_lvl == 3 ||
(afl->cmplog_lvl == 2 && afl->queue_cur->tc_ref) ||
!(afl->fsrv.total_execs % afl->queued_paths) ||
- get_cur_time() - afl->last_path_time > 300000) {
+ get_cur_time() - afl->last_path_time > 300000) { // 300 seconds
if (input_to_state_stage(afl, in_buf, out_buf, len)) {
diff --git a/src/afl-fuzz-python.c b/src/afl-fuzz-python.c
index 8760194c..3aa97635 100644
--- a/src/afl-fuzz-python.c
+++ b/src/afl-fuzz-python.c
@@ -212,7 +212,7 @@ static py_mutator_t *init_py_module(afl_state_t *afl, u8 *module_name) {
PyObject_GetAttrString(py_module, "introspection");
py_functions[PY_FUNC_DEINIT] = PyObject_GetAttrString(py_module, "deinit");
if (!py_functions[PY_FUNC_DEINIT])
- FATAL("deinit function not found in python module");
+ WARNF("deinit function not found in python module");
for (py_idx = 0; py_idx < PY_FUNC_COUNT; ++py_idx) {
diff --git a/src/afl-fuzz-run.c b/src/afl-fuzz-run.c
index 832f17bb..5a481639 100644
--- a/src/afl-fuzz-run.c
+++ b/src/afl-fuzz-run.c
@@ -203,7 +203,7 @@ static void write_with_gap(afl_state_t *afl, u8 *mem, u32 len, u32 skip_at,
}
- if (afl->fsrv.shmem_fuzz) {
+ if (likely(afl->fsrv.use_shmem_fuzz)) {
if (!post_process_skipped) {
@@ -211,9 +211,7 @@ static void write_with_gap(afl_state_t *afl, u8 *mem, u32 len, u32 skip_at,
memcpy(afl->fsrv.shmem_fuzz, new_mem, new_size);
- }
-
- else {
+ } else {
memcpy(afl->fsrv.shmem_fuzz, mem, skip_at);
@@ -244,7 +242,7 @@ static void write_with_gap(afl_state_t *afl, u8 *mem, u32 len, u32 skip_at,
return;
- } else if (afl->fsrv.out_file) {
+ } else if (unlikely(!afl->fsrv.use_stdin)) {
if (unlikely(afl->no_unlink)) {
@@ -279,7 +277,7 @@ static void write_with_gap(afl_state_t *afl, u8 *mem, u32 len, u32 skip_at,
}
- if (!afl->fsrv.out_file) {
+ if (afl->fsrv.use_stdin) {
if (ftruncate(fd, new_size)) { PFATAL("ftruncate() failed"); }
lseek(fd, 0, SEEK_SET);
@@ -412,7 +410,7 @@ u8 calibrate_case(afl_state_t *afl, struct queue_entry *q, u8 *use_mem,
}
var_detected = 1;
- afl->stage_max = CAL_CYCLES_LONG;
+ afl->stage_max = afl->fast_cal ? CAL_CYCLES : CAL_CYCLES_LONG;
} else {
diff --git a/src/afl-fuzz-state.c b/src/afl-fuzz-state.c
index 28d3339a..0658070e 100644
--- a/src/afl-fuzz-state.c
+++ b/src/afl-fuzz-state.c
@@ -99,6 +99,7 @@ void afl_state_init(afl_state_t *afl, uint32_t map_size) {
afl->cal_cycles = CAL_CYCLES;
afl->cal_cycles_long = CAL_CYCLES_LONG;
afl->hang_tmout = EXEC_TIMEOUT;
+ afl->exit_on_time = 0;
afl->stats_update_freq = 1;
afl->stats_avg_exec = 0;
afl->skip_deterministic = 1;
@@ -187,6 +188,13 @@ void read_afl_environment(afl_state_t *afl, char **envp) {
afl->afl_env.afl_exit_when_done =
get_afl_env(afl_environment_variables[i]) ? 1 : 0;
+ } else if (!strncmp(env, "AFL_EXIT_ON_TIME",
+
+ afl_environment_variable_len)) {
+
+ afl->afl_env.afl_exit_on_time =
+ (u8 *)get_afl_env(afl_environment_variables[i]);
+
} else if (!strncmp(env, "AFL_NO_AFFINITY",
afl_environment_variable_len)) {
@@ -194,12 +202,18 @@ void read_afl_environment(afl_state_t *afl, char **envp) {
afl->afl_env.afl_no_affinity =
get_afl_env(afl_environment_variables[i]) ? 1 : 0;
+ } else if (!strncmp(env, "AFL_TRY_AFFINITY",
+
+ afl_environment_variable_len)) {
+
+ afl->afl_env.afl_try_affinity =
+ get_afl_env(afl_environment_variables[i]) ? 1 : 0;
+
} else if (!strncmp(env, "AFL_SKIP_CRASHES",
afl_environment_variable_len)) {
- afl->afl_env.afl_skip_crashes =
- (u8 *)get_afl_env(afl_environment_variables[i]);
+ // we should mark this obsolete in a few versions
} else if (!strncmp(env, "AFL_HANG_TMOUT",
diff --git a/src/afl-fuzz-stats.c b/src/afl-fuzz-stats.c
index 22c0cbd2..4884b942 100644
--- a/src/afl-fuzz-stats.c
+++ b/src/afl-fuzz-stats.c
@@ -179,6 +179,8 @@ void load_stats_file(afl_state_t *afl) {
}
+ if (afl->unique_crashes) { write_crash_readme(afl); }
+
return;
}
@@ -366,7 +368,8 @@ void maybe_update_plot_file(afl_state_t *afl, u32 t_bytes, double bitmap_cvg,
afl->plot_prev_uh == afl->unique_hangs &&
afl->plot_prev_md == afl->max_depth &&
afl->plot_prev_ed == afl->fsrv.total_execs) ||
- !afl->queue_cycle || get_cur_time() - afl->start_time <= 60))) {
+ !afl->queue_cycle ||
+ get_cur_time() - afl->start_time <= 60000))) {
return;
@@ -384,14 +387,14 @@ void maybe_update_plot_file(afl_state_t *afl, u32 t_bytes, double bitmap_cvg,
/* Fields in the file:
- unix_time, afl->cycles_done, cur_path, paths_total, paths_not_fuzzed,
+ relative_time, afl->cycles_done, cur_path, paths_total, paths_not_fuzzed,
favored_not_fuzzed, unique_crashes, unique_hangs, max_depth,
execs_per_sec, edges_found */
fprintf(afl->fsrv.plot_file,
"%llu, %llu, %u, %u, %u, %u, %0.02f%%, %llu, %llu, %u, %0.02f, %llu, "
"%u\n",
- (afl->prev_run_time + get_cur_time() - afl->start_time),
+ ((afl->prev_run_time + get_cur_time() - afl->start_time) / 1000),
afl->queue_cycle - 1, afl->current_entry, afl->queued_paths,
afl->pending_not_fuzzed, afl->pending_favored, bitmap_cvg,
afl->unique_crashes, afl->unique_hangs, afl->max_depth, eps,
@@ -544,7 +547,7 @@ void show_stats(afl_state_t *afl) {
if (unlikely(afl->afl_env.afl_statsd)) {
- if (unlikely(afl->force_ui_update && cur_ms - afl->statsd_last_send_ms >
+ if (unlikely(afl->force_ui_update || cur_ms - afl->statsd_last_send_ms >
STATSD_UPDATE_SEC * 1000)) {
/* reset counter, even if send failed. */
@@ -574,6 +577,16 @@ void show_stats(afl_state_t *afl) {
}
+ /* AFL_EXIT_ON_TIME. */
+
+ if (unlikely(afl->last_path_time && !afl->non_instrumented_mode &&
+ afl->afl_env.afl_exit_on_time &&
+ (cur_ms - afl->last_path_time) > afl->exit_on_time)) {
+
+ afl->stop_soon = 2;
+
+ }
+
if (unlikely(afl->total_crashes && afl->afl_env.afl_bench_until_crash)) {
afl->stop_soon = 2;
diff --git a/src/afl-fuzz.c b/src/afl-fuzz.c
index 3606533d..a3a623d9 100644
--- a/src/afl-fuzz.c
+++ b/src/afl-fuzz.c
@@ -35,6 +35,10 @@
#include <sys/shm.h>
#endif
+#ifdef __APPLE__
+ #include <sys/qos.h>
+#endif
+
#ifdef PROFILING
extern u64 time_spent_working;
#endif
@@ -204,6 +208,7 @@ static void usage(u8 *argv0, int more_help) {
"AFL_DISABLE_TRIM: disable the trimming of test cases\n"
"AFL_DUMB_FORKSRV: use fork server without feedback from target\n"
"AFL_EXIT_WHEN_DONE: exit when all inputs are run and no new finds are found\n"
+ "AFL_EXIT_ON_TIME: exit when no new paths are found within the specified time period\n"
"AFL_EXPAND_HAVOC_NOW: immediately enable expand havoc mode (default: after 60 minutes and a cycle without finds)\n"
"AFL_FAST_CAL: limit the calibration stage to three cycles for speedup\n"
"AFL_FORCE_UI: force showing the status screen (for virtual consoles)\n"
@@ -219,6 +224,7 @@ static void usage(u8 *argv0, int more_help) {
" then they are randomly selected instead all of them being\n"
" used. Defaults to 200.\n"
"AFL_NO_AFFINITY: do not check for an unused cpu core to use for fuzzing\n"
+ "AFL_TRY_AFFINITY: try to bind to an unused core, but don't fail if unsuccessful\n"
"AFL_NO_ARITH: skip arithmetic mutations in deterministic stage\n"
"AFL_NO_AUTODICT: do not load an offered auto dictionary compiled into a target\n"
"AFL_NO_CPU_RED: avoid red color for showing very high cpu usage\n"
@@ -237,9 +243,9 @@ static void usage(u8 *argv0, int more_help) {
"AFL_PRELOAD: LD_PRELOAD / DYLD_INSERT_LIBRARIES settings for target\n"
"AFL_TARGET_ENV: pass extra environment variables to target\n"
"AFL_SHUFFLE_QUEUE: reorder the input queue randomly on startup\n"
- "AFL_SKIP_BIN_CHECK: skip the check, if the target is an executable\n"
+ "AFL_SKIP_BIN_CHECK: skip afl compatibility checks, also disables auto map size\n"
"AFL_SKIP_CPUFREQ: do not warn about variable cpu clocking\n"
- "AFL_SKIP_CRASHES: during initial dry run do not terminate for crashing inputs\n"
+ //"AFL_SKIP_CRASHES: during initial dry run do not terminate for crashing inputs\n"
"AFL_STATSD: enables StatsD metrics collection\n"
"AFL_STATSD_HOST: change default statsd host (default 127.0.0.1)\n"
"AFL_STATSD_PORT: change default statsd port (default: 8125)\n"
@@ -327,11 +333,55 @@ static int stricmp(char const *a, char const *b) {
}
+static void fasan_check_afl_preload(char *afl_preload) {
+
+ char first_preload[PATH_MAX + 1] = {0};
+ char * separator = strchr(afl_preload, ':');
+ size_t first_preload_len = PATH_MAX;
+ char * basename;
+ char clang_runtime_prefix[] = "libclang_rt.asan-";
+
+ if (separator != NULL && (separator - afl_preload) < PATH_MAX) {
+
+ first_preload_len = separator - afl_preload;
+
+ }
+
+ strncpy(first_preload, afl_preload, first_preload_len);
+
+ basename = strrchr(first_preload, '/');
+ if (basename == NULL) {
+
+ basename = first_preload;
+
+ } else {
+
+ basename = basename + 1;
+
+ }
+
+ if (strncmp(basename, clang_runtime_prefix,
+ sizeof(clang_runtime_prefix) - 1) != 0) {
+
+ FATAL("Address Sanitizer DSO must be the first DSO in AFL_PRELOAD");
+
+ }
+
+ if (access(first_preload, R_OK) != 0) {
+
+ FATAL("Address Sanitizer DSO not found");
+
+ }
+
+ OKF("Found ASAN DSO: %s", first_preload);
+
+}
+
/* Main entry point */
int main(int argc, char **argv_orig, char **envp) {
- s32 opt, i, auto_sync = 0 /*, user_set_cache = 0*/;
+ s32 opt, auto_sync = 0 /*, user_set_cache = 0*/;
u64 prev_queued = 0;
u32 sync_interval_cnt = 0, seek_to = 0, show_help = 0,
map_size = get_map_size();
@@ -784,6 +834,7 @@ int main(int argc, char **argv_orig, char **envp) {
}
afl->fsrv.frida_mode = 1;
+ if (get_afl_env("AFL_USE_FASAN")) { afl->fsrv.frida_asan = 1; }
break;
@@ -1246,6 +1297,13 @@ int main(int argc, char **argv_orig, char **envp) {
}
+ if (afl->afl_env.afl_exit_on_time) {
+
+ u64 exit_on_time = atoi(afl->afl_env.afl_exit_on_time);
+ afl->exit_on_time = (u64)exit_on_time * 1000;
+
+ }
+
if (afl->afl_env.afl_max_det_extras) {
s32 max_det_extras = atoi(afl->afl_env.afl_max_det_extras);
@@ -1358,20 +1416,29 @@ int main(int argc, char **argv_orig, char **envp) {
afl_preload = getenv("AFL_PRELOAD");
u8 *frida_binary = find_afl_binary(argv[0], "afl-frida-trace.so");
+ OKF("Injecting %s ...", frida_binary);
if (afl_preload) {
- frida_afl_preload = alloc_printf("%s:%s", afl_preload, frida_binary);
+ if (afl->fsrv.frida_asan) {
- } else {
+ OKF("Using Frida Address Sanitizer Mode");
- frida_afl_preload = alloc_printf("%s", frida_binary);
+ fasan_check_afl_preload(afl_preload);
- }
+ setenv("ASAN_OPTIONS", "detect_leaks=false", 1);
- ck_free(frida_binary);
+ }
+
+ u8 *frida_binary = find_afl_binary(argv[0], "afl-frida-trace.so");
+ OKF("Injecting %s ...", frida_binary);
+ frida_afl_preload = alloc_printf("%s:%s", afl_preload, frida_binary);
- setenv("LD_PRELOAD", frida_afl_preload, 1);
- setenv("DYLD_INSERT_LIBRARIES", frida_afl_preload, 1);
+ ck_free(frida_binary);
+
+ setenv("LD_PRELOAD", frida_afl_preload, 1);
+ setenv("DYLD_INSERT_LIBRARIES", frida_afl_preload, 1);
+
+ }
} else {
@@ -1382,10 +1449,22 @@ int main(int argc, char **argv_orig, char **envp) {
} else if (afl->fsrv.frida_mode) {
- u8 *frida_binary = find_afl_binary(argv[0], "afl-frida-trace.so");
- setenv("LD_PRELOAD", frida_binary, 1);
- setenv("DYLD_INSERT_LIBRARIES", frida_binary, 1);
- ck_free(frida_binary);
+ if (afl->fsrv.frida_asan) {
+
+ OKF("Using Frida Address Sanitizer Mode");
+ FATAL(
+ "Address Sanitizer DSO must be loaded using AFL_PRELOAD in Frida "
+ "Address Sanitizer Mode");
+
+ } else {
+
+ u8 *frida_binary = find_afl_binary(argv[0], "afl-frida-trace.so");
+ OKF("Injecting %s ...", frida_binary);
+ setenv("LD_PRELOAD", frida_binary, 1);
+ setenv("DYLD_INSERT_LIBRARIES", frida_binary, 1);
+ ck_free(frida_binary);
+
+ }
}
@@ -1643,10 +1722,10 @@ int main(int argc, char **argv_orig, char **envp) {
afl_shm_init(&afl->shm, afl->fsrv.map_size, afl->non_instrumented_mode);
if (!afl->non_instrumented_mode && !afl->fsrv.qemu_mode &&
- !afl->unicorn_mode) {
+ !afl->unicorn_mode && !afl->fsrv.frida_mode &&
+ !afl->afl_env.afl_skip_bin_check) {
- if (map_size <= DEFAULT_SHMEM_SIZE && !afl->non_instrumented_mode &&
- !afl->fsrv.qemu_mode && !afl->unicorn_mode) {
+ if (map_size <= DEFAULT_SHMEM_SIZE) {
afl->fsrv.map_size = DEFAULT_SHMEM_SIZE; // dummy temporary value
char vbuf[16];
@@ -1697,13 +1776,15 @@ int main(int argc, char **argv_orig, char **envp) {
// TODO: this is semi-nice
afl->cmplog_fsrv.trace_bits = afl->fsrv.trace_bits;
afl->cmplog_fsrv.qemu_mode = afl->fsrv.qemu_mode;
+ afl->cmplog_fsrv.frida_mode = afl->fsrv.frida_mode;
afl->cmplog_fsrv.cmplog_binary = afl->cmplog_binary;
afl->cmplog_fsrv.init_child_func = cmplog_exec_child;
if ((map_size <= DEFAULT_SHMEM_SIZE ||
afl->cmplog_fsrv.map_size < map_size) &&
!afl->non_instrumented_mode && !afl->fsrv.qemu_mode &&
- !afl->unicorn_mode) {
+ !afl->fsrv.frida_mode && !afl->unicorn_mode &&
+ !afl->afl_env.afl_skip_bin_check) {
afl->cmplog_fsrv.map_size = MAX(map_size, (u32)DEFAULT_SHMEM_SIZE);
char vbuf[16];
@@ -1759,7 +1840,7 @@ int main(int argc, char **argv_orig, char **envp) {
if (extras_dir_cnt) {
- for (i = 0; i < extras_dir_cnt; i++) {
+ for (u8 i = 0; i < extras_dir_cnt; i++) {
load_extras(afl, extras_dir[i]);
@@ -1911,6 +1992,13 @@ int main(int argc, char **argv_orig, char **envp) {
if (unlikely(seek_to)) {
+ if (unlikely(seek_to >= afl->queued_paths)) {
+
+ // This should never happen.
+ FATAL("BUG: seek_to location out of bounds!\n");
+
+ }
+
afl->current_entry = seek_to;
afl->queue_cur = afl->queue_buf[seek_to];
seek_to = 0;
@@ -1929,8 +2017,10 @@ int main(int argc, char **argv_orig, char **envp) {
/* If we had a full queue cycle with no new finds, try
recombination strategies next. */
- if (unlikely(afl->queued_paths == prev_queued &&
- (get_cur_time() - afl->start_time) >= 3600)) {
+ if (unlikely(afl->queued_paths == prev_queued
+ /* FIXME TODO BUG: && (get_cur_time() - afl->start_time) >=
+ 3600 */
+ )) {
if (afl->use_splicing) {
@@ -2048,7 +2138,7 @@ int main(int argc, char **argv_orig, char **envp) {
}
// we must recalculate the scores of all queue entries
- for (i = 0; i < (s32)afl->queued_paths; i++) {
+ for (u32 i = 0; i < afl->queued_paths; i++) {
if (likely(!afl->queue_buf[i]->disabled)) {
@@ -2209,6 +2299,14 @@ stop_fuzzing:
}
afl_fsrv_deinit(&afl->fsrv);
+
+ /* remove tmpfile */
+ if (afl->tmp_dir != NULL && !afl->in_place_resume && afl->fsrv.out_file) {
+
+ (void)unlink(afl->fsrv.out_file);
+
+ }
+
if (afl->orig_cmdline) { ck_free(afl->orig_cmdline); }
ck_free(afl->fsrv.target_path);
ck_free(afl->fsrv.out_file);
diff --git a/src/afl-ld-lto.c b/src/afl-ld-lto.c
index d0113af9..1ce97649 100644
--- a/src/afl-ld-lto.c
+++ b/src/afl-ld-lto.c
@@ -298,13 +298,12 @@ int main(int argc, char **argv) {
SAYF(
"\n"
- "This is a helper application for afl-clang-lto. It is a wrapper "
- "around GNU "
- "llvm's 'lld',\n"
- "executed by the toolchain whenever using "
- "afl-clang-lto/afl-clang-lto++.\n"
+ "This is a helper application for afl-clang-lto.\n"
+ "It is a wrapper around llvm's 'lld' in case afl-clang-lto cannot be "
+ "used.\n"
+ "Note that the target still has to be compiled with -flto=full!\n"
"You probably don't want to run this program directly but rather pass "
- "it as LD parameter to configure scripts\n\n"
+ "it as LD\nparameter to e.g. configure scripts.\n\n"
"Environment variables:\n"
" AFL_LD_PASSTHROUGH do not link+optimize == no instrumentation\n"
diff --git a/src/afl-showmap.c b/src/afl-showmap.c
index 946b19cd..96b72dd9 100644
--- a/src/afl-showmap.c
+++ b/src/afl-showmap.c
@@ -52,6 +52,7 @@
#include <fcntl.h>
#include <limits.h>
+#include <dirent.h>
#include <sys/wait.h>
#include <sys/time.h>
#ifndef USEMMAP
@@ -76,17 +77,18 @@ static u32 in_len; /* Input data length */
static u32 map_size = MAP_SIZE;
-static u8 quiet_mode, /* Hide non-essential messages? */
+static bool quiet_mode, /* Hide non-essential messages? */
edges_only, /* Ignore hit counts? */
raw_instr_output, /* Do not apply AFL filters */
cmin_mode, /* Generate output in afl-cmin mode? */
binary_mode, /* Write output as a binary map */
keep_cores, /* Allow coredumps? */
- remove_shm = 1, /* remove shmem? */
+ remove_shm = true, /* remove shmem? */
collect_coverage, /* collect coverage */
have_coverage, /* have coverage? */
no_classify, /* do not classify counts */
- debug; /* debug mode */
+ debug, /* debug mode */
+ print_filenames; /* print the current filename */
static volatile u8 stop_soon, /* Ctrl-C pressed? */
child_crashed; /* Child crashed? */
@@ -233,6 +235,9 @@ static u32 write_results_to_file(afl_forkserver_t *fsrv, u8 *outfile) {
if (cmin_mode &&
(fsrv->last_run_timed_out || (!caa && child_crashed != cco))) {
+ // create empty file to prevent error messages in afl-cmin
+ fd = open(outfile, O_WRONLY | O_CREAT | O_EXCL, DEFAULT_PERMISSION);
+ close(fd);
return ret;
}
@@ -320,11 +325,11 @@ static void showmap_run_target_forkserver(afl_forkserver_t *fsrv, u8 *mem,
if (fsrv->trace_bits[0] == 1) {
fsrv->trace_bits[0] = 0;
- have_coverage = 1;
+ have_coverage = true;
} else {
- have_coverage = 0;
+ have_coverage = false;
}
@@ -335,11 +340,11 @@ static void showmap_run_target_forkserver(afl_forkserver_t *fsrv, u8 *mem,
if (!fsrv->last_run_timed_out && !stop_soon &&
WIFSIGNALED(fsrv->child_status)) {
- child_crashed = 1;
+ child_crashed = true;
} else {
- child_crashed = 0;
+ child_crashed = false;
}
@@ -375,6 +380,13 @@ static void showmap_run_target_forkserver(afl_forkserver_t *fsrv, u8 *mem,
static u32 read_file(u8 *in_file) {
+ if (print_filenames) {
+
+ SAYF("Processing %s\n", in_file);
+ fflush(stdout);
+
+ }
+
struct stat st;
s32 fd = open(in_file, O_RDONLY);
@@ -386,7 +398,18 @@ static u32 read_file(u8 *in_file) {
}
- in_len = st.st_size;
+ if (st.st_size > MAX_FILE) {
+
+ WARNF("Input file '%s' is too large, only reading %u bytes.", in_file,
+ MAX_FILE);
+ in_len = MAX_FILE;
+
+ } else {
+
+ in_len = st.st_size;
+
+ }
+
in_data = ck_alloc_nozero(in_len);
ck_read(fd, in_data, in_len, in_file);
@@ -504,11 +527,11 @@ static void showmap_run_target(afl_forkserver_t *fsrv, char **argv) {
if (fsrv->trace_bits[0] == 1) {
fsrv->trace_bits[0] = 0;
- have_coverage = 1;
+ have_coverage = true;
} else {
- have_coverage = 0;
+ have_coverage = false;
}
@@ -518,7 +541,7 @@ static void showmap_run_target(afl_forkserver_t *fsrv, char **argv) {
if (!fsrv->last_run_timed_out && !stop_soon && WIFSIGNALED(status)) {
- child_crashed = 1;
+ child_crashed = true;
}
@@ -548,7 +571,7 @@ static void showmap_run_target(afl_forkserver_t *fsrv, char **argv) {
static void handle_stop_sig(int sig) {
(void)sig;
- stop_soon = 1;
+ stop_soon = true;
afl_fsrv_killall();
}
@@ -731,6 +754,8 @@ static void usage(u8 *argv0) {
"AFL_MAP_SIZE: the shared memory size for that target. must be >= the "
"size the target was compiled for\n"
"AFL_PRELOAD: LD_PRELOAD / DYLD_INSERT_LIBRARIES settings for target\n"
+ "AFL_PRINT_FILENAMES: If set, the filename currently processed will be "
+ "printed to stdout\n"
"AFL_QUIET: do not print extra informational output\n",
argv0, MEM_LIMIT, doc_path);
@@ -744,14 +769,17 @@ int main(int argc, char **argv_orig, char **envp) {
// TODO: u64 mem_limit = MEM_LIMIT; /* Memory limit (MB) */
- s32 opt, i;
- u8 mem_limit_given = 0, timeout_given = 0, unicorn_mode = 0, use_wine = 0;
+ s32 opt, i;
+ bool mem_limit_given = false, timeout_given = false, unicorn_mode = false,
+ use_wine = false;
char **use_argv;
char **argv = argv_cpy_dup(argc, argv_orig);
afl_forkserver_t fsrv_var = {0};
- if (getenv("AFL_DEBUG")) { debug = 1; }
+ if (getenv("AFL_DEBUG")) { debug = true; }
+ if (get_afl_env("AFL_PRINT_FILENAMES")) { print_filenames = true; }
+
fsrv = &fsrv_var;
afl_fsrv_init(fsrv);
map_size = get_map_size();
@@ -759,19 +787,19 @@ int main(int argc, char **argv_orig, char **envp) {
doc_path = access(DOC_PATH, F_OK) ? "docs" : DOC_PATH;
- if (getenv("AFL_QUIET") != NULL) { be_quiet = 1; }
+ if (getenv("AFL_QUIET") != NULL) { be_quiet = true; }
while ((opt = getopt(argc, argv, "+i:o:f:m:t:A:eqCZOQUWbcrsh")) > 0) {
switch (opt) {
case 's':
- no_classify = 1;
+ no_classify = true;
break;
case 'C':
- collect_coverage = 1;
- quiet_mode = 1;
+ collect_coverage = true;
+ quiet_mode = true;
break;
case 'i':
@@ -790,7 +818,7 @@ int main(int argc, char **argv_orig, char **envp) {
u8 suffix = 'M';
if (mem_limit_given) { FATAL("Multiple -m options not supported"); }
- mem_limit_given = 1;
+ mem_limit_given = true;
if (!optarg) { FATAL("Wrong usage of -m"); }
@@ -851,7 +879,7 @@ int main(int argc, char **argv_orig, char **envp) {
case 't':
if (timeout_given) { FATAL("Multiple -t options not supported"); }
- timeout_given = 1;
+ timeout_given = true;
if (!optarg) { FATAL("Wrong usage of -t"); }
@@ -873,12 +901,12 @@ int main(int argc, char **argv_orig, char **envp) {
if (edges_only) { FATAL("Multiple -e options not supported"); }
if (raw_instr_output) { FATAL("-e and -r are mutually exclusive"); }
- edges_only = 1;
+ edges_only = true;
break;
case 'q':
- quiet_mode = 1;
+ quiet_mode = true;
break;
case 'Z':
@@ -886,8 +914,8 @@ int main(int argc, char **argv_orig, char **envp) {
/* This is an undocumented option to write data in the syntax expected
by afl-cmin. Nobody else should have any use for this. */
- cmin_mode = 1;
- quiet_mode = 1;
+ cmin_mode = true;
+ quiet_mode = true;
break;
case 'A':
@@ -899,7 +927,7 @@ int main(int argc, char **argv_orig, char **envp) {
if (fsrv->frida_mode) { FATAL("Multiple -O options not supported"); }
- fsrv->frida_mode = 1;
+ fsrv->frida_mode = true;
break;
@@ -907,21 +935,21 @@ int main(int argc, char **argv_orig, char **envp) {
if (fsrv->qemu_mode) { FATAL("Multiple -Q options not supported"); }
- fsrv->qemu_mode = 1;
+ fsrv->qemu_mode = true;
break;
case 'U':
if (unicorn_mode) { FATAL("Multiple -U options not supported"); }
- unicorn_mode = 1;
+ unicorn_mode = true;
break;
case 'W': /* Wine+QEMU mode */
if (use_wine) { FATAL("Multiple -W options not supported"); }
- fsrv->qemu_mode = 1;
- use_wine = 1;
+ fsrv->qemu_mode = true;
+ use_wine = true;
break;
@@ -930,20 +958,20 @@ int main(int argc, char **argv_orig, char **envp) {
/* Secret undocumented mode. Writes output in raw binary format
similar to that dumped by afl-fuzz in <out_dir/queue/fuzz_bitmap. */
- binary_mode = 1;
+ binary_mode = true;
break;
case 'c':
if (keep_cores) { FATAL("Multiple -c options not supported"); }
- keep_cores = 1;
+ keep_cores = true;
break;
case 'r':
if (raw_instr_output) { FATAL("Multiple -r options not supported"); }
if (edges_only) { FATAL("-e and -r are mutually exclusive"); }
- raw_instr_output = 1;
+ raw_instr_output = true;
break;
case 'h':
@@ -1053,7 +1081,7 @@ int main(int argc, char **argv_orig, char **envp) {
/* initialize cmplog_mode */
shm_fuzz->cmplog_mode = 0;
u8 *map = afl_shm_init(shm_fuzz, MAX_FILE + sizeof(u32), 1);
- shm_fuzz->shmemfuzz_mode = 1;
+ shm_fuzz->shmemfuzz_mode = true;
if (!map) { FATAL("BUG: Zero return from afl_shm_init."); }
#ifdef USEMMAP
setenv(SHM_FUZZ_ENV_VAR, shm_fuzz->g_shm_file_path, 1);
@@ -1062,7 +1090,7 @@ int main(int argc, char **argv_orig, char **envp) {
setenv(SHM_FUZZ_ENV_VAR, shm_str, 1);
ck_free(shm_str);
#endif
- fsrv->support_shmem_fuzz = 1;
+ fsrv->support_shmem_fuzz = true;
fsrv->shmem_fuzz_len = (u32 *)map;
fsrv->shmem_fuzz = map + sizeof(u32);
@@ -1079,6 +1107,9 @@ int main(int argc, char **argv_orig, char **envp) {
: 0);
be_quiet = save_be_quiet;
+ fsrv->kill_signal =
+ parse_afl_kill_signal_env(getenv("AFL_KILL_SIGNAL"), SIGKILL);
+
if (new_map_size) {
// only reinitialize when it makes sense
@@ -1105,8 +1136,9 @@ int main(int argc, char **argv_orig, char **envp) {
if (in_dir) {
- DIR * dir_in, *dir_out = NULL;
- struct dirent *dir_ent;
+ DIR * dir_in, *dir_out = NULL;
+ struct dirent **file_list;
+
// int done = 0;
u8 infile[PATH_MAX], outfile[PATH_MAX];
u8 wait_for_gdb = 0;
@@ -1114,7 +1146,7 @@ int main(int argc, char **argv_orig, char **envp) {
struct stat statbuf;
#endif
- if (getenv("AFL_DEBUG_GDB")) wait_for_gdb = 1;
+ if (getenv("AFL_DEBUG_GDB")) wait_for_gdb = true;
fsrv->dev_null_fd = open("/dev/null", O_RDWR);
if (fsrv->dev_null_fd < 0) { PFATAL("Unable to open /dev/null"); }
@@ -1131,12 +1163,6 @@ int main(int argc, char **argv_orig, char **envp) {
ck_free(dn);
if (!be_quiet) ACTF("Reading from directory '%s'...", in_dir);
- if (!(dir_in = opendir(in_dir))) {
-
- PFATAL("cannot open directory %s", in_dir);
-
- }
-
if (!collect_coverage) {
if (!(dir_out = opendir(out_file))) {
@@ -1153,8 +1179,8 @@ int main(int argc, char **argv_orig, char **envp) {
if ((coverage_map = (u8 *)malloc(map_size)) == NULL)
FATAL("coult not grab memory");
- edges_only = 0;
- raw_instr_output = 1;
+ edges_only = false;
+ raw_instr_output = true;
}
@@ -1191,9 +1217,6 @@ int main(int argc, char **argv_orig, char **envp) {
}
- fsrv->kill_signal =
- parse_afl_kill_signal_env(getenv("AFL_KILL_SIGNAL"), SIGKILL);
-
if (getenv("AFL_CRASH_EXITCODE")) {
long exitcode = strtol(getenv("AFL_CRASH_EXITCODE"), NULL, 10);
@@ -1222,7 +1245,16 @@ int main(int argc, char **argv_orig, char **envp) {
if (fsrv->support_shmem_fuzz && !fsrv->use_shmem_fuzz)
shm_fuzz = deinit_shmem(fsrv, shm_fuzz);
- while ((dir_ent = readdir(dir_in))) {
+ int file_count = scandir(in_dir, &file_list, NULL, alphasort);
+ if (file_count < 0) {
+
+ PFATAL("Failed to read from input dir at %s\n", in_dir);
+
+ }
+
+ for (int i = 0; i < file_count; i++) {
+
+ struct dirent *dir_ent = file_list[i];
if (dir_ent->d_name[0] == '.') {
@@ -1269,9 +1301,11 @@ int main(int argc, char **argv_orig, char **envp) {
}
+ free(file_list);
+ file_list = NULL;
+
if (!quiet_mode) { OKF("Processed %llu input files.", fsrv->total_execs); }
- closedir(dir_in);
if (dir_out) { closedir(dir_out); }
if (collect_coverage) {