diff options
author | van Hauser <vh@thc.org> | 2022-10-24 20:01:36 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-10-24 20:01:36 +0200 |
commit | 02502c1a543b2150bec78fbac2f0fcf1f4cd7a5a (patch) | |
tree | 690fe65fc6663cbd80711f89882d67643210692d /src/afl-fuzz-state.c | |
parent | e9ecfed81dfd57f557a0e91d4f8ac106cfe867a2 (diff) | |
parent | 2cbe49c6eb9fa3514289a088e68c847949d9d4cc (diff) | |
download | afl++-02502c1a543b2150bec78fbac2f0fcf1f4cd7a5a.tar.gz |
Merge pull request #1563 from nbars/stable
Fix child reaping on fuzzer termination
Diffstat (limited to 'src/afl-fuzz-state.c')
-rw-r--r-- | src/afl-fuzz-state.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/src/afl-fuzz-state.c b/src/afl-fuzz-state.c index 5199f7e6..ae6cb6c7 100644 --- a/src/afl-fuzz-state.c +++ b/src/afl-fuzz-state.c @@ -23,6 +23,7 @@ */ +#include <signal.h> #include "afl-fuzz.h" #include "envs.h" @@ -484,10 +485,15 @@ void read_afl_environment(afl_state_t *afl, char **envp) { #endif } else if (!strncmp(env, "AFL_KILL_SIGNAL", + afl_environment_variable_len)) { + + afl->afl_env.afl_child_kill_signal = + (u8 *)get_afl_env(afl_environment_variables[i]); + } else if (!strncmp(env, "AFL_FORK_SERVER_KILL_SIGNAL", afl_environment_variable_len)) { - afl->afl_env.afl_kill_signal = + afl->afl_env.afl_fsrv_kill_signal = (u8 *)get_afl_env(afl_environment_variables[i]); } else if (!strncmp(env, "AFL_TARGET_ENV", @@ -653,9 +659,13 @@ void afl_states_stop(void) { }); LIST_FOREACH(&afl_states, afl_state_t, { - - if (el->fsrv.child_pid > 0) kill(el->fsrv.child_pid, el->fsrv.kill_signal); - if (el->fsrv.fsrv_pid > 0) kill(el->fsrv.fsrv_pid, el->fsrv.kill_signal); + /* NOTE: We need to make sure that the parent (the forkserver) reap the child (see below). */ + if (el->fsrv.child_pid > 0) kill(el->fsrv.child_pid, el->fsrv.child_kill_signal); + if (el->fsrv.fsrv_pid > 0) { + kill(el->fsrv.fsrv_pid, el->fsrv.fsrv_kill_signal); + /* Make sure the forkserver does not end up as zombie. */ + waitpid(el->fsrv.fsrv_pid, NULL, 0); + } }); @@ -672,4 +682,3 @@ void afl_states_request_skip(void) { LIST_FOREACH(&afl_states, afl_state_t, { el->skip_requested = 1; }); } - |