| OLD | NEW |
| 1 /* | 1 /* |
| 2 american fuzzy lop - LLVM instrumentation bootstrap | 2 american fuzzy lop - LLVM instrumentation bootstrap |
| 3 --------------------------------------------------- | 3 --------------------------------------------------- |
| 4 | 4 |
| 5 Written by Laszlo Szekeres <lszekeres@google.com> and | 5 Written by Laszlo Szekeres <lszekeres@google.com> and |
| 6 Michal Zalewski <lcamtuf@google.com> | 6 Michal Zalewski <lcamtuf@google.com> |
| 7 | 7 |
| 8 LLVM integration design comes from Laszlo Szekeres. | 8 LLVM integration design comes from Laszlo Szekeres. |
| 9 | 9 |
| 10 Copyright 2015, 2016 Google Inc. All rights reserved. | 10 Copyright 2015, 2016 Google Inc. All rights reserved. |
| 11 | 11 |
| 12 Licensed under the Apache License, Version 2.0 (the "License"); | 12 Licensed under the Apache License, Version 2.0 (the "License"); |
| 13 you may not use this file except in compliance with the License. | 13 you may not use this file except in compliance with the License. |
| 14 You may obtain a copy of the License at: | 14 You may obtain a copy of the License at: |
| 15 | 15 |
| 16 http://www.apache.org/licenses/LICENSE-2.0 | 16 http://www.apache.org/licenses/LICENSE-2.0 |
| 17 | 17 |
| 18 This code is the rewrite of afl-as.h's main_payload. | 18 This code is the rewrite of afl-as.h's main_payload. |
| 19 | 19 |
| 20 */ | 20 */ |
| 21 | 21 |
| 22 #include "../config.h" | 22 #include "../config.h" |
| 23 #include "../types.h" | 23 #include "../types.h" |
| 24 | 24 |
| 25 #include <stdio.h> | 25 #include <stdio.h> |
| 26 #include <stdlib.h> | 26 #include <stdlib.h> |
| 27 #include <signal.h> | 27 #include <signal.h> |
| 28 #include <unistd.h> | 28 #include <unistd.h> |
| 29 #include <string.h> |
| 29 #include <assert.h> | 30 #include <assert.h> |
| 30 | 31 |
| 31 #include <sys/mman.h> | 32 #include <sys/mman.h> |
| 32 #include <sys/shm.h> | 33 #include <sys/shm.h> |
| 33 #include <sys/wait.h> | 34 #include <sys/wait.h> |
| 34 #include <sys/types.h> | 35 #include <sys/types.h> |
| 35 | 36 |
| 36 | 37 |
| 37 /* Globals needed by the injected instrumentation. The __afl_area_initial region | 38 /* Globals needed by the injected instrumentation. The __afl_area_initial region |
| 38 is used for instrumentation output before __afl_map_shm() has a chance to run
. | 39 is used for instrumentation output before __afl_map_shm() has a chance to run
. |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 162 | 163 |
| 163 /* A simplified persistent mode handler, used as explained in README.llvm. */ | 164 /* A simplified persistent mode handler, used as explained in README.llvm. */ |
| 164 | 165 |
| 165 int __afl_persistent_loop(unsigned int max_cnt) { | 166 int __afl_persistent_loop(unsigned int max_cnt) { |
| 166 | 167 |
| 167 static u8 first_pass = 1; | 168 static u8 first_pass = 1; |
| 168 static u32 cycle_cnt; | 169 static u32 cycle_cnt; |
| 169 | 170 |
| 170 if (first_pass) { | 171 if (first_pass) { |
| 171 | 172 |
| 173 /* Make sure that every iteration of __AFL_LOOP() starts with a clean slate. |
| 174 On subsequent calls, the parent will take care of that, but on the first |
| 175 iteration, it's our job to erase any trace of whatever happened |
| 176 before the loop. */ |
| 177 |
| 178 if (is_persistent) { |
| 179 |
| 180 memset(__afl_area_ptr, 0, MAP_SIZE); |
| 181 __afl_area_ptr[0] = 1; |
| 182 __afl_prev_loc = 0; |
| 183 } |
| 184 |
| 172 cycle_cnt = max_cnt; | 185 cycle_cnt = max_cnt; |
| 173 first_pass = 0; | 186 first_pass = 0; |
| 174 return 1; | 187 return 1; |
| 175 | 188 |
| 176 } | 189 } |
| 177 | 190 |
| 178 if (is_persistent && --cycle_cnt) { | 191 if (is_persistent) { |
| 179 | 192 |
| 180 raise(SIGSTOP); | 193 if (--cycle_cnt) { |
| 181 return 1; | |
| 182 | 194 |
| 183 } else return 0; | 195 raise(SIGSTOP); |
| 196 |
| 197 __afl_area_ptr[0] = 1; |
| 198 __afl_prev_loc = 0; |
| 199 |
| 200 return 1; |
| 201 |
| 202 } else { |
| 203 |
| 204 /* When exiting __AFL_LOOP(), make sure that the subsequent code that |
| 205 follows the loop is not traced. We do that by pivoting back to the |
| 206 dummy output region. */ |
| 207 |
| 208 __afl_area_ptr = __afl_area_initial; |
| 209 |
| 210 } |
| 211 |
| 212 } |
| 213 |
| 214 return 0; |
| 184 | 215 |
| 185 } | 216 } |
| 186 | 217 |
| 187 | 218 |
| 188 /* This one can be called from user code when deferred forkserver mode | 219 /* This one can be called from user code when deferred forkserver mode |
| 189 is enabled. */ | 220 is enabled. */ |
| 190 | 221 |
| 191 void __afl_manual_init(void) { | 222 void __afl_manual_init(void) { |
| 192 | 223 |
| 193 static u8 init_done; | 224 static u8 init_done; |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 274 inst_ratio_scaled = inst_ratio_scaled * MIN(4096, MAP_SIZE) / 100; | 305 inst_ratio_scaled = inst_ratio_scaled * MIN(4096, MAP_SIZE) / 100; |
| 275 | 306 |
| 276 } | 307 } |
| 277 | 308 |
| 278 | 309 |
| 279 /* Work around a short-lived bug in LLVM with -fsanitize-coverage=trace-pc. */ | 310 /* Work around a short-lived bug in LLVM with -fsanitize-coverage=trace-pc. */ |
| 280 | 311 |
| 281 void __sanitizer_cov_module_init(void) __attribute__((weak)); | 312 void __sanitizer_cov_module_init(void) __attribute__((weak)); |
| 282 void __sanitizer_cov_module_init(void) { } | 313 void __sanitizer_cov_module_init(void) { } |
| 283 | 314 |
| OLD | NEW |