aboutsummaryrefslogtreecommitdiff
path: root/src/afl-forkserver.c
diff options
context:
space:
mode:
authorvan Hauser <vh@thc.org>2020-12-01 13:13:11 +0100
committervan Hauser <vh@thc.org>2020-12-01 13:13:11 +0100
commit8584f9d2b5de9687c518c672e471f4f8cd9166fa (patch)
tree568533382f57e7d631962b94fb5d1742c0377112 /src/afl-forkserver.c
parentf7d8643dc4531a9aa8849d4acf2a96b0d8ae5c3c (diff)
downloadafl++-8584f9d2b5de9687c518c672e471f4f8cd9166fa.tar.gz
added AFL_NO_AUTODICT
Diffstat (limited to 'src/afl-forkserver.c')
-rw-r--r--src/afl-forkserver.c125
1 files changed, 67 insertions, 58 deletions
diff --git a/src/afl-forkserver.c b/src/afl-forkserver.c
index 3814a77e..01ef1d9e 100644
--- a/src/afl-forkserver.c
+++ b/src/afl-forkserver.c
@@ -348,9 +348,10 @@ static void report_error_and_exit(int error) {
void afl_fsrv_start(afl_forkserver_t *fsrv, char **argv,
volatile u8 *stop_soon_p, u8 debug_child_output) {
- int st_pipe[2], ctl_pipe[2];
- s32 status;
- s32 rlen;
+ int st_pipe[2], ctl_pipe[2];
+ s32 status;
+ s32 rlen;
+ char *ignore_autodict = getenv("AFL_NO_AUTODICT");
if (!be_quiet) { ACTF("Spinning up the fork server..."); }
@@ -607,7 +608,7 @@ void afl_fsrv_start(afl_forkserver_t *fsrv, char **argv,
fsrv->use_shmem_fuzz = 1;
if (!be_quiet) { ACTF("Using SHARED MEMORY FUZZING feature."); }
- if ((status & FS_OPT_AUTODICT) == 0) {
+ if ((status & FS_OPT_AUTODICT) == 0 || ignore_autodict) {
u32 send_status = (FS_OPT_ENABLED | FS_OPT_SHDMEM_FUZZ);
if (write(fsrv->fsrv_ctl_fd, &send_status, 4) != 4) {
@@ -660,101 +661,109 @@ void afl_fsrv_start(afl_forkserver_t *fsrv, char **argv,
if ((status & FS_OPT_AUTODICT) == FS_OPT_AUTODICT) {
- if (fsrv->add_extra_func == NULL || fsrv->afl_ptr == NULL) {
+ if (ignore_autodict) {
- // this is not afl-fuzz - or it is cmplog - we deny and return
- if (fsrv->use_shmem_fuzz) {
+ if (!be_quiet) { WARNF("Ignoring offered AUTODICT feature."); }
- status = (FS_OPT_ENABLED | FS_OPT_SHDMEM_FUZZ);
+ } else {
- } else {
+ if (fsrv->add_extra_func == NULL || fsrv->afl_ptr == NULL) {
- status = (FS_OPT_ENABLED);
+ // this is not afl-fuzz - or it is cmplog - we deny and return
+ if (fsrv->use_shmem_fuzz) {
- }
+ status = (FS_OPT_ENABLED | FS_OPT_SHDMEM_FUZZ);
- if (write(fsrv->fsrv_ctl_fd, &status, 4) != 4) {
+ } else {
- FATAL("Writing to forkserver failed.");
+ status = (FS_OPT_ENABLED);
- }
+ }
- return;
+ if (write(fsrv->fsrv_ctl_fd, &status, 4) != 4) {
- }
+ FATAL("Writing to forkserver failed.");
- if (!be_quiet) { ACTF("Using AUTODICT feature."); }
+ }
- if (fsrv->use_shmem_fuzz) {
+ return;
- status = (FS_OPT_ENABLED | FS_OPT_AUTODICT | FS_OPT_SHDMEM_FUZZ);
+ }
- } else {
+ if (!be_quiet) { ACTF("Using AUTODICT feature."); }
- status = (FS_OPT_ENABLED | FS_OPT_AUTODICT);
+ if (fsrv->use_shmem_fuzz) {
- }
+ status = (FS_OPT_ENABLED | FS_OPT_AUTODICT | FS_OPT_SHDMEM_FUZZ);
- if (write(fsrv->fsrv_ctl_fd, &status, 4) != 4) {
+ } else {
- FATAL("Writing to forkserver failed.");
+ status = (FS_OPT_ENABLED | FS_OPT_AUTODICT);
- }
+ }
- if (read(fsrv->fsrv_st_fd, &status, 4) != 4) {
+ if (write(fsrv->fsrv_ctl_fd, &status, 4) != 4) {
- FATAL("Reading from forkserver failed.");
+ FATAL("Writing to forkserver failed.");
- }
+ }
- if (status < 2 || (u32)status > 0xffffff) {
+ if (read(fsrv->fsrv_st_fd, &status, 4) != 4) {
- FATAL("Dictionary has an illegal size: %d", status);
+ FATAL("Reading from forkserver failed.");
- }
+ }
- u32 offset = 0, count = 0;
- u32 len = status;
- u8 *dict = ck_alloc(len);
- if (dict == NULL) {
+ if (status < 2 || (u32)status > 0xffffff) {
- FATAL("Could not allocate %u bytes of autodictionary memory", len);
+ FATAL("Dictionary has an illegal size: %d", status);
- }
+ }
- while (len != 0) {
+ u32 offset = 0, count = 0;
+ u32 len = status;
+ u8 *dict = ck_alloc(len);
+ if (dict == NULL) {
- rlen = read(fsrv->fsrv_st_fd, dict + offset, len);
- if (rlen > 0) {
+ FATAL("Could not allocate %u bytes of autodictionary memory", len);
- len -= rlen;
- offset += rlen;
+ }
- } else {
+ while (len != 0) {
- FATAL(
- "Reading autodictionary fail at position %u with %u bytes "
- "left.",
- offset, len);
+ rlen = read(fsrv->fsrv_st_fd, dict + offset, len);
+ if (rlen > 0) {
+
+ len -= rlen;
+ offset += rlen;
+
+ } else {
+
+ FATAL(
+ "Reading autodictionary fail at position %u with %u bytes "
+ "left.",
+ offset, len);
+
+ }
}
- }
+ offset = 0;
+ while (offset < (u32)status &&
+ (u8)dict[offset] + offset < (u32)status) {
+
+ fsrv->add_extra_func(fsrv->afl_ptr, dict + offset + 1,
+ (u8)dict[offset]);
+ offset += (1 + dict[offset]);
+ count++;
- offset = 0;
- while (offset < (u32)status &&
- (u8)dict[offset] + offset < (u32)status) {
+ }
- fsrv->add_extra_func(fsrv->afl_ptr, dict + offset + 1,
- (u8)dict[offset]);
- offset += (1 + dict[offset]);
- count++;
+ if (!be_quiet) { ACTF("Loaded %u autodictionary entries", count); }
+ ck_free(dict);
}
- if (!be_quiet) { ACTF("Loaded %u autodictionary entries", count); }
- ck_free(dict);
-
}
}