about summary refs log tree commit diff
path: root/examples/custom_mutators/example.c
diff options
context:
space:
mode:
authorDominik Maier <domenukk@gmail.com>2020-03-26 19:44:44 +0100
committervan Hauser <vh@thc.org>2020-03-27 11:06:06 +0100
commitd6a7630fe2938621db05e616fe6b1b21dfaf21b3 (patch)
tree9ace0a1b60465ebd03ea1eda4d1c1eae297ce8f2 /examples/custom_mutators/example.c
parentfc4b03ee747366a5df1dd692851b961b93947eed (diff)
downloadafl++-d6a7630fe2938621db05e616fe6b1b21dfaf21b3.tar.gz
more api
Diffstat (limited to 'examples/custom_mutators/example.c')
-rw-r--r--examples/custom_mutators/example.c35
1 files changed, 30 insertions, 5 deletions
diff --git a/examples/custom_mutators/example.c b/examples/custom_mutators/example.c
index 3e708db8..04b72c77 100644
--- a/examples/custom_mutators/example.c
+++ b/examples/custom_mutators/example.c
@@ -15,6 +15,7 @@
 #include <stdio.h>
 
 #define DATA_SIZE (100)
+#define INITIAL_BUF_SIZE (16384)
 
 static const char *commands[] = {
 
@@ -28,6 +29,8 @@ typedef struct my_mutator {
 
   afl_t *afl;
   // any additional data here!
+  size_t pre_save_size;
+  u8 *   pre_save_buf;
 
 } my_mutator_t;
 
@@ -56,6 +59,16 @@ my_mutator_t *afl_custom_init(afl_t *afl, unsigned int seed) {
 
   data->afl = afl;
 
+  data->pre_save_buf = malloc(INITIAL_BUF_SIZE);
+  if (!data->pre_save_buf) {
+
+    free(data);
+    return NULL;
+
+  }
+
+  data->pre_save_size = INITIAL_BUF_SIZE;
+
   return data;
 
 }
@@ -125,12 +138,23 @@ size_t afl_custom_fuzz(my_mutator_t *data, uint8_t **buf, size_t buf_size,
 size_t afl_custom_pre_save(my_mutator_t *data, uint8_t *buf, size_t buf_size,
                            uint8_t *out_buf, size_t out_buf_size) {
 
-  // In case we need more than out_buf_size, we return that amount and get
-  // called again.
-  if (out_buf_size < 32000) return 32000;
+  if (data->pre_save_size < buf_size + 5) {
+
+    data->pre_save_buf = realloc(data->pre_save_buf, buf_size + 5);
+    if (!data->pre_save_buf) {
+
+      perror("custom mutator realloc");
+      free(data);
+      return -1;
+
+    }
+
+    data->pre_save_size = buf_size + 5;
+
+  }
 
-  memcpy(out_buf, buf, buf_size);
-  out_buf_size = buf_size;
+  memcpy(out_buf + 5, buf, buf_size);
+  out_buf_size = buf_size + 5;
   out_buf[0] = 'A';
   out_buf[1] = 'F';
   out_buf[2] = 'L';
@@ -322,6 +346,7 @@ void afl_custom_queue_new_entry(my_mutator_t * data,
  */
 void afl_custom_deinit(my_mutator_t *data) {
 
+  free(data->pre_save_buf);
   free(data);
 
 }