diff options
Diffstat (limited to 'src/afl-analyze.c')
-rw-r--r-- | src/afl-analyze.c | 33 |
1 files changed, 30 insertions, 3 deletions
diff --git a/src/afl-analyze.c b/src/afl-analyze.c index b82e124d..0a9b4785 100644 --- a/src/afl-analyze.c +++ b/src/afl-analyze.c @@ -82,6 +82,8 @@ static u8 edges_only, /* Ignore hit counts? */ static volatile u8 stop_soon, /* Ctrl-C pressed? */ child_timed_out; /* Child timed out? */ +static u8 qemu_mode; + /* Constants used for describing byte behavior. */ #define RESP_NONE 0x00 /* Changing byte is a no-op. */ @@ -709,8 +711,33 @@ static void set_up_environment(void) { if (getenv("AFL_PRELOAD")) { - setenv("LD_PRELOAD", getenv("AFL_PRELOAD"), 1); - setenv("DYLD_INSERT_LIBRARIES", getenv("AFL_PRELOAD"), 1); + if (qemu_mode) { + + u8* qemu_preload = getenv("QEMU_SET_ENV"); + u8* afl_preload = getenv("AFL_PRELOAD"); + u8* buf; + + s32 i, afl_preload_size = strlen(afl_preload); + for (i = 0; i < afl_preload_size; ++i) { + if (afl_preload[i] == ',') + PFATAL("Comma (',') is not allowed in AFL_PRELOAD when -Q is specified!"); + } + + if (qemu_preload) + buf = alloc_printf("%s,LD_PRELOAD=%s", qemu_preload, afl_preload); + else + buf = alloc_printf("LD_PRELOAD=%s", afl_preload); + + setenv("QEMU_SET_ENV", buf, 1); + + ck_free(buf); + + } else { + + setenv("LD_PRELOAD", getenv("AFL_PRELOAD"), 1); + setenv("DYLD_INSERT_LIBRARIES", getenv("AFL_PRELOAD"), 1); + + } } @@ -835,7 +862,7 @@ static void find_binary(u8* fname) { int main(int argc, char** argv) { s32 opt; - u8 mem_limit_given = 0, timeout_given = 0, qemu_mode = 0, unicorn_mode = 0, + u8 mem_limit_given = 0, timeout_given = 0, unicorn_mode = 0, use_wine = 0; char** use_argv; |