diff options
author | van Hauser <vh@thc.org> | 2020-12-11 11:38:22 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-12-11 11:38:22 +0100 |
commit | 12d62d539353517abee8069df6e591f4fc474e93 (patch) | |
tree | c7ec08c39d3153ab3de1602fbda0739dd32dd37e /utils/defork/defork.c | |
parent | 3997d06cbd09e12cd0367170b3e2698ee71dd8cf (diff) | |
parent | d5ded820e5b610f330cf23f53c21c169032a725a (diff) | |
download | afl++-12d62d539353517abee8069df6e591f4fc474e93.tar.gz |
Merge pull request #617 from AFLplusplus/dev
push to stable
Diffstat (limited to 'utils/defork/defork.c')
-rw-r--r-- | utils/defork/defork.c | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/utils/defork/defork.c b/utils/defork/defork.c new file mode 100644 index 00000000..f71d1124 --- /dev/null +++ b/utils/defork/defork.c @@ -0,0 +1,50 @@ +#define __GNU_SOURCE +#include <dlfcn.h> +#include <unistd.h> +#include <stdio.h> +#include <stdbool.h> + +#include "../../include/config.h" + +/* we want to fork once (for the afl++ forkserver), + then immediately return as child on subsequent forks. */ +static bool forked = 0; + +pid_t (*original_fork)(void); + +/* In case we are not running in afl, we use a dummy original_fork */ +static pid_t nop(void) { + + return 0; + +} + +__attribute__((constructor)) void preeny_fork_orig() { + + if (getenv(SHM_ENV_VAR)) { + + printf("defork: running in AFL++. Allowing forkserver.\n"); + original_fork = dlsym(RTLD_NEXT, "socket"); + + } else { + + printf("defork: no AFL++ detected. Disabling fork from the start.\n"); + original_fork = &nop; + + } + +} + +pid_t fork(void) { + + /* If we forked before, or if we're in the child (pid==0), + we don't want to fork anymore, else, we are still in the forkserver. + The forkserver parent needs to fork infinite times, each child should never + fork again. This can be written without branches and I hate myself for it. + */ + pid_t ret = !forked && original_fork(); + forked = !ret; + return ret; + +} + |