mangle/input: simplify input selection by not trusting the speed factor that much
diff --git a/fuzz.c b/fuzz.c index 5db9706..5aac848 100644 --- a/fuzz.c +++ b/fuzz.c
@@ -126,6 +126,7 @@ .fd = -1, .timeExecUSecs = 1, .path = "[DYNAMIC-0-SIZE]", + .timedout = false, .data = (uint8_t*)"", }; dynfile_t* tmp_dynfile = run->dynfile;
diff --git a/honggfuzz.h b/honggfuzz.h index e0926fe..6aa98d2 100644 --- a/honggfuzz.h +++ b/honggfuzz.h
@@ -154,6 +154,7 @@ struct _dynfile_t* src; uint32_t refs; fuzzState_t phase; + bool timedout; uint8_t* data; TAILQ_ENTRY(_dynfile_t) pointers; };
diff --git a/input.c b/input.c index 5b76dc8..7aaca97 100644 --- a/input.c +++ b/input.c
@@ -380,7 +380,8 @@ if (run->dynfile->src) { ATOMIC_POST_INC(run->dynfile->src->refs); } - dynfile->phase = fuzz_getState(run->global); + dynfile->phase = fuzz_getState(run->global); + dynfile->timedout = run->tmOutSignaled; input_generateFileName(dynfile, NULL, dynfile->path); MX_SCOPED_RWLOCK_WRITE(&run->global->mutex.dynfileq); @@ -459,17 +460,20 @@ } } -static inline int input_skipFactor(run_t* run, dynfile_t* dynfile, int* speed_factor) { +static inline int input_skipFactor(run_t* run, dynfile_t* dynfile) { int penalty = 0; #if 1 - { - *speed_factor = HF_CAP(input_speedFactor(run, dynfile), -10, 5); - penalty += *speed_factor; + if (dynfile->timedout) { + penalty += 50; } #endif -#if 0 +#if 1 + penalty -= HF_CAP(input_speedFactor(run, dynfile), -10, 10); +#endif + +#if 1 { /* Inputs with lower total coverage -> lower chance of being tested */ static const int scaleMap[200] = { @@ -531,7 +535,6 @@ LOG_F("The dynamic file corpus is empty. This shouldn't happen"); } - int speed_factor = 0; for (;;) { MX_SCOPED_RWLOCK_WRITE(&run->global->mutex.dynfileq); @@ -547,7 +550,7 @@ run->current = run->global->io.dynfileqCurrent; run->global->io.dynfileqCurrent = TAILQ_NEXT(run->global->io.dynfileqCurrent, pointers); - int skip_factor = input_skipFactor(run, run->current, &speed_factor); + int skip_factor = input_skipFactor(run, run->current); if (skip_factor <= 0) { run->triesLeft = -(skip_factor); break; @@ -564,12 +567,13 @@ run->dynfile->src = run->current; run->dynfile->refs = 0; run->dynfile->phase = fuzz_getState(run->global); + run->dynfile->timedout = run->current->timedout; memcpy(run->dynfile->cov, run->current->cov, sizeof(run->dynfile->cov)); snprintf(run->dynfile->path, sizeof(run->dynfile->path), "%s", run->current->path); memcpy(run->dynfile->data, run->current->data, run->current->size); if (needs_mangle) { - mangle_mangleContent(run, speed_factor); + mangle_mangleContent(run); } return true; @@ -671,9 +675,11 @@ .fd = -1, .timeExecUSecs = 1, .path = "", + .timedout = false, .data = dynamicFile, }; tmp_run.timeStartedUSecs = util_timeNowUSecs() - 1; + tmp_run.tmOutSignaled = false; memcpy(tmp_dynfile.path, dynamicInputFileName, PATH_MAX); tmp_run.dynfile = &tmp_dynfile; input_addDynamicInput(&tmp_run); @@ -780,13 +786,14 @@ input_setSize(run, fileSz); util_memsetInline(run->dynfile->cov, '\0', sizeof(run->dynfile->cov)); - run->dynfile->idx = 0; - run->dynfile->src = NULL; - run->dynfile->refs = 0; - run->dynfile->phase = fuzz_getState(run->global); + run->dynfile->idx = 0; + run->dynfile->src = NULL; + run->dynfile->refs = 0; + run->dynfile->phase = fuzz_getState(run->global); + run->dynfile->timedout = false; if (needs_mangle) { - mangle_mangleContent(run, /* slow_factor= */ 0); + mangle_mangleContent(run); } return true;
diff --git a/mangle.c b/mangle.c index 5f63d8b..40efd60 100644 --- a/mangle.c +++ b/mangle.c
@@ -842,7 +842,7 @@ } } -void mangle_mangleContent(run_t* run, int speed_factor) { +void mangle_mangleContent(run_t* run) { static void (*const mangleFuncs[])(run_t* run, bool printable) = { mangle_Shrink, mangle_Expand, @@ -873,16 +873,7 @@ mangle_Resize(run, /* printable= */ run->global->cfg.only_printable); } - uint64_t changesCnt = run->global->mutate.mutationsPerRun; - - if (speed_factor < 5) { - changesCnt = util_rndGet(1, run->global->mutate.mutationsPerRun); - } else if (speed_factor < 10) { - changesCnt = run->global->mutate.mutationsPerRun; - } else { - changesCnt = HF_MIN(speed_factor, 10); - changesCnt = HF_MAX(changesCnt, (run->global->mutate.mutationsPerRun * 5)); - } + const uint64_t changesCnt = util_rndGet(1, run->global->mutate.mutationsPerRun); /* If last coverage acquisition was more than 5 secs ago, use splicing more frequently */ if ((time(NULL) - ATOMIC_GET(run->global->timing.lastCovUpdate)) > 5) {
diff --git a/mangle.h b/mangle.h index f8f3988..e38f339 100644 --- a/mangle.h +++ b/mangle.h
@@ -26,6 +26,6 @@ #include "honggfuzz.h" -extern void mangle_mangleContent(run_t* run, int speed_factor); +extern void mangle_mangleContent(run_t* run); #endif