aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/afl-as.h4
-rw-r--r--include/afl-fuzz.h111
-rw-r--r--[-rwxr-xr-x]include/android-ashmem.h0
-rw-r--r--include/common.h324
-rw-r--r--include/debug.h4
-rw-r--r--include/forkserver.h3
6 files changed, 404 insertions, 42 deletions
diff --git a/include/afl-as.h b/include/afl-as.h
index 7fc00ffe..a2bf1f9c 100644
--- a/include/afl-as.h
+++ b/include/afl-as.h
@@ -152,7 +152,7 @@ static const u8 *trampoline_fmt_64 =
"/* --- END --- */\n"
"\n";
-static const u8*main_payload_32 =
+static const u8 *main_payload_32 =
"\n"
"/* --- AFL MAIN PAYLOAD (32-BIT) --- */\n"
@@ -409,7 +409,7 @@ static const u8*main_payload_32 =
#define CALL_L64(str) "call " str "@PLT\n"
#endif /* ^__APPLE__ */
-static const u8* main_payload_64 =
+static const u8 *main_payload_64 =
"\n"
"/* --- AFL MAIN PAYLOAD (64-BIT) --- */\n"
diff --git a/include/afl-fuzz.h b/include/afl-fuzz.h
index 620f5062..7dddefb0 100644
--- a/include/afl-fuzz.h
+++ b/include/afl-fuzz.h
@@ -109,6 +109,8 @@
#define CASE_PREFIX "id_"
#endif /* ^!SIMPLE_FILES */
+#define STAGE_BUF_SIZE (64) /* usable size for stage name buf in afl_state */
+
extern s8 interesting_8[INTERESTING_8_LEN];
extern s16 interesting_16[INTERESTING_8_LEN + INTERESTING_16_LEN];
extern s32
@@ -231,6 +233,7 @@ enum {
/* 04 */ QUAD, /* Quadratic schedule */
/* 05 */ EXPLOIT, /* AFL's exploitation-based const. */
/* 06 */ MMOPT, /* Modified MOPT schedule */
+ /* 07 */ RARE, /* Rare edges */
POWER_SCHEDULES_NUM
@@ -278,10 +281,20 @@ enum {
/* 07 */ PY_FUNC_HAVOC_MUTATION_PROBABILITY,
/* 08 */ PY_FUNC_QUEUE_GET,
/* 09 */ PY_FUNC_QUEUE_NEW_ENTRY,
+ /* 10 */ PY_FUNC_DEINIT,
PY_FUNC_COUNT
};
+typedef struct py_mutator {
+
+ PyObject *py_module;
+ PyObject *py_functions[PY_FUNC_COUNT];
+ void *afl_state;
+ void *py_data;
+
+} py_mutator_t;
+
#endif
typedef struct MOpt_globals {
@@ -479,7 +492,7 @@ typedef struct afl_state {
*stage_short, /* Short stage name */
*syncing_party; /* Currently syncing with... */
- u8 stage_name_buf64[64]; /* A name buf with len 64 if needed */
+ u8 stage_name_buf[STAGE_BUF_SIZE]; /* reused stagename buf with len 64 */
s32 stage_cur, stage_max; /* Stage progression */
s32 splicing_with; /* Splicing with which test case? */
@@ -537,24 +550,36 @@ typedef struct afl_state {
/* Custom mutators */
struct custom_mutator *mutator;
+#ifdef USE_PYTHON
+ struct custom_mutator *py_mutator;
+#endif
/* cmplog forkserver ids */
s32 cmplog_fsrv_ctl_fd, cmplog_fsrv_st_fd;
+ u32 cmplog_prev_timed_out;
u8 describe_op_buf_256[256]; /* describe_op will use this to return a string
up to 256 */
-#ifdef USE_PYTHON
- /* Python Mutators */
- PyObject *py_module;
- PyObject *py_functions[PY_FUNC_COUNT];
-#endif
-
#ifdef _AFL_DOCUMENT_MUTATIONS
u8 do_document;
u32 document_counter;
#endif
+ /* statis file */
+ double last_bitmap_cvg, last_stability, last_eps;
+
+ /* plot file saves from last run */
+ u32 plot_prev_qp, plot_prev_pf, plot_prev_pnf, plot_prev_ce, plot_prev_md;
+ u64 plot_prev_qc, plot_prev_uc, plot_prev_uh;
+
+ u64 stats_last_stats_ms, stats_last_plot_ms, stats_last_ms, stats_last_execs;
+ double stats_avg_exec;
+
+ u8 clean_trace[MAP_SIZE];
+ u8 clean_trace_custom[MAP_SIZE];
+ u8 first_trace[MAP_SIZE];
+
} afl_state_t;
/* A global pointer to all instances is needed (for now) for signals to arrive
@@ -567,22 +592,25 @@ struct custom_mutator {
const char *name;
void * dh;
+ void *data; /* custom mutator data ptr */
+
/* hooks for the custom mutator function */
/**
* Initialize the custom mutator.
*
- * (Optional)
- *
+ * @param afl AFL instance.
* @param seed Seed used for the mutation.
+ * @return pointer to internal data or NULL on error
*/
- void (*afl_custom_init)(afl_state_t *afl, unsigned int seed);
+ void *(*afl_custom_init)(afl_state_t *afl, unsigned int seed);
/**
* Perform custom mutations on a given input
*
* (Optional for now. Required in the future)
*
+ * @param data pointer returned in afl_custom_init for this fuzz case
* @param[inout] buf Pointer to the input data to be mutated and the mutated
* output
* @param[in] buf_size Size of the input/output data
@@ -592,7 +620,7 @@ struct custom_mutator {
* not produce data larger than max_size.
* @return Size of the mutated output.
*/
- size_t (*afl_custom_fuzz)(afl_state_t *afl, u8 **buf, size_t buf_size,
+ size_t (*afl_custom_fuzz)(void *data, u8 **buf, size_t buf_size,
u8 *add_buf, size_t add_buf_size, size_t max_size);
/**
@@ -602,6 +630,7 @@ struct custom_mutator {
* (Optional) If this functionality is not needed, simply don't define this
* function.
*
+ * @param[in] data pointer returned in afl_custom_init for this fuzz case
* @param[in] buf Buffer containing the test case to be executed
* @param[in] buf_size Size of the test case
* @param[out] out_buf Pointer to the buffer of storing the test case after
@@ -609,7 +638,7 @@ struct custom_mutator {
* will release the memory after saving the test case.
* @return Size of the output buffer after processing
*/
- size_t (*afl_custom_pre_save)(afl_state_t *afl, u8 *buf, size_t buf_size,
+ size_t (*afl_custom_pre_save)(void *data, u8 *buf, size_t buf_size,
u8 **out_buf);
/**
@@ -628,11 +657,12 @@ struct custom_mutator {
*
* (Optional)
*
+ * @param data pointer returned in afl_custom_init for this fuzz case
* @param buf Buffer containing the test case
* @param buf_size Size of the test case
* @return The amount of possible iteration steps to trim the input
*/
- u32 (*afl_custom_init_trim)(afl_state_t *afl, u8 *buf, size_t buf_size);
+ u32 (*afl_custom_init_trim)(void *data, u8 *buf, size_t buf_size);
/**
* This method is called for each trimming operation. It doesn't have any
@@ -645,12 +675,13 @@ struct custom_mutator {
*
* (Optional)
*
+ * @param data pointer returned in afl_custom_init for this fuzz case
* @param[out] out_buf Pointer to the buffer containing the trimmed test case.
* External library should allocate memory for out_buf. AFL++ will release
* the memory after saving the test case.
* @param[out] out_buf_size Pointer to the size of the trimmed test case
*/
- void (*afl_custom_trim)(afl_state_t *afl, u8 **out_buf, size_t *out_buf_size);
+ void (*afl_custom_trim)(void *data, u8 **out_buf, size_t *out_buf_size);
/**
* This method is called after each trim operation to inform you if your
@@ -659,11 +690,12 @@ struct custom_mutator {
*
* (Optional)
*
+ * @param data pointer returned in afl_custom_init for this fuzz case
* @param success Indicates if the last trim operation was successful.
* @return The next trim iteration index (from 0 to the maximum amount of
* steps returned in init_trim)
*/
- u32 (*afl_custom_post_trim)(afl_state_t *afl, u8 success);
+ u32 (*afl_custom_post_trim)(void *data, u8 success);
/**
* Perform a single custom mutation on a given input.
@@ -671,6 +703,7 @@ struct custom_mutator {
*
* (Optional)
*
+ * @param data pointer returned in afl_custom_init for this fuzz case
* @param[inout] buf Pointer to the input data to be mutated and the mutated
* output
* @param[in] buf_size Size of input data
@@ -678,7 +711,7 @@ struct custom_mutator {
* not produce data larger than max_size.
* @return Size of the mutated output.
*/
- size_t (*afl_custom_havoc_mutation)(afl_state_t *afl, u8 **buf,
+ size_t (*afl_custom_havoc_mutation)(void *data, u8 **buf,
size_t buf_size, size_t max_size);
/**
@@ -687,20 +720,22 @@ struct custom_mutator {
*
* (Optional)
*
+ * @param data pointer returned in afl_custom_init for this fuzz case
* @return The probability (0-100).
*/
- u8 (*afl_custom_havoc_mutation_probability)(afl_state_t *afl);
+ u8 (*afl_custom_havoc_mutation_probability)(void *data);
/**
* Determine whether the fuzzer should fuzz the current queue entry or not.
*
* (Optional)
*
+ * @param data pointer returned in afl_custom_init for this fuzz case
* @param filename File name of the test case in the queue entry
* @return Return True(1) if the fuzzer will fuzz the queue entry, and
* False(0) otherwise.
*/
- u8 (*afl_custom_queue_get)(afl_state_t *afl, const u8 *filename);
+ u8 (*afl_custom_queue_get)(void *data, const u8 *filename);
/**
* Allow for additional analysis (e.g. calling a different tool that does a
@@ -708,13 +743,20 @@ struct custom_mutator {
*
* (Optional)
*
+ * @param data pointer returned in afl_custom_init for this fuzz case
* @param filename_new_queue File name of the new queue entry
* @param filename_orig_queue File name of the original queue entry. This
* argument can be NULL while initializing the fuzzer
*/
- void (*afl_custom_queue_new_entry)(afl_state_t *afl,
+ void (*afl_custom_queue_new_entry)(void *data,
const u8 * filename_new_queue,
const u8 * filename_orig_queue);
+ /**
+ * Deinitialize the custom mutator.
+ *
+ * @param data pointer returned in afl_custom_init for this fuzz case
+ */
+ void (*afl_custom_deinit)(void *data);
};
@@ -732,19 +774,17 @@ u8 trim_case_custom(afl_state_t *, struct queue_entry *q, u8 *in_buf);
/* Python */
#ifdef USE_PYTHON
-int init_py_module(afl_state_t *, u8 *);
-void finalize_py_module(afl_state_t *);
+void finalize_py_module(void *);
-void init_py(afl_state_t *, unsigned int);
-size_t fuzz_py(afl_state_t *, u8 **, size_t, u8 *, size_t, size_t);
-size_t pre_save_py(afl_state_t *, u8 *, size_t, u8 **);
-u32 init_trim_py(afl_state_t *, u8 *, size_t);
-u32 post_trim_py(afl_state_t *, u8);
-void trim_py(afl_state_t *, u8 **, size_t *);
-size_t havoc_mutation_py(afl_state_t *, u8 **, size_t, size_t);
-u8 havoc_mutation_probability_py(afl_state_t *);
-u8 queue_get_py(afl_state_t *, const u8 *);
-void queue_new_entry_py(afl_state_t *, const u8 *, const u8 *);
+size_t pre_save_py(void *, u8 *, size_t, u8 **);
+u32 init_trim_py(void *, u8 *, size_t);
+u32 post_trim_py(void *, u8);
+void trim_py(void *, u8 **, size_t *);
+size_t havoc_mutation_py(void *, u8 **, size_t, size_t);
+u8 havoc_mutation_probability_py(void *);
+u8 queue_get_py(void *, const u8 *);
+void queue_new_entry_py(void *, const u8 *, const u8 *);
+void deinit_py(void *);
#endif
@@ -781,13 +821,6 @@ u8 *describe_op(afl_state_t *, u8);
u8 save_if_interesting(afl_state_t *, void *, u32, u8);
u8 has_new_bits(afl_state_t *, u8 *);
-/* Misc */
-
-u8 *DI(u64);
-u8 *DF(double);
-u8 *DMS(u64);
-u8 *DTD(u64, u64);
-
/* Extras */
void load_extras_file(afl_state_t *, u8 *, u32 *, u32 *, u32);
@@ -862,7 +895,7 @@ u8 input_to_state_stage(afl_state_t *afl, u8 *orig_buf, u8 *buf, u32 len,
/* Generate a random number (from 0 to limit - 1). This may
have slight bias. */
-static inline u32 UR(afl_state_t *afl, u32 limit) {
+static inline u32 rand_below(afl_state_t *afl, u32 limit) {
#ifdef HAVE_ARC4RANDOM
if (afl->fixed_seed) { return random() % limit; }
diff --git a/include/android-ashmem.h b/include/android-ashmem.h
index 3a0b9969..3a0b9969 100755..100644
--- a/include/android-ashmem.h
+++ b/include/android-ashmem.h
diff --git a/include/common.h b/include/common.h
index 28c11049..97076004 100644
--- a/include/common.h
+++ b/include/common.h
@@ -27,10 +27,16 @@
#ifndef __AFLCOMMON_H
#define __AFLCOMMON_H
+#include <stdio.h>
+#include <string.h>
#include <sys/time.h>
#include "types.h"
#include "stdbool.h"
+/* STRINGIFY_VAL_SIZE_MAX will fit all stringify_ strings. */
+
+#define STRINGIFY_VAL_SIZE_MAX (16)
+
void detect_file_args(char **argv, u8 *prog_in, u8 *use_stdin);
void check_environment_vars(char **env);
@@ -67,5 +73,323 @@ static u64 get_cur_time_us(void) {
}
+/* Describe integer. The buf should be
+ at least 6 bytes to fit all ints we randomly see.
+ Will return buf for convenience. */
+
+static u8 *stringify_int(u8 *buf, size_t len, u64 val) {
+
+#define CHK_FORMAT(_divisor, _limit_mult, _fmt, _cast) \
+ do { \
+ \
+ if (val < (_divisor) * (_limit_mult)) { \
+ \
+ snprintf(buf, len, _fmt, ((_cast)val) / (_divisor)); \
+ return buf; \
+ \
+ } \
+ \
+ } while (0)
+
+ /* 0-9999 */
+ CHK_FORMAT(1, 10000, "%llu", u64);
+
+ /* 10.0k - 99.9k */
+ CHK_FORMAT(1000, 99.95, "%0.01fk", double);
+
+ /* 100k - 999k */
+ CHK_FORMAT(1000, 1000, "%lluk", u64);
+
+ /* 1.00M - 9.99M */
+ CHK_FORMAT(1000 * 1000, 9.995, "%0.02fM", double);
+
+ /* 10.0M - 99.9M */
+ CHK_FORMAT(1000 * 1000, 99.95, "%0.01fM", double);
+
+ /* 100M - 999M */
+ CHK_FORMAT(1000 * 1000, 1000, "%lluM", u64);
+
+ /* 1.00G - 9.99G */
+ CHK_FORMAT(1000LL * 1000 * 1000, 9.995, "%0.02fG", double);
+
+ /* 10.0G - 99.9G */
+ CHK_FORMAT(1000LL * 1000 * 1000, 99.95, "%0.01fG", double);
+
+ /* 100G - 999G */
+ CHK_FORMAT(1000LL * 1000 * 1000, 1000, "%lluG", u64);
+
+ /* 1.00T - 9.99G */
+ CHK_FORMAT(1000LL * 1000 * 1000 * 1000, 9.995, "%0.02fT", double);
+
+ /* 10.0T - 99.9T */
+ CHK_FORMAT(1000LL * 1000 * 1000 * 1000, 99.95, "%0.01fT", double);
+
+ /* 100T+ */
+ strncpy(buf, "infty", len);
+ buf[len - 1] = '\0';
+
+ return buf;
+
+}
+
+/* Describe float. Similar as int. */
+
+static u8 *stringify_float(u8 *buf, size_t len, double val) {
+
+ if (val < 99.995) {
+
+ snprintf(buf, len, "%0.02f", val);
+
+ } else if (val < 999.95) {
+
+ snprintf(buf, len, "%0.01f", val);
+
+ } else {
+
+ stringify_int(buf, len, (u64)val);
+
+ }
+
+ return buf;
+
+}
+
+/* Describe integer as memory size. */
+
+static u8 *stringify_mem_size(u8 *buf, size_t len, u64 val) {
+
+ /* 0-9999 */
+ CHK_FORMAT(1, 10000, "%llu B", u64);
+
+ /* 10.0k - 99.9k */
+ CHK_FORMAT(1024, 99.95, "%0.01f kB", double);
+
+ /* 100k - 999k */
+ CHK_FORMAT(1024, 1000, "%llu kB", u64);
+
+ /* 1.00M - 9.99M */
+ CHK_FORMAT(1024 * 1024, 9.995, "%0.02f MB", double);
+
+ /* 10.0M - 99.9M */
+ CHK_FORMAT(1024 * 1024, 99.95, "%0.01f MB", double);
+
+ /* 100M - 999M */
+ CHK_FORMAT(1024 * 1024, 1000, "%llu MB", u64);
+
+ /* 1.00G - 9.99G */
+ CHK_FORMAT(1024LL * 1024 * 1024, 9.995, "%0.02f GB", double);
+
+ /* 10.0G - 99.9G */
+ CHK_FORMAT(1024LL * 1024 * 1024, 99.95, "%0.01f GB", double);
+
+ /* 100G - 999G */
+ CHK_FORMAT(1024LL * 1024 * 1024, 1000, "%llu GB", u64);
+
+ /* 1.00T - 9.99G */
+ CHK_FORMAT(1024LL * 1024 * 1024 * 1024, 9.995, "%0.02f TB", double);
+
+ /* 10.0T - 99.9T */
+ CHK_FORMAT(1024LL * 1024 * 1024 * 1024, 99.95, "%0.01f TB", double);
+
+#undef CHK_FORMAT
+
+ /* 100T+ */
+ strncpy(buf, "infty", len - 1);
+ buf[len - 1] = '\0';
+
+ return buf;
+
+}
+
+/* Describe time delta as string.
+ Returns a pointer to buf for convenience. */
+
+static u8 *stringify_time_diff(u8 *buf, size_t len, u64 cur_ms, u64 event_ms) {
+
+ u64 delta;
+ s32 t_d, t_h, t_m, t_s;
+ u8 val_buf[STRINGIFY_VAL_SIZE_MAX];
+
+ if (!event_ms) {
+
+ snprintf(buf, len, "none seen yet");
+
+ } else {
+
+ delta = cur_ms - event_ms;
+
+ t_d = delta / 1000 / 60 / 60 / 24;
+ t_h = (delta / 1000 / 60 / 60) % 24;
+ t_m = (delta / 1000 / 60) % 60;
+ t_s = (delta / 1000) % 60;
+
+ stringify_int(val_buf, sizeof(val_buf), t_d);
+ snprintf(buf, len, "%s days, %d hrs, %d min, %d sec", val_buf, t_h, t_m,
+ t_s);
+
+ }
+
+ return buf;
+
+}
+
+
+/* Unsafe Describe integer. The buf sizes are not checked.
+ This is unsafe but fast.
+ Will return buf for convenience. */
+
+static u8 *u_stringify_int(u8 *buf, u64 val) {
+
+#define CHK_FORMAT(_divisor, _limit_mult, _fmt, _cast) \
+ do { \
+ \
+ if (val < (_divisor) * (_limit_mult)) { \
+ \
+ sprintf(buf, _fmt, ((_cast)val) / (_divisor)); \
+ return buf; \
+ \
+ } \
+ \
+ } while (0)
+
+ /* 0-9999 */
+ CHK_FORMAT(1, 10000, "%llu", u64);
+
+ /* 10.0k - 99.9k */
+ CHK_FORMAT(1000, 99.95, "%0.01fk", double);
+
+ /* 100k - 999k */
+ CHK_FORMAT(1000, 1000, "%lluk", u64);
+
+ /* 1.00M - 9.99M */
+ CHK_FORMAT(1000 * 1000, 9.995, "%0.02fM", double);
+
+ /* 10.0M - 99.9M */
+ CHK_FORMAT(1000 * 1000, 99.95, "%0.01fM", double);
+
+ /* 100M - 999M */
+ CHK_FORMAT(1000 * 1000, 1000, "%lluM", u64);
+
+ /* 1.00G - 9.99G */
+ CHK_FORMAT(1000LL * 1000 * 1000, 9.995, "%0.02fG", double);
+
+ /* 10.0G - 99.9G */
+ CHK_FORMAT(1000LL * 1000 * 1000, 99.95, "%0.01fG", double);
+
+ /* 100G - 999G */
+ CHK_FORMAT(1000LL * 1000 * 1000, 1000, "%lluG", u64);
+
+ /* 1.00T - 9.99G */
+ CHK_FORMAT(1000LL * 1000 * 1000 * 1000, 9.995, "%0.02fT", double);
+
+ /* 10.0T - 99.9T */
+ CHK_FORMAT(1000LL * 1000 * 1000 * 1000, 99.95, "%0.01fT", double);
+
+ /* 100T+ */
+ strcpy(buf, "infty");
+
+ return buf;
+
+}
+
+/* Unsafe describe float. Similar as unsafe int. */
+
+static u8 *u_stringify_float(u8 *buf, double val) {
+
+ if (val < 99.995) {
+
+ sprintf(buf, "%0.02f", val);
+
+ } else if (val < 999.95) {
+
+ sprintf(buf, "%0.01f", val);
+
+ } else {
+
+ return u_stringify_int(buf, (u64)val);
+
+ }
+
+ return buf;
+
+}
+
+/* Unsafe describe integer as memory size. */
+
+static u8 *u_stringify_mem_size(u8 *buf, u64 val) {
+
+ /* 0-9999 */
+ CHK_FORMAT(1, 10000, "%llu B", u64);
+
+ /* 10.0k - 99.9k */
+ CHK_FORMAT(1024, 99.95, "%0.01f kB", double);
+
+ /* 100k - 999k */
+ CHK_FORMAT(1024, 1000, "%llu kB", u64);
+
+ /* 1.00M - 9.99M */
+ CHK_FORMAT(1024 * 1024, 9.995, "%0.02f MB", double);
+
+ /* 10.0M - 99.9M */
+ CHK_FORMAT(1024 * 1024, 99.95, "%0.01f MB", double);
+
+ /* 100M - 999M */
+ CHK_FORMAT(1024 * 1024, 1000, "%llu MB", u64);
+
+ /* 1.00G - 9.99G */
+ CHK_FORMAT(1024LL * 1024 * 1024, 9.995, "%0.02f GB", double);
+
+ /* 10.0G - 99.9G */
+ CHK_FORMAT(1024LL * 1024 * 1024, 99.95, "%0.01f GB", double);
+
+ /* 100G - 999G */
+ CHK_FORMAT(1024LL * 1024 * 1024, 1000, "%llu GB", u64);
+
+ /* 1.00T - 9.99G */
+ CHK_FORMAT(1024LL * 1024 * 1024 * 1024, 9.995, "%0.02f TB", double);
+
+ /* 10.0T - 99.9T */
+ CHK_FORMAT(1024LL * 1024 * 1024 * 1024, 99.95, "%0.01f TB", double);
+
+#undef CHK_FORMAT
+
+ /* 100T+ */
+ strcpy(buf, "infty");
+
+ return buf;
+
+}
+
+/* Unsafe describe time delta as string.
+ Returns a pointer to buf for convenience. */
+
+static u8 *u_stringify_time_diff(u8 *buf, u64 cur_ms, u64 event_ms) {
+
+ u64 delta;
+ s32 t_d, t_h, t_m, t_s;
+ u8 val_buf[STRINGIFY_VAL_SIZE_MAX];
+
+ if (!event_ms) {
+
+ sprintf(buf, "none seen yet");
+
+ } else {
+
+ delta = cur_ms - event_ms;
+
+ t_d = delta / 1000 / 60 / 60 / 24;
+ t_h = (delta / 1000 / 60 / 60) % 24;
+ t_m = (delta / 1000 / 60) % 60;
+ t_s = (delta / 1000) % 60;
+
+ u_stringify_int(val_buf, t_d);
+ sprintf(buf, "%s days, %d hrs, %d min, %d sec", val_buf, t_h, t_m, t_s);
+
+ }
+
+ return buf;
+
+}
+
#endif
diff --git a/include/debug.h b/include/debug.h
index b3865c19..ff2845f9 100644
--- a/include/debug.h
+++ b/include/debug.h
@@ -32,6 +32,10 @@
* Terminal colors *
*******************/
+#ifndef MESSAGES_TO_STDOUT
+#define MESSAGES_TO_STDOUT
+#endif
+
#ifdef USE_COLOR
#define cBLK "\x1b[0;30m"
diff --git a/include/forkserver.h b/include/forkserver.h
index 9802b216..5d1bd2cf 100644
--- a/include/forkserver.h
+++ b/include/forkserver.h
@@ -62,9 +62,10 @@ typedef struct afl_forkserver {
u8 use_fauxsrv; /* Fauxsrv for non-forking targets? */
+ u32 prev_timed_out; /* if prev forkserver run timed out */
+
} afl_forkserver_t;
-void handle_timeout(int sig);
void afl_fsrv_init(afl_forkserver_t *fsrv);
void afl_fsrv_start(afl_forkserver_t *fsrv, char **argv);
void afl_fsrv_deinit(afl_forkserver_t *fsrv);