aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDominik Maier <domenukk@gmail.com>2020-03-30 00:50:04 +0200
committerDominik Maier <domenukk@gmail.com>2020-03-30 00:50:14 +0200
commitf4844e2c0c7a85a27b4adc6764dcb938470cebba (patch)
tree5796aa0fb75091579be89ac48fe364b553e31555 /src
parentef3a13fa63c24389073a03249afacaae6bd1b814 (diff)
downloadafl++-f4844e2c0c7a85a27b4adc6764dcb938470cebba.tar.gz
added read_timed
Diffstat (limited to 'src')
-rw-r--r--src/afl-forkserver.c24
-rw-r--r--src/afl-fuzz-cmplog.c67
-rw-r--r--src/afl-fuzz-redqueen.c5
-rw-r--r--src/afl-fuzz-run.c23
4 files changed, 42 insertions, 77 deletions
diff --git a/src/afl-forkserver.c b/src/afl-forkserver.c
index 2dd7a9f0..01a606c3 100644
--- a/src/afl-forkserver.c
+++ b/src/afl-forkserver.c
@@ -164,10 +164,9 @@ static void afl_fauxsrv_execv(afl_forkserver_t *fsrv, char **argv) {
void afl_fsrv_start(afl_forkserver_t *fsrv, char **argv) {
- struct timeval timeout;
- int st_pipe[2], ctl_pipe[2];
- int status;
- s32 rlen;
+ int st_pipe[2], ctl_pipe[2];
+ int status;
+ s32 rlen;
if (fsrv->use_fauxsrv) ACTF("Using Fauxserver:");
@@ -318,24 +317,15 @@ void afl_fsrv_start(afl_forkserver_t *fsrv, char **argv) {
rlen = 0;
if (fsrv->exec_tmout) {
- fd_set readfds;
+ rlen = 4;
+ u32 time = read_timed(fsrv->fsrv_st_fd, &status, rlen,
+ fsrv->exec_tmout * FORK_WAIT_MULT);
- FD_ZERO(&readfds);
- FD_SET(fsrv->fsrv_st_fd, &readfds);
- timeout.tv_sec = ((fsrv->exec_tmout * FORK_WAIT_MULT) / 1000);
- timeout.tv_usec = ((fsrv->exec_tmout * FORK_WAIT_MULT) % 1000) * 1000;
-
- int sret = select(fsrv->fsrv_st_fd + 1, &readfds, NULL, NULL, &timeout);
-
- if (sret == 0) {
+ if (!time) {
fsrv->child_timed_out = 1;
kill(fsrv->child_pid, SIGKILL);
- } else {
-
- rlen = read(fsrv->fsrv_st_fd, &status, 4);
-
}
} else {
diff --git a/src/afl-fuzz-cmplog.c b/src/afl-fuzz-cmplog.c
index 7c398507..08ac15c7 100644
--- a/src/afl-fuzz-cmplog.c
+++ b/src/afl-fuzz-cmplog.c
@@ -31,10 +31,9 @@
void init_cmplog_forkserver(afl_state_t *afl) {
- struct timeval timeout;
- int st_pipe[2], ctl_pipe[2];
- int status;
- s32 rlen;
+ int st_pipe[2], ctl_pipe[2];
+ int status;
+ s32 rlen;
ACTF("Spinning up the cmplog fork server...");
@@ -185,21 +184,19 @@ void init_cmplog_forkserver(afl_state_t *afl) {
rlen = 0;
if (afl->fsrv.exec_tmout) {
- fd_set readfds;
- FD_ZERO(&readfds);
- FD_SET(afl->cmplog_fsrv_st_fd, &readfds);
- timeout.tv_sec = ((afl->fsrv.exec_tmout * FORK_WAIT_MULT) / 1000);
- timeout.tv_usec = ((afl->fsrv.exec_tmout * FORK_WAIT_MULT) % 1000) * 1000;
+ rlen = 4;
+ u32 timeout_ms = afl->fsrv.exec_tmout * FORK_WAIT_MULT;
+ /* Reuse readfds as exceptfds to see when the child closed the pipe */
+ u32 time_ms = read_timed(afl->cmplog_fsrv_st_fd, &status, rlen, timeout_ms);
- int sret =
- select(afl->cmplog_fsrv_st_fd + 1, &readfds, NULL, NULL, &timeout);
+ if (!time_ms) {
- if (sret == 0) {
+ PFATAL("Error in timed read");
- kill(afl->cmplog_fsrv_pid, SIGKILL);
-
- } else {
+ } else if (time_ms > timeout_ms) {
+ afl->fsrv.child_timed_out = 1;
+ kill(afl->cmplog_fsrv_pid, SIGKILL);
rlen = read(afl->cmplog_fsrv_st_fd, &status, 4);
}
@@ -213,6 +210,11 @@ void init_cmplog_forkserver(afl_state_t *afl) {
/* If we have a four-byte "hello" message from the server, we're all set.
Otherwise, try to figure out what went wrong. */
+ if (afl->fsrv.child_timed_out)
+ FATAL(
+ "Timeout while initializing cmplog fork server (adjusting -t may "
+ "help)");
+
if (rlen == 4) {
OKF("All right - fork server is up.");
@@ -220,11 +222,6 @@ void init_cmplog_forkserver(afl_state_t *afl) {
}
- if (afl->fsrv.child_timed_out)
- FATAL(
- "Timeout while initializing cmplog fork server (adjusting -t may "
- "help)");
-
if (waitpid(afl->cmplog_fsrv_pid, &status, 0) <= 0)
PFATAL("waitpid() failed");
@@ -379,16 +376,12 @@ void init_cmplog_forkserver(afl_state_t *afl) {
u8 run_cmplog_target(afl_state_t *afl, u32 timeout) {
- struct timeval it;
- int status = 0;
- int sret;
- u64 exec_ms;
+ int status = 0;
+ u64 exec_ms;
u32 tb4;
s32 res;
- fd_set readfds;
-
afl->fsrv.child_timed_out = 0;
/* After this memset, afl->fsrv.trace_bits[] are effectively volatile, so we
@@ -423,18 +416,9 @@ u8 run_cmplog_target(afl_state_t *afl, u32 timeout) {
/* Configure timeout, as requested by user, then wait for child to terminate.
*/
+ u32 time_ms = read_timed(afl->cmplog_fsrv_st_fd, &status, 4, timeout);
- it.tv_sec = (timeout / 1000);
- it.tv_usec = (timeout % 1000) * 1000;
-
- FD_ZERO(&readfds);
- FD_SET(afl->cmplog_fsrv_st_fd, &readfds);
- it.tv_sec = ((timeout) / 1000);
- it.tv_usec = ((timeout) % 1000) * 1000;
-
- sret = select(afl->cmplog_fsrv_st_fd + 1, &readfds, NULL, NULL, &it);
-
- if (sret == 0) {
+ if (time_ms > timeout) {
/* If there was no response from forkserver after timeout seconds,
we kill the child. The forkserver should inform us afterwards */
@@ -442,9 +426,12 @@ u8 run_cmplog_target(afl_state_t *afl, u32 timeout) {
kill(afl->cmplog_child_pid, SIGKILL);
afl->fsrv.child_timed_out = 1;
+ /* After killing the child, the forkserver should tell us */
+ if (!read(afl->cmplog_fsrv_st_fd, &status, 4)) time_ms = 0;
+
}
- if ((res = read(afl->cmplog_fsrv_st_fd, &status, 4)) != 4) {
+ if (!time_ms) { // Something went wrong.
if (afl->stop_soon) return 0;
SAYF("\n" cLRD "[-] " cRST
@@ -467,12 +454,8 @@ u8 run_cmplog_target(afl_state_t *afl, u32 timeout) {
if (!WIFSTOPPED(status)) afl->cmplog_child_pid = 0;
- exec_ms = (u64)timeout - (it.tv_sec * 1000 + it.tv_usec / 1000);
if (afl->slowest_exec_ms < exec_ms) afl->slowest_exec_ms = exec_ms;
- it.tv_sec = 0;
- it.tv_usec = 0;
-
++afl->total_execs;
/* Any subsequent operations on afl->fsrv.trace_bits must not be moved by the
diff --git a/src/afl-fuzz-redqueen.c b/src/afl-fuzz-redqueen.c
index b069fa77..4acc204b 100644
--- a/src/afl-fuzz-redqueen.c
+++ b/src/afl-fuzz-redqueen.c
@@ -529,9 +529,10 @@ u8 input_to_state_stage(afl_state_t *afl, u8 *orig_buf, u8 *buf, u32 len,
if (!afl->shm.cmp_map->headers[k].hits) continue;
if (afl->shm.cmp_map->headers[k].type == CMP_TYPE_INS)
- afl->stage_max += MIN(afl->shm.cmp_map->headers[k].hits, CMP_MAP_H);
+ afl->stage_max += MIN((u32)afl->shm.cmp_map->headers[k].hits, CMP_MAP_H);
else
- afl->stage_max += MIN(afl->shm.cmp_map->headers[k].hits, CMP_MAP_RTN_H);
+ afl->stage_max +=
+ MIN((u32)afl->shm.cmp_map->headers[k].hits, CMP_MAP_RTN_H);
}
diff --git a/src/afl-fuzz-run.c b/src/afl-fuzz-run.c
index 90cb2ed5..f58e1a33 100644
--- a/src/afl-fuzz-run.c
+++ b/src/afl-fuzz-run.c
@@ -33,13 +33,10 @@
u8 run_target(afl_state_t *afl, u32 timeout) {
s32 res;
- int sret;
+ u32 time_ms;
- fd_set readfds;
-
- struct timeval it;
- int status = 0;
- u32 tb4;
+ int status = 0;
+ u32 tb4;
afl->fsrv.child_timed_out = 0;
@@ -70,26 +67,20 @@ u8 run_target(afl_state_t *afl, u32 timeout) {
if (afl->fsrv.child_pid <= 0) FATAL("Fork server is misbehaving (OOM?)");
- /* use select to monitor the forkserver for timeouts. */
-
- FD_ZERO(&readfds);
- FD_SET(afl->fsrv.fsrv_st_fd, &readfds);
- it.tv_sec = ((timeout) / 1000);
- it.tv_usec = ((timeout) % 1000) * 1000;
-
- sret = select(afl->fsrv.fsrv_st_fd + 1, &readfds, NULL, NULL, &it);
+ time_ms = read_timed(afl->fsrv.fsrv_st_fd, &status, 4, timeout);
- if (sret == 0) {
+ if (time_ms > timeout) {
/* If there was no response from forkserver after timeout seconds,
we kill the child. The forkserver should inform us afterwards */
kill(afl->fsrv.child_pid, SIGKILL);
afl->fsrv.child_timed_out = 1;
+ if (read(afl->fsrv.fsrv_st_fd, &status, 4) < 4) time_ms = 0;
}
- if ((res = read(afl->fsrv.fsrv_st_fd, &status, 4)) != 4) {
+ if (!time_ms) {
if (afl->stop_soon) return 0;
SAYF("\n" cLRD "[-] " cRST