robert.swiecki | 3bb518c | 2010-10-14 00:48:24 +0000 | [diff] [blame] | 1 | /* |
robert.swiecki@gmail.com | 3b630b4 | 2015-02-16 10:53:53 +0000 | [diff] [blame] | 2 | * |
robert.swiecki@gmail.com | 772b33d | 2015-02-14 20:35:00 +0000 | [diff] [blame] | 3 | * honggfuzz - core structures and macros |
| 4 | * ----------------------------------------- |
robert.swiecki@gmail.com | 3b630b4 | 2015-02-16 10:53:53 +0000 | [diff] [blame] | 5 | * |
robert.swiecki@gmail.com | 772b33d | 2015-02-14 20:35:00 +0000 | [diff] [blame] | 6 | * Author: Robert Swiecki <swiecki@google.com> |
robert.swiecki@gmail.com | 3b630b4 | 2015-02-16 10:53:53 +0000 | [diff] [blame] | 7 | * |
robert.swiecki@gmail.com | 772b33d | 2015-02-14 20:35:00 +0000 | [diff] [blame] | 8 | * Copyright 2010-2015 by Google Inc. All Rights Reserved. |
robert.swiecki@gmail.com | 3b630b4 | 2015-02-16 10:53:53 +0000 | [diff] [blame] | 9 | * |
| 10 | * Licensed under the Apache License, Version 2.0 (the "License"); you may |
| 11 | * not use this file except in compliance with the License. You may obtain |
robert.swiecki@gmail.com | 772b33d | 2015-02-14 20:35:00 +0000 | [diff] [blame] | 12 | * a copy of the License at |
robert.swiecki@gmail.com | 3b630b4 | 2015-02-16 10:53:53 +0000 | [diff] [blame] | 13 | * |
robert.swiecki@gmail.com | 772b33d | 2015-02-14 20:35:00 +0000 | [diff] [blame] | 14 | * http://www.apache.org/licenses/LICENSE-2.0 |
robert.swiecki@gmail.com | 3b630b4 | 2015-02-16 10:53:53 +0000 | [diff] [blame] | 15 | * |
robert.swiecki@gmail.com | 772b33d | 2015-02-14 20:35:00 +0000 | [diff] [blame] | 16 | * Unless required by applicable law or agreed to in writing, software |
| 17 | * distributed under the License is distributed on an "AS IS" BASIS, |
| 18 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or |
| 19 | * implied. See the License for the specific language governing |
| 20 | * permissions and limitations under the License. |
robert.swiecki@gmail.com | 3b630b4 | 2015-02-16 10:53:53 +0000 | [diff] [blame] | 21 | * |
robert.swiecki@gmail.com | 772b33d | 2015-02-14 20:35:00 +0000 | [diff] [blame] | 22 | */ |
robert.swiecki | 3bb518c | 2010-10-14 00:48:24 +0000 | [diff] [blame] | 23 | |
Jagger | 876a74c | 2016-02-09 22:09:11 +0100 | [diff] [blame] | 24 | #ifndef _HF_COMMON_H_ |
| 25 | #define _HF_COMMON_H_ |
robert.swiecki | 3bb518c | 2010-10-14 00:48:24 +0000 | [diff] [blame] | 26 | |
robert.swiecki@gmail.com | ba85c3e | 2015-02-02 14:55:16 +0000 | [diff] [blame] | 27 | #include <limits.h> |
robert.swiecki@gmail.com | 41d8e05 | 2015-02-19 01:10:41 +0000 | [diff] [blame] | 28 | #include <pthread.h> |
robert.swiecki | 3bb518c | 2010-10-14 00:48:24 +0000 | [diff] [blame] | 29 | #include <stdbool.h> |
| 30 | #include <stdint.h> |
robert.swiecki@gmail.com | ba85c3e | 2015-02-02 14:55:16 +0000 | [diff] [blame] | 31 | #include <sys/param.h> |
Robert Swiecki | 3bfc33c | 2016-03-14 18:12:41 +0100 | [diff] [blame] | 32 | #include <sys/queue.h> |
robert.swiecki@gmail.com | ba85c3e | 2015-02-02 14:55:16 +0000 | [diff] [blame] | 33 | #include <sys/types.h> |
robert.swiecki | 3bb518c | 2010-10-14 00:48:24 +0000 | [diff] [blame] | 34 | |
Anestis Bechtsoudis | 4d9e8c9 | 2016-01-31 16:18:48 +0200 | [diff] [blame] | 35 | #ifdef __clang__ |
| 36 | #include <stdatomic.h> |
| 37 | #endif |
| 38 | |
Anestis Bechtsoudis | 2ff92d1 | 2015-12-20 15:33:20 +0200 | [diff] [blame] | 39 | #ifndef UNUSED |
| 40 | #define UNUSED __attribute__((unused)) |
| 41 | #endif |
| 42 | |
robert.swiecki | 3bb518c | 2010-10-14 00:48:24 +0000 | [diff] [blame] | 43 | #define PROG_NAME "honggfuzz" |
robert.swiecki@gmail.com | a51662b | 2015-03-01 19:12:41 +0000 | [diff] [blame] | 44 | #define PROG_VERSION "0.6rc" |
robert.swiecki | 32b69c9 | 2015-02-26 14:56:36 +0000 | [diff] [blame] | 45 | #define PROG_AUTHORS "Robert Swiecki <swiecki@google.com> et al.,\nCopyright 2010-2015 by Google Inc. All Rights Reserved." |
robert.swiecki | 3bb518c | 2010-10-14 00:48:24 +0000 | [diff] [blame] | 46 | |
Robert Swiecki | a9db9dd | 2016-03-09 16:29:37 +0100 | [diff] [blame] | 47 | /* Go-style defer implementation */ |
| 48 | #define __STRMERGE(a, b) a##b |
| 49 | #define _STRMERGE(a, b) __STRMERGE(a, b) |
| 50 | |
| 51 | #ifdef __clang__ |
| 52 | static void __attribute__ ((unused)) _clang_cleanup_func(void (^*dfunc) (void)) |
| 53 | { |
| 54 | (*dfunc) (); |
| 55 | } |
| 56 | |
Jagger | 28aebbd | 2016-03-10 22:58:51 +0100 | [diff] [blame] | 57 | #define DEFER(a) void (^_STRMERGE(__defer_f_, __COUNTER__))(void) __attribute__((cleanup(_clang_cleanup_func))) __attribute__((unused)) = ^{ a; } |
Robert Swiecki | a9db9dd | 2016-03-09 16:29:37 +0100 | [diff] [blame] | 58 | #else |
| 59 | #define __block |
Jagger | 28aebbd | 2016-03-10 22:58:51 +0100 | [diff] [blame] | 60 | #define _DEFER(a, count) void _STRMERGE(__defer_f_, count)(void *_defer_arg __attribute__((unused))) { a; } ; \ |
Robert Swiecki | df05a3c | 2016-03-10 16:00:07 +0100 | [diff] [blame] | 61 | int _STRMERGE(_defer_var_, count) __attribute__((cleanup(_STRMERGE(__defer_f_, count)))) __attribute__((unused)) |
Jagger | 28aebbd | 2016-03-10 22:58:51 +0100 | [diff] [blame] | 62 | #define DEFER(a) _DEFER(a, __COUNTER__) |
Robert Swiecki | a9db9dd | 2016-03-09 16:29:37 +0100 | [diff] [blame] | 63 | #endif |
| 64 | |
robert.swiecki@gmail.com | 64dc2a0 | 2015-02-17 22:21:30 +0000 | [diff] [blame] | 65 | /* Name of the template which will be replaced with the proper name of the file */ |
robert.swiecki@gmail.com | a0d8714 | 2015-02-14 13:11:18 +0000 | [diff] [blame] | 66 | #define _HF_FILE_PLACEHOLDER "___FILE___" |
robert.swiecki@gmail.com | 64dc2a0 | 2015-02-17 22:21:30 +0000 | [diff] [blame] | 67 | |
| 68 | /* Default name of the report created with some architectures */ |
robert.swiecki@gmail.com | e7190b9 | 2015-02-14 23:05:42 +0000 | [diff] [blame] | 69 | #define _HF_REPORT_FILE "HONGGFUZZ.REPORT.TXT" |
robert.swiecki | 3bb518c | 2010-10-14 00:48:24 +0000 | [diff] [blame] | 70 | |
robert.swiecki@gmail.com | 64dc2a0 | 2015-02-17 22:21:30 +0000 | [diff] [blame] | 71 | /* Default stack-size of created threads. Must be bigger then _HF_DYNAMIC_FILE_MAX_SZ */ |
robert.swiecki@gmail.com | 23b3a2f | 2015-03-01 03:40:12 +0000 | [diff] [blame] | 72 | #define _HF_PTHREAD_STACKSIZE (1024 * 1024 * 8) /* 8MB */ |
robert.swiecki@gmail.com | 01b6dd4 | 2015-02-16 18:11:28 +0000 | [diff] [blame] | 73 | |
robert.swiecki@gmail.com | e768052 | 2015-02-22 22:22:37 +0000 | [diff] [blame] | 74 | /* Align to the upper-page boundary */ |
robert.swiecki | 87f7c7e | 2015-02-26 14:11:57 +0000 | [diff] [blame] | 75 | #define _HF_PAGE_ALIGN_UP(x) (((size_t)x + (size_t)getpagesize() - (size_t)1) & ~((size_t)getpagesize() - (size_t)1)) |
robert.swiecki@gmail.com | e768052 | 2015-02-22 22:22:37 +0000 | [diff] [blame] | 76 | |
Anestis Bechtsoudis | cfc39fb | 2015-08-06 10:31:36 +0300 | [diff] [blame] | 77 | /* String buffer size for function names in stack traces produced from libunwind */ |
Jagger | d628a70 | 2015-08-23 12:59:37 +0200 | [diff] [blame] | 78 | #define _HF_FUNC_NAME_SZ 256 // Should be alright for mangled C++ procs too |
Anestis Bechtsoudis | cfc39fb | 2015-08-06 10:31:36 +0300 | [diff] [blame] | 79 | |
Anestis Bechtsoudis | 5c86ebc | 2015-09-27 18:06:43 +0300 | [diff] [blame] | 80 | /* Number of crash verifier iterations before tag crash as stable */ |
| 81 | #define _HF_VERIFIER_ITER 5 |
| 82 | |
Anestis Bechtsoudis | 60ea5e7 | 2015-11-24 19:10:06 +0200 | [diff] [blame] | 83 | /* Constant prefix used for single frame crashes stackhash masking */ |
Anestis Bechtsoudis | c06f8b3 | 2015-12-26 14:48:05 +0200 | [diff] [blame] | 84 | #define _HF_SINGLE_FRAME_MASK 0xBADBAD0000000000 |
| 85 | |
| 86 | /* Size (in bytes) for report data to be stored in stack before written to file */ |
| 87 | #define _HF_REPORT_SIZE 8192 |
Anestis Bechtsoudis | 0ef9000 | 2015-11-22 21:17:06 +0200 | [diff] [blame] | 88 | |
Anestis Bechtsoudis | 02b99be | 2015-12-27 11:53:01 +0200 | [diff] [blame] | 89 | #define _HF_DYNFILE_SUB_MASK 0xFFFUL // Zero-set two MSB |
| 90 | |
Anestis Bechtsoudis | a16f70f | 2016-01-03 13:03:21 +0200 | [diff] [blame] | 91 | /* Bitmap size */ |
Jagger | 5d9fb9c | 2016-03-17 00:08:37 +0100 | [diff] [blame^] | 92 | #define _HF_BITMAP_SIZE 0x3FFFFFF |
Anestis Bechtsoudis | a16f70f | 2016-01-03 13:03:21 +0200 | [diff] [blame] | 93 | |
Robert Swiecki | 3bfc33c | 2016-03-14 18:12:41 +0100 | [diff] [blame] | 94 | /* Perf bitmap size */ |
Robert Swiecki | 4b0390a | 2016-03-14 18:44:05 +0100 | [diff] [blame] | 95 | #define _HF_PERF_BITMAP_SIZE (1024U * 1024U * 1024U) |
Robert Swiecki | 3bfc33c | 2016-03-14 18:12:41 +0100 | [diff] [blame] | 96 | |
Anestis Bechtsoudis | a16f70f | 2016-01-03 13:03:21 +0200 | [diff] [blame] | 97 | /* Directory in workspace to store sanitizer coverage data */ |
| 98 | #define _HF_SANCOV_DIR "HF_SANCOV" |
| 99 | |
Anestis Bechtsoudis | 8e634c3 | 2016-01-13 13:07:26 +0200 | [diff] [blame] | 100 | #if defined(__ANDROID__) |
| 101 | #define _HF_MONITOR_SIGABRT 0 |
| 102 | #else |
| 103 | #define _HF_MONITOR_SIGABRT 1 |
| 104 | #endif |
| 105 | |
Anestis Bechtsoudis | 7c88d7a | 2016-02-09 17:55:38 +0200 | [diff] [blame] | 106 | /* Size of remote pid cmdline char buffer */ |
| 107 | #define _HF_PROC_CMDLINE_SZ 8192 |
| 108 | |
Jagger | d34417d | 2016-03-16 01:26:54 +0100 | [diff] [blame] | 109 | #define ARRAYSIZE(x) (sizeof(x) / sizeof(*x)) |
| 110 | |
| 111 | /* Memory barriers */ |
| 112 | #define rmb() __asm__ __volatile__("":::"memory") |
| 113 | #define wmb() __sync_synchronize() |
| 114 | |
| 115 | /* Atomics */ |
| 116 | #define ATOMIC_GET(x) __sync_fetch_and_add(&(x), 0) |
| 117 | #define ATOMIC_SET(x, y) __sync_lock_test_and_set(&(x), y) |
| 118 | #define ATOMIC_CLEAR(x) __sync_fetch_and_and(&(x), 0) |
| 119 | |
| 120 | #define ATOMIC_PRE_INC(x) __sync_add_and_fetch(&(x), 1) |
| 121 | #define ATOMIC_POST_INC(x) __sync_fetch_and_add(&(x), 1) |
| 122 | |
| 123 | #define ATOMIC_PRE_DEC(x) __sync_sub_and_fetch(&(x), 1) |
| 124 | #define ATOMIC_POST_DEC(x) __sync_fetch_and_sub(&(x), 1) |
| 125 | |
| 126 | #define ATOMIC_PRE_ADD(x, y) __sync_add_and_fetch(&(x), y) |
| 127 | #define ATOMIC_POST_ADD(x, y) __sync_fetch_and_add(&(x), y) |
| 128 | |
| 129 | #define ATOMIC_PRE_SUB(x, y) __sync_sub_and_fetch(&(x), y) |
| 130 | #define ATOMIC_POST_SUB(x, y) __sync_fetch_and_sub(&(x), y) |
| 131 | |
| 132 | #define ATOMIC_PRE_AND(x, y) __sync_and_and_fetch(&(x), y) |
| 133 | #define ATOMIC_POST_AND(x, y) __sync_fetch_and_and(&(x), y) |
| 134 | |
| 135 | #define ATOMIC_PRE_OR(x, y) __sync_or_and_fetch(&(x), y) |
| 136 | #define ATOMIC_POST_OR(x, y) __sync_fetch_and_or(&(x), y) |
| 137 | |
robert.swiecki@gmail.com | cac22fd | 2015-02-19 14:03:28 +0000 | [diff] [blame] | 138 | typedef enum { |
robert.swiecki@gmail.com | 81e26dc | 2015-03-03 04:26:04 +0000 | [diff] [blame] | 139 | _HF_DYNFILE_NONE = 0x0, |
| 140 | _HF_DYNFILE_INSTR_COUNT = 0x1, |
| 141 | _HF_DYNFILE_BRANCH_COUNT = 0x2, |
Jagger | 3abc560 | 2016-02-04 00:53:43 +0100 | [diff] [blame] | 142 | _HF_DYNFILE_BTS_BLOCK = 0x8, |
| 143 | _HF_DYNFILE_BTS_EDGE = 0x10, |
Jagger | 39bd2b0 | 2016-02-04 01:16:15 +0100 | [diff] [blame] | 144 | _HF_DYNFILE_IPT_BLOCK = 0x20, |
Jagger | 0d2727a | 2016-02-08 02:08:42 +0100 | [diff] [blame] | 145 | _HF_DYNFILE_CUSTOM = 0x40, |
robert.swiecki@gmail.com | cac22fd | 2015-02-19 14:03:28 +0000 | [diff] [blame] | 146 | } dynFileMethod_t; |
| 147 | |
robert.swiecki | 3bb518c | 2010-10-14 00:48:24 +0000 | [diff] [blame] | 148 | typedef struct { |
Jagger | b409ee1 | 2015-09-09 02:02:32 +0200 | [diff] [blame] | 149 | uint64_t cpuInstrCnt; |
| 150 | uint64_t cpuBranchCnt; |
Jagger | b409ee1 | 2015-09-09 02:02:32 +0200 | [diff] [blame] | 151 | uint64_t customCnt; |
Robert Swiecki | 3bfc33c | 2016-03-14 18:12:41 +0100 | [diff] [blame] | 152 | uint64_t bbCnt; |
Jagger | b409ee1 | 2015-09-09 02:02:32 +0200 | [diff] [blame] | 153 | } hwcnt_t; |
| 154 | |
Anestis Bechtsoudis | a16f70f | 2016-01-03 13:03:21 +0200 | [diff] [blame] | 155 | /* Sanitizer coverage specific data structures */ |
Jagger | b409ee1 | 2015-09-09 02:02:32 +0200 | [diff] [blame] | 156 | typedef struct { |
Anestis Bechtsoudis | 56e360f | 2016-01-11 14:29:17 +0200 | [diff] [blame] | 157 | uint64_t hitBBCnt; |
| 158 | uint64_t totalBBCnt; |
Anestis Bechtsoudis | a16f70f | 2016-01-03 13:03:21 +0200 | [diff] [blame] | 159 | uint64_t dsoCnt; |
| 160 | uint64_t iDsoCnt; |
Anestis Bechtsoudis | 56e360f | 2016-01-11 14:29:17 +0200 | [diff] [blame] | 161 | uint64_t newBBCnt; |
Anestis Bechtsoudis | a16f70f | 2016-01-03 13:03:21 +0200 | [diff] [blame] | 162 | uint64_t crashesCnt; |
Anestis Bechtsoudis | be0ac7b | 2015-12-26 15:38:47 +0200 | [diff] [blame] | 163 | } sancovcnt_t; |
| 164 | |
| 165 | typedef struct { |
Anestis Bechtsoudis | a16f70f | 2016-01-03 13:03:21 +0200 | [diff] [blame] | 166 | uint32_t capacity; |
| 167 | uint32_t *pChunks; |
| 168 | uint32_t nChunks; |
| 169 | } bitmap_t; |
| 170 | |
| 171 | /* Memory map struct */ |
| 172 | typedef struct __attribute__ ((packed)) { |
| 173 | uint64_t start; // region start addr |
| 174 | uint64_t end; // region end addr |
| 175 | uint64_t base; // region base addr |
| 176 | char mapName[NAME_MAX]; // bin/DSO name |
Anestis Bechtsoudis | 56e360f | 2016-01-11 14:29:17 +0200 | [diff] [blame] | 177 | uint64_t bbCnt; |
| 178 | uint64_t newBBCnt; |
Anestis Bechtsoudis | a16f70f | 2016-01-03 13:03:21 +0200 | [diff] [blame] | 179 | } memMap_t; |
| 180 | |
| 181 | /* Trie node data struct */ |
| 182 | typedef struct __attribute__ ((packed)) { |
Anestis Bechtsoudis | a16f70f | 2016-01-03 13:03:21 +0200 | [diff] [blame] | 183 | bitmap_t *pBM; |
| 184 | } trieData_t; |
| 185 | |
| 186 | /* Trie node struct */ |
| 187 | typedef struct __attribute__ ((packed)) node { |
| 188 | char key; |
| 189 | trieData_t data; |
| 190 | struct node *next; |
| 191 | struct node *prev; |
| 192 | struct node *children; |
| 193 | struct node *parent; |
| 194 | } node_t; |
Anestis Bechtsoudis | b78cf60 | 2016-01-07 13:10:50 +0200 | [diff] [blame] | 195 | |
Anestis Bechtsoudis | a16f70f | 2016-01-03 13:03:21 +0200 | [diff] [blame] | 196 | /* EOF Sanitizer coverage specific data structures */ |
| 197 | |
| 198 | typedef struct { |
Anestis Bechtsoudis | 61b5ab1 | 2016-01-08 16:07:02 +0200 | [diff] [blame] | 199 | char *asanOpts; |
| 200 | char *msanOpts; |
| 201 | char *ubsanOpts; |
| 202 | } sanOpts_t; |
| 203 | |
Robert Swiecki | 6c9f682 | 2016-03-14 16:12:27 +0100 | [diff] [blame] | 204 | typedef enum { |
| 205 | _HF_STATE_UNSET = 0, |
| 206 | _HF_STATE_STATIC = 1, |
| 207 | _HF_STATE_DYNAMIC_PRE = 2, |
| 208 | _HF_STATE_DYNAMIC_MAIN = 3, |
| 209 | } fuzzState_t; |
| 210 | |
Robert Swiecki | 3bfc33c | 2016-03-14 18:12:41 +0100 | [diff] [blame] | 211 | struct dynfile_t { |
| 212 | uint8_t *data; |
| 213 | size_t size; |
Robert Swiecki | 7084e65 | 2016-03-14 19:47:00 +0100 | [diff] [blame] | 214 | TAILQ_ENTRY(dynfile_t) pointers; |
Robert Swiecki | 3bfc33c | 2016-03-14 18:12:41 +0100 | [diff] [blame] | 215 | }; |
| 216 | |
Anestis Bechtsoudis | 61b5ab1 | 2016-01-08 16:07:02 +0200 | [diff] [blame] | 217 | typedef struct { |
robert.swiecki | 3bb518c | 2010-10-14 00:48:24 +0000 | [diff] [blame] | 218 | char **cmdline; |
Robert Swiecki | 72d2bef | 2016-01-19 14:39:26 +0100 | [diff] [blame] | 219 | char cmdline_txt[PATH_MAX]; |
robert.swiecki | 3bb518c | 2010-10-14 00:48:24 +0000 | [diff] [blame] | 220 | char *inputFile; |
| 221 | bool nullifyStdio; |
| 222 | bool fuzzStdin; |
| 223 | bool saveUnique; |
Jagger | 0764ad7 | 2015-09-06 01:11:08 +0200 | [diff] [blame] | 224 | bool useScreen; |
Anestis Bechtsoudis | 5c86ebc | 2015-09-27 18:06:43 +0300 | [diff] [blame] | 225 | bool useVerifier; |
Robert Swiecki | 6c9f682 | 2016-03-14 16:12:27 +0100 | [diff] [blame] | 226 | time_t timeStart; |
robert.swiecki | 3bb518c | 2010-10-14 00:48:24 +0000 | [diff] [blame] | 227 | char *fileExtn; |
Anestis Bechtsoudis | d968053 | 2015-09-06 17:37:05 +0300 | [diff] [blame] | 228 | char *workDir; |
Robert Swiecki | a96d78d | 2016-03-14 16:50:50 +0100 | [diff] [blame] | 229 | double origFlipRate; |
robert.swiecki | 3bb518c | 2010-10-14 00:48:24 +0000 | [diff] [blame] | 230 | char *externalCommand; |
robert.swiecki@gmail.com | 4f1124f | 2015-04-21 17:12:22 +0000 | [diff] [blame] | 231 | const char *dictionaryFile; |
Anestis Bechtsoudis | 70f2fbd | 2016-01-14 13:15:19 +0200 | [diff] [blame] | 232 | char **dictionary; |
Anestis Bechtsoudis | d59af69 | 2015-09-21 15:15:05 +0300 | [diff] [blame] | 233 | const char *blacklistFile; |
| 234 | uint64_t *blacklist; |
| 235 | size_t blacklistCnt; |
robert.swiecki | 3bb518c | 2010-10-14 00:48:24 +0000 | [diff] [blame] | 236 | long tmOut; |
Jagger | ea39a8f | 2015-09-05 00:57:22 +0200 | [diff] [blame] | 237 | size_t dictionaryCnt; |
| 238 | size_t mutationsMax; |
Jagger | ea39a8f | 2015-09-05 00:57:22 +0200 | [diff] [blame] | 239 | size_t threadsMax; |
| 240 | size_t threadsFinished; |
robert.swiecki@gmail.com | 4da86bf | 2015-02-22 14:24:58 +0000 | [diff] [blame] | 241 | size_t maxFileSz; |
robert.swiecki@gmail.com | e7190b9 | 2015-02-14 23:05:42 +0000 | [diff] [blame] | 242 | char *reportFile; |
Robert Swiecki | c578d64 | 2015-09-08 16:13:36 +0200 | [diff] [blame] | 243 | uint64_t asLimit; |
robert.swiecki | 3bb518c | 2010-10-14 00:48:24 +0000 | [diff] [blame] | 244 | char **files; |
Anestis Bechtsoudis | 46ea10e | 2015-11-07 18:16:25 +0200 | [diff] [blame] | 245 | size_t fileCnt; |
Robert Swiecki | 05354ca | 2016-03-15 19:10:23 +0100 | [diff] [blame] | 246 | size_t lastFileIndex; |
| 247 | size_t doneFileIndex; |
Jagger | cdbf685 | 2016-02-07 22:06:02 +0100 | [diff] [blame] | 248 | int exeFd; |
Jagger | 80041fe | 2016-03-10 21:32:35 +0100 | [diff] [blame] | 249 | bool clearEnv; |
robert.swiecki@gmail.com | 15eca6f | 2015-03-04 03:31:36 +0000 | [diff] [blame] | 250 | char *envs[128]; |
robert.swiecki@gmail.com | 41d8e05 | 2015-02-19 01:10:41 +0000 | [diff] [blame] | 251 | |
Robert Swiecki | 6c9f682 | 2016-03-14 16:12:27 +0100 | [diff] [blame] | 252 | fuzzState_t state; |
Robert Swiecki | 3bfc33c | 2016-03-14 18:12:41 +0100 | [diff] [blame] | 253 | uint8_t *bbMap; |
| 254 | size_t bbMapSz; |
| 255 | size_t dynfileqCnt; |
Robert Swiecki | e586c1f | 2016-03-14 18:46:03 +0100 | [diff] [blame] | 256 | pthread_mutex_t dynfileq_mutex; |
Robert Swiecki | 3bfc33c | 2016-03-14 18:12:41 +0100 | [diff] [blame] | 257 | TAILQ_HEAD(dynfileq_t, dynfile_t) dynfileq; |
Robert Swiecki | 6c9f682 | 2016-03-14 16:12:27 +0100 | [diff] [blame] | 258 | |
Jagger | 0764ad7 | 2015-09-06 01:11:08 +0200 | [diff] [blame] | 259 | size_t mutationsCnt; |
| 260 | size_t crashesCnt; |
Anestis Bechtsoudis | d7e8ed2 | 2015-09-10 18:29:34 +0300 | [diff] [blame] | 261 | size_t uniqueCrashesCnt; |
Anestis Bechtsoudis | 79b799e | 2015-11-01 00:02:25 +0200 | [diff] [blame] | 262 | size_t verifiedCrashesCnt; |
Anestis Bechtsoudis | d59af69 | 2015-09-21 15:15:05 +0300 | [diff] [blame] | 263 | size_t blCrashesCnt; |
Jagger | 4b5281e | 2015-09-06 02:35:37 +0200 | [diff] [blame] | 264 | size_t timeoutedCnt; |
Jagger | 0764ad7 | 2015-09-06 01:11:08 +0200 | [diff] [blame] | 265 | |
robert.swiecki@gmail.com | cac22fd | 2015-02-19 14:03:28 +0000 | [diff] [blame] | 266 | dynFileMethod_t dynFileMethod; |
Anestis Bechtsoudis | be0ac7b | 2015-12-26 15:38:47 +0200 | [diff] [blame] | 267 | sancovcnt_t sanCovCnts; |
Anestis Bechtsoudis | a16f70f | 2016-01-03 13:03:21 +0200 | [diff] [blame] | 268 | pthread_mutex_t sanCov_mutex; |
Anestis Bechtsoudis | 61b5ab1 | 2016-01-08 16:07:02 +0200 | [diff] [blame] | 269 | sanOpts_t sanOpts; |
Robert Swiecki | 6c9f682 | 2016-03-14 16:12:27 +0100 | [diff] [blame] | 270 | size_t dynFileIterExpire; |
| 271 | bool useSanCov; |
| 272 | node_t *covMetadata; |
Robert Swiecki | 6c9f682 | 2016-03-14 16:12:27 +0100 | [diff] [blame] | 273 | |
| 274 | /* For the Linux code */ |
| 275 | hwcnt_t hwCnts; |
| 276 | uint64_t dynamicCutOffAddr; |
| 277 | bool disableRandomization; |
| 278 | bool msanReportUMRS; |
| 279 | void *ignoreAddr; |
| 280 | size_t numMajorFrames; |
Anestis Bechtsoudis | 413cb13 | 2016-02-07 12:59:00 +0200 | [diff] [blame] | 281 | pid_t pid; |
| 282 | const char *pidFile; |
Anestis Bechtsoudis | 7c88d7a | 2016-02-09 17:55:38 +0200 | [diff] [blame] | 283 | char *pidCmd; |
robert.swiecki | 3bb518c | 2010-10-14 00:48:24 +0000 | [diff] [blame] | 284 | } honggfuzz_t; |
| 285 | |
robert.swiecki@gmail.com | 882900b | 2015-02-11 13:56:22 +0000 | [diff] [blame] | 286 | typedef struct fuzzer_t { |
| 287 | pid_t pid; |
robert.swiecki@gmail.com | 3213a11 | 2015-03-12 01:42:02 +0000 | [diff] [blame] | 288 | int64_t timeStartedMillis; |
robert.swiecki@gmail.com | 882900b | 2015-02-11 13:56:22 +0000 | [diff] [blame] | 289 | char origFileName[PATH_MAX]; |
| 290 | char fileName[PATH_MAX]; |
Anestis Bechtsoudis | 5c86ebc | 2015-09-27 18:06:43 +0300 | [diff] [blame] | 291 | char crashFileName[PATH_MAX]; |
robert.swiecki@gmail.com | 882900b | 2015-02-11 13:56:22 +0000 | [diff] [blame] | 292 | uint64_t pc; |
| 293 | uint64_t backtrace; |
| 294 | uint64_t access; |
| 295 | int exception; |
Anestis Bechtsoudis | c06f8b3 | 2015-12-26 14:48:05 +0200 | [diff] [blame] | 296 | char report[_HF_REPORT_SIZE]; |
Anestis Bechtsoudis | 6b9e83d | 2015-10-02 11:10:50 -0700 | [diff] [blame] | 297 | bool mainWorker; |
Robert Swiecki | a96d78d | 2016-03-14 16:50:50 +0100 | [diff] [blame] | 298 | float flipRate; |
| 299 | |
| 300 | sancovcnt_t sanCovCnts; |
| 301 | uint8_t *dynamicFile; |
| 302 | size_t dynamicFileSz; |
robert.swiecki@gmail.com | d4dd4df | 2015-02-18 00:50:12 +0000 | [diff] [blame] | 303 | |
Anestis Bechtsoudis | 413cb13 | 2016-02-07 12:59:00 +0200 | [diff] [blame] | 304 | /* For Linux code */ |
Jagger | b409ee1 | 2015-09-09 02:02:32 +0200 | [diff] [blame] | 305 | hwcnt_t hwCnts; |
robert.swiecki@gmail.com | 882900b | 2015-02-11 13:56:22 +0000 | [diff] [blame] | 306 | } fuzzer_t; |
robert.swiecki | 3bb518c | 2010-10-14 00:48:24 +0000 | [diff] [blame] | 307 | |
Anestis Bechtsoudis | cfc39fb | 2015-08-06 10:31:36 +0300 | [diff] [blame] | 308 | #define _HF_MAX_FUNCS 80 |
robert.swiecki@gmail.com | a0d8714 | 2015-02-14 13:11:18 +0000 | [diff] [blame] | 309 | typedef struct { |
| 310 | void *pc; |
Anestis Bechtsoudis | cfc39fb | 2015-08-06 10:31:36 +0300 | [diff] [blame] | 311 | char func[_HF_FUNC_NAME_SZ]; |
| 312 | size_t line; |
robert.swiecki@gmail.com | a0d8714 | 2015-02-14 13:11:18 +0000 | [diff] [blame] | 313 | } funcs_t; |
| 314 | |
robert.swiecki | 3bb518c | 2010-10-14 00:48:24 +0000 | [diff] [blame] | 315 | #endif |