aboutsummaryrefslogtreecommitdiff
path: root/instrumentation
diff options
context:
space:
mode:
authorvan Hauser <vh@thc.org>2020-11-19 16:14:19 +0100
committervan Hauser <vh@thc.org>2020-11-19 16:14:19 +0100
commite32b7eeb83c0571a2bdaadfd5b7b769fec1405cc (patch)
tree474d91fe4f69f650f5604f7c417b8bdc0654169e /instrumentation
parentcd0a25be5e9b05a2ab6a11592cd95e7f653bf42d (diff)
downloadafl++-e32b7eeb83c0571a2bdaadfd5b7b769fec1405cc.tar.gz
fixed child not killed with -c
Diffstat (limited to 'instrumentation')
-rw-r--r--instrumentation/afl-compiler-rt.o.c22
1 files changed, 20 insertions, 2 deletions
diff --git a/instrumentation/afl-compiler-rt.o.c b/instrumentation/afl-compiler-rt.o.c
index 485f500c..b07aeb83 100644
--- a/instrumentation/afl-compiler-rt.o.c
+++ b/instrumentation/afl-compiler-rt.o.c
@@ -101,6 +101,11 @@ int __afl_sharedmem_fuzzing __attribute__((weak));
struct cmp_map *__afl_cmp_map;
+/* Child pid? */
+
+static s32 child_pid;
+static void (*old_sigterm_handler)(int) = 0;
+
/* Running in persistent mode? */
static u8 is_persistent;
@@ -109,6 +114,14 @@ static u8 is_persistent;
static u8 _is_sancov;
+/* ensure we kill the child on termination */
+
+void at_exit(int signal) {
+
+ if (child_pid > 0) { kill(child_pid, SIGKILL); }
+
+}
+
/* Uninspired gcc plugin instrumentation */
void __afl_trace(const u32 x) {
@@ -432,7 +445,6 @@ static void __afl_map_shm(void) {
static void __afl_start_snapshots(void) {
static u8 tmp[4] = {0, 0, 0, 0};
- s32 child_pid;
u32 status = 0;
u32 already_read_first = 0;
u32 was_killed;
@@ -579,6 +591,7 @@ static void __afl_start_snapshots(void) {
//(void)nice(-20); // does not seem to improve
signal(SIGCHLD, old_sigchld_handler);
+ signal(SIGTERM, old_sigterm_handler);
close(FORKSRV_FD);
close(FORKSRV_FD + 1);
@@ -633,6 +646,11 @@ static void __afl_start_snapshots(void) {
static void __afl_start_forkserver(void) {
+ struct sigaction orig_action;
+ sigaction(SIGTERM, NULL, &orig_action);
+ old_sigterm_handler = orig_action.sa_handler;
+ signal(SIGTERM, at_exit);
+
#ifdef __linux__
if (/*!is_persistent &&*/ !__afl_cmp_map && !getenv("AFL_NO_SNAPSHOT") &&
afl_snapshot_init() >= 0) {
@@ -645,7 +663,6 @@ static void __afl_start_forkserver(void) {
#endif
u8 tmp[4] = {0, 0, 0, 0};
- s32 child_pid;
u32 status = 0;
u32 already_read_first = 0;
u32 was_killed;
@@ -793,6 +810,7 @@ static void __afl_start_forkserver(void) {
//(void)nice(-20);
signal(SIGCHLD, old_sigchld_handler);
+ signal(SIGTERM, old_sigterm_handler);
close(FORKSRV_FD);
close(FORKSRV_FD + 1);