1*08b48e0bSAndroid Build Coastguard Worker /*
2*08b48e0bSAndroid Build Coastguard Worker american fuzzy lop++ - instrumentation bootstrap
3*08b48e0bSAndroid Build Coastguard Worker ------------------------------------------------
4*08b48e0bSAndroid Build Coastguard Worker
5*08b48e0bSAndroid Build Coastguard Worker Copyright 2015, 2016 Google Inc. All rights reserved.
6*08b48e0bSAndroid Build Coastguard Worker Copyright 2019-2024 AFLplusplus Project. All rights reserved.
7*08b48e0bSAndroid Build Coastguard Worker
8*08b48e0bSAndroid Build Coastguard Worker Licensed under the Apache License, Version 2.0 (the "License");
9*08b48e0bSAndroid Build Coastguard Worker you may not use this file except in compliance with the License.
10*08b48e0bSAndroid Build Coastguard Worker You may obtain a copy of the License at:
11*08b48e0bSAndroid Build Coastguard Worker
12*08b48e0bSAndroid Build Coastguard Worker https://www.apache.org/licenses/LICENSE-2.0
13*08b48e0bSAndroid Build Coastguard Worker
14*08b48e0bSAndroid Build Coastguard Worker
15*08b48e0bSAndroid Build Coastguard Worker */
16*08b48e0bSAndroid Build Coastguard Worker
17*08b48e0bSAndroid Build Coastguard Worker #ifdef __AFL_CODE_COVERAGE
18*08b48e0bSAndroid Build Coastguard Worker #ifndef _GNU_SOURCE
19*08b48e0bSAndroid Build Coastguard Worker #define _GNU_SOURCE
20*08b48e0bSAndroid Build Coastguard Worker #endif
21*08b48e0bSAndroid Build Coastguard Worker #ifndef __USE_GNU
22*08b48e0bSAndroid Build Coastguard Worker #define __USE_GNU
23*08b48e0bSAndroid Build Coastguard Worker #endif
24*08b48e0bSAndroid Build Coastguard Worker #include <dlfcn.h>
25*08b48e0bSAndroid Build Coastguard Worker
26*08b48e0bSAndroid Build Coastguard Worker __attribute__((weak)) void __sanitizer_symbolize_pc(void *, const char *fmt,
27*08b48e0bSAndroid Build Coastguard Worker char *out_buf,
28*08b48e0bSAndroid Build Coastguard Worker size_t out_buf_size);
29*08b48e0bSAndroid Build Coastguard Worker #endif
30*08b48e0bSAndroid Build Coastguard Worker
31*08b48e0bSAndroid Build Coastguard Worker #ifdef __ANDROID__
32*08b48e0bSAndroid Build Coastguard Worker #include "android-ashmem.h"
33*08b48e0bSAndroid Build Coastguard Worker #endif
34*08b48e0bSAndroid Build Coastguard Worker #include "config.h"
35*08b48e0bSAndroid Build Coastguard Worker #include "types.h"
36*08b48e0bSAndroid Build Coastguard Worker #include "cmplog.h"
37*08b48e0bSAndroid Build Coastguard Worker #include "llvm-alternative-coverage.h"
38*08b48e0bSAndroid Build Coastguard Worker
39*08b48e0bSAndroid Build Coastguard Worker #define XXH_INLINE_ALL
40*08b48e0bSAndroid Build Coastguard Worker #include "xxhash.h"
41*08b48e0bSAndroid Build Coastguard Worker #undef XXH_INLINE_ALL
42*08b48e0bSAndroid Build Coastguard Worker
43*08b48e0bSAndroid Build Coastguard Worker #include <stdio.h>
44*08b48e0bSAndroid Build Coastguard Worker #include <stdlib.h>
45*08b48e0bSAndroid Build Coastguard Worker #include <signal.h>
46*08b48e0bSAndroid Build Coastguard Worker #include <unistd.h>
47*08b48e0bSAndroid Build Coastguard Worker #include <string.h>
48*08b48e0bSAndroid Build Coastguard Worker #include <assert.h>
49*08b48e0bSAndroid Build Coastguard Worker #include <stdint.h>
50*08b48e0bSAndroid Build Coastguard Worker #include <stddef.h>
51*08b48e0bSAndroid Build Coastguard Worker #include <limits.h>
52*08b48e0bSAndroid Build Coastguard Worker #include <errno.h>
53*08b48e0bSAndroid Build Coastguard Worker
54*08b48e0bSAndroid Build Coastguard Worker #include <sys/mman.h>
55*08b48e0bSAndroid Build Coastguard Worker #if !defined(__HAIKU__) && !defined(__OpenBSD__)
56*08b48e0bSAndroid Build Coastguard Worker #include <sys/syscall.h>
57*08b48e0bSAndroid Build Coastguard Worker #endif
58*08b48e0bSAndroid Build Coastguard Worker #ifndef USEMMAP
59*08b48e0bSAndroid Build Coastguard Worker #include <sys/shm.h>
60*08b48e0bSAndroid Build Coastguard Worker #endif
61*08b48e0bSAndroid Build Coastguard Worker #include <sys/wait.h>
62*08b48e0bSAndroid Build Coastguard Worker #include <sys/types.h>
63*08b48e0bSAndroid Build Coastguard Worker
64*08b48e0bSAndroid Build Coastguard Worker #if !__GNUC__
65*08b48e0bSAndroid Build Coastguard Worker #include "llvm/Config/llvm-config.h"
66*08b48e0bSAndroid Build Coastguard Worker #endif
67*08b48e0bSAndroid Build Coastguard Worker
68*08b48e0bSAndroid Build Coastguard Worker #ifdef __linux__
69*08b48e0bSAndroid Build Coastguard Worker #include "snapshot-inl.h"
70*08b48e0bSAndroid Build Coastguard Worker #endif
71*08b48e0bSAndroid Build Coastguard Worker
72*08b48e0bSAndroid Build Coastguard Worker /* This is a somewhat ugly hack for the experimental 'trace-pc-guard' mode.
73*08b48e0bSAndroid Build Coastguard Worker Basically, we need to make sure that the forkserver is initialized after
74*08b48e0bSAndroid Build Coastguard Worker the LLVM-generated runtime initialization pass, not before. */
75*08b48e0bSAndroid Build Coastguard Worker
76*08b48e0bSAndroid Build Coastguard Worker #ifndef MAP_FIXED_NOREPLACE
77*08b48e0bSAndroid Build Coastguard Worker #ifdef MAP_EXCL
78*08b48e0bSAndroid Build Coastguard Worker #define MAP_FIXED_NOREPLACE MAP_EXCL | MAP_FIXED
79*08b48e0bSAndroid Build Coastguard Worker #else
80*08b48e0bSAndroid Build Coastguard Worker #define MAP_FIXED_NOREPLACE MAP_FIXED
81*08b48e0bSAndroid Build Coastguard Worker #endif
82*08b48e0bSAndroid Build Coastguard Worker #endif
83*08b48e0bSAndroid Build Coastguard Worker
84*08b48e0bSAndroid Build Coastguard Worker #define CTOR_PRIO 3
85*08b48e0bSAndroid Build Coastguard Worker #define EARLY_FS_PRIO 5
86*08b48e0bSAndroid Build Coastguard Worker
87*08b48e0bSAndroid Build Coastguard Worker #include <sys/mman.h>
88*08b48e0bSAndroid Build Coastguard Worker #include <fcntl.h>
89*08b48e0bSAndroid Build Coastguard Worker
90*08b48e0bSAndroid Build Coastguard Worker /* Globals needed by the injected instrumentation. The __afl_area_initial region
91*08b48e0bSAndroid Build Coastguard Worker is used for instrumentation output before __afl_map_shm() has a chance to
92*08b48e0bSAndroid Build Coastguard Worker run. It will end up as .comm, so it shouldn't be too wasteful. */
93*08b48e0bSAndroid Build Coastguard Worker
94*08b48e0bSAndroid Build Coastguard Worker #if defined(__HAIKU__)
95*08b48e0bSAndroid Build Coastguard Worker extern ssize_t _kern_write(int fd, off_t pos, const void *buffer,
96*08b48e0bSAndroid Build Coastguard Worker size_t bufferSize);
97*08b48e0bSAndroid Build Coastguard Worker #endif // HAIKU
98*08b48e0bSAndroid Build Coastguard Worker
99*08b48e0bSAndroid Build Coastguard Worker char *strcasestr(const char *haystack, const char *needle);
100*08b48e0bSAndroid Build Coastguard Worker
101*08b48e0bSAndroid Build Coastguard Worker static u8 __afl_area_initial[MAP_INITIAL_SIZE];
102*08b48e0bSAndroid Build Coastguard Worker static u8 *__afl_area_ptr_dummy = __afl_area_initial;
103*08b48e0bSAndroid Build Coastguard Worker static u8 *__afl_area_ptr_backup = __afl_area_initial;
104*08b48e0bSAndroid Build Coastguard Worker
105*08b48e0bSAndroid Build Coastguard Worker u8 *__afl_area_ptr = __afl_area_initial;
106*08b48e0bSAndroid Build Coastguard Worker u8 *__afl_dictionary;
107*08b48e0bSAndroid Build Coastguard Worker u8 *__afl_fuzz_ptr;
108*08b48e0bSAndroid Build Coastguard Worker static u32 __afl_fuzz_len_dummy;
109*08b48e0bSAndroid Build Coastguard Worker u32 *__afl_fuzz_len = &__afl_fuzz_len_dummy;
110*08b48e0bSAndroid Build Coastguard Worker int __afl_sharedmem_fuzzing __attribute__((weak));
111*08b48e0bSAndroid Build Coastguard Worker
112*08b48e0bSAndroid Build Coastguard Worker u32 __afl_final_loc;
113*08b48e0bSAndroid Build Coastguard Worker u32 __afl_map_size = MAP_SIZE;
114*08b48e0bSAndroid Build Coastguard Worker u32 __afl_dictionary_len;
115*08b48e0bSAndroid Build Coastguard Worker u64 __afl_map_addr;
116*08b48e0bSAndroid Build Coastguard Worker u32 __afl_first_final_loc;
117*08b48e0bSAndroid Build Coastguard Worker
118*08b48e0bSAndroid Build Coastguard Worker #ifdef __AFL_CODE_COVERAGE
119*08b48e0bSAndroid Build Coastguard Worker typedef struct afl_module_info_t afl_module_info_t;
120*08b48e0bSAndroid Build Coastguard Worker
121*08b48e0bSAndroid Build Coastguard Worker struct afl_module_info_t {
122*08b48e0bSAndroid Build Coastguard Worker
123*08b48e0bSAndroid Build Coastguard Worker // A unique id starting with 0
124*08b48e0bSAndroid Build Coastguard Worker u32 id;
125*08b48e0bSAndroid Build Coastguard Worker
126*08b48e0bSAndroid Build Coastguard Worker // Name and base address of the module
127*08b48e0bSAndroid Build Coastguard Worker char *name;
128*08b48e0bSAndroid Build Coastguard Worker uintptr_t base_address;
129*08b48e0bSAndroid Build Coastguard Worker
130*08b48e0bSAndroid Build Coastguard Worker // PC Guard start/stop
131*08b48e0bSAndroid Build Coastguard Worker u32 *start;
132*08b48e0bSAndroid Build Coastguard Worker u32 *stop;
133*08b48e0bSAndroid Build Coastguard Worker
134*08b48e0bSAndroid Build Coastguard Worker // PC Table begin/end
135*08b48e0bSAndroid Build Coastguard Worker const uintptr_t *pcs_beg;
136*08b48e0bSAndroid Build Coastguard Worker const uintptr_t *pcs_end;
137*08b48e0bSAndroid Build Coastguard Worker
138*08b48e0bSAndroid Build Coastguard Worker u8 mapped;
139*08b48e0bSAndroid Build Coastguard Worker
140*08b48e0bSAndroid Build Coastguard Worker afl_module_info_t *next;
141*08b48e0bSAndroid Build Coastguard Worker
142*08b48e0bSAndroid Build Coastguard Worker };
143*08b48e0bSAndroid Build Coastguard Worker
144*08b48e0bSAndroid Build Coastguard Worker typedef struct {
145*08b48e0bSAndroid Build Coastguard Worker
146*08b48e0bSAndroid Build Coastguard Worker uintptr_t PC, PCFlags;
147*08b48e0bSAndroid Build Coastguard Worker
148*08b48e0bSAndroid Build Coastguard Worker } PCTableEntry;
149*08b48e0bSAndroid Build Coastguard Worker
150*08b48e0bSAndroid Build Coastguard Worker afl_module_info_t *__afl_module_info = NULL;
151*08b48e0bSAndroid Build Coastguard Worker
152*08b48e0bSAndroid Build Coastguard Worker u32 __afl_pcmap_size = 0;
153*08b48e0bSAndroid Build Coastguard Worker uintptr_t *__afl_pcmap_ptr = NULL;
154*08b48e0bSAndroid Build Coastguard Worker
155*08b48e0bSAndroid Build Coastguard Worker typedef struct {
156*08b48e0bSAndroid Build Coastguard Worker
157*08b48e0bSAndroid Build Coastguard Worker uintptr_t start;
158*08b48e0bSAndroid Build Coastguard Worker u32 len;
159*08b48e0bSAndroid Build Coastguard Worker
160*08b48e0bSAndroid Build Coastguard Worker } FilterPCEntry;
161*08b48e0bSAndroid Build Coastguard Worker
162*08b48e0bSAndroid Build Coastguard Worker u32 __afl_filter_pcs_size = 0;
163*08b48e0bSAndroid Build Coastguard Worker FilterPCEntry *__afl_filter_pcs = NULL;
164*08b48e0bSAndroid Build Coastguard Worker u8 *__afl_filter_pcs_module = NULL;
165*08b48e0bSAndroid Build Coastguard Worker
166*08b48e0bSAndroid Build Coastguard Worker #endif // __AFL_CODE_COVERAGE
167*08b48e0bSAndroid Build Coastguard Worker
168*08b48e0bSAndroid Build Coastguard Worker /* 1 if we are running in afl, and the forkserver was started, else 0 */
169*08b48e0bSAndroid Build Coastguard Worker u32 __afl_connected = 0;
170*08b48e0bSAndroid Build Coastguard Worker
171*08b48e0bSAndroid Build Coastguard Worker // for the __AFL_COVERAGE_ON/__AFL_COVERAGE_OFF features to work:
172*08b48e0bSAndroid Build Coastguard Worker int __afl_selective_coverage __attribute__((weak));
173*08b48e0bSAndroid Build Coastguard Worker int __afl_selective_coverage_start_off __attribute__((weak));
174*08b48e0bSAndroid Build Coastguard Worker static int __afl_selective_coverage_temp = 1;
175*08b48e0bSAndroid Build Coastguard Worker
176*08b48e0bSAndroid Build Coastguard Worker #if defined(__ANDROID__) || defined(__HAIKU__) || defined(NO_TLS)
177*08b48e0bSAndroid Build Coastguard Worker PREV_LOC_T __afl_prev_loc[NGRAM_SIZE_MAX];
178*08b48e0bSAndroid Build Coastguard Worker PREV_LOC_T __afl_prev_caller[CTX_MAX_K];
179*08b48e0bSAndroid Build Coastguard Worker u32 __afl_prev_ctx;
180*08b48e0bSAndroid Build Coastguard Worker #else
181*08b48e0bSAndroid Build Coastguard Worker __thread PREV_LOC_T __afl_prev_loc[NGRAM_SIZE_MAX];
182*08b48e0bSAndroid Build Coastguard Worker __thread PREV_LOC_T __afl_prev_caller[CTX_MAX_K];
183*08b48e0bSAndroid Build Coastguard Worker __thread u32 __afl_prev_ctx;
184*08b48e0bSAndroid Build Coastguard Worker #endif
185*08b48e0bSAndroid Build Coastguard Worker
186*08b48e0bSAndroid Build Coastguard Worker struct cmp_map *__afl_cmp_map;
187*08b48e0bSAndroid Build Coastguard Worker struct cmp_map *__afl_cmp_map_backup;
188*08b48e0bSAndroid Build Coastguard Worker
189*08b48e0bSAndroid Build Coastguard Worker /* Child pid? */
190*08b48e0bSAndroid Build Coastguard Worker
191*08b48e0bSAndroid Build Coastguard Worker static s32 child_pid;
192*08b48e0bSAndroid Build Coastguard Worker static void (*old_sigterm_handler)(int) = 0;
193*08b48e0bSAndroid Build Coastguard Worker
194*08b48e0bSAndroid Build Coastguard Worker /* Running in persistent mode? */
195*08b48e0bSAndroid Build Coastguard Worker
196*08b48e0bSAndroid Build Coastguard Worker static u8 is_persistent;
197*08b48e0bSAndroid Build Coastguard Worker
198*08b48e0bSAndroid Build Coastguard Worker /* Are we in sancov mode? */
199*08b48e0bSAndroid Build Coastguard Worker
200*08b48e0bSAndroid Build Coastguard Worker static u8 _is_sancov;
201*08b48e0bSAndroid Build Coastguard Worker
202*08b48e0bSAndroid Build Coastguard Worker /* Debug? */
203*08b48e0bSAndroid Build Coastguard Worker
204*08b48e0bSAndroid Build Coastguard Worker /*static*/ u32 __afl_debug;
205*08b48e0bSAndroid Build Coastguard Worker
206*08b48e0bSAndroid Build Coastguard Worker /* Already initialized markers */
207*08b48e0bSAndroid Build Coastguard Worker
208*08b48e0bSAndroid Build Coastguard Worker u32 __afl_already_initialized_shm;
209*08b48e0bSAndroid Build Coastguard Worker u32 __afl_already_initialized_forkserver;
210*08b48e0bSAndroid Build Coastguard Worker u32 __afl_already_initialized_first;
211*08b48e0bSAndroid Build Coastguard Worker u32 __afl_already_initialized_second;
212*08b48e0bSAndroid Build Coastguard Worker u32 __afl_already_initialized_early;
213*08b48e0bSAndroid Build Coastguard Worker u32 __afl_already_initialized_init;
214*08b48e0bSAndroid Build Coastguard Worker
215*08b48e0bSAndroid Build Coastguard Worker /* Dummy pipe for area_is_valid() */
216*08b48e0bSAndroid Build Coastguard Worker
217*08b48e0bSAndroid Build Coastguard Worker static int __afl_dummy_fd[2] = {2, 2};
218*08b48e0bSAndroid Build Coastguard Worker
219*08b48e0bSAndroid Build Coastguard Worker /* ensure we kill the child on termination */
220*08b48e0bSAndroid Build Coastguard Worker
at_exit(int signal)221*08b48e0bSAndroid Build Coastguard Worker static void at_exit(int signal) {
222*08b48e0bSAndroid Build Coastguard Worker
223*08b48e0bSAndroid Build Coastguard Worker if (unlikely(child_pid > 0)) {
224*08b48e0bSAndroid Build Coastguard Worker
225*08b48e0bSAndroid Build Coastguard Worker kill(child_pid, SIGKILL);
226*08b48e0bSAndroid Build Coastguard Worker waitpid(child_pid, NULL, 0);
227*08b48e0bSAndroid Build Coastguard Worker child_pid = -1;
228*08b48e0bSAndroid Build Coastguard Worker
229*08b48e0bSAndroid Build Coastguard Worker }
230*08b48e0bSAndroid Build Coastguard Worker
231*08b48e0bSAndroid Build Coastguard Worker _exit(0);
232*08b48e0bSAndroid Build Coastguard Worker
233*08b48e0bSAndroid Build Coastguard Worker }
234*08b48e0bSAndroid Build Coastguard Worker
235*08b48e0bSAndroid Build Coastguard Worker #define default_hash(a, b) XXH3_64bits(a, b)
236*08b48e0bSAndroid Build Coastguard Worker
237*08b48e0bSAndroid Build Coastguard Worker /* Uninspired gcc plugin instrumentation */
238*08b48e0bSAndroid Build Coastguard Worker
__afl_trace(const u32 x)239*08b48e0bSAndroid Build Coastguard Worker void __afl_trace(const u32 x) {
240*08b48e0bSAndroid Build Coastguard Worker
241*08b48e0bSAndroid Build Coastguard Worker PREV_LOC_T prev = __afl_prev_loc[0];
242*08b48e0bSAndroid Build Coastguard Worker __afl_prev_loc[0] = (x >> 1);
243*08b48e0bSAndroid Build Coastguard Worker
244*08b48e0bSAndroid Build Coastguard Worker u8 *p = &__afl_area_ptr[prev ^ x];
245*08b48e0bSAndroid Build Coastguard Worker
246*08b48e0bSAndroid Build Coastguard Worker #if 1 /* enable for neverZero feature. */
247*08b48e0bSAndroid Build Coastguard Worker #if __GNUC__
248*08b48e0bSAndroid Build Coastguard Worker u8 c = __builtin_add_overflow(*p, 1, p);
249*08b48e0bSAndroid Build Coastguard Worker *p += c;
250*08b48e0bSAndroid Build Coastguard Worker #else
251*08b48e0bSAndroid Build Coastguard Worker *p += 1 + ((u8)(1 + *p) == 0);
252*08b48e0bSAndroid Build Coastguard Worker #endif
253*08b48e0bSAndroid Build Coastguard Worker #else
254*08b48e0bSAndroid Build Coastguard Worker ++*p;
255*08b48e0bSAndroid Build Coastguard Worker #endif
256*08b48e0bSAndroid Build Coastguard Worker
257*08b48e0bSAndroid Build Coastguard Worker return;
258*08b48e0bSAndroid Build Coastguard Worker
259*08b48e0bSAndroid Build Coastguard Worker }
260*08b48e0bSAndroid Build Coastguard Worker
261*08b48e0bSAndroid Build Coastguard Worker /* Error reporting to forkserver controller */
262*08b48e0bSAndroid Build Coastguard Worker
send_forkserver_error(int error)263*08b48e0bSAndroid Build Coastguard Worker static void send_forkserver_error(int error) {
264*08b48e0bSAndroid Build Coastguard Worker
265*08b48e0bSAndroid Build Coastguard Worker u32 status;
266*08b48e0bSAndroid Build Coastguard Worker if (!error || error > 0xffff) return;
267*08b48e0bSAndroid Build Coastguard Worker status = (FS_OPT_ERROR | FS_OPT_SET_ERROR(error));
268*08b48e0bSAndroid Build Coastguard Worker if (write(FORKSRV_FD + 1, (char *)&status, 4) != 4) { return; }
269*08b48e0bSAndroid Build Coastguard Worker
270*08b48e0bSAndroid Build Coastguard Worker }
271*08b48e0bSAndroid Build Coastguard Worker
272*08b48e0bSAndroid Build Coastguard Worker /* SHM fuzzing setup. */
273*08b48e0bSAndroid Build Coastguard Worker
__afl_map_shm_fuzz()274*08b48e0bSAndroid Build Coastguard Worker static void __afl_map_shm_fuzz() {
275*08b48e0bSAndroid Build Coastguard Worker
276*08b48e0bSAndroid Build Coastguard Worker char *id_str = getenv(SHM_FUZZ_ENV_VAR);
277*08b48e0bSAndroid Build Coastguard Worker
278*08b48e0bSAndroid Build Coastguard Worker if (__afl_debug) {
279*08b48e0bSAndroid Build Coastguard Worker
280*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr, "DEBUG: fuzzcase shmem %s\n", id_str ? id_str : "none");
281*08b48e0bSAndroid Build Coastguard Worker
282*08b48e0bSAndroid Build Coastguard Worker }
283*08b48e0bSAndroid Build Coastguard Worker
284*08b48e0bSAndroid Build Coastguard Worker if (id_str) {
285*08b48e0bSAndroid Build Coastguard Worker
286*08b48e0bSAndroid Build Coastguard Worker u8 *map = NULL;
287*08b48e0bSAndroid Build Coastguard Worker
288*08b48e0bSAndroid Build Coastguard Worker #ifdef USEMMAP
289*08b48e0bSAndroid Build Coastguard Worker const char *shm_file_path = id_str;
290*08b48e0bSAndroid Build Coastguard Worker int shm_fd = -1;
291*08b48e0bSAndroid Build Coastguard Worker
292*08b48e0bSAndroid Build Coastguard Worker /* create the shared memory segment as if it was a file */
293*08b48e0bSAndroid Build Coastguard Worker shm_fd = shm_open(shm_file_path, O_RDWR, DEFAULT_PERMISSION);
294*08b48e0bSAndroid Build Coastguard Worker if (shm_fd == -1) {
295*08b48e0bSAndroid Build Coastguard Worker
296*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr, "shm_open() failed for fuzz\n");
297*08b48e0bSAndroid Build Coastguard Worker send_forkserver_error(FS_ERROR_SHM_OPEN);
298*08b48e0bSAndroid Build Coastguard Worker exit(1);
299*08b48e0bSAndroid Build Coastguard Worker
300*08b48e0bSAndroid Build Coastguard Worker }
301*08b48e0bSAndroid Build Coastguard Worker
302*08b48e0bSAndroid Build Coastguard Worker map =
303*08b48e0bSAndroid Build Coastguard Worker (u8 *)mmap(0, MAX_FILE + sizeof(u32), PROT_READ, MAP_SHARED, shm_fd, 0);
304*08b48e0bSAndroid Build Coastguard Worker
305*08b48e0bSAndroid Build Coastguard Worker #else
306*08b48e0bSAndroid Build Coastguard Worker u32 shm_id = atoi(id_str);
307*08b48e0bSAndroid Build Coastguard Worker map = (u8 *)shmat(shm_id, NULL, 0);
308*08b48e0bSAndroid Build Coastguard Worker
309*08b48e0bSAndroid Build Coastguard Worker #endif
310*08b48e0bSAndroid Build Coastguard Worker
311*08b48e0bSAndroid Build Coastguard Worker /* Whooooops. */
312*08b48e0bSAndroid Build Coastguard Worker
313*08b48e0bSAndroid Build Coastguard Worker if (!map || map == (void *)-1) {
314*08b48e0bSAndroid Build Coastguard Worker
315*08b48e0bSAndroid Build Coastguard Worker perror("Could not access fuzzing shared memory");
316*08b48e0bSAndroid Build Coastguard Worker send_forkserver_error(FS_ERROR_SHM_OPEN);
317*08b48e0bSAndroid Build Coastguard Worker exit(1);
318*08b48e0bSAndroid Build Coastguard Worker
319*08b48e0bSAndroid Build Coastguard Worker }
320*08b48e0bSAndroid Build Coastguard Worker
321*08b48e0bSAndroid Build Coastguard Worker __afl_fuzz_len = (u32 *)map;
322*08b48e0bSAndroid Build Coastguard Worker __afl_fuzz_ptr = map + sizeof(u32);
323*08b48e0bSAndroid Build Coastguard Worker
324*08b48e0bSAndroid Build Coastguard Worker if (__afl_debug) {
325*08b48e0bSAndroid Build Coastguard Worker
326*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr, "DEBUG: successfully got fuzzing shared memory\n");
327*08b48e0bSAndroid Build Coastguard Worker
328*08b48e0bSAndroid Build Coastguard Worker }
329*08b48e0bSAndroid Build Coastguard Worker
330*08b48e0bSAndroid Build Coastguard Worker } else {
331*08b48e0bSAndroid Build Coastguard Worker
332*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr, "Error: variable for fuzzing shared memory is not set\n");
333*08b48e0bSAndroid Build Coastguard Worker send_forkserver_error(FS_ERROR_SHM_OPEN);
334*08b48e0bSAndroid Build Coastguard Worker exit(1);
335*08b48e0bSAndroid Build Coastguard Worker
336*08b48e0bSAndroid Build Coastguard Worker }
337*08b48e0bSAndroid Build Coastguard Worker
338*08b48e0bSAndroid Build Coastguard Worker }
339*08b48e0bSAndroid Build Coastguard Worker
340*08b48e0bSAndroid Build Coastguard Worker /* SHM setup. */
341*08b48e0bSAndroid Build Coastguard Worker
__afl_map_shm(void)342*08b48e0bSAndroid Build Coastguard Worker static void __afl_map_shm(void) {
343*08b48e0bSAndroid Build Coastguard Worker
344*08b48e0bSAndroid Build Coastguard Worker if (__afl_already_initialized_shm) return;
345*08b48e0bSAndroid Build Coastguard Worker __afl_already_initialized_shm = 1;
346*08b48e0bSAndroid Build Coastguard Worker
347*08b48e0bSAndroid Build Coastguard Worker // if we are not running in afl ensure the map exists
348*08b48e0bSAndroid Build Coastguard Worker if (!__afl_area_ptr) { __afl_area_ptr = __afl_area_ptr_dummy; }
349*08b48e0bSAndroid Build Coastguard Worker
350*08b48e0bSAndroid Build Coastguard Worker char *id_str = getenv(SHM_ENV_VAR);
351*08b48e0bSAndroid Build Coastguard Worker
352*08b48e0bSAndroid Build Coastguard Worker if (__afl_final_loc) {
353*08b48e0bSAndroid Build Coastguard Worker
354*08b48e0bSAndroid Build Coastguard Worker __afl_map_size = ++__afl_final_loc; // as we count starting 0
355*08b48e0bSAndroid Build Coastguard Worker
356*08b48e0bSAndroid Build Coastguard Worker if (getenv("AFL_DUMP_MAP_SIZE")) {
357*08b48e0bSAndroid Build Coastguard Worker
358*08b48e0bSAndroid Build Coastguard Worker printf("%u\n", __afl_map_size);
359*08b48e0bSAndroid Build Coastguard Worker exit(-1);
360*08b48e0bSAndroid Build Coastguard Worker
361*08b48e0bSAndroid Build Coastguard Worker }
362*08b48e0bSAndroid Build Coastguard Worker
363*08b48e0bSAndroid Build Coastguard Worker if (__afl_final_loc > MAP_SIZE) {
364*08b48e0bSAndroid Build Coastguard Worker
365*08b48e0bSAndroid Build Coastguard Worker char *ptr;
366*08b48e0bSAndroid Build Coastguard Worker u32 val = 0;
367*08b48e0bSAndroid Build Coastguard Worker if ((ptr = getenv("AFL_MAP_SIZE")) != NULL) { val = atoi(ptr); }
368*08b48e0bSAndroid Build Coastguard Worker if (val < __afl_final_loc) {
369*08b48e0bSAndroid Build Coastguard Worker
370*08b48e0bSAndroid Build Coastguard Worker if (__afl_final_loc > FS_OPT_MAX_MAPSIZE) {
371*08b48e0bSAndroid Build Coastguard Worker
372*08b48e0bSAndroid Build Coastguard Worker if (!getenv("AFL_QUIET"))
373*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr,
374*08b48e0bSAndroid Build Coastguard Worker "Error: AFL++ tools *require* to set AFL_MAP_SIZE to %u "
375*08b48e0bSAndroid Build Coastguard Worker "to be able to run this instrumented program!\n",
376*08b48e0bSAndroid Build Coastguard Worker __afl_final_loc);
377*08b48e0bSAndroid Build Coastguard Worker
378*08b48e0bSAndroid Build Coastguard Worker if (id_str) {
379*08b48e0bSAndroid Build Coastguard Worker
380*08b48e0bSAndroid Build Coastguard Worker send_forkserver_error(FS_ERROR_MAP_SIZE);
381*08b48e0bSAndroid Build Coastguard Worker exit(-1);
382*08b48e0bSAndroid Build Coastguard Worker
383*08b48e0bSAndroid Build Coastguard Worker }
384*08b48e0bSAndroid Build Coastguard Worker
385*08b48e0bSAndroid Build Coastguard Worker } else {
386*08b48e0bSAndroid Build Coastguard Worker
387*08b48e0bSAndroid Build Coastguard Worker if (__afl_final_loc > MAP_INITIAL_SIZE && !getenv("AFL_QUIET")) {
388*08b48e0bSAndroid Build Coastguard Worker
389*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr,
390*08b48e0bSAndroid Build Coastguard Worker "Warning: AFL++ tools might need to set AFL_MAP_SIZE to %u "
391*08b48e0bSAndroid Build Coastguard Worker "to be able to run this instrumented program if this "
392*08b48e0bSAndroid Build Coastguard Worker "crashes!\n",
393*08b48e0bSAndroid Build Coastguard Worker __afl_final_loc);
394*08b48e0bSAndroid Build Coastguard Worker
395*08b48e0bSAndroid Build Coastguard Worker }
396*08b48e0bSAndroid Build Coastguard Worker
397*08b48e0bSAndroid Build Coastguard Worker }
398*08b48e0bSAndroid Build Coastguard Worker
399*08b48e0bSAndroid Build Coastguard Worker }
400*08b48e0bSAndroid Build Coastguard Worker
401*08b48e0bSAndroid Build Coastguard Worker }
402*08b48e0bSAndroid Build Coastguard Worker
403*08b48e0bSAndroid Build Coastguard Worker } else {
404*08b48e0bSAndroid Build Coastguard Worker
405*08b48e0bSAndroid Build Coastguard Worker if (getenv("AFL_DUMP_MAP_SIZE")) {
406*08b48e0bSAndroid Build Coastguard Worker
407*08b48e0bSAndroid Build Coastguard Worker printf("%u\n", MAP_SIZE);
408*08b48e0bSAndroid Build Coastguard Worker exit(-1);
409*08b48e0bSAndroid Build Coastguard Worker
410*08b48e0bSAndroid Build Coastguard Worker }
411*08b48e0bSAndroid Build Coastguard Worker
412*08b48e0bSAndroid Build Coastguard Worker }
413*08b48e0bSAndroid Build Coastguard Worker
414*08b48e0bSAndroid Build Coastguard Worker if (__afl_sharedmem_fuzzing && (!id_str || !getenv(SHM_FUZZ_ENV_VAR) ||
415*08b48e0bSAndroid Build Coastguard Worker fcntl(FORKSRV_FD, F_GETFD) == -1 ||
416*08b48e0bSAndroid Build Coastguard Worker fcntl(FORKSRV_FD + 1, F_GETFD) == -1)) {
417*08b48e0bSAndroid Build Coastguard Worker
418*08b48e0bSAndroid Build Coastguard Worker if (__afl_debug) {
419*08b48e0bSAndroid Build Coastguard Worker
420*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr,
421*08b48e0bSAndroid Build Coastguard Worker "DEBUG: running not inside afl-fuzz, disabling shared memory "
422*08b48e0bSAndroid Build Coastguard Worker "testcases\n");
423*08b48e0bSAndroid Build Coastguard Worker
424*08b48e0bSAndroid Build Coastguard Worker }
425*08b48e0bSAndroid Build Coastguard Worker
426*08b48e0bSAndroid Build Coastguard Worker __afl_sharedmem_fuzzing = 0;
427*08b48e0bSAndroid Build Coastguard Worker
428*08b48e0bSAndroid Build Coastguard Worker }
429*08b48e0bSAndroid Build Coastguard Worker
430*08b48e0bSAndroid Build Coastguard Worker if (!id_str) {
431*08b48e0bSAndroid Build Coastguard Worker
432*08b48e0bSAndroid Build Coastguard Worker u32 val = 0;
433*08b48e0bSAndroid Build Coastguard Worker u8 *ptr;
434*08b48e0bSAndroid Build Coastguard Worker
435*08b48e0bSAndroid Build Coastguard Worker if ((ptr = getenv("AFL_MAP_SIZE")) != NULL) { val = atoi(ptr); }
436*08b48e0bSAndroid Build Coastguard Worker
437*08b48e0bSAndroid Build Coastguard Worker if (val > MAP_INITIAL_SIZE) {
438*08b48e0bSAndroid Build Coastguard Worker
439*08b48e0bSAndroid Build Coastguard Worker __afl_map_size = val;
440*08b48e0bSAndroid Build Coastguard Worker
441*08b48e0bSAndroid Build Coastguard Worker } else {
442*08b48e0bSAndroid Build Coastguard Worker
443*08b48e0bSAndroid Build Coastguard Worker if (__afl_first_final_loc > MAP_INITIAL_SIZE) {
444*08b48e0bSAndroid Build Coastguard Worker
445*08b48e0bSAndroid Build Coastguard Worker // done in second stage constructor
446*08b48e0bSAndroid Build Coastguard Worker __afl_map_size = __afl_first_final_loc;
447*08b48e0bSAndroid Build Coastguard Worker
448*08b48e0bSAndroid Build Coastguard Worker } else {
449*08b48e0bSAndroid Build Coastguard Worker
450*08b48e0bSAndroid Build Coastguard Worker __afl_map_size = MAP_INITIAL_SIZE;
451*08b48e0bSAndroid Build Coastguard Worker
452*08b48e0bSAndroid Build Coastguard Worker }
453*08b48e0bSAndroid Build Coastguard Worker
454*08b48e0bSAndroid Build Coastguard Worker }
455*08b48e0bSAndroid Build Coastguard Worker
456*08b48e0bSAndroid Build Coastguard Worker if (__afl_map_size > MAP_INITIAL_SIZE && __afl_final_loc < __afl_map_size) {
457*08b48e0bSAndroid Build Coastguard Worker
458*08b48e0bSAndroid Build Coastguard Worker __afl_final_loc = __afl_map_size;
459*08b48e0bSAndroid Build Coastguard Worker
460*08b48e0bSAndroid Build Coastguard Worker }
461*08b48e0bSAndroid Build Coastguard Worker
462*08b48e0bSAndroid Build Coastguard Worker if (__afl_debug) {
463*08b48e0bSAndroid Build Coastguard Worker
464*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr, "DEBUG: (0) init map size is %u to %p\n", __afl_map_size,
465*08b48e0bSAndroid Build Coastguard Worker __afl_area_ptr_dummy);
466*08b48e0bSAndroid Build Coastguard Worker
467*08b48e0bSAndroid Build Coastguard Worker }
468*08b48e0bSAndroid Build Coastguard Worker
469*08b48e0bSAndroid Build Coastguard Worker }
470*08b48e0bSAndroid Build Coastguard Worker
471*08b48e0bSAndroid Build Coastguard Worker /* If we're running under AFL, attach to the appropriate region, replacing the
472*08b48e0bSAndroid Build Coastguard Worker early-stage __afl_area_initial region that is needed to allow some really
473*08b48e0bSAndroid Build Coastguard Worker hacky .init code to work correctly in projects such as OpenSSL. */
474*08b48e0bSAndroid Build Coastguard Worker
475*08b48e0bSAndroid Build Coastguard Worker if (__afl_debug) {
476*08b48e0bSAndroid Build Coastguard Worker
477*08b48e0bSAndroid Build Coastguard Worker fprintf(
478*08b48e0bSAndroid Build Coastguard Worker stderr,
479*08b48e0bSAndroid Build Coastguard Worker "DEBUG: (1) id_str %s, __afl_area_ptr %p, __afl_area_initial %p, "
480*08b48e0bSAndroid Build Coastguard Worker "__afl_area_ptr_dummy %p, __afl_map_addr 0x%llx, MAP_SIZE %u, "
481*08b48e0bSAndroid Build Coastguard Worker "__afl_final_loc %u, __afl_map_size %u, max_size_forkserver %u/0x%x\n",
482*08b48e0bSAndroid Build Coastguard Worker id_str == NULL ? "<null>" : id_str, __afl_area_ptr, __afl_area_initial,
483*08b48e0bSAndroid Build Coastguard Worker __afl_area_ptr_dummy, __afl_map_addr, MAP_SIZE, __afl_final_loc,
484*08b48e0bSAndroid Build Coastguard Worker __afl_map_size, FS_OPT_MAX_MAPSIZE, FS_OPT_MAX_MAPSIZE);
485*08b48e0bSAndroid Build Coastguard Worker
486*08b48e0bSAndroid Build Coastguard Worker }
487*08b48e0bSAndroid Build Coastguard Worker
488*08b48e0bSAndroid Build Coastguard Worker if (id_str) {
489*08b48e0bSAndroid Build Coastguard Worker
490*08b48e0bSAndroid Build Coastguard Worker if (__afl_area_ptr && __afl_area_ptr != __afl_area_initial &&
491*08b48e0bSAndroid Build Coastguard Worker __afl_area_ptr != __afl_area_ptr_dummy) {
492*08b48e0bSAndroid Build Coastguard Worker
493*08b48e0bSAndroid Build Coastguard Worker if (__afl_map_addr) {
494*08b48e0bSAndroid Build Coastguard Worker
495*08b48e0bSAndroid Build Coastguard Worker munmap((void *)__afl_map_addr, __afl_final_loc);
496*08b48e0bSAndroid Build Coastguard Worker
497*08b48e0bSAndroid Build Coastguard Worker } else {
498*08b48e0bSAndroid Build Coastguard Worker
499*08b48e0bSAndroid Build Coastguard Worker free(__afl_area_ptr);
500*08b48e0bSAndroid Build Coastguard Worker
501*08b48e0bSAndroid Build Coastguard Worker }
502*08b48e0bSAndroid Build Coastguard Worker
503*08b48e0bSAndroid Build Coastguard Worker __afl_area_ptr = __afl_area_ptr_dummy;
504*08b48e0bSAndroid Build Coastguard Worker
505*08b48e0bSAndroid Build Coastguard Worker }
506*08b48e0bSAndroid Build Coastguard Worker
507*08b48e0bSAndroid Build Coastguard Worker #ifdef USEMMAP
508*08b48e0bSAndroid Build Coastguard Worker const char *shm_file_path = id_str;
509*08b48e0bSAndroid Build Coastguard Worker int shm_fd = -1;
510*08b48e0bSAndroid Build Coastguard Worker unsigned char *shm_base = NULL;
511*08b48e0bSAndroid Build Coastguard Worker
512*08b48e0bSAndroid Build Coastguard Worker /* create the shared memory segment as if it was a file */
513*08b48e0bSAndroid Build Coastguard Worker shm_fd = shm_open(shm_file_path, O_RDWR, DEFAULT_PERMISSION);
514*08b48e0bSAndroid Build Coastguard Worker if (shm_fd == -1) {
515*08b48e0bSAndroid Build Coastguard Worker
516*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr, "shm_open() failed\n");
517*08b48e0bSAndroid Build Coastguard Worker send_forkserver_error(FS_ERROR_SHM_OPEN);
518*08b48e0bSAndroid Build Coastguard Worker exit(1);
519*08b48e0bSAndroid Build Coastguard Worker
520*08b48e0bSAndroid Build Coastguard Worker }
521*08b48e0bSAndroid Build Coastguard Worker
522*08b48e0bSAndroid Build Coastguard Worker /* map the shared memory segment to the address space of the process */
523*08b48e0bSAndroid Build Coastguard Worker if (__afl_map_addr) {
524*08b48e0bSAndroid Build Coastguard Worker
525*08b48e0bSAndroid Build Coastguard Worker shm_base =
526*08b48e0bSAndroid Build Coastguard Worker mmap((void *)__afl_map_addr, __afl_map_size, PROT_READ | PROT_WRITE,
527*08b48e0bSAndroid Build Coastguard Worker MAP_FIXED_NOREPLACE | MAP_SHARED, shm_fd, 0);
528*08b48e0bSAndroid Build Coastguard Worker
529*08b48e0bSAndroid Build Coastguard Worker } else {
530*08b48e0bSAndroid Build Coastguard Worker
531*08b48e0bSAndroid Build Coastguard Worker shm_base = mmap(0, __afl_map_size, PROT_READ | PROT_WRITE, MAP_SHARED,
532*08b48e0bSAndroid Build Coastguard Worker shm_fd, 0);
533*08b48e0bSAndroid Build Coastguard Worker
534*08b48e0bSAndroid Build Coastguard Worker }
535*08b48e0bSAndroid Build Coastguard Worker
536*08b48e0bSAndroid Build Coastguard Worker close(shm_fd);
537*08b48e0bSAndroid Build Coastguard Worker shm_fd = -1;
538*08b48e0bSAndroid Build Coastguard Worker
539*08b48e0bSAndroid Build Coastguard Worker if (shm_base == MAP_FAILED) {
540*08b48e0bSAndroid Build Coastguard Worker
541*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr, "mmap() failed\n");
542*08b48e0bSAndroid Build Coastguard Worker perror("mmap for map");
543*08b48e0bSAndroid Build Coastguard Worker
544*08b48e0bSAndroid Build Coastguard Worker if (__afl_map_addr)
545*08b48e0bSAndroid Build Coastguard Worker send_forkserver_error(FS_ERROR_MAP_ADDR);
546*08b48e0bSAndroid Build Coastguard Worker else
547*08b48e0bSAndroid Build Coastguard Worker send_forkserver_error(FS_ERROR_MMAP);
548*08b48e0bSAndroid Build Coastguard Worker
549*08b48e0bSAndroid Build Coastguard Worker exit(2);
550*08b48e0bSAndroid Build Coastguard Worker
551*08b48e0bSAndroid Build Coastguard Worker }
552*08b48e0bSAndroid Build Coastguard Worker
553*08b48e0bSAndroid Build Coastguard Worker __afl_area_ptr = shm_base;
554*08b48e0bSAndroid Build Coastguard Worker #else
555*08b48e0bSAndroid Build Coastguard Worker u32 shm_id = atoi(id_str);
556*08b48e0bSAndroid Build Coastguard Worker
557*08b48e0bSAndroid Build Coastguard Worker if (__afl_map_size && __afl_map_size > MAP_SIZE) {
558*08b48e0bSAndroid Build Coastguard Worker
559*08b48e0bSAndroid Build Coastguard Worker u8 *map_env = (u8 *)getenv("AFL_MAP_SIZE");
560*08b48e0bSAndroid Build Coastguard Worker if (!map_env || atoi((char *)map_env) < MAP_SIZE) {
561*08b48e0bSAndroid Build Coastguard Worker
562*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr, "FS_ERROR_MAP_SIZE\n");
563*08b48e0bSAndroid Build Coastguard Worker send_forkserver_error(FS_ERROR_MAP_SIZE);
564*08b48e0bSAndroid Build Coastguard Worker _exit(1);
565*08b48e0bSAndroid Build Coastguard Worker
566*08b48e0bSAndroid Build Coastguard Worker }
567*08b48e0bSAndroid Build Coastguard Worker
568*08b48e0bSAndroid Build Coastguard Worker }
569*08b48e0bSAndroid Build Coastguard Worker
570*08b48e0bSAndroid Build Coastguard Worker __afl_area_ptr = (u8 *)shmat(shm_id, (void *)__afl_map_addr, 0);
571*08b48e0bSAndroid Build Coastguard Worker
572*08b48e0bSAndroid Build Coastguard Worker /* Whooooops. */
573*08b48e0bSAndroid Build Coastguard Worker
574*08b48e0bSAndroid Build Coastguard Worker if (!__afl_area_ptr || __afl_area_ptr == (void *)-1) {
575*08b48e0bSAndroid Build Coastguard Worker
576*08b48e0bSAndroid Build Coastguard Worker if (__afl_map_addr)
577*08b48e0bSAndroid Build Coastguard Worker send_forkserver_error(FS_ERROR_MAP_ADDR);
578*08b48e0bSAndroid Build Coastguard Worker else
579*08b48e0bSAndroid Build Coastguard Worker send_forkserver_error(FS_ERROR_SHMAT);
580*08b48e0bSAndroid Build Coastguard Worker
581*08b48e0bSAndroid Build Coastguard Worker perror("shmat for map");
582*08b48e0bSAndroid Build Coastguard Worker _exit(1);
583*08b48e0bSAndroid Build Coastguard Worker
584*08b48e0bSAndroid Build Coastguard Worker }
585*08b48e0bSAndroid Build Coastguard Worker
586*08b48e0bSAndroid Build Coastguard Worker #endif
587*08b48e0bSAndroid Build Coastguard Worker
588*08b48e0bSAndroid Build Coastguard Worker /* Write something into the bitmap so that even with low AFL_INST_RATIO,
589*08b48e0bSAndroid Build Coastguard Worker our parent doesn't give up on us. */
590*08b48e0bSAndroid Build Coastguard Worker
591*08b48e0bSAndroid Build Coastguard Worker __afl_area_ptr[0] = 1;
592*08b48e0bSAndroid Build Coastguard Worker
593*08b48e0bSAndroid Build Coastguard Worker } else if ((!__afl_area_ptr || __afl_area_ptr == __afl_area_initial) &&
594*08b48e0bSAndroid Build Coastguard Worker
595*08b48e0bSAndroid Build Coastguard Worker __afl_map_addr) {
596*08b48e0bSAndroid Build Coastguard Worker
597*08b48e0bSAndroid Build Coastguard Worker __afl_area_ptr = (u8 *)mmap(
598*08b48e0bSAndroid Build Coastguard Worker (void *)__afl_map_addr, __afl_map_size, PROT_READ | PROT_WRITE,
599*08b48e0bSAndroid Build Coastguard Worker MAP_FIXED_NOREPLACE | MAP_SHARED | MAP_ANONYMOUS, -1, 0);
600*08b48e0bSAndroid Build Coastguard Worker
601*08b48e0bSAndroid Build Coastguard Worker if (__afl_area_ptr == MAP_FAILED) {
602*08b48e0bSAndroid Build Coastguard Worker
603*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr, "can not acquire mmap for address %p\n",
604*08b48e0bSAndroid Build Coastguard Worker (void *)__afl_map_addr);
605*08b48e0bSAndroid Build Coastguard Worker send_forkserver_error(FS_ERROR_SHM_OPEN);
606*08b48e0bSAndroid Build Coastguard Worker exit(1);
607*08b48e0bSAndroid Build Coastguard Worker
608*08b48e0bSAndroid Build Coastguard Worker }
609*08b48e0bSAndroid Build Coastguard Worker
610*08b48e0bSAndroid Build Coastguard Worker } else if (__afl_final_loc > MAP_INITIAL_SIZE &&
611*08b48e0bSAndroid Build Coastguard Worker
612*08b48e0bSAndroid Build Coastguard Worker __afl_final_loc > __afl_first_final_loc) {
613*08b48e0bSAndroid Build Coastguard Worker
614*08b48e0bSAndroid Build Coastguard Worker if (__afl_area_initial != __afl_area_ptr_dummy) {
615*08b48e0bSAndroid Build Coastguard Worker
616*08b48e0bSAndroid Build Coastguard Worker free(__afl_area_ptr_dummy);
617*08b48e0bSAndroid Build Coastguard Worker
618*08b48e0bSAndroid Build Coastguard Worker }
619*08b48e0bSAndroid Build Coastguard Worker
620*08b48e0bSAndroid Build Coastguard Worker __afl_area_ptr_dummy = (u8 *)malloc(__afl_final_loc);
621*08b48e0bSAndroid Build Coastguard Worker __afl_area_ptr = __afl_area_ptr_dummy;
622*08b48e0bSAndroid Build Coastguard Worker __afl_map_size = __afl_final_loc;
623*08b48e0bSAndroid Build Coastguard Worker
624*08b48e0bSAndroid Build Coastguard Worker if (!__afl_area_ptr_dummy) {
625*08b48e0bSAndroid Build Coastguard Worker
626*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr,
627*08b48e0bSAndroid Build Coastguard Worker "Error: AFL++ could not acquire %u bytes of memory, exiting!\n",
628*08b48e0bSAndroid Build Coastguard Worker __afl_final_loc);
629*08b48e0bSAndroid Build Coastguard Worker exit(-1);
630*08b48e0bSAndroid Build Coastguard Worker
631*08b48e0bSAndroid Build Coastguard Worker }
632*08b48e0bSAndroid Build Coastguard Worker
633*08b48e0bSAndroid Build Coastguard Worker } // else: nothing to be done
634*08b48e0bSAndroid Build Coastguard Worker
635*08b48e0bSAndroid Build Coastguard Worker __afl_area_ptr_backup = __afl_area_ptr;
636*08b48e0bSAndroid Build Coastguard Worker
637*08b48e0bSAndroid Build Coastguard Worker if (__afl_debug) {
638*08b48e0bSAndroid Build Coastguard Worker
639*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr,
640*08b48e0bSAndroid Build Coastguard Worker "DEBUG: (2) id_str %s, __afl_area_ptr %p, __afl_area_initial %p, "
641*08b48e0bSAndroid Build Coastguard Worker "__afl_area_ptr_dummy %p, __afl_map_addr 0x%llx, MAP_SIZE "
642*08b48e0bSAndroid Build Coastguard Worker "%u, __afl_final_loc %u, __afl_map_size %u, "
643*08b48e0bSAndroid Build Coastguard Worker "max_size_forkserver %u/0x%x\n",
644*08b48e0bSAndroid Build Coastguard Worker id_str == NULL ? "<null>" : id_str, __afl_area_ptr,
645*08b48e0bSAndroid Build Coastguard Worker __afl_area_initial, __afl_area_ptr_dummy, __afl_map_addr, MAP_SIZE,
646*08b48e0bSAndroid Build Coastguard Worker __afl_final_loc, __afl_map_size, FS_OPT_MAX_MAPSIZE,
647*08b48e0bSAndroid Build Coastguard Worker FS_OPT_MAX_MAPSIZE);
648*08b48e0bSAndroid Build Coastguard Worker
649*08b48e0bSAndroid Build Coastguard Worker }
650*08b48e0bSAndroid Build Coastguard Worker
651*08b48e0bSAndroid Build Coastguard Worker if (__afl_selective_coverage) {
652*08b48e0bSAndroid Build Coastguard Worker
653*08b48e0bSAndroid Build Coastguard Worker if (__afl_map_size > MAP_INITIAL_SIZE) {
654*08b48e0bSAndroid Build Coastguard Worker
655*08b48e0bSAndroid Build Coastguard Worker __afl_area_ptr_dummy = (u8 *)malloc(__afl_map_size);
656*08b48e0bSAndroid Build Coastguard Worker
657*08b48e0bSAndroid Build Coastguard Worker if (__afl_area_ptr_dummy) {
658*08b48e0bSAndroid Build Coastguard Worker
659*08b48e0bSAndroid Build Coastguard Worker if (__afl_selective_coverage_start_off) {
660*08b48e0bSAndroid Build Coastguard Worker
661*08b48e0bSAndroid Build Coastguard Worker __afl_area_ptr = __afl_area_ptr_dummy;
662*08b48e0bSAndroid Build Coastguard Worker
663*08b48e0bSAndroid Build Coastguard Worker }
664*08b48e0bSAndroid Build Coastguard Worker
665*08b48e0bSAndroid Build Coastguard Worker } else {
666*08b48e0bSAndroid Build Coastguard Worker
667*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr, "Error: __afl_selective_coverage failed!\n");
668*08b48e0bSAndroid Build Coastguard Worker __afl_selective_coverage = 0;
669*08b48e0bSAndroid Build Coastguard Worker // continue;
670*08b48e0bSAndroid Build Coastguard Worker
671*08b48e0bSAndroid Build Coastguard Worker }
672*08b48e0bSAndroid Build Coastguard Worker
673*08b48e0bSAndroid Build Coastguard Worker }
674*08b48e0bSAndroid Build Coastguard Worker
675*08b48e0bSAndroid Build Coastguard Worker }
676*08b48e0bSAndroid Build Coastguard Worker
677*08b48e0bSAndroid Build Coastguard Worker id_str = getenv(CMPLOG_SHM_ENV_VAR);
678*08b48e0bSAndroid Build Coastguard Worker
679*08b48e0bSAndroid Build Coastguard Worker if (__afl_debug) {
680*08b48e0bSAndroid Build Coastguard Worker
681*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr, "DEBUG: cmplog id_str %s\n",
682*08b48e0bSAndroid Build Coastguard Worker id_str == NULL ? "<null>" : id_str);
683*08b48e0bSAndroid Build Coastguard Worker
684*08b48e0bSAndroid Build Coastguard Worker }
685*08b48e0bSAndroid Build Coastguard Worker
686*08b48e0bSAndroid Build Coastguard Worker if (id_str) {
687*08b48e0bSAndroid Build Coastguard Worker
688*08b48e0bSAndroid Build Coastguard Worker // /dev/null doesn't work so we use /dev/urandom
689*08b48e0bSAndroid Build Coastguard Worker if ((__afl_dummy_fd[1] = open("/dev/urandom", O_WRONLY)) < 0) {
690*08b48e0bSAndroid Build Coastguard Worker
691*08b48e0bSAndroid Build Coastguard Worker if (pipe(__afl_dummy_fd) < 0) { __afl_dummy_fd[1] = 1; }
692*08b48e0bSAndroid Build Coastguard Worker
693*08b48e0bSAndroid Build Coastguard Worker }
694*08b48e0bSAndroid Build Coastguard Worker
695*08b48e0bSAndroid Build Coastguard Worker #ifdef USEMMAP
696*08b48e0bSAndroid Build Coastguard Worker const char *shm_file_path = id_str;
697*08b48e0bSAndroid Build Coastguard Worker int shm_fd = -1;
698*08b48e0bSAndroid Build Coastguard Worker struct cmp_map *shm_base = NULL;
699*08b48e0bSAndroid Build Coastguard Worker
700*08b48e0bSAndroid Build Coastguard Worker /* create the shared memory segment as if it was a file */
701*08b48e0bSAndroid Build Coastguard Worker shm_fd = shm_open(shm_file_path, O_RDWR, DEFAULT_PERMISSION);
702*08b48e0bSAndroid Build Coastguard Worker if (shm_fd == -1) {
703*08b48e0bSAndroid Build Coastguard Worker
704*08b48e0bSAndroid Build Coastguard Worker perror("shm_open() failed\n");
705*08b48e0bSAndroid Build Coastguard Worker send_forkserver_error(FS_ERROR_SHM_OPEN);
706*08b48e0bSAndroid Build Coastguard Worker exit(1);
707*08b48e0bSAndroid Build Coastguard Worker
708*08b48e0bSAndroid Build Coastguard Worker }
709*08b48e0bSAndroid Build Coastguard Worker
710*08b48e0bSAndroid Build Coastguard Worker /* map the shared memory segment to the address space of the process */
711*08b48e0bSAndroid Build Coastguard Worker shm_base = mmap(0, sizeof(struct cmp_map), PROT_READ | PROT_WRITE,
712*08b48e0bSAndroid Build Coastguard Worker MAP_SHARED, shm_fd, 0);
713*08b48e0bSAndroid Build Coastguard Worker if (shm_base == MAP_FAILED) {
714*08b48e0bSAndroid Build Coastguard Worker
715*08b48e0bSAndroid Build Coastguard Worker close(shm_fd);
716*08b48e0bSAndroid Build Coastguard Worker shm_fd = -1;
717*08b48e0bSAndroid Build Coastguard Worker
718*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr, "mmap() failed\n");
719*08b48e0bSAndroid Build Coastguard Worker send_forkserver_error(FS_ERROR_SHM_OPEN);
720*08b48e0bSAndroid Build Coastguard Worker exit(2);
721*08b48e0bSAndroid Build Coastguard Worker
722*08b48e0bSAndroid Build Coastguard Worker }
723*08b48e0bSAndroid Build Coastguard Worker
724*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map = shm_base;
725*08b48e0bSAndroid Build Coastguard Worker #else
726*08b48e0bSAndroid Build Coastguard Worker u32 shm_id = atoi(id_str);
727*08b48e0bSAndroid Build Coastguard Worker
728*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map = (struct cmp_map *)shmat(shm_id, NULL, 0);
729*08b48e0bSAndroid Build Coastguard Worker #endif
730*08b48e0bSAndroid Build Coastguard Worker
731*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map_backup = __afl_cmp_map;
732*08b48e0bSAndroid Build Coastguard Worker
733*08b48e0bSAndroid Build Coastguard Worker if (!__afl_cmp_map || __afl_cmp_map == (void *)-1) {
734*08b48e0bSAndroid Build Coastguard Worker
735*08b48e0bSAndroid Build Coastguard Worker perror("shmat for cmplog");
736*08b48e0bSAndroid Build Coastguard Worker send_forkserver_error(FS_ERROR_SHM_OPEN);
737*08b48e0bSAndroid Build Coastguard Worker _exit(1);
738*08b48e0bSAndroid Build Coastguard Worker
739*08b48e0bSAndroid Build Coastguard Worker }
740*08b48e0bSAndroid Build Coastguard Worker
741*08b48e0bSAndroid Build Coastguard Worker }
742*08b48e0bSAndroid Build Coastguard Worker
743*08b48e0bSAndroid Build Coastguard Worker #ifdef __AFL_CODE_COVERAGE
744*08b48e0bSAndroid Build Coastguard Worker char *pcmap_id_str = getenv("__AFL_PCMAP_SHM_ID");
745*08b48e0bSAndroid Build Coastguard Worker
746*08b48e0bSAndroid Build Coastguard Worker if (pcmap_id_str) {
747*08b48e0bSAndroid Build Coastguard Worker
748*08b48e0bSAndroid Build Coastguard Worker __afl_pcmap_size = __afl_map_size * sizeof(void *);
749*08b48e0bSAndroid Build Coastguard Worker u32 shm_id = atoi(pcmap_id_str);
750*08b48e0bSAndroid Build Coastguard Worker
751*08b48e0bSAndroid Build Coastguard Worker __afl_pcmap_ptr = (uintptr_t *)shmat(shm_id, NULL, 0);
752*08b48e0bSAndroid Build Coastguard Worker
753*08b48e0bSAndroid Build Coastguard Worker if (__afl_debug) {
754*08b48e0bSAndroid Build Coastguard Worker
755*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr, "DEBUG: Received %p via shmat for pcmap\n",
756*08b48e0bSAndroid Build Coastguard Worker __afl_pcmap_ptr);
757*08b48e0bSAndroid Build Coastguard Worker
758*08b48e0bSAndroid Build Coastguard Worker }
759*08b48e0bSAndroid Build Coastguard Worker
760*08b48e0bSAndroid Build Coastguard Worker }
761*08b48e0bSAndroid Build Coastguard Worker
762*08b48e0bSAndroid Build Coastguard Worker #endif // __AFL_CODE_COVERAGE
763*08b48e0bSAndroid Build Coastguard Worker
764*08b48e0bSAndroid Build Coastguard Worker }
765*08b48e0bSAndroid Build Coastguard Worker
766*08b48e0bSAndroid Build Coastguard Worker /* unmap SHM. */
767*08b48e0bSAndroid Build Coastguard Worker
__afl_unmap_shm(void)768*08b48e0bSAndroid Build Coastguard Worker static void __afl_unmap_shm(void) {
769*08b48e0bSAndroid Build Coastguard Worker
770*08b48e0bSAndroid Build Coastguard Worker if (!__afl_already_initialized_shm) return;
771*08b48e0bSAndroid Build Coastguard Worker
772*08b48e0bSAndroid Build Coastguard Worker #ifdef __AFL_CODE_COVERAGE
773*08b48e0bSAndroid Build Coastguard Worker if (__afl_pcmap_size) {
774*08b48e0bSAndroid Build Coastguard Worker
775*08b48e0bSAndroid Build Coastguard Worker shmdt((void *)__afl_pcmap_ptr);
776*08b48e0bSAndroid Build Coastguard Worker __afl_pcmap_ptr = NULL;
777*08b48e0bSAndroid Build Coastguard Worker __afl_pcmap_size = 0;
778*08b48e0bSAndroid Build Coastguard Worker
779*08b48e0bSAndroid Build Coastguard Worker }
780*08b48e0bSAndroid Build Coastguard Worker
781*08b48e0bSAndroid Build Coastguard Worker #endif // __AFL_CODE_COVERAGE
782*08b48e0bSAndroid Build Coastguard Worker
783*08b48e0bSAndroid Build Coastguard Worker char *id_str = getenv(SHM_ENV_VAR);
784*08b48e0bSAndroid Build Coastguard Worker
785*08b48e0bSAndroid Build Coastguard Worker if (id_str) {
786*08b48e0bSAndroid Build Coastguard Worker
787*08b48e0bSAndroid Build Coastguard Worker #ifdef USEMMAP
788*08b48e0bSAndroid Build Coastguard Worker
789*08b48e0bSAndroid Build Coastguard Worker munmap((void *)__afl_area_ptr, __afl_map_size);
790*08b48e0bSAndroid Build Coastguard Worker
791*08b48e0bSAndroid Build Coastguard Worker #else
792*08b48e0bSAndroid Build Coastguard Worker
793*08b48e0bSAndroid Build Coastguard Worker shmdt((void *)__afl_area_ptr);
794*08b48e0bSAndroid Build Coastguard Worker
795*08b48e0bSAndroid Build Coastguard Worker #endif
796*08b48e0bSAndroid Build Coastguard Worker
797*08b48e0bSAndroid Build Coastguard Worker } else if ((!__afl_area_ptr || __afl_area_ptr == __afl_area_initial) &&
798*08b48e0bSAndroid Build Coastguard Worker
799*08b48e0bSAndroid Build Coastguard Worker __afl_map_addr) {
800*08b48e0bSAndroid Build Coastguard Worker
801*08b48e0bSAndroid Build Coastguard Worker munmap((void *)__afl_map_addr, __afl_map_size);
802*08b48e0bSAndroid Build Coastguard Worker
803*08b48e0bSAndroid Build Coastguard Worker }
804*08b48e0bSAndroid Build Coastguard Worker
805*08b48e0bSAndroid Build Coastguard Worker __afl_area_ptr = __afl_area_ptr_dummy;
806*08b48e0bSAndroid Build Coastguard Worker
807*08b48e0bSAndroid Build Coastguard Worker id_str = getenv(CMPLOG_SHM_ENV_VAR);
808*08b48e0bSAndroid Build Coastguard Worker
809*08b48e0bSAndroid Build Coastguard Worker if (id_str) {
810*08b48e0bSAndroid Build Coastguard Worker
811*08b48e0bSAndroid Build Coastguard Worker #ifdef USEMMAP
812*08b48e0bSAndroid Build Coastguard Worker
813*08b48e0bSAndroid Build Coastguard Worker munmap((void *)__afl_cmp_map, __afl_map_size);
814*08b48e0bSAndroid Build Coastguard Worker
815*08b48e0bSAndroid Build Coastguard Worker #else
816*08b48e0bSAndroid Build Coastguard Worker
817*08b48e0bSAndroid Build Coastguard Worker shmdt((void *)__afl_cmp_map);
818*08b48e0bSAndroid Build Coastguard Worker
819*08b48e0bSAndroid Build Coastguard Worker #endif
820*08b48e0bSAndroid Build Coastguard Worker
821*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map = NULL;
822*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map_backup = NULL;
823*08b48e0bSAndroid Build Coastguard Worker
824*08b48e0bSAndroid Build Coastguard Worker }
825*08b48e0bSAndroid Build Coastguard Worker
826*08b48e0bSAndroid Build Coastguard Worker __afl_already_initialized_shm = 0;
827*08b48e0bSAndroid Build Coastguard Worker
828*08b48e0bSAndroid Build Coastguard Worker }
829*08b48e0bSAndroid Build Coastguard Worker
830*08b48e0bSAndroid Build Coastguard Worker #define write_error(text) write_error_with_location(text, __FILE__, __LINE__)
831*08b48e0bSAndroid Build Coastguard Worker
write_error_with_location(char * text,char * filename,int linenumber)832*08b48e0bSAndroid Build Coastguard Worker void write_error_with_location(char *text, char *filename, int linenumber) {
833*08b48e0bSAndroid Build Coastguard Worker
834*08b48e0bSAndroid Build Coastguard Worker u8 *o = getenv("__AFL_OUT_DIR");
835*08b48e0bSAndroid Build Coastguard Worker char *e = strerror(errno);
836*08b48e0bSAndroid Build Coastguard Worker
837*08b48e0bSAndroid Build Coastguard Worker if (o) {
838*08b48e0bSAndroid Build Coastguard Worker
839*08b48e0bSAndroid Build Coastguard Worker char buf[4096];
840*08b48e0bSAndroid Build Coastguard Worker snprintf(buf, sizeof(buf), "%s/error.txt", o);
841*08b48e0bSAndroid Build Coastguard Worker FILE *f = fopen(buf, "a");
842*08b48e0bSAndroid Build Coastguard Worker
843*08b48e0bSAndroid Build Coastguard Worker if (f) {
844*08b48e0bSAndroid Build Coastguard Worker
845*08b48e0bSAndroid Build Coastguard Worker fprintf(f, "File %s, line %d: Error(%s): %s\n", filename, linenumber,
846*08b48e0bSAndroid Build Coastguard Worker text, e);
847*08b48e0bSAndroid Build Coastguard Worker fclose(f);
848*08b48e0bSAndroid Build Coastguard Worker
849*08b48e0bSAndroid Build Coastguard Worker }
850*08b48e0bSAndroid Build Coastguard Worker
851*08b48e0bSAndroid Build Coastguard Worker }
852*08b48e0bSAndroid Build Coastguard Worker
853*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr, "File %s, line %d: Error(%s): %s\n", filename, linenumber,
854*08b48e0bSAndroid Build Coastguard Worker text, e);
855*08b48e0bSAndroid Build Coastguard Worker
856*08b48e0bSAndroid Build Coastguard Worker }
857*08b48e0bSAndroid Build Coastguard Worker
858*08b48e0bSAndroid Build Coastguard Worker #ifdef __linux__
__afl_start_snapshots(void)859*08b48e0bSAndroid Build Coastguard Worker static void __afl_start_snapshots(void) {
860*08b48e0bSAndroid Build Coastguard Worker
861*08b48e0bSAndroid Build Coastguard Worker static u8 tmp[4] = {0, 0, 0, 0};
862*08b48e0bSAndroid Build Coastguard Worker u32 status = 0;
863*08b48e0bSAndroid Build Coastguard Worker u32 already_read_first = 0;
864*08b48e0bSAndroid Build Coastguard Worker u32 was_killed;
865*08b48e0bSAndroid Build Coastguard Worker
866*08b48e0bSAndroid Build Coastguard Worker u8 child_stopped = 0;
867*08b48e0bSAndroid Build Coastguard Worker
868*08b48e0bSAndroid Build Coastguard Worker void (*old_sigchld_handler)(int) = signal(SIGCHLD, SIG_DFL);
869*08b48e0bSAndroid Build Coastguard Worker
870*08b48e0bSAndroid Build Coastguard Worker /* Phone home and tell the parent that we're OK. If parent isn't there,
871*08b48e0bSAndroid Build Coastguard Worker assume we're not running in forkserver mode and just execute program. */
872*08b48e0bSAndroid Build Coastguard Worker
873*08b48e0bSAndroid Build Coastguard Worker status |= (FS_OPT_ENABLED | FS_OPT_SNAPSHOT | FS_OPT_NEWCMPLOG);
874*08b48e0bSAndroid Build Coastguard Worker if (__afl_sharedmem_fuzzing) { status |= FS_OPT_SHDMEM_FUZZ; }
875*08b48e0bSAndroid Build Coastguard Worker if (__afl_map_size <= FS_OPT_MAX_MAPSIZE)
876*08b48e0bSAndroid Build Coastguard Worker status |= (FS_OPT_SET_MAPSIZE(__afl_map_size) | FS_OPT_MAPSIZE);
877*08b48e0bSAndroid Build Coastguard Worker if (__afl_dictionary_len && __afl_dictionary) { status |= FS_OPT_AUTODICT; }
878*08b48e0bSAndroid Build Coastguard Worker memcpy(tmp, &status, 4);
879*08b48e0bSAndroid Build Coastguard Worker
880*08b48e0bSAndroid Build Coastguard Worker if (write(FORKSRV_FD + 1, tmp, 4) != 4) { return; }
881*08b48e0bSAndroid Build Coastguard Worker
882*08b48e0bSAndroid Build Coastguard Worker if (__afl_sharedmem_fuzzing || (__afl_dictionary_len && __afl_dictionary)) {
883*08b48e0bSAndroid Build Coastguard Worker
884*08b48e0bSAndroid Build Coastguard Worker if (read(FORKSRV_FD, &was_killed, 4) != 4) {
885*08b48e0bSAndroid Build Coastguard Worker
886*08b48e0bSAndroid Build Coastguard Worker write_error("read to afl-fuzz");
887*08b48e0bSAndroid Build Coastguard Worker _exit(1);
888*08b48e0bSAndroid Build Coastguard Worker
889*08b48e0bSAndroid Build Coastguard Worker }
890*08b48e0bSAndroid Build Coastguard Worker
891*08b48e0bSAndroid Build Coastguard Worker if (__afl_debug) {
892*08b48e0bSAndroid Build Coastguard Worker
893*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr, "DEBUG: target forkserver recv: %08x\n", was_killed);
894*08b48e0bSAndroid Build Coastguard Worker
895*08b48e0bSAndroid Build Coastguard Worker }
896*08b48e0bSAndroid Build Coastguard Worker
897*08b48e0bSAndroid Build Coastguard Worker if ((was_killed & (FS_OPT_ENABLED | FS_OPT_SHDMEM_FUZZ)) ==
898*08b48e0bSAndroid Build Coastguard Worker (FS_OPT_ENABLED | FS_OPT_SHDMEM_FUZZ)) {
899*08b48e0bSAndroid Build Coastguard Worker
900*08b48e0bSAndroid Build Coastguard Worker __afl_map_shm_fuzz();
901*08b48e0bSAndroid Build Coastguard Worker
902*08b48e0bSAndroid Build Coastguard Worker }
903*08b48e0bSAndroid Build Coastguard Worker
904*08b48e0bSAndroid Build Coastguard Worker if ((was_killed & (FS_OPT_ENABLED | FS_OPT_AUTODICT)) ==
905*08b48e0bSAndroid Build Coastguard Worker (FS_OPT_ENABLED | FS_OPT_AUTODICT) &&
906*08b48e0bSAndroid Build Coastguard Worker __afl_dictionary_len && __afl_dictionary) {
907*08b48e0bSAndroid Build Coastguard Worker
908*08b48e0bSAndroid Build Coastguard Worker // great lets pass the dictionary through the forkserver FD
909*08b48e0bSAndroid Build Coastguard Worker u32 len = __afl_dictionary_len, offset = 0;
910*08b48e0bSAndroid Build Coastguard Worker s32 ret;
911*08b48e0bSAndroid Build Coastguard Worker
912*08b48e0bSAndroid Build Coastguard Worker if (write(FORKSRV_FD + 1, &len, 4) != 4) {
913*08b48e0bSAndroid Build Coastguard Worker
914*08b48e0bSAndroid Build Coastguard Worker write(2, "Error: could not send dictionary len\n",
915*08b48e0bSAndroid Build Coastguard Worker strlen("Error: could not send dictionary len\n"));
916*08b48e0bSAndroid Build Coastguard Worker _exit(1);
917*08b48e0bSAndroid Build Coastguard Worker
918*08b48e0bSAndroid Build Coastguard Worker }
919*08b48e0bSAndroid Build Coastguard Worker
920*08b48e0bSAndroid Build Coastguard Worker while (len != 0) {
921*08b48e0bSAndroid Build Coastguard Worker
922*08b48e0bSAndroid Build Coastguard Worker ret = write(FORKSRV_FD + 1, __afl_dictionary + offset, len);
923*08b48e0bSAndroid Build Coastguard Worker
924*08b48e0bSAndroid Build Coastguard Worker if (ret < 1) {
925*08b48e0bSAndroid Build Coastguard Worker
926*08b48e0bSAndroid Build Coastguard Worker write(2, "Error: could not send dictionary\n",
927*08b48e0bSAndroid Build Coastguard Worker strlen("Error: could not send dictionary\n"));
928*08b48e0bSAndroid Build Coastguard Worker _exit(1);
929*08b48e0bSAndroid Build Coastguard Worker
930*08b48e0bSAndroid Build Coastguard Worker }
931*08b48e0bSAndroid Build Coastguard Worker
932*08b48e0bSAndroid Build Coastguard Worker len -= ret;
933*08b48e0bSAndroid Build Coastguard Worker offset += ret;
934*08b48e0bSAndroid Build Coastguard Worker
935*08b48e0bSAndroid Build Coastguard Worker }
936*08b48e0bSAndroid Build Coastguard Worker
937*08b48e0bSAndroid Build Coastguard Worker } else {
938*08b48e0bSAndroid Build Coastguard Worker
939*08b48e0bSAndroid Build Coastguard Worker // uh this forkserver does not understand extended option passing
940*08b48e0bSAndroid Build Coastguard Worker // or does not want the dictionary
941*08b48e0bSAndroid Build Coastguard Worker if (!__afl_fuzz_ptr) already_read_first = 1;
942*08b48e0bSAndroid Build Coastguard Worker
943*08b48e0bSAndroid Build Coastguard Worker }
944*08b48e0bSAndroid Build Coastguard Worker
945*08b48e0bSAndroid Build Coastguard Worker }
946*08b48e0bSAndroid Build Coastguard Worker
947*08b48e0bSAndroid Build Coastguard Worker while (1) {
948*08b48e0bSAndroid Build Coastguard Worker
949*08b48e0bSAndroid Build Coastguard Worker int status;
950*08b48e0bSAndroid Build Coastguard Worker
951*08b48e0bSAndroid Build Coastguard Worker if (already_read_first) {
952*08b48e0bSAndroid Build Coastguard Worker
953*08b48e0bSAndroid Build Coastguard Worker already_read_first = 0;
954*08b48e0bSAndroid Build Coastguard Worker
955*08b48e0bSAndroid Build Coastguard Worker } else {
956*08b48e0bSAndroid Build Coastguard Worker
957*08b48e0bSAndroid Build Coastguard Worker /* Wait for parent by reading from the pipe. Abort if read fails. */
958*08b48e0bSAndroid Build Coastguard Worker if (read(FORKSRV_FD, &was_killed, 4) != 4) {
959*08b48e0bSAndroid Build Coastguard Worker
960*08b48e0bSAndroid Build Coastguard Worker write_error("reading from afl-fuzz");
961*08b48e0bSAndroid Build Coastguard Worker _exit(1);
962*08b48e0bSAndroid Build Coastguard Worker
963*08b48e0bSAndroid Build Coastguard Worker }
964*08b48e0bSAndroid Build Coastguard Worker
965*08b48e0bSAndroid Build Coastguard Worker }
966*08b48e0bSAndroid Build Coastguard Worker
967*08b48e0bSAndroid Build Coastguard Worker #ifdef _AFL_DOCUMENT_MUTATIONS
968*08b48e0bSAndroid Build Coastguard Worker if (__afl_fuzz_ptr) {
969*08b48e0bSAndroid Build Coastguard Worker
970*08b48e0bSAndroid Build Coastguard Worker static uint32_t counter = 0;
971*08b48e0bSAndroid Build Coastguard Worker char fn[32];
972*08b48e0bSAndroid Build Coastguard Worker sprintf(fn, "%09u:forkserver", counter);
973*08b48e0bSAndroid Build Coastguard Worker s32 fd_doc = open(fn, O_WRONLY | O_CREAT | O_TRUNC, DEFAULT_PERMISSION);
974*08b48e0bSAndroid Build Coastguard Worker if (fd_doc >= 0) {
975*08b48e0bSAndroid Build Coastguard Worker
976*08b48e0bSAndroid Build Coastguard Worker if (write(fd_doc, __afl_fuzz_ptr, *__afl_fuzz_len) != *__afl_fuzz_len) {
977*08b48e0bSAndroid Build Coastguard Worker
978*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr, "write of mutation file failed: %s\n", fn);
979*08b48e0bSAndroid Build Coastguard Worker unlink(fn);
980*08b48e0bSAndroid Build Coastguard Worker
981*08b48e0bSAndroid Build Coastguard Worker }
982*08b48e0bSAndroid Build Coastguard Worker
983*08b48e0bSAndroid Build Coastguard Worker close(fd_doc);
984*08b48e0bSAndroid Build Coastguard Worker
985*08b48e0bSAndroid Build Coastguard Worker }
986*08b48e0bSAndroid Build Coastguard Worker
987*08b48e0bSAndroid Build Coastguard Worker counter++;
988*08b48e0bSAndroid Build Coastguard Worker
989*08b48e0bSAndroid Build Coastguard Worker }
990*08b48e0bSAndroid Build Coastguard Worker
991*08b48e0bSAndroid Build Coastguard Worker #endif
992*08b48e0bSAndroid Build Coastguard Worker
993*08b48e0bSAndroid Build Coastguard Worker /* If we stopped the child in persistent mode, but there was a race
994*08b48e0bSAndroid Build Coastguard Worker condition and afl-fuzz already issued SIGKILL, write off the old
995*08b48e0bSAndroid Build Coastguard Worker process. */
996*08b48e0bSAndroid Build Coastguard Worker
997*08b48e0bSAndroid Build Coastguard Worker if (child_stopped && was_killed) {
998*08b48e0bSAndroid Build Coastguard Worker
999*08b48e0bSAndroid Build Coastguard Worker child_stopped = 0;
1000*08b48e0bSAndroid Build Coastguard Worker if (waitpid(child_pid, &status, 0) < 0) {
1001*08b48e0bSAndroid Build Coastguard Worker
1002*08b48e0bSAndroid Build Coastguard Worker write_error("child_stopped && was_killed");
1003*08b48e0bSAndroid Build Coastguard Worker _exit(1); // TODO why exit?
1004*08b48e0bSAndroid Build Coastguard Worker
1005*08b48e0bSAndroid Build Coastguard Worker }
1006*08b48e0bSAndroid Build Coastguard Worker
1007*08b48e0bSAndroid Build Coastguard Worker }
1008*08b48e0bSAndroid Build Coastguard Worker
1009*08b48e0bSAndroid Build Coastguard Worker if (!child_stopped) {
1010*08b48e0bSAndroid Build Coastguard Worker
1011*08b48e0bSAndroid Build Coastguard Worker /* Once woken up, create a clone of our process. */
1012*08b48e0bSAndroid Build Coastguard Worker
1013*08b48e0bSAndroid Build Coastguard Worker child_pid = fork();
1014*08b48e0bSAndroid Build Coastguard Worker if (child_pid < 0) {
1015*08b48e0bSAndroid Build Coastguard Worker
1016*08b48e0bSAndroid Build Coastguard Worker write_error("fork");
1017*08b48e0bSAndroid Build Coastguard Worker _exit(1);
1018*08b48e0bSAndroid Build Coastguard Worker
1019*08b48e0bSAndroid Build Coastguard Worker }
1020*08b48e0bSAndroid Build Coastguard Worker
1021*08b48e0bSAndroid Build Coastguard Worker /* In child process: close fds, resume execution. */
1022*08b48e0bSAndroid Build Coastguard Worker
1023*08b48e0bSAndroid Build Coastguard Worker if (!child_pid) {
1024*08b48e0bSAndroid Build Coastguard Worker
1025*08b48e0bSAndroid Build Coastguard Worker //(void)nice(-20); // does not seem to improve
1026*08b48e0bSAndroid Build Coastguard Worker
1027*08b48e0bSAndroid Build Coastguard Worker signal(SIGCHLD, old_sigchld_handler);
1028*08b48e0bSAndroid Build Coastguard Worker signal(SIGTERM, old_sigterm_handler);
1029*08b48e0bSAndroid Build Coastguard Worker
1030*08b48e0bSAndroid Build Coastguard Worker close(FORKSRV_FD);
1031*08b48e0bSAndroid Build Coastguard Worker close(FORKSRV_FD + 1);
1032*08b48e0bSAndroid Build Coastguard Worker
1033*08b48e0bSAndroid Build Coastguard Worker if (!afl_snapshot_take(AFL_SNAPSHOT_MMAP | AFL_SNAPSHOT_FDS |
1034*08b48e0bSAndroid Build Coastguard Worker AFL_SNAPSHOT_REGS | AFL_SNAPSHOT_EXIT)) {
1035*08b48e0bSAndroid Build Coastguard Worker
1036*08b48e0bSAndroid Build Coastguard Worker raise(SIGSTOP);
1037*08b48e0bSAndroid Build Coastguard Worker
1038*08b48e0bSAndroid Build Coastguard Worker }
1039*08b48e0bSAndroid Build Coastguard Worker
1040*08b48e0bSAndroid Build Coastguard Worker __afl_area_ptr[0] = 1;
1041*08b48e0bSAndroid Build Coastguard Worker memset(__afl_prev_loc, 0, NGRAM_SIZE_MAX * sizeof(PREV_LOC_T));
1042*08b48e0bSAndroid Build Coastguard Worker
1043*08b48e0bSAndroid Build Coastguard Worker return;
1044*08b48e0bSAndroid Build Coastguard Worker
1045*08b48e0bSAndroid Build Coastguard Worker }
1046*08b48e0bSAndroid Build Coastguard Worker
1047*08b48e0bSAndroid Build Coastguard Worker } else {
1048*08b48e0bSAndroid Build Coastguard Worker
1049*08b48e0bSAndroid Build Coastguard Worker /* Special handling for persistent mode: if the child is alive but
1050*08b48e0bSAndroid Build Coastguard Worker currently stopped, simply restart it with SIGCONT. */
1051*08b48e0bSAndroid Build Coastguard Worker
1052*08b48e0bSAndroid Build Coastguard Worker kill(child_pid, SIGCONT);
1053*08b48e0bSAndroid Build Coastguard Worker child_stopped = 0;
1054*08b48e0bSAndroid Build Coastguard Worker
1055*08b48e0bSAndroid Build Coastguard Worker }
1056*08b48e0bSAndroid Build Coastguard Worker
1057*08b48e0bSAndroid Build Coastguard Worker /* In parent process: write PID to pipe, then wait for child. */
1058*08b48e0bSAndroid Build Coastguard Worker
1059*08b48e0bSAndroid Build Coastguard Worker if (write(FORKSRV_FD + 1, &child_pid, 4) != 4) {
1060*08b48e0bSAndroid Build Coastguard Worker
1061*08b48e0bSAndroid Build Coastguard Worker write_error("write to afl-fuzz");
1062*08b48e0bSAndroid Build Coastguard Worker _exit(1);
1063*08b48e0bSAndroid Build Coastguard Worker
1064*08b48e0bSAndroid Build Coastguard Worker }
1065*08b48e0bSAndroid Build Coastguard Worker
1066*08b48e0bSAndroid Build Coastguard Worker if (waitpid(child_pid, &status, WUNTRACED) < 0) {
1067*08b48e0bSAndroid Build Coastguard Worker
1068*08b48e0bSAndroid Build Coastguard Worker write_error("waitpid");
1069*08b48e0bSAndroid Build Coastguard Worker _exit(1);
1070*08b48e0bSAndroid Build Coastguard Worker
1071*08b48e0bSAndroid Build Coastguard Worker }
1072*08b48e0bSAndroid Build Coastguard Worker
1073*08b48e0bSAndroid Build Coastguard Worker /* In persistent mode, the child stops itself with SIGSTOP to indicate
1074*08b48e0bSAndroid Build Coastguard Worker a successful run. In this case, we want to wake it up without forking
1075*08b48e0bSAndroid Build Coastguard Worker again. */
1076*08b48e0bSAndroid Build Coastguard Worker
1077*08b48e0bSAndroid Build Coastguard Worker if (WIFSTOPPED(status)) child_stopped = 1;
1078*08b48e0bSAndroid Build Coastguard Worker
1079*08b48e0bSAndroid Build Coastguard Worker /* Relay wait status to pipe, then loop back. */
1080*08b48e0bSAndroid Build Coastguard Worker
1081*08b48e0bSAndroid Build Coastguard Worker if (write(FORKSRV_FD + 1, &status, 4) != 4) {
1082*08b48e0bSAndroid Build Coastguard Worker
1083*08b48e0bSAndroid Build Coastguard Worker write_error("writing to afl-fuzz");
1084*08b48e0bSAndroid Build Coastguard Worker _exit(1);
1085*08b48e0bSAndroid Build Coastguard Worker
1086*08b48e0bSAndroid Build Coastguard Worker }
1087*08b48e0bSAndroid Build Coastguard Worker
1088*08b48e0bSAndroid Build Coastguard Worker }
1089*08b48e0bSAndroid Build Coastguard Worker
1090*08b48e0bSAndroid Build Coastguard Worker }
1091*08b48e0bSAndroid Build Coastguard Worker
1092*08b48e0bSAndroid Build Coastguard Worker #endif
1093*08b48e0bSAndroid Build Coastguard Worker
1094*08b48e0bSAndroid Build Coastguard Worker /* Fork server logic. */
1095*08b48e0bSAndroid Build Coastguard Worker
__afl_start_forkserver(void)1096*08b48e0bSAndroid Build Coastguard Worker static void __afl_start_forkserver(void) {
1097*08b48e0bSAndroid Build Coastguard Worker
1098*08b48e0bSAndroid Build Coastguard Worker if (__afl_already_initialized_forkserver) return;
1099*08b48e0bSAndroid Build Coastguard Worker __afl_already_initialized_forkserver = 1;
1100*08b48e0bSAndroid Build Coastguard Worker
1101*08b48e0bSAndroid Build Coastguard Worker struct sigaction orig_action;
1102*08b48e0bSAndroid Build Coastguard Worker sigaction(SIGTERM, NULL, &orig_action);
1103*08b48e0bSAndroid Build Coastguard Worker old_sigterm_handler = orig_action.sa_handler;
1104*08b48e0bSAndroid Build Coastguard Worker signal(SIGTERM, at_exit);
1105*08b48e0bSAndroid Build Coastguard Worker
1106*08b48e0bSAndroid Build Coastguard Worker #ifdef __linux__
1107*08b48e0bSAndroid Build Coastguard Worker if (/*!is_persistent &&*/ !__afl_cmp_map && !getenv("AFL_NO_SNAPSHOT") &&
1108*08b48e0bSAndroid Build Coastguard Worker afl_snapshot_init() >= 0) {
1109*08b48e0bSAndroid Build Coastguard Worker
1110*08b48e0bSAndroid Build Coastguard Worker __afl_start_snapshots();
1111*08b48e0bSAndroid Build Coastguard Worker return;
1112*08b48e0bSAndroid Build Coastguard Worker
1113*08b48e0bSAndroid Build Coastguard Worker }
1114*08b48e0bSAndroid Build Coastguard Worker
1115*08b48e0bSAndroid Build Coastguard Worker #endif
1116*08b48e0bSAndroid Build Coastguard Worker
1117*08b48e0bSAndroid Build Coastguard Worker u8 tmp[4] = {0, 0, 0, 0};
1118*08b48e0bSAndroid Build Coastguard Worker u32 status_for_fsrv = 0;
1119*08b48e0bSAndroid Build Coastguard Worker u32 already_read_first = 0;
1120*08b48e0bSAndroid Build Coastguard Worker u32 was_killed;
1121*08b48e0bSAndroid Build Coastguard Worker
1122*08b48e0bSAndroid Build Coastguard Worker u8 child_stopped = 0;
1123*08b48e0bSAndroid Build Coastguard Worker
1124*08b48e0bSAndroid Build Coastguard Worker void (*old_sigchld_handler)(int) = signal(SIGCHLD, SIG_DFL);
1125*08b48e0bSAndroid Build Coastguard Worker
1126*08b48e0bSAndroid Build Coastguard Worker if (__afl_map_size <= FS_OPT_MAX_MAPSIZE) {
1127*08b48e0bSAndroid Build Coastguard Worker
1128*08b48e0bSAndroid Build Coastguard Worker status_for_fsrv |= (FS_OPT_SET_MAPSIZE(__afl_map_size) | FS_OPT_MAPSIZE);
1129*08b48e0bSAndroid Build Coastguard Worker
1130*08b48e0bSAndroid Build Coastguard Worker }
1131*08b48e0bSAndroid Build Coastguard Worker
1132*08b48e0bSAndroid Build Coastguard Worker if (__afl_dictionary_len && __afl_dictionary) {
1133*08b48e0bSAndroid Build Coastguard Worker
1134*08b48e0bSAndroid Build Coastguard Worker status_for_fsrv |= FS_OPT_AUTODICT;
1135*08b48e0bSAndroid Build Coastguard Worker
1136*08b48e0bSAndroid Build Coastguard Worker }
1137*08b48e0bSAndroid Build Coastguard Worker
1138*08b48e0bSAndroid Build Coastguard Worker if (__afl_sharedmem_fuzzing) { status_for_fsrv |= FS_OPT_SHDMEM_FUZZ; }
1139*08b48e0bSAndroid Build Coastguard Worker if (status_for_fsrv) {
1140*08b48e0bSAndroid Build Coastguard Worker
1141*08b48e0bSAndroid Build Coastguard Worker status_for_fsrv |= (FS_OPT_ENABLED | FS_OPT_NEWCMPLOG);
1142*08b48e0bSAndroid Build Coastguard Worker
1143*08b48e0bSAndroid Build Coastguard Worker }
1144*08b48e0bSAndroid Build Coastguard Worker
1145*08b48e0bSAndroid Build Coastguard Worker memcpy(tmp, &status_for_fsrv, 4);
1146*08b48e0bSAndroid Build Coastguard Worker
1147*08b48e0bSAndroid Build Coastguard Worker /* Phone home and tell the parent that we're OK. If parent isn't there,
1148*08b48e0bSAndroid Build Coastguard Worker assume we're not running in forkserver mode and just execute program. */
1149*08b48e0bSAndroid Build Coastguard Worker
1150*08b48e0bSAndroid Build Coastguard Worker if (write(FORKSRV_FD + 1, tmp, 4) != 4) { return; }
1151*08b48e0bSAndroid Build Coastguard Worker
1152*08b48e0bSAndroid Build Coastguard Worker __afl_connected = 1;
1153*08b48e0bSAndroid Build Coastguard Worker
1154*08b48e0bSAndroid Build Coastguard Worker if (__afl_sharedmem_fuzzing || (__afl_dictionary_len && __afl_dictionary)) {
1155*08b48e0bSAndroid Build Coastguard Worker
1156*08b48e0bSAndroid Build Coastguard Worker if (read(FORKSRV_FD, &was_killed, 4) != 4) _exit(1);
1157*08b48e0bSAndroid Build Coastguard Worker
1158*08b48e0bSAndroid Build Coastguard Worker if (__afl_debug) {
1159*08b48e0bSAndroid Build Coastguard Worker
1160*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr, "DEBUG: target forkserver recv: %08x\n", was_killed);
1161*08b48e0bSAndroid Build Coastguard Worker
1162*08b48e0bSAndroid Build Coastguard Worker }
1163*08b48e0bSAndroid Build Coastguard Worker
1164*08b48e0bSAndroid Build Coastguard Worker if ((was_killed & (FS_OPT_ENABLED | FS_OPT_SHDMEM_FUZZ)) ==
1165*08b48e0bSAndroid Build Coastguard Worker (FS_OPT_ENABLED | FS_OPT_SHDMEM_FUZZ)) {
1166*08b48e0bSAndroid Build Coastguard Worker
1167*08b48e0bSAndroid Build Coastguard Worker __afl_map_shm_fuzz();
1168*08b48e0bSAndroid Build Coastguard Worker
1169*08b48e0bSAndroid Build Coastguard Worker }
1170*08b48e0bSAndroid Build Coastguard Worker
1171*08b48e0bSAndroid Build Coastguard Worker if ((was_killed & (FS_OPT_ENABLED | FS_OPT_AUTODICT)) ==
1172*08b48e0bSAndroid Build Coastguard Worker (FS_OPT_ENABLED | FS_OPT_AUTODICT) &&
1173*08b48e0bSAndroid Build Coastguard Worker __afl_dictionary_len && __afl_dictionary) {
1174*08b48e0bSAndroid Build Coastguard Worker
1175*08b48e0bSAndroid Build Coastguard Worker // great lets pass the dictionary through the forkserver FD
1176*08b48e0bSAndroid Build Coastguard Worker u32 len = __afl_dictionary_len, offset = 0;
1177*08b48e0bSAndroid Build Coastguard Worker
1178*08b48e0bSAndroid Build Coastguard Worker if (write(FORKSRV_FD + 1, &len, 4) != 4) {
1179*08b48e0bSAndroid Build Coastguard Worker
1180*08b48e0bSAndroid Build Coastguard Worker write(2, "Error: could not send dictionary len\n",
1181*08b48e0bSAndroid Build Coastguard Worker strlen("Error: could not send dictionary len\n"));
1182*08b48e0bSAndroid Build Coastguard Worker _exit(1);
1183*08b48e0bSAndroid Build Coastguard Worker
1184*08b48e0bSAndroid Build Coastguard Worker }
1185*08b48e0bSAndroid Build Coastguard Worker
1186*08b48e0bSAndroid Build Coastguard Worker while (len != 0) {
1187*08b48e0bSAndroid Build Coastguard Worker
1188*08b48e0bSAndroid Build Coastguard Worker s32 ret;
1189*08b48e0bSAndroid Build Coastguard Worker ret = write(FORKSRV_FD + 1, __afl_dictionary + offset, len);
1190*08b48e0bSAndroid Build Coastguard Worker
1191*08b48e0bSAndroid Build Coastguard Worker if (ret < 1) {
1192*08b48e0bSAndroid Build Coastguard Worker
1193*08b48e0bSAndroid Build Coastguard Worker write(2, "Error: could not send dictionary\n",
1194*08b48e0bSAndroid Build Coastguard Worker strlen("Error: could not send dictionary\n"));
1195*08b48e0bSAndroid Build Coastguard Worker _exit(1);
1196*08b48e0bSAndroid Build Coastguard Worker
1197*08b48e0bSAndroid Build Coastguard Worker }
1198*08b48e0bSAndroid Build Coastguard Worker
1199*08b48e0bSAndroid Build Coastguard Worker len -= ret;
1200*08b48e0bSAndroid Build Coastguard Worker offset += ret;
1201*08b48e0bSAndroid Build Coastguard Worker
1202*08b48e0bSAndroid Build Coastguard Worker }
1203*08b48e0bSAndroid Build Coastguard Worker
1204*08b48e0bSAndroid Build Coastguard Worker } else {
1205*08b48e0bSAndroid Build Coastguard Worker
1206*08b48e0bSAndroid Build Coastguard Worker // uh this forkserver does not understand extended option passing
1207*08b48e0bSAndroid Build Coastguard Worker // or does not want the dictionary
1208*08b48e0bSAndroid Build Coastguard Worker if (!__afl_fuzz_ptr) already_read_first = 1;
1209*08b48e0bSAndroid Build Coastguard Worker
1210*08b48e0bSAndroid Build Coastguard Worker }
1211*08b48e0bSAndroid Build Coastguard Worker
1212*08b48e0bSAndroid Build Coastguard Worker }
1213*08b48e0bSAndroid Build Coastguard Worker
1214*08b48e0bSAndroid Build Coastguard Worker while (1) {
1215*08b48e0bSAndroid Build Coastguard Worker
1216*08b48e0bSAndroid Build Coastguard Worker int status;
1217*08b48e0bSAndroid Build Coastguard Worker
1218*08b48e0bSAndroid Build Coastguard Worker /* Wait for parent by reading from the pipe. Abort if read fails. */
1219*08b48e0bSAndroid Build Coastguard Worker
1220*08b48e0bSAndroid Build Coastguard Worker if (already_read_first) {
1221*08b48e0bSAndroid Build Coastguard Worker
1222*08b48e0bSAndroid Build Coastguard Worker already_read_first = 0;
1223*08b48e0bSAndroid Build Coastguard Worker
1224*08b48e0bSAndroid Build Coastguard Worker } else {
1225*08b48e0bSAndroid Build Coastguard Worker
1226*08b48e0bSAndroid Build Coastguard Worker if (read(FORKSRV_FD, &was_killed, 4) != 4) {
1227*08b48e0bSAndroid Build Coastguard Worker
1228*08b48e0bSAndroid Build Coastguard Worker // write_error("read from afl-fuzz");
1229*08b48e0bSAndroid Build Coastguard Worker _exit(1);
1230*08b48e0bSAndroid Build Coastguard Worker
1231*08b48e0bSAndroid Build Coastguard Worker }
1232*08b48e0bSAndroid Build Coastguard Worker
1233*08b48e0bSAndroid Build Coastguard Worker }
1234*08b48e0bSAndroid Build Coastguard Worker
1235*08b48e0bSAndroid Build Coastguard Worker #ifdef _AFL_DOCUMENT_MUTATIONS
1236*08b48e0bSAndroid Build Coastguard Worker if (__afl_fuzz_ptr) {
1237*08b48e0bSAndroid Build Coastguard Worker
1238*08b48e0bSAndroid Build Coastguard Worker static uint32_t counter = 0;
1239*08b48e0bSAndroid Build Coastguard Worker char fn[32];
1240*08b48e0bSAndroid Build Coastguard Worker sprintf(fn, "%09u:forkserver", counter);
1241*08b48e0bSAndroid Build Coastguard Worker s32 fd_doc = open(fn, O_WRONLY | O_CREAT | O_TRUNC, DEFAULT_PERMISSION);
1242*08b48e0bSAndroid Build Coastguard Worker if (fd_doc >= 0) {
1243*08b48e0bSAndroid Build Coastguard Worker
1244*08b48e0bSAndroid Build Coastguard Worker if (write(fd_doc, __afl_fuzz_ptr, *__afl_fuzz_len) != *__afl_fuzz_len) {
1245*08b48e0bSAndroid Build Coastguard Worker
1246*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr, "write of mutation file failed: %s\n", fn);
1247*08b48e0bSAndroid Build Coastguard Worker unlink(fn);
1248*08b48e0bSAndroid Build Coastguard Worker
1249*08b48e0bSAndroid Build Coastguard Worker }
1250*08b48e0bSAndroid Build Coastguard Worker
1251*08b48e0bSAndroid Build Coastguard Worker close(fd_doc);
1252*08b48e0bSAndroid Build Coastguard Worker
1253*08b48e0bSAndroid Build Coastguard Worker }
1254*08b48e0bSAndroid Build Coastguard Worker
1255*08b48e0bSAndroid Build Coastguard Worker counter++;
1256*08b48e0bSAndroid Build Coastguard Worker
1257*08b48e0bSAndroid Build Coastguard Worker }
1258*08b48e0bSAndroid Build Coastguard Worker
1259*08b48e0bSAndroid Build Coastguard Worker #endif
1260*08b48e0bSAndroid Build Coastguard Worker
1261*08b48e0bSAndroid Build Coastguard Worker /* If we stopped the child in persistent mode, but there was a race
1262*08b48e0bSAndroid Build Coastguard Worker condition and afl-fuzz already issued SIGKILL, write off the old
1263*08b48e0bSAndroid Build Coastguard Worker process. */
1264*08b48e0bSAndroid Build Coastguard Worker
1265*08b48e0bSAndroid Build Coastguard Worker if (child_stopped && was_killed) {
1266*08b48e0bSAndroid Build Coastguard Worker
1267*08b48e0bSAndroid Build Coastguard Worker child_stopped = 0;
1268*08b48e0bSAndroid Build Coastguard Worker if (waitpid(child_pid, &status, 0) < 0) {
1269*08b48e0bSAndroid Build Coastguard Worker
1270*08b48e0bSAndroid Build Coastguard Worker write_error("child_stopped && was_killed");
1271*08b48e0bSAndroid Build Coastguard Worker _exit(1);
1272*08b48e0bSAndroid Build Coastguard Worker
1273*08b48e0bSAndroid Build Coastguard Worker }
1274*08b48e0bSAndroid Build Coastguard Worker
1275*08b48e0bSAndroid Build Coastguard Worker }
1276*08b48e0bSAndroid Build Coastguard Worker
1277*08b48e0bSAndroid Build Coastguard Worker if (!child_stopped) {
1278*08b48e0bSAndroid Build Coastguard Worker
1279*08b48e0bSAndroid Build Coastguard Worker /* Once woken up, create a clone of our process. */
1280*08b48e0bSAndroid Build Coastguard Worker
1281*08b48e0bSAndroid Build Coastguard Worker child_pid = fork();
1282*08b48e0bSAndroid Build Coastguard Worker if (child_pid < 0) {
1283*08b48e0bSAndroid Build Coastguard Worker
1284*08b48e0bSAndroid Build Coastguard Worker write_error("fork");
1285*08b48e0bSAndroid Build Coastguard Worker _exit(1);
1286*08b48e0bSAndroid Build Coastguard Worker
1287*08b48e0bSAndroid Build Coastguard Worker }
1288*08b48e0bSAndroid Build Coastguard Worker
1289*08b48e0bSAndroid Build Coastguard Worker /* In child process: close fds, resume execution. */
1290*08b48e0bSAndroid Build Coastguard Worker
1291*08b48e0bSAndroid Build Coastguard Worker if (!child_pid) {
1292*08b48e0bSAndroid Build Coastguard Worker
1293*08b48e0bSAndroid Build Coastguard Worker //(void)nice(-20);
1294*08b48e0bSAndroid Build Coastguard Worker
1295*08b48e0bSAndroid Build Coastguard Worker signal(SIGCHLD, old_sigchld_handler);
1296*08b48e0bSAndroid Build Coastguard Worker signal(SIGTERM, old_sigterm_handler);
1297*08b48e0bSAndroid Build Coastguard Worker
1298*08b48e0bSAndroid Build Coastguard Worker close(FORKSRV_FD);
1299*08b48e0bSAndroid Build Coastguard Worker close(FORKSRV_FD + 1);
1300*08b48e0bSAndroid Build Coastguard Worker return;
1301*08b48e0bSAndroid Build Coastguard Worker
1302*08b48e0bSAndroid Build Coastguard Worker }
1303*08b48e0bSAndroid Build Coastguard Worker
1304*08b48e0bSAndroid Build Coastguard Worker } else {
1305*08b48e0bSAndroid Build Coastguard Worker
1306*08b48e0bSAndroid Build Coastguard Worker /* Special handling for persistent mode: if the child is alive but
1307*08b48e0bSAndroid Build Coastguard Worker currently stopped, simply restart it with SIGCONT. */
1308*08b48e0bSAndroid Build Coastguard Worker
1309*08b48e0bSAndroid Build Coastguard Worker kill(child_pid, SIGCONT);
1310*08b48e0bSAndroid Build Coastguard Worker child_stopped = 0;
1311*08b48e0bSAndroid Build Coastguard Worker
1312*08b48e0bSAndroid Build Coastguard Worker }
1313*08b48e0bSAndroid Build Coastguard Worker
1314*08b48e0bSAndroid Build Coastguard Worker /* In parent process: write PID to pipe, then wait for child. */
1315*08b48e0bSAndroid Build Coastguard Worker
1316*08b48e0bSAndroid Build Coastguard Worker if (write(FORKSRV_FD + 1, &child_pid, 4) != 4) {
1317*08b48e0bSAndroid Build Coastguard Worker
1318*08b48e0bSAndroid Build Coastguard Worker write_error("write to afl-fuzz");
1319*08b48e0bSAndroid Build Coastguard Worker _exit(1);
1320*08b48e0bSAndroid Build Coastguard Worker
1321*08b48e0bSAndroid Build Coastguard Worker }
1322*08b48e0bSAndroid Build Coastguard Worker
1323*08b48e0bSAndroid Build Coastguard Worker if (waitpid(child_pid, &status, is_persistent ? WUNTRACED : 0) < 0) {
1324*08b48e0bSAndroid Build Coastguard Worker
1325*08b48e0bSAndroid Build Coastguard Worker write_error("waitpid");
1326*08b48e0bSAndroid Build Coastguard Worker _exit(1);
1327*08b48e0bSAndroid Build Coastguard Worker
1328*08b48e0bSAndroid Build Coastguard Worker }
1329*08b48e0bSAndroid Build Coastguard Worker
1330*08b48e0bSAndroid Build Coastguard Worker /* In persistent mode, the child stops itself with SIGSTOP to indicate
1331*08b48e0bSAndroid Build Coastguard Worker a successful run. In this case, we want to wake it up without forking
1332*08b48e0bSAndroid Build Coastguard Worker again. */
1333*08b48e0bSAndroid Build Coastguard Worker
1334*08b48e0bSAndroid Build Coastguard Worker if (WIFSTOPPED(status)) child_stopped = 1;
1335*08b48e0bSAndroid Build Coastguard Worker
1336*08b48e0bSAndroid Build Coastguard Worker /* Relay wait status to pipe, then loop back. */
1337*08b48e0bSAndroid Build Coastguard Worker
1338*08b48e0bSAndroid Build Coastguard Worker if (write(FORKSRV_FD + 1, &status, 4) != 4) {
1339*08b48e0bSAndroid Build Coastguard Worker
1340*08b48e0bSAndroid Build Coastguard Worker write_error("writing to afl-fuzz");
1341*08b48e0bSAndroid Build Coastguard Worker _exit(1);
1342*08b48e0bSAndroid Build Coastguard Worker
1343*08b48e0bSAndroid Build Coastguard Worker }
1344*08b48e0bSAndroid Build Coastguard Worker
1345*08b48e0bSAndroid Build Coastguard Worker }
1346*08b48e0bSAndroid Build Coastguard Worker
1347*08b48e0bSAndroid Build Coastguard Worker }
1348*08b48e0bSAndroid Build Coastguard Worker
1349*08b48e0bSAndroid Build Coastguard Worker /* A simplified persistent mode handler, used as explained in
1350*08b48e0bSAndroid Build Coastguard Worker * README.llvm.md. */
1351*08b48e0bSAndroid Build Coastguard Worker
__afl_persistent_loop(unsigned int max_cnt)1352*08b48e0bSAndroid Build Coastguard Worker int __afl_persistent_loop(unsigned int max_cnt) {
1353*08b48e0bSAndroid Build Coastguard Worker
1354*08b48e0bSAndroid Build Coastguard Worker static u8 first_pass = 1;
1355*08b48e0bSAndroid Build Coastguard Worker static u32 cycle_cnt;
1356*08b48e0bSAndroid Build Coastguard Worker
1357*08b48e0bSAndroid Build Coastguard Worker if (first_pass) {
1358*08b48e0bSAndroid Build Coastguard Worker
1359*08b48e0bSAndroid Build Coastguard Worker /* Make sure that every iteration of __AFL_LOOP() starts with a clean slate.
1360*08b48e0bSAndroid Build Coastguard Worker On subsequent calls, the parent will take care of that, but on the first
1361*08b48e0bSAndroid Build Coastguard Worker iteration, it's our job to erase any trace of whatever happened
1362*08b48e0bSAndroid Build Coastguard Worker before the loop. */
1363*08b48e0bSAndroid Build Coastguard Worker
1364*08b48e0bSAndroid Build Coastguard Worker memset(__afl_area_ptr, 0, __afl_map_size);
1365*08b48e0bSAndroid Build Coastguard Worker __afl_area_ptr[0] = 1;
1366*08b48e0bSAndroid Build Coastguard Worker memset(__afl_prev_loc, 0, NGRAM_SIZE_MAX * sizeof(PREV_LOC_T));
1367*08b48e0bSAndroid Build Coastguard Worker
1368*08b48e0bSAndroid Build Coastguard Worker cycle_cnt = max_cnt;
1369*08b48e0bSAndroid Build Coastguard Worker first_pass = 0;
1370*08b48e0bSAndroid Build Coastguard Worker __afl_selective_coverage_temp = 1;
1371*08b48e0bSAndroid Build Coastguard Worker
1372*08b48e0bSAndroid Build Coastguard Worker return 1;
1373*08b48e0bSAndroid Build Coastguard Worker
1374*08b48e0bSAndroid Build Coastguard Worker } else if (--cycle_cnt) {
1375*08b48e0bSAndroid Build Coastguard Worker
1376*08b48e0bSAndroid Build Coastguard Worker raise(SIGSTOP);
1377*08b48e0bSAndroid Build Coastguard Worker
1378*08b48e0bSAndroid Build Coastguard Worker __afl_area_ptr[0] = 1;
1379*08b48e0bSAndroid Build Coastguard Worker memset(__afl_prev_loc, 0, NGRAM_SIZE_MAX * sizeof(PREV_LOC_T));
1380*08b48e0bSAndroid Build Coastguard Worker __afl_selective_coverage_temp = 1;
1381*08b48e0bSAndroid Build Coastguard Worker
1382*08b48e0bSAndroid Build Coastguard Worker return 1;
1383*08b48e0bSAndroid Build Coastguard Worker
1384*08b48e0bSAndroid Build Coastguard Worker } else {
1385*08b48e0bSAndroid Build Coastguard Worker
1386*08b48e0bSAndroid Build Coastguard Worker /* When exiting __AFL_LOOP(), make sure that the subsequent code that
1387*08b48e0bSAndroid Build Coastguard Worker follows the loop is not traced. We do that by pivoting back to the
1388*08b48e0bSAndroid Build Coastguard Worker dummy output region. */
1389*08b48e0bSAndroid Build Coastguard Worker
1390*08b48e0bSAndroid Build Coastguard Worker __afl_area_ptr = __afl_area_ptr_dummy;
1391*08b48e0bSAndroid Build Coastguard Worker
1392*08b48e0bSAndroid Build Coastguard Worker return 0;
1393*08b48e0bSAndroid Build Coastguard Worker
1394*08b48e0bSAndroid Build Coastguard Worker }
1395*08b48e0bSAndroid Build Coastguard Worker
1396*08b48e0bSAndroid Build Coastguard Worker }
1397*08b48e0bSAndroid Build Coastguard Worker
1398*08b48e0bSAndroid Build Coastguard Worker /* This one can be called from user code when deferred forkserver mode
1399*08b48e0bSAndroid Build Coastguard Worker is enabled. */
1400*08b48e0bSAndroid Build Coastguard Worker
__afl_manual_init(void)1401*08b48e0bSAndroid Build Coastguard Worker void __afl_manual_init(void) {
1402*08b48e0bSAndroid Build Coastguard Worker
1403*08b48e0bSAndroid Build Coastguard Worker static u8 init_done;
1404*08b48e0bSAndroid Build Coastguard Worker
1405*08b48e0bSAndroid Build Coastguard Worker if (getenv("AFL_DISABLE_LLVM_INSTRUMENTATION")) {
1406*08b48e0bSAndroid Build Coastguard Worker
1407*08b48e0bSAndroid Build Coastguard Worker init_done = 1;
1408*08b48e0bSAndroid Build Coastguard Worker is_persistent = 0;
1409*08b48e0bSAndroid Build Coastguard Worker __afl_sharedmem_fuzzing = 0;
1410*08b48e0bSAndroid Build Coastguard Worker if (__afl_area_ptr == NULL) __afl_area_ptr = __afl_area_ptr_dummy;
1411*08b48e0bSAndroid Build Coastguard Worker
1412*08b48e0bSAndroid Build Coastguard Worker if (__afl_debug) {
1413*08b48e0bSAndroid Build Coastguard Worker
1414*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr,
1415*08b48e0bSAndroid Build Coastguard Worker "DEBUG: disabled instrumentation because of "
1416*08b48e0bSAndroid Build Coastguard Worker "AFL_DISABLE_LLVM_INSTRUMENTATION\n");
1417*08b48e0bSAndroid Build Coastguard Worker
1418*08b48e0bSAndroid Build Coastguard Worker }
1419*08b48e0bSAndroid Build Coastguard Worker
1420*08b48e0bSAndroid Build Coastguard Worker }
1421*08b48e0bSAndroid Build Coastguard Worker
1422*08b48e0bSAndroid Build Coastguard Worker if (!init_done) {
1423*08b48e0bSAndroid Build Coastguard Worker
1424*08b48e0bSAndroid Build Coastguard Worker __afl_start_forkserver();
1425*08b48e0bSAndroid Build Coastguard Worker init_done = 1;
1426*08b48e0bSAndroid Build Coastguard Worker
1427*08b48e0bSAndroid Build Coastguard Worker }
1428*08b48e0bSAndroid Build Coastguard Worker
1429*08b48e0bSAndroid Build Coastguard Worker }
1430*08b48e0bSAndroid Build Coastguard Worker
1431*08b48e0bSAndroid Build Coastguard Worker /* Initialization of the forkserver - latest possible */
1432*08b48e0bSAndroid Build Coastguard Worker
__afl_auto_init(void)1433*08b48e0bSAndroid Build Coastguard Worker __attribute__((constructor())) void __afl_auto_init(void) {
1434*08b48e0bSAndroid Build Coastguard Worker
1435*08b48e0bSAndroid Build Coastguard Worker if (__afl_already_initialized_init) { return; }
1436*08b48e0bSAndroid Build Coastguard Worker
1437*08b48e0bSAndroid Build Coastguard Worker #ifdef __ANDROID__
1438*08b48e0bSAndroid Build Coastguard Worker // Disable handlers in linker/debuggerd, check include/debuggerd/handler.h
1439*08b48e0bSAndroid Build Coastguard Worker signal(SIGABRT, SIG_DFL);
1440*08b48e0bSAndroid Build Coastguard Worker signal(SIGBUS, SIG_DFL);
1441*08b48e0bSAndroid Build Coastguard Worker signal(SIGFPE, SIG_DFL);
1442*08b48e0bSAndroid Build Coastguard Worker signal(SIGILL, SIG_DFL);
1443*08b48e0bSAndroid Build Coastguard Worker signal(SIGSEGV, SIG_DFL);
1444*08b48e0bSAndroid Build Coastguard Worker signal(SIGSTKFLT, SIG_DFL);
1445*08b48e0bSAndroid Build Coastguard Worker signal(SIGSYS, SIG_DFL);
1446*08b48e0bSAndroid Build Coastguard Worker signal(SIGTRAP, SIG_DFL);
1447*08b48e0bSAndroid Build Coastguard Worker #endif
1448*08b48e0bSAndroid Build Coastguard Worker
1449*08b48e0bSAndroid Build Coastguard Worker __afl_already_initialized_init = 1;
1450*08b48e0bSAndroid Build Coastguard Worker
1451*08b48e0bSAndroid Build Coastguard Worker if (getenv("AFL_DISABLE_LLVM_INSTRUMENTATION")) return;
1452*08b48e0bSAndroid Build Coastguard Worker
1453*08b48e0bSAndroid Build Coastguard Worker if (getenv(DEFER_ENV_VAR)) return;
1454*08b48e0bSAndroid Build Coastguard Worker
1455*08b48e0bSAndroid Build Coastguard Worker __afl_manual_init();
1456*08b48e0bSAndroid Build Coastguard Worker
1457*08b48e0bSAndroid Build Coastguard Worker }
1458*08b48e0bSAndroid Build Coastguard Worker
1459*08b48e0bSAndroid Build Coastguard Worker /* Optionally run an early forkserver */
1460*08b48e0bSAndroid Build Coastguard Worker
__early_forkserver(void)1461*08b48e0bSAndroid Build Coastguard Worker __attribute__((constructor(EARLY_FS_PRIO))) void __early_forkserver(void) {
1462*08b48e0bSAndroid Build Coastguard Worker
1463*08b48e0bSAndroid Build Coastguard Worker if (getenv("AFL_EARLY_FORKSERVER")) { __afl_auto_init(); }
1464*08b48e0bSAndroid Build Coastguard Worker
1465*08b48e0bSAndroid Build Coastguard Worker }
1466*08b48e0bSAndroid Build Coastguard Worker
1467*08b48e0bSAndroid Build Coastguard Worker /* Initialization of the shmem - earliest possible because of LTO fixed mem. */
1468*08b48e0bSAndroid Build Coastguard Worker
__afl_auto_early(void)1469*08b48e0bSAndroid Build Coastguard Worker __attribute__((constructor(CTOR_PRIO))) void __afl_auto_early(void) {
1470*08b48e0bSAndroid Build Coastguard Worker
1471*08b48e0bSAndroid Build Coastguard Worker if (__afl_already_initialized_early) return;
1472*08b48e0bSAndroid Build Coastguard Worker __afl_already_initialized_early = 1;
1473*08b48e0bSAndroid Build Coastguard Worker
1474*08b48e0bSAndroid Build Coastguard Worker is_persistent = !!getenv(PERSIST_ENV_VAR);
1475*08b48e0bSAndroid Build Coastguard Worker
1476*08b48e0bSAndroid Build Coastguard Worker if (getenv("AFL_DISABLE_LLVM_INSTRUMENTATION")) return;
1477*08b48e0bSAndroid Build Coastguard Worker
1478*08b48e0bSAndroid Build Coastguard Worker __afl_map_shm();
1479*08b48e0bSAndroid Build Coastguard Worker
1480*08b48e0bSAndroid Build Coastguard Worker }
1481*08b48e0bSAndroid Build Coastguard Worker
1482*08b48e0bSAndroid Build Coastguard Worker /* preset __afl_area_ptr #2 */
1483*08b48e0bSAndroid Build Coastguard Worker
__afl_auto_second(void)1484*08b48e0bSAndroid Build Coastguard Worker __attribute__((constructor(1))) void __afl_auto_second(void) {
1485*08b48e0bSAndroid Build Coastguard Worker
1486*08b48e0bSAndroid Build Coastguard Worker if (__afl_already_initialized_second) return;
1487*08b48e0bSAndroid Build Coastguard Worker __afl_already_initialized_second = 1;
1488*08b48e0bSAndroid Build Coastguard Worker
1489*08b48e0bSAndroid Build Coastguard Worker if (getenv("AFL_DEBUG")) {
1490*08b48e0bSAndroid Build Coastguard Worker
1491*08b48e0bSAndroid Build Coastguard Worker __afl_debug = 1;
1492*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr, "DEBUG: debug enabled\n");
1493*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr, "DEBUG: AFL++ afl-compiler-rt" VERSION "\n");
1494*08b48e0bSAndroid Build Coastguard Worker
1495*08b48e0bSAndroid Build Coastguard Worker }
1496*08b48e0bSAndroid Build Coastguard Worker
1497*08b48e0bSAndroid Build Coastguard Worker if (getenv("AFL_DISABLE_LLVM_INSTRUMENTATION")) return;
1498*08b48e0bSAndroid Build Coastguard Worker u8 *ptr;
1499*08b48e0bSAndroid Build Coastguard Worker
1500*08b48e0bSAndroid Build Coastguard Worker if (__afl_final_loc > MAP_INITIAL_SIZE) {
1501*08b48e0bSAndroid Build Coastguard Worker
1502*08b48e0bSAndroid Build Coastguard Worker __afl_first_final_loc = __afl_final_loc + 1;
1503*08b48e0bSAndroid Build Coastguard Worker
1504*08b48e0bSAndroid Build Coastguard Worker if (__afl_area_ptr && __afl_area_ptr != __afl_area_initial)
1505*08b48e0bSAndroid Build Coastguard Worker free(__afl_area_ptr);
1506*08b48e0bSAndroid Build Coastguard Worker
1507*08b48e0bSAndroid Build Coastguard Worker if (__afl_map_addr)
1508*08b48e0bSAndroid Build Coastguard Worker ptr = (u8 *)mmap((void *)__afl_map_addr, __afl_first_final_loc,
1509*08b48e0bSAndroid Build Coastguard Worker PROT_READ | PROT_WRITE,
1510*08b48e0bSAndroid Build Coastguard Worker MAP_FIXED_NOREPLACE | MAP_SHARED | MAP_ANONYMOUS, -1, 0);
1511*08b48e0bSAndroid Build Coastguard Worker else
1512*08b48e0bSAndroid Build Coastguard Worker ptr = (u8 *)malloc(__afl_first_final_loc);
1513*08b48e0bSAndroid Build Coastguard Worker
1514*08b48e0bSAndroid Build Coastguard Worker if (ptr && (ssize_t)ptr != -1) {
1515*08b48e0bSAndroid Build Coastguard Worker
1516*08b48e0bSAndroid Build Coastguard Worker __afl_area_ptr = ptr;
1517*08b48e0bSAndroid Build Coastguard Worker __afl_area_ptr_dummy = __afl_area_ptr;
1518*08b48e0bSAndroid Build Coastguard Worker __afl_area_ptr_backup = __afl_area_ptr;
1519*08b48e0bSAndroid Build Coastguard Worker
1520*08b48e0bSAndroid Build Coastguard Worker }
1521*08b48e0bSAndroid Build Coastguard Worker
1522*08b48e0bSAndroid Build Coastguard Worker }
1523*08b48e0bSAndroid Build Coastguard Worker
1524*08b48e0bSAndroid Build Coastguard Worker } // ptr memleak report is a false positive
1525*08b48e0bSAndroid Build Coastguard Worker
1526*08b48e0bSAndroid Build Coastguard Worker /* preset __afl_area_ptr #1 - at constructor level 0 global variables have
1527*08b48e0bSAndroid Build Coastguard Worker not been set */
1528*08b48e0bSAndroid Build Coastguard Worker
__afl_auto_first(void)1529*08b48e0bSAndroid Build Coastguard Worker __attribute__((constructor(0))) void __afl_auto_first(void) {
1530*08b48e0bSAndroid Build Coastguard Worker
1531*08b48e0bSAndroid Build Coastguard Worker if (__afl_already_initialized_first) return;
1532*08b48e0bSAndroid Build Coastguard Worker __afl_already_initialized_first = 1;
1533*08b48e0bSAndroid Build Coastguard Worker
1534*08b48e0bSAndroid Build Coastguard Worker if (getenv("AFL_DISABLE_LLVM_INSTRUMENTATION")) return;
1535*08b48e0bSAndroid Build Coastguard Worker
1536*08b48e0bSAndroid Build Coastguard Worker /*
1537*08b48e0bSAndroid Build Coastguard Worker u8 *ptr = (u8 *)malloc(MAP_INITIAL_SIZE);
1538*08b48e0bSAndroid Build Coastguard Worker
1539*08b48e0bSAndroid Build Coastguard Worker if (ptr && (ssize_t)ptr != -1) {
1540*08b48e0bSAndroid Build Coastguard Worker
1541*08b48e0bSAndroid Build Coastguard Worker __afl_area_ptr = ptr;
1542*08b48e0bSAndroid Build Coastguard Worker __afl_area_ptr_backup = __afl_area_ptr;
1543*08b48e0bSAndroid Build Coastguard Worker
1544*08b48e0bSAndroid Build Coastguard Worker }
1545*08b48e0bSAndroid Build Coastguard Worker
1546*08b48e0bSAndroid Build Coastguard Worker */
1547*08b48e0bSAndroid Build Coastguard Worker
1548*08b48e0bSAndroid Build Coastguard Worker } // ptr memleak report is a false positive
1549*08b48e0bSAndroid Build Coastguard Worker
1550*08b48e0bSAndroid Build Coastguard Worker /* The following stuff deals with supporting -fsanitize-coverage=trace-pc-guard.
1551*08b48e0bSAndroid Build Coastguard Worker It remains non-operational in the traditional, plugin-backed LLVM mode.
1552*08b48e0bSAndroid Build Coastguard Worker For more info about 'trace-pc-guard', see README.llvm.md.
1553*08b48e0bSAndroid Build Coastguard Worker
1554*08b48e0bSAndroid Build Coastguard Worker The first function (__sanitizer_cov_trace_pc_guard) is called back on every
1555*08b48e0bSAndroid Build Coastguard Worker edge (as opposed to every basic block). */
1556*08b48e0bSAndroid Build Coastguard Worker
__sanitizer_cov_trace_pc_guard(uint32_t * guard)1557*08b48e0bSAndroid Build Coastguard Worker void __sanitizer_cov_trace_pc_guard(uint32_t *guard) {
1558*08b48e0bSAndroid Build Coastguard Worker
1559*08b48e0bSAndroid Build Coastguard Worker // For stability analysis, if you want to know to which function unstable
1560*08b48e0bSAndroid Build Coastguard Worker // edge IDs belong - uncomment, recompile+install llvm_mode, recompile
1561*08b48e0bSAndroid Build Coastguard Worker // the target. libunwind and libbacktrace are better solutions.
1562*08b48e0bSAndroid Build Coastguard Worker // Set AFL_DEBUG_CHILD=1 and run afl-fuzz with 2>file to capture
1563*08b48e0bSAndroid Build Coastguard Worker // the backtrace output
1564*08b48e0bSAndroid Build Coastguard Worker /*
1565*08b48e0bSAndroid Build Coastguard Worker uint32_t unstable[] = { ... unstable edge IDs };
1566*08b48e0bSAndroid Build Coastguard Worker uint32_t idx;
1567*08b48e0bSAndroid Build Coastguard Worker char bt[1024];
1568*08b48e0bSAndroid Build Coastguard Worker for (idx = 0; i < sizeof(unstable)/sizeof(uint32_t); i++) {
1569*08b48e0bSAndroid Build Coastguard Worker
1570*08b48e0bSAndroid Build Coastguard Worker if (unstable[idx] == __afl_area_ptr[*guard]) {
1571*08b48e0bSAndroid Build Coastguard Worker
1572*08b48e0bSAndroid Build Coastguard Worker int bt_size = backtrace(bt, 256);
1573*08b48e0bSAndroid Build Coastguard Worker if (bt_size > 0) {
1574*08b48e0bSAndroid Build Coastguard Worker
1575*08b48e0bSAndroid Build Coastguard Worker char **bt_syms = backtrace_symbols(bt, bt_size);
1576*08b48e0bSAndroid Build Coastguard Worker if (bt_syms) {
1577*08b48e0bSAndroid Build Coastguard Worker
1578*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr, "DEBUG: edge=%u caller=%s\n", unstable[idx],
1579*08b48e0bSAndroid Build Coastguard Worker bt_syms[0]);
1580*08b48e0bSAndroid Build Coastguard Worker free(bt_syms);
1581*08b48e0bSAndroid Build Coastguard Worker
1582*08b48e0bSAndroid Build Coastguard Worker }
1583*08b48e0bSAndroid Build Coastguard Worker
1584*08b48e0bSAndroid Build Coastguard Worker }
1585*08b48e0bSAndroid Build Coastguard Worker
1586*08b48e0bSAndroid Build Coastguard Worker }
1587*08b48e0bSAndroid Build Coastguard Worker
1588*08b48e0bSAndroid Build Coastguard Worker }
1589*08b48e0bSAndroid Build Coastguard Worker
1590*08b48e0bSAndroid Build Coastguard Worker */
1591*08b48e0bSAndroid Build Coastguard Worker
1592*08b48e0bSAndroid Build Coastguard Worker #if (LLVM_VERSION_MAJOR < 9)
1593*08b48e0bSAndroid Build Coastguard Worker
1594*08b48e0bSAndroid Build Coastguard Worker __afl_area_ptr[*guard]++;
1595*08b48e0bSAndroid Build Coastguard Worker
1596*08b48e0bSAndroid Build Coastguard Worker #else
1597*08b48e0bSAndroid Build Coastguard Worker
1598*08b48e0bSAndroid Build Coastguard Worker __afl_area_ptr[*guard] =
1599*08b48e0bSAndroid Build Coastguard Worker __afl_area_ptr[*guard] + 1 + (__afl_area_ptr[*guard] == 255 ? 1 : 0);
1600*08b48e0bSAndroid Build Coastguard Worker
1601*08b48e0bSAndroid Build Coastguard Worker #endif
1602*08b48e0bSAndroid Build Coastguard Worker
1603*08b48e0bSAndroid Build Coastguard Worker }
1604*08b48e0bSAndroid Build Coastguard Worker
1605*08b48e0bSAndroid Build Coastguard Worker #ifdef __AFL_CODE_COVERAGE
afl_read_pc_filter_file(const char * filter_file)1606*08b48e0bSAndroid Build Coastguard Worker void afl_read_pc_filter_file(const char *filter_file) {
1607*08b48e0bSAndroid Build Coastguard Worker
1608*08b48e0bSAndroid Build Coastguard Worker FILE *file;
1609*08b48e0bSAndroid Build Coastguard Worker char ch;
1610*08b48e0bSAndroid Build Coastguard Worker
1611*08b48e0bSAndroid Build Coastguard Worker file = fopen(filter_file, "r");
1612*08b48e0bSAndroid Build Coastguard Worker if (file == NULL) {
1613*08b48e0bSAndroid Build Coastguard Worker
1614*08b48e0bSAndroid Build Coastguard Worker perror("Error opening file");
1615*08b48e0bSAndroid Build Coastguard Worker return;
1616*08b48e0bSAndroid Build Coastguard Worker
1617*08b48e0bSAndroid Build Coastguard Worker }
1618*08b48e0bSAndroid Build Coastguard Worker
1619*08b48e0bSAndroid Build Coastguard Worker // Check how many PCs we expect to read
1620*08b48e0bSAndroid Build Coastguard Worker while ((ch = fgetc(file)) != EOF) {
1621*08b48e0bSAndroid Build Coastguard Worker
1622*08b48e0bSAndroid Build Coastguard Worker if (ch == '\n') { __afl_filter_pcs_size++; }
1623*08b48e0bSAndroid Build Coastguard Worker
1624*08b48e0bSAndroid Build Coastguard Worker }
1625*08b48e0bSAndroid Build Coastguard Worker
1626*08b48e0bSAndroid Build Coastguard Worker // Rewind to actually read the PCs
1627*08b48e0bSAndroid Build Coastguard Worker fseek(file, 0, SEEK_SET);
1628*08b48e0bSAndroid Build Coastguard Worker
1629*08b48e0bSAndroid Build Coastguard Worker __afl_filter_pcs = malloc(__afl_filter_pcs_size * sizeof(FilterPCEntry));
1630*08b48e0bSAndroid Build Coastguard Worker if (!__afl_filter_pcs) {
1631*08b48e0bSAndroid Build Coastguard Worker
1632*08b48e0bSAndroid Build Coastguard Worker perror("Error allocating PC array");
1633*08b48e0bSAndroid Build Coastguard Worker return;
1634*08b48e0bSAndroid Build Coastguard Worker
1635*08b48e0bSAndroid Build Coastguard Worker }
1636*08b48e0bSAndroid Build Coastguard Worker
1637*08b48e0bSAndroid Build Coastguard Worker for (size_t i = 0; i < __afl_filter_pcs_size; i++) {
1638*08b48e0bSAndroid Build Coastguard Worker
1639*08b48e0bSAndroid Build Coastguard Worker fscanf(file, "%lx", &(__afl_filter_pcs[i].start));
1640*08b48e0bSAndroid Build Coastguard Worker ch = fgetc(file); // Read tab
1641*08b48e0bSAndroid Build Coastguard Worker fscanf(file, "%u", &(__afl_filter_pcs[i].len));
1642*08b48e0bSAndroid Build Coastguard Worker ch = fgetc(file); // Read tab
1643*08b48e0bSAndroid Build Coastguard Worker
1644*08b48e0bSAndroid Build Coastguard Worker if (!__afl_filter_pcs_module) {
1645*08b48e0bSAndroid Build Coastguard Worker
1646*08b48e0bSAndroid Build Coastguard Worker // Read the module name and store it.
1647*08b48e0bSAndroid Build Coastguard Worker // TODO: We only support one module here right now although
1648*08b48e0bSAndroid Build Coastguard Worker // there is technically no reason to support multiple modules
1649*08b48e0bSAndroid Build Coastguard Worker // in one go.
1650*08b48e0bSAndroid Build Coastguard Worker size_t max_module_len = 255;
1651*08b48e0bSAndroid Build Coastguard Worker size_t i = 0;
1652*08b48e0bSAndroid Build Coastguard Worker __afl_filter_pcs_module = malloc(max_module_len);
1653*08b48e0bSAndroid Build Coastguard Worker while (i < max_module_len - 1 &&
1654*08b48e0bSAndroid Build Coastguard Worker (__afl_filter_pcs_module[i] = fgetc(file)) != '\t') {
1655*08b48e0bSAndroid Build Coastguard Worker
1656*08b48e0bSAndroid Build Coastguard Worker ++i;
1657*08b48e0bSAndroid Build Coastguard Worker
1658*08b48e0bSAndroid Build Coastguard Worker }
1659*08b48e0bSAndroid Build Coastguard Worker
1660*08b48e0bSAndroid Build Coastguard Worker __afl_filter_pcs_module[i] = '\0';
1661*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr, "DEBUGXXX: Read module name %s\n",
1662*08b48e0bSAndroid Build Coastguard Worker __afl_filter_pcs_module);
1663*08b48e0bSAndroid Build Coastguard Worker
1664*08b48e0bSAndroid Build Coastguard Worker }
1665*08b48e0bSAndroid Build Coastguard Worker
1666*08b48e0bSAndroid Build Coastguard Worker while ((ch = fgetc(file)) != '\n' && ch != EOF)
1667*08b48e0bSAndroid Build Coastguard Worker ;
1668*08b48e0bSAndroid Build Coastguard Worker
1669*08b48e0bSAndroid Build Coastguard Worker }
1670*08b48e0bSAndroid Build Coastguard Worker
1671*08b48e0bSAndroid Build Coastguard Worker fclose(file);
1672*08b48e0bSAndroid Build Coastguard Worker
1673*08b48e0bSAndroid Build Coastguard Worker }
1674*08b48e0bSAndroid Build Coastguard Worker
locate_in_pcs(uintptr_t needle,u32 * index)1675*08b48e0bSAndroid Build Coastguard Worker u32 locate_in_pcs(uintptr_t needle, u32 *index) {
1676*08b48e0bSAndroid Build Coastguard Worker
1677*08b48e0bSAndroid Build Coastguard Worker size_t lower_bound = 0;
1678*08b48e0bSAndroid Build Coastguard Worker size_t upper_bound = __afl_filter_pcs_size - 1;
1679*08b48e0bSAndroid Build Coastguard Worker
1680*08b48e0bSAndroid Build Coastguard Worker while (lower_bound < __afl_filter_pcs_size && lower_bound <= upper_bound) {
1681*08b48e0bSAndroid Build Coastguard Worker
1682*08b48e0bSAndroid Build Coastguard Worker size_t current_index = lower_bound + (upper_bound - lower_bound) / 2;
1683*08b48e0bSAndroid Build Coastguard Worker
1684*08b48e0bSAndroid Build Coastguard Worker if (__afl_filter_pcs[current_index].start <= needle) {
1685*08b48e0bSAndroid Build Coastguard Worker
1686*08b48e0bSAndroid Build Coastguard Worker if (__afl_filter_pcs[current_index].start +
1687*08b48e0bSAndroid Build Coastguard Worker __afl_filter_pcs[current_index].len >
1688*08b48e0bSAndroid Build Coastguard Worker needle) {
1689*08b48e0bSAndroid Build Coastguard Worker
1690*08b48e0bSAndroid Build Coastguard Worker // Hit
1691*08b48e0bSAndroid Build Coastguard Worker *index = current_index;
1692*08b48e0bSAndroid Build Coastguard Worker return 1;
1693*08b48e0bSAndroid Build Coastguard Worker
1694*08b48e0bSAndroid Build Coastguard Worker } else {
1695*08b48e0bSAndroid Build Coastguard Worker
1696*08b48e0bSAndroid Build Coastguard Worker lower_bound = current_index + 1;
1697*08b48e0bSAndroid Build Coastguard Worker
1698*08b48e0bSAndroid Build Coastguard Worker }
1699*08b48e0bSAndroid Build Coastguard Worker
1700*08b48e0bSAndroid Build Coastguard Worker } else {
1701*08b48e0bSAndroid Build Coastguard Worker
1702*08b48e0bSAndroid Build Coastguard Worker if (!current_index) { break; }
1703*08b48e0bSAndroid Build Coastguard Worker upper_bound = current_index - 1;
1704*08b48e0bSAndroid Build Coastguard Worker
1705*08b48e0bSAndroid Build Coastguard Worker }
1706*08b48e0bSAndroid Build Coastguard Worker
1707*08b48e0bSAndroid Build Coastguard Worker }
1708*08b48e0bSAndroid Build Coastguard Worker
1709*08b48e0bSAndroid Build Coastguard Worker return 0;
1710*08b48e0bSAndroid Build Coastguard Worker
1711*08b48e0bSAndroid Build Coastguard Worker }
1712*08b48e0bSAndroid Build Coastguard Worker
__sanitizer_cov_pcs_init(const uintptr_t * pcs_beg,const uintptr_t * pcs_end)1713*08b48e0bSAndroid Build Coastguard Worker void __sanitizer_cov_pcs_init(const uintptr_t *pcs_beg,
1714*08b48e0bSAndroid Build Coastguard Worker const uintptr_t *pcs_end) {
1715*08b48e0bSAndroid Build Coastguard Worker
1716*08b48e0bSAndroid Build Coastguard Worker // If for whatever reason, we cannot get dlinfo here, then pc_guard_init also
1717*08b48e0bSAndroid Build Coastguard Worker // couldn't get it and we'd end up attributing to the wrong module.
1718*08b48e0bSAndroid Build Coastguard Worker Dl_info dlinfo;
1719*08b48e0bSAndroid Build Coastguard Worker if (!dladdr(__builtin_return_address(0), &dlinfo)) {
1720*08b48e0bSAndroid Build Coastguard Worker
1721*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr,
1722*08b48e0bSAndroid Build Coastguard Worker "WARNING: Ignoring __sanitizer_cov_pcs_init callback due to "
1723*08b48e0bSAndroid Build Coastguard Worker "missing module info\n");
1724*08b48e0bSAndroid Build Coastguard Worker return;
1725*08b48e0bSAndroid Build Coastguard Worker
1726*08b48e0bSAndroid Build Coastguard Worker }
1727*08b48e0bSAndroid Build Coastguard Worker
1728*08b48e0bSAndroid Build Coastguard Worker if (__afl_debug) {
1729*08b48e0bSAndroid Build Coastguard Worker
1730*08b48e0bSAndroid Build Coastguard Worker fprintf(
1731*08b48e0bSAndroid Build Coastguard Worker stderr,
1732*08b48e0bSAndroid Build Coastguard Worker "DEBUG: (%u) __sanitizer_cov_pcs_init called for module %s with %ld "
1733*08b48e0bSAndroid Build Coastguard Worker "PCs\n",
1734*08b48e0bSAndroid Build Coastguard Worker getpid(), dlinfo.dli_fname, pcs_end - pcs_beg);
1735*08b48e0bSAndroid Build Coastguard Worker
1736*08b48e0bSAndroid Build Coastguard Worker }
1737*08b48e0bSAndroid Build Coastguard Worker
1738*08b48e0bSAndroid Build Coastguard Worker afl_module_info_t *last_module_info = __afl_module_info;
1739*08b48e0bSAndroid Build Coastguard Worker while (last_module_info && last_module_info->next) {
1740*08b48e0bSAndroid Build Coastguard Worker
1741*08b48e0bSAndroid Build Coastguard Worker last_module_info = last_module_info->next;
1742*08b48e0bSAndroid Build Coastguard Worker
1743*08b48e0bSAndroid Build Coastguard Worker }
1744*08b48e0bSAndroid Build Coastguard Worker
1745*08b48e0bSAndroid Build Coastguard Worker if (!last_module_info) {
1746*08b48e0bSAndroid Build Coastguard Worker
1747*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr,
1748*08b48e0bSAndroid Build Coastguard Worker "ERROR: __sanitizer_cov_pcs_init called with no module info?!\n");
1749*08b48e0bSAndroid Build Coastguard Worker abort();
1750*08b48e0bSAndroid Build Coastguard Worker
1751*08b48e0bSAndroid Build Coastguard Worker }
1752*08b48e0bSAndroid Build Coastguard Worker
1753*08b48e0bSAndroid Build Coastguard Worker if (strcmp(dlinfo.dli_fname, last_module_info->name)) {
1754*08b48e0bSAndroid Build Coastguard Worker
1755*08b48e0bSAndroid Build Coastguard Worker // This can happen with modules being loaded after the forkserver
1756*08b48e0bSAndroid Build Coastguard Worker // where we decide to not track the module. In that case we must
1757*08b48e0bSAndroid Build Coastguard Worker // not track it here either.
1758*08b48e0bSAndroid Build Coastguard Worker fprintf(
1759*08b48e0bSAndroid Build Coastguard Worker stderr,
1760*08b48e0bSAndroid Build Coastguard Worker "WARNING: __sanitizer_cov_pcs_init module info mismatch: %s vs %s\n",
1761*08b48e0bSAndroid Build Coastguard Worker dlinfo.dli_fname, last_module_info->name);
1762*08b48e0bSAndroid Build Coastguard Worker return;
1763*08b48e0bSAndroid Build Coastguard Worker
1764*08b48e0bSAndroid Build Coastguard Worker }
1765*08b48e0bSAndroid Build Coastguard Worker
1766*08b48e0bSAndroid Build Coastguard Worker last_module_info->pcs_beg = pcs_beg;
1767*08b48e0bSAndroid Build Coastguard Worker last_module_info->pcs_end = pcs_end;
1768*08b48e0bSAndroid Build Coastguard Worker
1769*08b48e0bSAndroid Build Coastguard Worker // This is a direct filter based on symbolizing inside the runtime.
1770*08b48e0bSAndroid Build Coastguard Worker // It should only be used with smaller binaries to avoid long startup
1771*08b48e0bSAndroid Build Coastguard Worker // times. Currently, this only supports a single token to scan for.
1772*08b48e0bSAndroid Build Coastguard Worker const char *pc_filter = getenv("AFL_PC_FILTER");
1773*08b48e0bSAndroid Build Coastguard Worker
1774*08b48e0bSAndroid Build Coastguard Worker // This is a much faster PC filter based on pre-symbolized input data
1775*08b48e0bSAndroid Build Coastguard Worker // that is sorted for fast lookup through binary search. This method
1776*08b48e0bSAndroid Build Coastguard Worker // of filtering is suitable even for very large binaries.
1777*08b48e0bSAndroid Build Coastguard Worker const char *pc_filter_file = getenv("AFL_PC_FILTER_FILE");
1778*08b48e0bSAndroid Build Coastguard Worker if (pc_filter_file && !__afl_filter_pcs) {
1779*08b48e0bSAndroid Build Coastguard Worker
1780*08b48e0bSAndroid Build Coastguard Worker afl_read_pc_filter_file(pc_filter_file);
1781*08b48e0bSAndroid Build Coastguard Worker
1782*08b48e0bSAndroid Build Coastguard Worker }
1783*08b48e0bSAndroid Build Coastguard Worker
1784*08b48e0bSAndroid Build Coastguard Worker // Now update the pcmap. If this is the last module coming in, after all
1785*08b48e0bSAndroid Build Coastguard Worker // pre-loaded code, then this will also map all of our delayed previous
1786*08b48e0bSAndroid Build Coastguard Worker // modules.
1787*08b48e0bSAndroid Build Coastguard Worker //
1788*08b48e0bSAndroid Build Coastguard Worker for (afl_module_info_t *mod_info = __afl_module_info; mod_info;
1789*08b48e0bSAndroid Build Coastguard Worker mod_info = mod_info->next) {
1790*08b48e0bSAndroid Build Coastguard Worker
1791*08b48e0bSAndroid Build Coastguard Worker if (mod_info->mapped) { continue; }
1792*08b48e0bSAndroid Build Coastguard Worker
1793*08b48e0bSAndroid Build Coastguard Worker if (!mod_info->start) {
1794*08b48e0bSAndroid Build Coastguard Worker
1795*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr,
1796*08b48e0bSAndroid Build Coastguard Worker "ERROR: __sanitizer_cov_pcs_init called with mod_info->start == "
1797*08b48e0bSAndroid Build Coastguard Worker "NULL (%s)\n",
1798*08b48e0bSAndroid Build Coastguard Worker mod_info->name);
1799*08b48e0bSAndroid Build Coastguard Worker abort();
1800*08b48e0bSAndroid Build Coastguard Worker
1801*08b48e0bSAndroid Build Coastguard Worker }
1802*08b48e0bSAndroid Build Coastguard Worker
1803*08b48e0bSAndroid Build Coastguard Worker PCTableEntry *start = (PCTableEntry *)(mod_info->pcs_beg);
1804*08b48e0bSAndroid Build Coastguard Worker PCTableEntry *end = (PCTableEntry *)(mod_info->pcs_end);
1805*08b48e0bSAndroid Build Coastguard Worker
1806*08b48e0bSAndroid Build Coastguard Worker if (!*mod_info->stop) { continue; }
1807*08b48e0bSAndroid Build Coastguard Worker
1808*08b48e0bSAndroid Build Coastguard Worker u32 in_module_index = 0;
1809*08b48e0bSAndroid Build Coastguard Worker
1810*08b48e0bSAndroid Build Coastguard Worker while (start < end) {
1811*08b48e0bSAndroid Build Coastguard Worker
1812*08b48e0bSAndroid Build Coastguard Worker if (*mod_info->start + in_module_index >= __afl_map_size) {
1813*08b48e0bSAndroid Build Coastguard Worker
1814*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr,
1815*08b48e0bSAndroid Build Coastguard Worker "ERROR: __sanitizer_cov_pcs_init out of bounds?! Start: %u "
1816*08b48e0bSAndroid Build Coastguard Worker "Stop: %u Map Size: %u (%s)\n",
1817*08b48e0bSAndroid Build Coastguard Worker *mod_info->start, *mod_info->stop, __afl_map_size,
1818*08b48e0bSAndroid Build Coastguard Worker mod_info->name);
1819*08b48e0bSAndroid Build Coastguard Worker abort();
1820*08b48e0bSAndroid Build Coastguard Worker
1821*08b48e0bSAndroid Build Coastguard Worker }
1822*08b48e0bSAndroid Build Coastguard Worker
1823*08b48e0bSAndroid Build Coastguard Worker u32 orig_start_index = *mod_info->start;
1824*08b48e0bSAndroid Build Coastguard Worker
1825*08b48e0bSAndroid Build Coastguard Worker uintptr_t PC = start->PC;
1826*08b48e0bSAndroid Build Coastguard Worker
1827*08b48e0bSAndroid Build Coastguard Worker // This is what `GetPreviousInstructionPc` in sanitizer runtime does
1828*08b48e0bSAndroid Build Coastguard Worker // for x86/x86-64. Needs more work for ARM and other archs.
1829*08b48e0bSAndroid Build Coastguard Worker PC = PC - 1;
1830*08b48e0bSAndroid Build Coastguard Worker
1831*08b48e0bSAndroid Build Coastguard Worker // Calculate relative offset in module
1832*08b48e0bSAndroid Build Coastguard Worker PC = PC - mod_info->base_address;
1833*08b48e0bSAndroid Build Coastguard Worker
1834*08b48e0bSAndroid Build Coastguard Worker if (__afl_pcmap_ptr) {
1835*08b48e0bSAndroid Build Coastguard Worker
1836*08b48e0bSAndroid Build Coastguard Worker __afl_pcmap_ptr[orig_start_index + in_module_index] = PC;
1837*08b48e0bSAndroid Build Coastguard Worker
1838*08b48e0bSAndroid Build Coastguard Worker }
1839*08b48e0bSAndroid Build Coastguard Worker
1840*08b48e0bSAndroid Build Coastguard Worker if (pc_filter) {
1841*08b48e0bSAndroid Build Coastguard Worker
1842*08b48e0bSAndroid Build Coastguard Worker char PcDescr[1024];
1843*08b48e0bSAndroid Build Coastguard Worker // This function is a part of the sanitizer run-time.
1844*08b48e0bSAndroid Build Coastguard Worker // To use it, link with AddressSanitizer or other sanitizer.
1845*08b48e0bSAndroid Build Coastguard Worker __sanitizer_symbolize_pc((void *)start->PC, "%p %F %L", PcDescr,
1846*08b48e0bSAndroid Build Coastguard Worker sizeof(PcDescr));
1847*08b48e0bSAndroid Build Coastguard Worker
1848*08b48e0bSAndroid Build Coastguard Worker if (strstr(PcDescr, pc_filter)) {
1849*08b48e0bSAndroid Build Coastguard Worker
1850*08b48e0bSAndroid Build Coastguard Worker if (__afl_debug)
1851*08b48e0bSAndroid Build Coastguard Worker fprintf(
1852*08b48e0bSAndroid Build Coastguard Worker stderr,
1853*08b48e0bSAndroid Build Coastguard Worker "DEBUG: Selective instrumentation match: %s (PC %p Index %u)\n",
1854*08b48e0bSAndroid Build Coastguard Worker PcDescr, (void *)start->PC,
1855*08b48e0bSAndroid Build Coastguard Worker *(mod_info->start + in_module_index));
1856*08b48e0bSAndroid Build Coastguard Worker // No change to guard needed
1857*08b48e0bSAndroid Build Coastguard Worker
1858*08b48e0bSAndroid Build Coastguard Worker } else {
1859*08b48e0bSAndroid Build Coastguard Worker
1860*08b48e0bSAndroid Build Coastguard Worker // Null out the guard to disable this edge
1861*08b48e0bSAndroid Build Coastguard Worker *(mod_info->start + in_module_index) = 0;
1862*08b48e0bSAndroid Build Coastguard Worker
1863*08b48e0bSAndroid Build Coastguard Worker }
1864*08b48e0bSAndroid Build Coastguard Worker
1865*08b48e0bSAndroid Build Coastguard Worker }
1866*08b48e0bSAndroid Build Coastguard Worker
1867*08b48e0bSAndroid Build Coastguard Worker if (__afl_filter_pcs && strstr(mod_info->name, __afl_filter_pcs_module)) {
1868*08b48e0bSAndroid Build Coastguard Worker
1869*08b48e0bSAndroid Build Coastguard Worker u32 result_index;
1870*08b48e0bSAndroid Build Coastguard Worker if (locate_in_pcs(PC, &result_index)) {
1871*08b48e0bSAndroid Build Coastguard Worker
1872*08b48e0bSAndroid Build Coastguard Worker if (__afl_debug)
1873*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr,
1874*08b48e0bSAndroid Build Coastguard Worker "DEBUG: Selective instrumentation match: (PC %lx File "
1875*08b48e0bSAndroid Build Coastguard Worker "Index %u PC Index %u)\n",
1876*08b48e0bSAndroid Build Coastguard Worker PC, result_index, in_module_index);
1877*08b48e0bSAndroid Build Coastguard Worker
1878*08b48e0bSAndroid Build Coastguard Worker } else {
1879*08b48e0bSAndroid Build Coastguard Worker
1880*08b48e0bSAndroid Build Coastguard Worker // Null out the guard to disable this edge
1881*08b48e0bSAndroid Build Coastguard Worker *(mod_info->start + in_module_index) = 0;
1882*08b48e0bSAndroid Build Coastguard Worker
1883*08b48e0bSAndroid Build Coastguard Worker }
1884*08b48e0bSAndroid Build Coastguard Worker
1885*08b48e0bSAndroid Build Coastguard Worker }
1886*08b48e0bSAndroid Build Coastguard Worker
1887*08b48e0bSAndroid Build Coastguard Worker start++;
1888*08b48e0bSAndroid Build Coastguard Worker in_module_index++;
1889*08b48e0bSAndroid Build Coastguard Worker
1890*08b48e0bSAndroid Build Coastguard Worker }
1891*08b48e0bSAndroid Build Coastguard Worker
1892*08b48e0bSAndroid Build Coastguard Worker mod_info->mapped = 1;
1893*08b48e0bSAndroid Build Coastguard Worker
1894*08b48e0bSAndroid Build Coastguard Worker if (__afl_debug) {
1895*08b48e0bSAndroid Build Coastguard Worker
1896*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr,
1897*08b48e0bSAndroid Build Coastguard Worker "DEBUG: __sanitizer_cov_pcs_init successfully mapped %s with %u "
1898*08b48e0bSAndroid Build Coastguard Worker "PCs\n",
1899*08b48e0bSAndroid Build Coastguard Worker mod_info->name, in_module_index);
1900*08b48e0bSAndroid Build Coastguard Worker
1901*08b48e0bSAndroid Build Coastguard Worker }
1902*08b48e0bSAndroid Build Coastguard Worker
1903*08b48e0bSAndroid Build Coastguard Worker }
1904*08b48e0bSAndroid Build Coastguard Worker
1905*08b48e0bSAndroid Build Coastguard Worker }
1906*08b48e0bSAndroid Build Coastguard Worker
1907*08b48e0bSAndroid Build Coastguard Worker #endif // __AFL_CODE_COVERAGE
1908*08b48e0bSAndroid Build Coastguard Worker
1909*08b48e0bSAndroid Build Coastguard Worker /* Init callback. Populates instrumentation IDs. Note that we're using
1910*08b48e0bSAndroid Build Coastguard Worker ID of 0 as a special value to indicate non-instrumented bits. That may
1911*08b48e0bSAndroid Build Coastguard Worker still touch the bitmap, but in a fairly harmless way. */
1912*08b48e0bSAndroid Build Coastguard Worker
__sanitizer_cov_trace_pc_guard_init(uint32_t * start,uint32_t * stop)1913*08b48e0bSAndroid Build Coastguard Worker void __sanitizer_cov_trace_pc_guard_init(uint32_t *start, uint32_t *stop) {
1914*08b48e0bSAndroid Build Coastguard Worker
1915*08b48e0bSAndroid Build Coastguard Worker u32 inst_ratio = 100;
1916*08b48e0bSAndroid Build Coastguard Worker char *x;
1917*08b48e0bSAndroid Build Coastguard Worker
1918*08b48e0bSAndroid Build Coastguard Worker _is_sancov = 1;
1919*08b48e0bSAndroid Build Coastguard Worker
1920*08b48e0bSAndroid Build Coastguard Worker if (!getenv("AFL_DUMP_MAP_SIZE")) {
1921*08b48e0bSAndroid Build Coastguard Worker
1922*08b48e0bSAndroid Build Coastguard Worker __afl_auto_first();
1923*08b48e0bSAndroid Build Coastguard Worker __afl_auto_second();
1924*08b48e0bSAndroid Build Coastguard Worker __afl_auto_early();
1925*08b48e0bSAndroid Build Coastguard Worker
1926*08b48e0bSAndroid Build Coastguard Worker }
1927*08b48e0bSAndroid Build Coastguard Worker
1928*08b48e0bSAndroid Build Coastguard Worker if (__afl_debug) {
1929*08b48e0bSAndroid Build Coastguard Worker
1930*08b48e0bSAndroid Build Coastguard Worker fprintf(
1931*08b48e0bSAndroid Build Coastguard Worker stderr,
1932*08b48e0bSAndroid Build Coastguard Worker "DEBUG: Running __sanitizer_cov_trace_pc_guard_init: %p-%p (%lu edges) "
1933*08b48e0bSAndroid Build Coastguard Worker "after_fs=%u *start=%u\n",
1934*08b48e0bSAndroid Build Coastguard Worker start, stop, (unsigned long)(stop - start),
1935*08b48e0bSAndroid Build Coastguard Worker __afl_already_initialized_forkserver, *start);
1936*08b48e0bSAndroid Build Coastguard Worker
1937*08b48e0bSAndroid Build Coastguard Worker }
1938*08b48e0bSAndroid Build Coastguard Worker
1939*08b48e0bSAndroid Build Coastguard Worker if (start == stop || *start) { return; }
1940*08b48e0bSAndroid Build Coastguard Worker
1941*08b48e0bSAndroid Build Coastguard Worker #ifdef __AFL_CODE_COVERAGE
1942*08b48e0bSAndroid Build Coastguard Worker u32 *orig_start = start;
1943*08b48e0bSAndroid Build Coastguard Worker afl_module_info_t *mod_info = NULL;
1944*08b48e0bSAndroid Build Coastguard Worker
1945*08b48e0bSAndroid Build Coastguard Worker Dl_info dlinfo;
1946*08b48e0bSAndroid Build Coastguard Worker if (dladdr(__builtin_return_address(0), &dlinfo)) {
1947*08b48e0bSAndroid Build Coastguard Worker
1948*08b48e0bSAndroid Build Coastguard Worker if (__afl_already_initialized_forkserver) {
1949*08b48e0bSAndroid Build Coastguard Worker
1950*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr, "[pcmap] Error: Module was not preloaded: %s\n",
1951*08b48e0bSAndroid Build Coastguard Worker dlinfo.dli_fname);
1952*08b48e0bSAndroid Build Coastguard Worker
1953*08b48e0bSAndroid Build Coastguard Worker } else {
1954*08b48e0bSAndroid Build Coastguard Worker
1955*08b48e0bSAndroid Build Coastguard Worker afl_module_info_t *last_module_info = __afl_module_info;
1956*08b48e0bSAndroid Build Coastguard Worker while (last_module_info && last_module_info->next) {
1957*08b48e0bSAndroid Build Coastguard Worker
1958*08b48e0bSAndroid Build Coastguard Worker last_module_info = last_module_info->next;
1959*08b48e0bSAndroid Build Coastguard Worker
1960*08b48e0bSAndroid Build Coastguard Worker }
1961*08b48e0bSAndroid Build Coastguard Worker
1962*08b48e0bSAndroid Build Coastguard Worker mod_info = malloc(sizeof(afl_module_info_t));
1963*08b48e0bSAndroid Build Coastguard Worker
1964*08b48e0bSAndroid Build Coastguard Worker mod_info->id = last_module_info ? last_module_info->id + 1 : 0;
1965*08b48e0bSAndroid Build Coastguard Worker mod_info->name = strdup(dlinfo.dli_fname);
1966*08b48e0bSAndroid Build Coastguard Worker mod_info->base_address = (uintptr_t)dlinfo.dli_fbase;
1967*08b48e0bSAndroid Build Coastguard Worker mod_info->start = NULL;
1968*08b48e0bSAndroid Build Coastguard Worker mod_info->stop = NULL;
1969*08b48e0bSAndroid Build Coastguard Worker mod_info->pcs_beg = NULL;
1970*08b48e0bSAndroid Build Coastguard Worker mod_info->pcs_end = NULL;
1971*08b48e0bSAndroid Build Coastguard Worker mod_info->mapped = 0;
1972*08b48e0bSAndroid Build Coastguard Worker mod_info->next = NULL;
1973*08b48e0bSAndroid Build Coastguard Worker
1974*08b48e0bSAndroid Build Coastguard Worker if (last_module_info) {
1975*08b48e0bSAndroid Build Coastguard Worker
1976*08b48e0bSAndroid Build Coastguard Worker last_module_info->next = mod_info;
1977*08b48e0bSAndroid Build Coastguard Worker
1978*08b48e0bSAndroid Build Coastguard Worker } else {
1979*08b48e0bSAndroid Build Coastguard Worker
1980*08b48e0bSAndroid Build Coastguard Worker __afl_module_info = mod_info;
1981*08b48e0bSAndroid Build Coastguard Worker
1982*08b48e0bSAndroid Build Coastguard Worker }
1983*08b48e0bSAndroid Build Coastguard Worker
1984*08b48e0bSAndroid Build Coastguard Worker if (__afl_debug) {
1985*08b48e0bSAndroid Build Coastguard Worker
1986*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr, "[pcmap] Module: %s Base Address: %p\n",
1987*08b48e0bSAndroid Build Coastguard Worker dlinfo.dli_fname, dlinfo.dli_fbase);
1988*08b48e0bSAndroid Build Coastguard Worker
1989*08b48e0bSAndroid Build Coastguard Worker }
1990*08b48e0bSAndroid Build Coastguard Worker
1991*08b48e0bSAndroid Build Coastguard Worker }
1992*08b48e0bSAndroid Build Coastguard Worker
1993*08b48e0bSAndroid Build Coastguard Worker } else {
1994*08b48e0bSAndroid Build Coastguard Worker
1995*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr, "[pcmap] dladdr call failed\n");
1996*08b48e0bSAndroid Build Coastguard Worker
1997*08b48e0bSAndroid Build Coastguard Worker }
1998*08b48e0bSAndroid Build Coastguard Worker
1999*08b48e0bSAndroid Build Coastguard Worker #endif // __AFL_CODE_COVERAGE
2000*08b48e0bSAndroid Build Coastguard Worker
2001*08b48e0bSAndroid Build Coastguard Worker x = getenv("AFL_INST_RATIO");
2002*08b48e0bSAndroid Build Coastguard Worker if (x) {
2003*08b48e0bSAndroid Build Coastguard Worker
2004*08b48e0bSAndroid Build Coastguard Worker inst_ratio = (u32)atoi(x);
2005*08b48e0bSAndroid Build Coastguard Worker
2006*08b48e0bSAndroid Build Coastguard Worker if (!inst_ratio || inst_ratio > 100) {
2007*08b48e0bSAndroid Build Coastguard Worker
2008*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr, "[-] ERROR: Invalid AFL_INST_RATIO (must be 1-100).\n");
2009*08b48e0bSAndroid Build Coastguard Worker abort();
2010*08b48e0bSAndroid Build Coastguard Worker
2011*08b48e0bSAndroid Build Coastguard Worker }
2012*08b48e0bSAndroid Build Coastguard Worker
2013*08b48e0bSAndroid Build Coastguard Worker }
2014*08b48e0bSAndroid Build Coastguard Worker
2015*08b48e0bSAndroid Build Coastguard Worker // If a dlopen of an instrumented library happens after the forkserver then
2016*08b48e0bSAndroid Build Coastguard Worker // we have a problem as we cannot increase the coverage map anymore.
2017*08b48e0bSAndroid Build Coastguard Worker if (__afl_already_initialized_forkserver) {
2018*08b48e0bSAndroid Build Coastguard Worker
2019*08b48e0bSAndroid Build Coastguard Worker if (!getenv("AFL_IGNORE_PROBLEMS")) {
2020*08b48e0bSAndroid Build Coastguard Worker
2021*08b48e0bSAndroid Build Coastguard Worker fprintf(
2022*08b48e0bSAndroid Build Coastguard Worker stderr,
2023*08b48e0bSAndroid Build Coastguard Worker "[-] FATAL: forkserver is already up, but an instrumented dlopen() "
2024*08b48e0bSAndroid Build Coastguard Worker "library loaded afterwards. You must AFL_PRELOAD such libraries to "
2025*08b48e0bSAndroid Build Coastguard Worker "be able to fuzz them or LD_PRELOAD to run outside of afl-fuzz.\n"
2026*08b48e0bSAndroid Build Coastguard Worker "To ignore this set AFL_IGNORE_PROBLEMS=1 but this will lead to "
2027*08b48e0bSAndroid Build Coastguard Worker "ambiguous coverage data.\n"
2028*08b48e0bSAndroid Build Coastguard Worker "In addition, you can set AFL_IGNORE_PROBLEMS_COVERAGE=1 to "
2029*08b48e0bSAndroid Build Coastguard Worker "ignore the additional coverage instead (use with caution!).\n");
2030*08b48e0bSAndroid Build Coastguard Worker abort();
2031*08b48e0bSAndroid Build Coastguard Worker
2032*08b48e0bSAndroid Build Coastguard Worker } else {
2033*08b48e0bSAndroid Build Coastguard Worker
2034*08b48e0bSAndroid Build Coastguard Worker u8 ignore_dso_after_fs = !!getenv("AFL_IGNORE_PROBLEMS_COVERAGE");
2035*08b48e0bSAndroid Build Coastguard Worker if (__afl_debug && ignore_dso_after_fs) {
2036*08b48e0bSAndroid Build Coastguard Worker
2037*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr,
2038*08b48e0bSAndroid Build Coastguard Worker "DEBUG: Ignoring coverage from dynamically loaded code\n");
2039*08b48e0bSAndroid Build Coastguard Worker
2040*08b48e0bSAndroid Build Coastguard Worker }
2041*08b48e0bSAndroid Build Coastguard Worker
2042*08b48e0bSAndroid Build Coastguard Worker static u32 offset = 5;
2043*08b48e0bSAndroid Build Coastguard Worker
2044*08b48e0bSAndroid Build Coastguard Worker while (start < stop) {
2045*08b48e0bSAndroid Build Coastguard Worker
2046*08b48e0bSAndroid Build Coastguard Worker if (!ignore_dso_after_fs &&
2047*08b48e0bSAndroid Build Coastguard Worker (likely(inst_ratio == 100) || R(100) < inst_ratio)) {
2048*08b48e0bSAndroid Build Coastguard Worker
2049*08b48e0bSAndroid Build Coastguard Worker *(start++) = offset;
2050*08b48e0bSAndroid Build Coastguard Worker
2051*08b48e0bSAndroid Build Coastguard Worker } else {
2052*08b48e0bSAndroid Build Coastguard Worker
2053*08b48e0bSAndroid Build Coastguard Worker *(start++) = 0; // write to map[0]
2054*08b48e0bSAndroid Build Coastguard Worker
2055*08b48e0bSAndroid Build Coastguard Worker }
2056*08b48e0bSAndroid Build Coastguard Worker
2057*08b48e0bSAndroid Build Coastguard Worker if (unlikely(++offset >= __afl_final_loc)) { offset = 5; }
2058*08b48e0bSAndroid Build Coastguard Worker
2059*08b48e0bSAndroid Build Coastguard Worker }
2060*08b48e0bSAndroid Build Coastguard Worker
2061*08b48e0bSAndroid Build Coastguard Worker }
2062*08b48e0bSAndroid Build Coastguard Worker
2063*08b48e0bSAndroid Build Coastguard Worker return; // we are done for this special case
2064*08b48e0bSAndroid Build Coastguard Worker
2065*08b48e0bSAndroid Build Coastguard Worker }
2066*08b48e0bSAndroid Build Coastguard Worker
2067*08b48e0bSAndroid Build Coastguard Worker /* Make sure that the first element in the range is always set - we use that
2068*08b48e0bSAndroid Build Coastguard Worker to avoid duplicate calls (which can happen as an artifact of the underlying
2069*08b48e0bSAndroid Build Coastguard Worker implementation in LLVM). */
2070*08b48e0bSAndroid Build Coastguard Worker
2071*08b48e0bSAndroid Build Coastguard Worker if (__afl_final_loc < 5) __afl_final_loc = 5; // we skip the first 5 entries
2072*08b48e0bSAndroid Build Coastguard Worker
2073*08b48e0bSAndroid Build Coastguard Worker *(start++) = ++__afl_final_loc;
2074*08b48e0bSAndroid Build Coastguard Worker
2075*08b48e0bSAndroid Build Coastguard Worker while (start < stop) {
2076*08b48e0bSAndroid Build Coastguard Worker
2077*08b48e0bSAndroid Build Coastguard Worker if (likely(inst_ratio == 100) || R(100) < inst_ratio) {
2078*08b48e0bSAndroid Build Coastguard Worker
2079*08b48e0bSAndroid Build Coastguard Worker *(start++) = ++__afl_final_loc;
2080*08b48e0bSAndroid Build Coastguard Worker
2081*08b48e0bSAndroid Build Coastguard Worker } else {
2082*08b48e0bSAndroid Build Coastguard Worker
2083*08b48e0bSAndroid Build Coastguard Worker *(start++) = 0; // write to map[0]
2084*08b48e0bSAndroid Build Coastguard Worker
2085*08b48e0bSAndroid Build Coastguard Worker }
2086*08b48e0bSAndroid Build Coastguard Worker
2087*08b48e0bSAndroid Build Coastguard Worker }
2088*08b48e0bSAndroid Build Coastguard Worker
2089*08b48e0bSAndroid Build Coastguard Worker #ifdef __AFL_CODE_COVERAGE
2090*08b48e0bSAndroid Build Coastguard Worker if (mod_info) {
2091*08b48e0bSAndroid Build Coastguard Worker
2092*08b48e0bSAndroid Build Coastguard Worker if (!mod_info->start) {
2093*08b48e0bSAndroid Build Coastguard Worker
2094*08b48e0bSAndroid Build Coastguard Worker mod_info->start = orig_start;
2095*08b48e0bSAndroid Build Coastguard Worker mod_info->stop = stop - 1;
2096*08b48e0bSAndroid Build Coastguard Worker
2097*08b48e0bSAndroid Build Coastguard Worker }
2098*08b48e0bSAndroid Build Coastguard Worker
2099*08b48e0bSAndroid Build Coastguard Worker if (__afl_debug) {
2100*08b48e0bSAndroid Build Coastguard Worker
2101*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr, "DEBUG: [pcmap] Start Index: %u Stop Index: %u\n",
2102*08b48e0bSAndroid Build Coastguard Worker *(mod_info->start), *(mod_info->stop));
2103*08b48e0bSAndroid Build Coastguard Worker
2104*08b48e0bSAndroid Build Coastguard Worker }
2105*08b48e0bSAndroid Build Coastguard Worker
2106*08b48e0bSAndroid Build Coastguard Worker }
2107*08b48e0bSAndroid Build Coastguard Worker
2108*08b48e0bSAndroid Build Coastguard Worker #endif // __AFL_CODE_COVERAGE
2109*08b48e0bSAndroid Build Coastguard Worker
2110*08b48e0bSAndroid Build Coastguard Worker if (__afl_debug) {
2111*08b48e0bSAndroid Build Coastguard Worker
2112*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr,
2113*08b48e0bSAndroid Build Coastguard Worker "DEBUG: Done __sanitizer_cov_trace_pc_guard_init: __afl_final_loc "
2114*08b48e0bSAndroid Build Coastguard Worker "= %u\n",
2115*08b48e0bSAndroid Build Coastguard Worker __afl_final_loc);
2116*08b48e0bSAndroid Build Coastguard Worker
2117*08b48e0bSAndroid Build Coastguard Worker }
2118*08b48e0bSAndroid Build Coastguard Worker
2119*08b48e0bSAndroid Build Coastguard Worker if (__afl_already_initialized_shm) {
2120*08b48e0bSAndroid Build Coastguard Worker
2121*08b48e0bSAndroid Build Coastguard Worker if (__afl_final_loc > __afl_map_size) {
2122*08b48e0bSAndroid Build Coastguard Worker
2123*08b48e0bSAndroid Build Coastguard Worker if (__afl_debug) {
2124*08b48e0bSAndroid Build Coastguard Worker
2125*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr, "DEBUG: Reinit shm necessary (+%u)\n",
2126*08b48e0bSAndroid Build Coastguard Worker __afl_final_loc - __afl_map_size);
2127*08b48e0bSAndroid Build Coastguard Worker
2128*08b48e0bSAndroid Build Coastguard Worker }
2129*08b48e0bSAndroid Build Coastguard Worker
2130*08b48e0bSAndroid Build Coastguard Worker __afl_unmap_shm();
2131*08b48e0bSAndroid Build Coastguard Worker __afl_map_shm();
2132*08b48e0bSAndroid Build Coastguard Worker
2133*08b48e0bSAndroid Build Coastguard Worker }
2134*08b48e0bSAndroid Build Coastguard Worker
2135*08b48e0bSAndroid Build Coastguard Worker __afl_map_size = __afl_final_loc + 1;
2136*08b48e0bSAndroid Build Coastguard Worker
2137*08b48e0bSAndroid Build Coastguard Worker }
2138*08b48e0bSAndroid Build Coastguard Worker
2139*08b48e0bSAndroid Build Coastguard Worker }
2140*08b48e0bSAndroid Build Coastguard Worker
2141*08b48e0bSAndroid Build Coastguard Worker ///// CmpLog instrumentation
2142*08b48e0bSAndroid Build Coastguard Worker
__cmplog_ins_hook1(uint8_t arg1,uint8_t arg2,uint8_t attr)2143*08b48e0bSAndroid Build Coastguard Worker void __cmplog_ins_hook1(uint8_t arg1, uint8_t arg2, uint8_t attr) {
2144*08b48e0bSAndroid Build Coastguard Worker
2145*08b48e0bSAndroid Build Coastguard Worker // fprintf(stderr, "hook1 arg0=%02x arg1=%02x attr=%u\n",
2146*08b48e0bSAndroid Build Coastguard Worker // (u8) arg1, (u8) arg2, attr);
2147*08b48e0bSAndroid Build Coastguard Worker
2148*08b48e0bSAndroid Build Coastguard Worker return;
2149*08b48e0bSAndroid Build Coastguard Worker
2150*08b48e0bSAndroid Build Coastguard Worker /*
2151*08b48e0bSAndroid Build Coastguard Worker
2152*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!__afl_cmp_map || arg1 == arg2)) return;
2153*08b48e0bSAndroid Build Coastguard Worker
2154*08b48e0bSAndroid Build Coastguard Worker uintptr_t k = (uintptr_t)__builtin_return_address(0);
2155*08b48e0bSAndroid Build Coastguard Worker k = (uintptr_t)(default_hash((u8 *)&k, sizeof(uintptr_t)) & (CMP_MAP_W - 1));
2156*08b48e0bSAndroid Build Coastguard Worker
2157*08b48e0bSAndroid Build Coastguard Worker u32 hits;
2158*08b48e0bSAndroid Build Coastguard Worker
2159*08b48e0bSAndroid Build Coastguard Worker if (__afl_cmp_map->headers[k].type != CMP_TYPE_INS) {
2160*08b48e0bSAndroid Build Coastguard Worker
2161*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->headers[k].type = CMP_TYPE_INS;
2162*08b48e0bSAndroid Build Coastguard Worker hits = 0;
2163*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->headers[k].hits = 1;
2164*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->headers[k].shape = 0;
2165*08b48e0bSAndroid Build Coastguard Worker
2166*08b48e0bSAndroid Build Coastguard Worker } else {
2167*08b48e0bSAndroid Build Coastguard Worker
2168*08b48e0bSAndroid Build Coastguard Worker hits = __afl_cmp_map->headers[k].hits++;
2169*08b48e0bSAndroid Build Coastguard Worker
2170*08b48e0bSAndroid Build Coastguard Worker }
2171*08b48e0bSAndroid Build Coastguard Worker
2172*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->headers[k].attribute = attr;
2173*08b48e0bSAndroid Build Coastguard Worker
2174*08b48e0bSAndroid Build Coastguard Worker hits &= CMP_MAP_H - 1;
2175*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->log[k][hits].v0 = arg1;
2176*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->log[k][hits].v1 = arg2;
2177*08b48e0bSAndroid Build Coastguard Worker
2178*08b48e0bSAndroid Build Coastguard Worker */
2179*08b48e0bSAndroid Build Coastguard Worker
2180*08b48e0bSAndroid Build Coastguard Worker }
2181*08b48e0bSAndroid Build Coastguard Worker
__cmplog_ins_hook2(uint16_t arg1,uint16_t arg2,uint8_t attr)2182*08b48e0bSAndroid Build Coastguard Worker void __cmplog_ins_hook2(uint16_t arg1, uint16_t arg2, uint8_t attr) {
2183*08b48e0bSAndroid Build Coastguard Worker
2184*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!__afl_cmp_map || arg1 == arg2)) return;
2185*08b48e0bSAndroid Build Coastguard Worker
2186*08b48e0bSAndroid Build Coastguard Worker uintptr_t k = (uintptr_t)__builtin_return_address(0);
2187*08b48e0bSAndroid Build Coastguard Worker k = (uintptr_t)(default_hash((u8 *)&k, sizeof(uintptr_t)) & (CMP_MAP_W - 1));
2188*08b48e0bSAndroid Build Coastguard Worker
2189*08b48e0bSAndroid Build Coastguard Worker u32 hits;
2190*08b48e0bSAndroid Build Coastguard Worker
2191*08b48e0bSAndroid Build Coastguard Worker if (__afl_cmp_map->headers[k].type != CMP_TYPE_INS) {
2192*08b48e0bSAndroid Build Coastguard Worker
2193*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->headers[k].type = CMP_TYPE_INS;
2194*08b48e0bSAndroid Build Coastguard Worker hits = 0;
2195*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->headers[k].hits = 1;
2196*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->headers[k].shape = 1;
2197*08b48e0bSAndroid Build Coastguard Worker
2198*08b48e0bSAndroid Build Coastguard Worker } else {
2199*08b48e0bSAndroid Build Coastguard Worker
2200*08b48e0bSAndroid Build Coastguard Worker hits = __afl_cmp_map->headers[k].hits++;
2201*08b48e0bSAndroid Build Coastguard Worker
2202*08b48e0bSAndroid Build Coastguard Worker if (!__afl_cmp_map->headers[k].shape) {
2203*08b48e0bSAndroid Build Coastguard Worker
2204*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->headers[k].shape = 1;
2205*08b48e0bSAndroid Build Coastguard Worker
2206*08b48e0bSAndroid Build Coastguard Worker }
2207*08b48e0bSAndroid Build Coastguard Worker
2208*08b48e0bSAndroid Build Coastguard Worker }
2209*08b48e0bSAndroid Build Coastguard Worker
2210*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->headers[k].attribute = attr;
2211*08b48e0bSAndroid Build Coastguard Worker
2212*08b48e0bSAndroid Build Coastguard Worker hits &= CMP_MAP_H - 1;
2213*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->log[k][hits].v0 = arg1;
2214*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->log[k][hits].v1 = arg2;
2215*08b48e0bSAndroid Build Coastguard Worker
2216*08b48e0bSAndroid Build Coastguard Worker }
2217*08b48e0bSAndroid Build Coastguard Worker
__cmplog_ins_hook4(uint32_t arg1,uint32_t arg2,uint8_t attr)2218*08b48e0bSAndroid Build Coastguard Worker void __cmplog_ins_hook4(uint32_t arg1, uint32_t arg2, uint8_t attr) {
2219*08b48e0bSAndroid Build Coastguard Worker
2220*08b48e0bSAndroid Build Coastguard Worker // fprintf(stderr, "hook4 arg0=%x arg1=%x attr=%u\n", arg1, arg2, attr);
2221*08b48e0bSAndroid Build Coastguard Worker
2222*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!__afl_cmp_map || arg1 == arg2)) return;
2223*08b48e0bSAndroid Build Coastguard Worker
2224*08b48e0bSAndroid Build Coastguard Worker uintptr_t k = (uintptr_t)__builtin_return_address(0);
2225*08b48e0bSAndroid Build Coastguard Worker k = (uintptr_t)(default_hash((u8 *)&k, sizeof(uintptr_t)) & (CMP_MAP_W - 1));
2226*08b48e0bSAndroid Build Coastguard Worker
2227*08b48e0bSAndroid Build Coastguard Worker u32 hits;
2228*08b48e0bSAndroid Build Coastguard Worker
2229*08b48e0bSAndroid Build Coastguard Worker if (__afl_cmp_map->headers[k].type != CMP_TYPE_INS) {
2230*08b48e0bSAndroid Build Coastguard Worker
2231*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->headers[k].type = CMP_TYPE_INS;
2232*08b48e0bSAndroid Build Coastguard Worker hits = 0;
2233*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->headers[k].hits = 1;
2234*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->headers[k].shape = 3;
2235*08b48e0bSAndroid Build Coastguard Worker
2236*08b48e0bSAndroid Build Coastguard Worker } else {
2237*08b48e0bSAndroid Build Coastguard Worker
2238*08b48e0bSAndroid Build Coastguard Worker hits = __afl_cmp_map->headers[k].hits++;
2239*08b48e0bSAndroid Build Coastguard Worker
2240*08b48e0bSAndroid Build Coastguard Worker if (__afl_cmp_map->headers[k].shape < 3) {
2241*08b48e0bSAndroid Build Coastguard Worker
2242*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->headers[k].shape = 3;
2243*08b48e0bSAndroid Build Coastguard Worker
2244*08b48e0bSAndroid Build Coastguard Worker }
2245*08b48e0bSAndroid Build Coastguard Worker
2246*08b48e0bSAndroid Build Coastguard Worker }
2247*08b48e0bSAndroid Build Coastguard Worker
2248*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->headers[k].attribute = attr;
2249*08b48e0bSAndroid Build Coastguard Worker
2250*08b48e0bSAndroid Build Coastguard Worker hits &= CMP_MAP_H - 1;
2251*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->log[k][hits].v0 = arg1;
2252*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->log[k][hits].v1 = arg2;
2253*08b48e0bSAndroid Build Coastguard Worker
2254*08b48e0bSAndroid Build Coastguard Worker }
2255*08b48e0bSAndroid Build Coastguard Worker
__cmplog_ins_hook8(uint64_t arg1,uint64_t arg2,uint8_t attr)2256*08b48e0bSAndroid Build Coastguard Worker void __cmplog_ins_hook8(uint64_t arg1, uint64_t arg2, uint8_t attr) {
2257*08b48e0bSAndroid Build Coastguard Worker
2258*08b48e0bSAndroid Build Coastguard Worker // fprintf(stderr, "hook8 arg0=%lx arg1=%lx attr=%u\n", arg1, arg2, attr);
2259*08b48e0bSAndroid Build Coastguard Worker
2260*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!__afl_cmp_map || arg1 == arg2)) return;
2261*08b48e0bSAndroid Build Coastguard Worker
2262*08b48e0bSAndroid Build Coastguard Worker uintptr_t k = (uintptr_t)__builtin_return_address(0);
2263*08b48e0bSAndroid Build Coastguard Worker k = (uintptr_t)(default_hash((u8 *)&k, sizeof(uintptr_t)) & (CMP_MAP_W - 1));
2264*08b48e0bSAndroid Build Coastguard Worker
2265*08b48e0bSAndroid Build Coastguard Worker u32 hits;
2266*08b48e0bSAndroid Build Coastguard Worker
2267*08b48e0bSAndroid Build Coastguard Worker if (__afl_cmp_map->headers[k].type != CMP_TYPE_INS) {
2268*08b48e0bSAndroid Build Coastguard Worker
2269*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->headers[k].type = CMP_TYPE_INS;
2270*08b48e0bSAndroid Build Coastguard Worker hits = 0;
2271*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->headers[k].hits = 1;
2272*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->headers[k].shape = 7;
2273*08b48e0bSAndroid Build Coastguard Worker
2274*08b48e0bSAndroid Build Coastguard Worker } else {
2275*08b48e0bSAndroid Build Coastguard Worker
2276*08b48e0bSAndroid Build Coastguard Worker hits = __afl_cmp_map->headers[k].hits++;
2277*08b48e0bSAndroid Build Coastguard Worker
2278*08b48e0bSAndroid Build Coastguard Worker if (__afl_cmp_map->headers[k].shape < 7) {
2279*08b48e0bSAndroid Build Coastguard Worker
2280*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->headers[k].shape = 7;
2281*08b48e0bSAndroid Build Coastguard Worker
2282*08b48e0bSAndroid Build Coastguard Worker }
2283*08b48e0bSAndroid Build Coastguard Worker
2284*08b48e0bSAndroid Build Coastguard Worker }
2285*08b48e0bSAndroid Build Coastguard Worker
2286*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->headers[k].attribute = attr;
2287*08b48e0bSAndroid Build Coastguard Worker
2288*08b48e0bSAndroid Build Coastguard Worker hits &= CMP_MAP_H - 1;
2289*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->log[k][hits].v0 = arg1;
2290*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->log[k][hits].v1 = arg2;
2291*08b48e0bSAndroid Build Coastguard Worker
2292*08b48e0bSAndroid Build Coastguard Worker }
2293*08b48e0bSAndroid Build Coastguard Worker
2294*08b48e0bSAndroid Build Coastguard Worker #ifdef WORD_SIZE_64
2295*08b48e0bSAndroid Build Coastguard Worker // support for u24 to u120 via llvm _ExitInt(). size is in bytes minus 1
__cmplog_ins_hookN(uint128_t arg1,uint128_t arg2,uint8_t attr,uint8_t size)2296*08b48e0bSAndroid Build Coastguard Worker void __cmplog_ins_hookN(uint128_t arg1, uint128_t arg2, uint8_t attr,
2297*08b48e0bSAndroid Build Coastguard Worker uint8_t size) {
2298*08b48e0bSAndroid Build Coastguard Worker
2299*08b48e0bSAndroid Build Coastguard Worker // fprintf(stderr, "hookN arg0=%llx:%llx arg1=%llx:%llx bytes=%u attr=%u\n",
2300*08b48e0bSAndroid Build Coastguard Worker // (u64)(arg1 >> 64), (u64)arg1, (u64)(arg2 >> 64), (u64)arg2, size + 1,
2301*08b48e0bSAndroid Build Coastguard Worker // attr);
2302*08b48e0bSAndroid Build Coastguard Worker
2303*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!__afl_cmp_map || arg1 == arg2)) return;
2304*08b48e0bSAndroid Build Coastguard Worker
2305*08b48e0bSAndroid Build Coastguard Worker uintptr_t k = (uintptr_t)__builtin_return_address(0);
2306*08b48e0bSAndroid Build Coastguard Worker k = (uintptr_t)(default_hash((u8 *)&k, sizeof(uintptr_t)) & (CMP_MAP_W - 1));
2307*08b48e0bSAndroid Build Coastguard Worker
2308*08b48e0bSAndroid Build Coastguard Worker u32 hits;
2309*08b48e0bSAndroid Build Coastguard Worker
2310*08b48e0bSAndroid Build Coastguard Worker if (__afl_cmp_map->headers[k].type != CMP_TYPE_INS) {
2311*08b48e0bSAndroid Build Coastguard Worker
2312*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->headers[k].type = CMP_TYPE_INS;
2313*08b48e0bSAndroid Build Coastguard Worker hits = 0;
2314*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->headers[k].hits = 1;
2315*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->headers[k].shape = size;
2316*08b48e0bSAndroid Build Coastguard Worker
2317*08b48e0bSAndroid Build Coastguard Worker } else {
2318*08b48e0bSAndroid Build Coastguard Worker
2319*08b48e0bSAndroid Build Coastguard Worker hits = __afl_cmp_map->headers[k].hits++;
2320*08b48e0bSAndroid Build Coastguard Worker
2321*08b48e0bSAndroid Build Coastguard Worker if (__afl_cmp_map->headers[k].shape < size) {
2322*08b48e0bSAndroid Build Coastguard Worker
2323*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->headers[k].shape = size;
2324*08b48e0bSAndroid Build Coastguard Worker
2325*08b48e0bSAndroid Build Coastguard Worker }
2326*08b48e0bSAndroid Build Coastguard Worker
2327*08b48e0bSAndroid Build Coastguard Worker }
2328*08b48e0bSAndroid Build Coastguard Worker
2329*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->headers[k].attribute = attr;
2330*08b48e0bSAndroid Build Coastguard Worker
2331*08b48e0bSAndroid Build Coastguard Worker hits &= CMP_MAP_H - 1;
2332*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->log[k][hits].v0 = (u64)arg1;
2333*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->log[k][hits].v1 = (u64)arg2;
2334*08b48e0bSAndroid Build Coastguard Worker
2335*08b48e0bSAndroid Build Coastguard Worker if (size > 7) {
2336*08b48e0bSAndroid Build Coastguard Worker
2337*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->log[k][hits].v0_128 = (u64)(arg1 >> 64);
2338*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->log[k][hits].v1_128 = (u64)(arg2 >> 64);
2339*08b48e0bSAndroid Build Coastguard Worker
2340*08b48e0bSAndroid Build Coastguard Worker }
2341*08b48e0bSAndroid Build Coastguard Worker
2342*08b48e0bSAndroid Build Coastguard Worker }
2343*08b48e0bSAndroid Build Coastguard Worker
__cmplog_ins_hook16(uint128_t arg1,uint128_t arg2,uint8_t attr)2344*08b48e0bSAndroid Build Coastguard Worker void __cmplog_ins_hook16(uint128_t arg1, uint128_t arg2, uint8_t attr) {
2345*08b48e0bSAndroid Build Coastguard Worker
2346*08b48e0bSAndroid Build Coastguard Worker if (likely(!__afl_cmp_map)) return;
2347*08b48e0bSAndroid Build Coastguard Worker
2348*08b48e0bSAndroid Build Coastguard Worker uintptr_t k = (uintptr_t)__builtin_return_address(0);
2349*08b48e0bSAndroid Build Coastguard Worker k = (uintptr_t)(default_hash((u8 *)&k, sizeof(uintptr_t)) & (CMP_MAP_W - 1));
2350*08b48e0bSAndroid Build Coastguard Worker
2351*08b48e0bSAndroid Build Coastguard Worker u32 hits;
2352*08b48e0bSAndroid Build Coastguard Worker
2353*08b48e0bSAndroid Build Coastguard Worker if (__afl_cmp_map->headers[k].type != CMP_TYPE_INS) {
2354*08b48e0bSAndroid Build Coastguard Worker
2355*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->headers[k].type = CMP_TYPE_INS;
2356*08b48e0bSAndroid Build Coastguard Worker hits = 0;
2357*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->headers[k].hits = 1;
2358*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->headers[k].shape = 15;
2359*08b48e0bSAndroid Build Coastguard Worker
2360*08b48e0bSAndroid Build Coastguard Worker } else {
2361*08b48e0bSAndroid Build Coastguard Worker
2362*08b48e0bSAndroid Build Coastguard Worker hits = __afl_cmp_map->headers[k].hits++;
2363*08b48e0bSAndroid Build Coastguard Worker
2364*08b48e0bSAndroid Build Coastguard Worker if (__afl_cmp_map->headers[k].shape < 15) {
2365*08b48e0bSAndroid Build Coastguard Worker
2366*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->headers[k].shape = 15;
2367*08b48e0bSAndroid Build Coastguard Worker
2368*08b48e0bSAndroid Build Coastguard Worker }
2369*08b48e0bSAndroid Build Coastguard Worker
2370*08b48e0bSAndroid Build Coastguard Worker }
2371*08b48e0bSAndroid Build Coastguard Worker
2372*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->headers[k].attribute = attr;
2373*08b48e0bSAndroid Build Coastguard Worker
2374*08b48e0bSAndroid Build Coastguard Worker hits &= CMP_MAP_H - 1;
2375*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->log[k][hits].v0 = (u64)arg1;
2376*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->log[k][hits].v1 = (u64)arg2;
2377*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->log[k][hits].v0_128 = (u64)(arg1 >> 64);
2378*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->log[k][hits].v1_128 = (u64)(arg2 >> 64);
2379*08b48e0bSAndroid Build Coastguard Worker
2380*08b48e0bSAndroid Build Coastguard Worker }
2381*08b48e0bSAndroid Build Coastguard Worker
2382*08b48e0bSAndroid Build Coastguard Worker #endif
2383*08b48e0bSAndroid Build Coastguard Worker
__sanitizer_cov_trace_cmp1(uint8_t arg1,uint8_t arg2)2384*08b48e0bSAndroid Build Coastguard Worker void __sanitizer_cov_trace_cmp1(uint8_t arg1, uint8_t arg2) {
2385*08b48e0bSAndroid Build Coastguard Worker
2386*08b48e0bSAndroid Build Coastguard Worker //__cmplog_ins_hook1(arg1, arg2, 0);
2387*08b48e0bSAndroid Build Coastguard Worker
2388*08b48e0bSAndroid Build Coastguard Worker }
2389*08b48e0bSAndroid Build Coastguard Worker
__sanitizer_cov_trace_const_cmp1(uint8_t arg1,uint8_t arg2)2390*08b48e0bSAndroid Build Coastguard Worker void __sanitizer_cov_trace_const_cmp1(uint8_t arg1, uint8_t arg2) {
2391*08b48e0bSAndroid Build Coastguard Worker
2392*08b48e0bSAndroid Build Coastguard Worker //__cmplog_ins_hook1(arg1, arg2, 0);
2393*08b48e0bSAndroid Build Coastguard Worker
2394*08b48e0bSAndroid Build Coastguard Worker }
2395*08b48e0bSAndroid Build Coastguard Worker
__sanitizer_cov_trace_cmp2(uint16_t arg1,uint16_t arg2)2396*08b48e0bSAndroid Build Coastguard Worker void __sanitizer_cov_trace_cmp2(uint16_t arg1, uint16_t arg2) {
2397*08b48e0bSAndroid Build Coastguard Worker
2398*08b48e0bSAndroid Build Coastguard Worker __cmplog_ins_hook2(arg1, arg2, 0);
2399*08b48e0bSAndroid Build Coastguard Worker
2400*08b48e0bSAndroid Build Coastguard Worker }
2401*08b48e0bSAndroid Build Coastguard Worker
__sanitizer_cov_trace_const_cmp2(uint16_t arg1,uint16_t arg2)2402*08b48e0bSAndroid Build Coastguard Worker void __sanitizer_cov_trace_const_cmp2(uint16_t arg1, uint16_t arg2) {
2403*08b48e0bSAndroid Build Coastguard Worker
2404*08b48e0bSAndroid Build Coastguard Worker __cmplog_ins_hook2(arg1, arg2, 0);
2405*08b48e0bSAndroid Build Coastguard Worker
2406*08b48e0bSAndroid Build Coastguard Worker }
2407*08b48e0bSAndroid Build Coastguard Worker
__sanitizer_cov_trace_cmp4(uint32_t arg1,uint32_t arg2)2408*08b48e0bSAndroid Build Coastguard Worker void __sanitizer_cov_trace_cmp4(uint32_t arg1, uint32_t arg2) {
2409*08b48e0bSAndroid Build Coastguard Worker
2410*08b48e0bSAndroid Build Coastguard Worker __cmplog_ins_hook4(arg1, arg2, 0);
2411*08b48e0bSAndroid Build Coastguard Worker
2412*08b48e0bSAndroid Build Coastguard Worker }
2413*08b48e0bSAndroid Build Coastguard Worker
__sanitizer_cov_trace_const_cmp4(uint32_t arg1,uint32_t arg2)2414*08b48e0bSAndroid Build Coastguard Worker void __sanitizer_cov_trace_const_cmp4(uint32_t arg1, uint32_t arg2) {
2415*08b48e0bSAndroid Build Coastguard Worker
2416*08b48e0bSAndroid Build Coastguard Worker __cmplog_ins_hook4(arg1, arg2, 0);
2417*08b48e0bSAndroid Build Coastguard Worker
2418*08b48e0bSAndroid Build Coastguard Worker }
2419*08b48e0bSAndroid Build Coastguard Worker
__sanitizer_cov_trace_cmp8(uint64_t arg1,uint64_t arg2)2420*08b48e0bSAndroid Build Coastguard Worker void __sanitizer_cov_trace_cmp8(uint64_t arg1, uint64_t arg2) {
2421*08b48e0bSAndroid Build Coastguard Worker
2422*08b48e0bSAndroid Build Coastguard Worker __cmplog_ins_hook8(arg1, arg2, 0);
2423*08b48e0bSAndroid Build Coastguard Worker
2424*08b48e0bSAndroid Build Coastguard Worker }
2425*08b48e0bSAndroid Build Coastguard Worker
__sanitizer_cov_trace_const_cmp8(uint64_t arg1,uint64_t arg2)2426*08b48e0bSAndroid Build Coastguard Worker void __sanitizer_cov_trace_const_cmp8(uint64_t arg1, uint64_t arg2) {
2427*08b48e0bSAndroid Build Coastguard Worker
2428*08b48e0bSAndroid Build Coastguard Worker __cmplog_ins_hook8(arg1, arg2, 0);
2429*08b48e0bSAndroid Build Coastguard Worker
2430*08b48e0bSAndroid Build Coastguard Worker }
2431*08b48e0bSAndroid Build Coastguard Worker
2432*08b48e0bSAndroid Build Coastguard Worker #ifdef WORD_SIZE_64
__sanitizer_cov_trace_cmp16(uint128_t arg1,uint128_t arg2)2433*08b48e0bSAndroid Build Coastguard Worker void __sanitizer_cov_trace_cmp16(uint128_t arg1, uint128_t arg2) {
2434*08b48e0bSAndroid Build Coastguard Worker
2435*08b48e0bSAndroid Build Coastguard Worker __cmplog_ins_hook16(arg1, arg2, 0);
2436*08b48e0bSAndroid Build Coastguard Worker
2437*08b48e0bSAndroid Build Coastguard Worker }
2438*08b48e0bSAndroid Build Coastguard Worker
__sanitizer_cov_trace_const_cmp16(uint128_t arg1,uint128_t arg2)2439*08b48e0bSAndroid Build Coastguard Worker void __sanitizer_cov_trace_const_cmp16(uint128_t arg1, uint128_t arg2) {
2440*08b48e0bSAndroid Build Coastguard Worker
2441*08b48e0bSAndroid Build Coastguard Worker __cmplog_ins_hook16(arg1, arg2, 0);
2442*08b48e0bSAndroid Build Coastguard Worker
2443*08b48e0bSAndroid Build Coastguard Worker }
2444*08b48e0bSAndroid Build Coastguard Worker
2445*08b48e0bSAndroid Build Coastguard Worker #endif
2446*08b48e0bSAndroid Build Coastguard Worker
__sanitizer_cov_trace_switch(uint64_t val,uint64_t * cases)2447*08b48e0bSAndroid Build Coastguard Worker void __sanitizer_cov_trace_switch(uint64_t val, uint64_t *cases) {
2448*08b48e0bSAndroid Build Coastguard Worker
2449*08b48e0bSAndroid Build Coastguard Worker if (likely(!__afl_cmp_map)) return;
2450*08b48e0bSAndroid Build Coastguard Worker
2451*08b48e0bSAndroid Build Coastguard Worker for (uint64_t i = 0; i < cases[0]; i++) {
2452*08b48e0bSAndroid Build Coastguard Worker
2453*08b48e0bSAndroid Build Coastguard Worker uintptr_t k = (uintptr_t)__builtin_return_address(0) + i;
2454*08b48e0bSAndroid Build Coastguard Worker k = (uintptr_t)(default_hash((u8 *)&k, sizeof(uintptr_t)) &
2455*08b48e0bSAndroid Build Coastguard Worker (CMP_MAP_W - 1));
2456*08b48e0bSAndroid Build Coastguard Worker
2457*08b48e0bSAndroid Build Coastguard Worker u32 hits;
2458*08b48e0bSAndroid Build Coastguard Worker
2459*08b48e0bSAndroid Build Coastguard Worker if (__afl_cmp_map->headers[k].type != CMP_TYPE_INS) {
2460*08b48e0bSAndroid Build Coastguard Worker
2461*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->headers[k].type = CMP_TYPE_INS;
2462*08b48e0bSAndroid Build Coastguard Worker hits = 0;
2463*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->headers[k].hits = 1;
2464*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->headers[k].shape = 7;
2465*08b48e0bSAndroid Build Coastguard Worker
2466*08b48e0bSAndroid Build Coastguard Worker } else {
2467*08b48e0bSAndroid Build Coastguard Worker
2468*08b48e0bSAndroid Build Coastguard Worker hits = __afl_cmp_map->headers[k].hits++;
2469*08b48e0bSAndroid Build Coastguard Worker
2470*08b48e0bSAndroid Build Coastguard Worker if (__afl_cmp_map->headers[k].shape < 7) {
2471*08b48e0bSAndroid Build Coastguard Worker
2472*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->headers[k].shape = 7;
2473*08b48e0bSAndroid Build Coastguard Worker
2474*08b48e0bSAndroid Build Coastguard Worker }
2475*08b48e0bSAndroid Build Coastguard Worker
2476*08b48e0bSAndroid Build Coastguard Worker }
2477*08b48e0bSAndroid Build Coastguard Worker
2478*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->headers[k].attribute = 1;
2479*08b48e0bSAndroid Build Coastguard Worker
2480*08b48e0bSAndroid Build Coastguard Worker hits &= CMP_MAP_H - 1;
2481*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->log[k][hits].v0 = val;
2482*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->log[k][hits].v1 = cases[i + 2];
2483*08b48e0bSAndroid Build Coastguard Worker
2484*08b48e0bSAndroid Build Coastguard Worker }
2485*08b48e0bSAndroid Build Coastguard Worker
2486*08b48e0bSAndroid Build Coastguard Worker }
2487*08b48e0bSAndroid Build Coastguard Worker
__asan_region_is_poisoned(void * beg,size_t size)2488*08b48e0bSAndroid Build Coastguard Worker __attribute__((weak)) void *__asan_region_is_poisoned(void *beg, size_t size) {
2489*08b48e0bSAndroid Build Coastguard Worker
2490*08b48e0bSAndroid Build Coastguard Worker return NULL;
2491*08b48e0bSAndroid Build Coastguard Worker
2492*08b48e0bSAndroid Build Coastguard Worker }
2493*08b48e0bSAndroid Build Coastguard Worker
2494*08b48e0bSAndroid Build Coastguard Worker // POSIX shenanigan to see if an area is mapped.
2495*08b48e0bSAndroid Build Coastguard Worker // If it is mapped as X-only, we have a problem, so maybe we should add a check
2496*08b48e0bSAndroid Build Coastguard Worker // to avoid to call it on .text addresses
area_is_valid(void * ptr,size_t len)2497*08b48e0bSAndroid Build Coastguard Worker static int area_is_valid(void *ptr, size_t len) {
2498*08b48e0bSAndroid Build Coastguard Worker
2499*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!ptr || __asan_region_is_poisoned(ptr, len))) { return 0; }
2500*08b48e0bSAndroid Build Coastguard Worker
2501*08b48e0bSAndroid Build Coastguard Worker #ifdef __HAIKU__
2502*08b48e0bSAndroid Build Coastguard Worker long r = _kern_write(__afl_dummy_fd[1], -1, ptr, len);
2503*08b48e0bSAndroid Build Coastguard Worker #elif defined(__OpenBSD__)
2504*08b48e0bSAndroid Build Coastguard Worker long r = write(__afl_dummy_fd[1], ptr, len);
2505*08b48e0bSAndroid Build Coastguard Worker #else
2506*08b48e0bSAndroid Build Coastguard Worker long r = syscall(SYS_write, __afl_dummy_fd[1], ptr, len);
2507*08b48e0bSAndroid Build Coastguard Worker #endif // HAIKU, OPENBSD
2508*08b48e0bSAndroid Build Coastguard Worker
2509*08b48e0bSAndroid Build Coastguard Worker if (r <= 0 || r > len) return 0;
2510*08b48e0bSAndroid Build Coastguard Worker
2511*08b48e0bSAndroid Build Coastguard Worker // even if the write succeed this can be a false positive if we cross
2512*08b48e0bSAndroid Build Coastguard Worker // a page boundary. who knows why.
2513*08b48e0bSAndroid Build Coastguard Worker
2514*08b48e0bSAndroid Build Coastguard Worker char *p = (char *)ptr;
2515*08b48e0bSAndroid Build Coastguard Worker long page_size = sysconf(_SC_PAGE_SIZE);
2516*08b48e0bSAndroid Build Coastguard Worker char *page = (char *)((uintptr_t)p & ~(page_size - 1)) + page_size;
2517*08b48e0bSAndroid Build Coastguard Worker
2518*08b48e0bSAndroid Build Coastguard Worker if (page > p + len) {
2519*08b48e0bSAndroid Build Coastguard Worker
2520*08b48e0bSAndroid Build Coastguard Worker // no, not crossing a page boundary
2521*08b48e0bSAndroid Build Coastguard Worker return (int)r;
2522*08b48e0bSAndroid Build Coastguard Worker
2523*08b48e0bSAndroid Build Coastguard Worker } else {
2524*08b48e0bSAndroid Build Coastguard Worker
2525*08b48e0bSAndroid Build Coastguard Worker // yes it crosses a boundary, hence we can only return the length of
2526*08b48e0bSAndroid Build Coastguard Worker // rest of the first page, we cannot detect if the next page is valid
2527*08b48e0bSAndroid Build Coastguard Worker // or not, neither by SYS_write nor msync() :-(
2528*08b48e0bSAndroid Build Coastguard Worker return (int)(page - p);
2529*08b48e0bSAndroid Build Coastguard Worker
2530*08b48e0bSAndroid Build Coastguard Worker }
2531*08b48e0bSAndroid Build Coastguard Worker
2532*08b48e0bSAndroid Build Coastguard Worker }
2533*08b48e0bSAndroid Build Coastguard Worker
2534*08b48e0bSAndroid Build Coastguard Worker /* hook for string with length functions, eg. strncmp, strncasecmp etc.
2535*08b48e0bSAndroid Build Coastguard Worker Note that we ignore the len parameter and take longer strings if present. */
__cmplog_rtn_hook_strn(u8 * ptr1,u8 * ptr2,u64 len)2536*08b48e0bSAndroid Build Coastguard Worker void __cmplog_rtn_hook_strn(u8 *ptr1, u8 *ptr2, u64 len) {
2537*08b48e0bSAndroid Build Coastguard Worker
2538*08b48e0bSAndroid Build Coastguard Worker // fprintf(stderr, "RTN1 %p %p %u\n", ptr1, ptr2, len);
2539*08b48e0bSAndroid Build Coastguard Worker if (likely(!__afl_cmp_map)) return;
2540*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!len)) return;
2541*08b48e0bSAndroid Build Coastguard Worker int len0 = MIN(len, 31);
2542*08b48e0bSAndroid Build Coastguard Worker int len1 = strnlen(ptr1, len0);
2543*08b48e0bSAndroid Build Coastguard Worker if (len1 < 31) len1 = area_is_valid(ptr1, len1 + 1);
2544*08b48e0bSAndroid Build Coastguard Worker int len2 = strnlen(ptr2, len0);
2545*08b48e0bSAndroid Build Coastguard Worker if (len2 < 31) len2 = area_is_valid(ptr2, len2 + 1);
2546*08b48e0bSAndroid Build Coastguard Worker int l = MAX(len1, len2);
2547*08b48e0bSAndroid Build Coastguard Worker if (l < 2) return;
2548*08b48e0bSAndroid Build Coastguard Worker
2549*08b48e0bSAndroid Build Coastguard Worker uintptr_t k = (uintptr_t)__builtin_return_address(0);
2550*08b48e0bSAndroid Build Coastguard Worker k = (uintptr_t)(default_hash((u8 *)&k, sizeof(uintptr_t)) & (CMP_MAP_W - 1));
2551*08b48e0bSAndroid Build Coastguard Worker
2552*08b48e0bSAndroid Build Coastguard Worker u32 hits;
2553*08b48e0bSAndroid Build Coastguard Worker
2554*08b48e0bSAndroid Build Coastguard Worker if (__afl_cmp_map->headers[k].type != CMP_TYPE_RTN) {
2555*08b48e0bSAndroid Build Coastguard Worker
2556*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->headers[k].type = CMP_TYPE_RTN;
2557*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->headers[k].hits = 1;
2558*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->headers[k].shape = l - 1;
2559*08b48e0bSAndroid Build Coastguard Worker hits = 0;
2560*08b48e0bSAndroid Build Coastguard Worker
2561*08b48e0bSAndroid Build Coastguard Worker } else {
2562*08b48e0bSAndroid Build Coastguard Worker
2563*08b48e0bSAndroid Build Coastguard Worker hits = __afl_cmp_map->headers[k].hits++;
2564*08b48e0bSAndroid Build Coastguard Worker
2565*08b48e0bSAndroid Build Coastguard Worker if (__afl_cmp_map->headers[k].shape < l) {
2566*08b48e0bSAndroid Build Coastguard Worker
2567*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->headers[k].shape = l - 1;
2568*08b48e0bSAndroid Build Coastguard Worker
2569*08b48e0bSAndroid Build Coastguard Worker }
2570*08b48e0bSAndroid Build Coastguard Worker
2571*08b48e0bSAndroid Build Coastguard Worker }
2572*08b48e0bSAndroid Build Coastguard Worker
2573*08b48e0bSAndroid Build Coastguard Worker struct cmpfn_operands *cmpfn = (struct cmpfn_operands *)__afl_cmp_map->log[k];
2574*08b48e0bSAndroid Build Coastguard Worker hits &= CMP_MAP_RTN_H - 1;
2575*08b48e0bSAndroid Build Coastguard Worker
2576*08b48e0bSAndroid Build Coastguard Worker cmpfn[hits].v0_len = 0x80 + l;
2577*08b48e0bSAndroid Build Coastguard Worker cmpfn[hits].v1_len = 0x80 + l;
2578*08b48e0bSAndroid Build Coastguard Worker __builtin_memcpy(cmpfn[hits].v0, ptr1, len1);
2579*08b48e0bSAndroid Build Coastguard Worker __builtin_memcpy(cmpfn[hits].v1, ptr2, len2);
2580*08b48e0bSAndroid Build Coastguard Worker // fprintf(stderr, "RTN3\n");
2581*08b48e0bSAndroid Build Coastguard Worker
2582*08b48e0bSAndroid Build Coastguard Worker }
2583*08b48e0bSAndroid Build Coastguard Worker
2584*08b48e0bSAndroid Build Coastguard Worker /* hook for string functions, eg. strcmp, strcasecmp etc. */
__cmplog_rtn_hook_str(u8 * ptr1,u8 * ptr2)2585*08b48e0bSAndroid Build Coastguard Worker void __cmplog_rtn_hook_str(u8 *ptr1, u8 *ptr2) {
2586*08b48e0bSAndroid Build Coastguard Worker
2587*08b48e0bSAndroid Build Coastguard Worker // fprintf(stderr, "RTN1 %p %p\n", ptr1, ptr2);
2588*08b48e0bSAndroid Build Coastguard Worker if (likely(!__afl_cmp_map)) return;
2589*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!ptr1 || !ptr2)) return;
2590*08b48e0bSAndroid Build Coastguard Worker int len1 = strnlen(ptr1, 30) + 1;
2591*08b48e0bSAndroid Build Coastguard Worker int len2 = strnlen(ptr2, 30) + 1;
2592*08b48e0bSAndroid Build Coastguard Worker int l = MAX(len1, len2);
2593*08b48e0bSAndroid Build Coastguard Worker if (l < 3) return;
2594*08b48e0bSAndroid Build Coastguard Worker
2595*08b48e0bSAndroid Build Coastguard Worker uintptr_t k = (uintptr_t)__builtin_return_address(0);
2596*08b48e0bSAndroid Build Coastguard Worker k = (uintptr_t)(default_hash((u8 *)&k, sizeof(uintptr_t)) & (CMP_MAP_W - 1));
2597*08b48e0bSAndroid Build Coastguard Worker
2598*08b48e0bSAndroid Build Coastguard Worker u32 hits;
2599*08b48e0bSAndroid Build Coastguard Worker
2600*08b48e0bSAndroid Build Coastguard Worker if (__afl_cmp_map->headers[k].type != CMP_TYPE_RTN) {
2601*08b48e0bSAndroid Build Coastguard Worker
2602*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->headers[k].type = CMP_TYPE_RTN;
2603*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->headers[k].hits = 1;
2604*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->headers[k].shape = l - 1;
2605*08b48e0bSAndroid Build Coastguard Worker hits = 0;
2606*08b48e0bSAndroid Build Coastguard Worker
2607*08b48e0bSAndroid Build Coastguard Worker } else {
2608*08b48e0bSAndroid Build Coastguard Worker
2609*08b48e0bSAndroid Build Coastguard Worker hits = __afl_cmp_map->headers[k].hits++;
2610*08b48e0bSAndroid Build Coastguard Worker
2611*08b48e0bSAndroid Build Coastguard Worker if (__afl_cmp_map->headers[k].shape < l) {
2612*08b48e0bSAndroid Build Coastguard Worker
2613*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->headers[k].shape = l - 1;
2614*08b48e0bSAndroid Build Coastguard Worker
2615*08b48e0bSAndroid Build Coastguard Worker }
2616*08b48e0bSAndroid Build Coastguard Worker
2617*08b48e0bSAndroid Build Coastguard Worker }
2618*08b48e0bSAndroid Build Coastguard Worker
2619*08b48e0bSAndroid Build Coastguard Worker struct cmpfn_operands *cmpfn = (struct cmpfn_operands *)__afl_cmp_map->log[k];
2620*08b48e0bSAndroid Build Coastguard Worker hits &= CMP_MAP_RTN_H - 1;
2621*08b48e0bSAndroid Build Coastguard Worker
2622*08b48e0bSAndroid Build Coastguard Worker cmpfn[hits].v0_len = 0x80 + len1;
2623*08b48e0bSAndroid Build Coastguard Worker cmpfn[hits].v1_len = 0x80 + len2;
2624*08b48e0bSAndroid Build Coastguard Worker __builtin_memcpy(cmpfn[hits].v0, ptr1, len1);
2625*08b48e0bSAndroid Build Coastguard Worker __builtin_memcpy(cmpfn[hits].v1, ptr2, len2);
2626*08b48e0bSAndroid Build Coastguard Worker // fprintf(stderr, "RTN3\n");
2627*08b48e0bSAndroid Build Coastguard Worker
2628*08b48e0bSAndroid Build Coastguard Worker }
2629*08b48e0bSAndroid Build Coastguard Worker
2630*08b48e0bSAndroid Build Coastguard Worker /* hook function for all other func(ptr, ptr, ...) variants */
__cmplog_rtn_hook(u8 * ptr1,u8 * ptr2)2631*08b48e0bSAndroid Build Coastguard Worker void __cmplog_rtn_hook(u8 *ptr1, u8 *ptr2) {
2632*08b48e0bSAndroid Build Coastguard Worker
2633*08b48e0bSAndroid Build Coastguard Worker /*
2634*08b48e0bSAndroid Build Coastguard Worker u32 i;
2635*08b48e0bSAndroid Build Coastguard Worker if (area_is_valid(ptr1, 31) <= 0 || area_is_valid(ptr2, 31) <= 0) return;
2636*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr, "rtn arg0=");
2637*08b48e0bSAndroid Build Coastguard Worker for (i = 0; i < 32; i++)
2638*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr, "%02x", ptr1[i]);
2639*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr, " arg1=");
2640*08b48e0bSAndroid Build Coastguard Worker for (i = 0; i < 32; i++)
2641*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr, "%02x", ptr2[i]);
2642*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr, "\n");
2643*08b48e0bSAndroid Build Coastguard Worker */
2644*08b48e0bSAndroid Build Coastguard Worker
2645*08b48e0bSAndroid Build Coastguard Worker // fprintf(stderr, "RTN1 %p %p\n", ptr1, ptr2);
2646*08b48e0bSAndroid Build Coastguard Worker if (likely(!__afl_cmp_map)) return;
2647*08b48e0bSAndroid Build Coastguard Worker int l1, l2;
2648*08b48e0bSAndroid Build Coastguard Worker if ((l1 = area_is_valid(ptr1, 31)) <= 0 ||
2649*08b48e0bSAndroid Build Coastguard Worker (l2 = area_is_valid(ptr2, 31)) <= 0)
2650*08b48e0bSAndroid Build Coastguard Worker return;
2651*08b48e0bSAndroid Build Coastguard Worker int len = MIN(31, MIN(l1, l2));
2652*08b48e0bSAndroid Build Coastguard Worker
2653*08b48e0bSAndroid Build Coastguard Worker // fprintf(stderr, "RTN2 %u\n", len);
2654*08b48e0bSAndroid Build Coastguard Worker uintptr_t k = (uintptr_t)__builtin_return_address(0);
2655*08b48e0bSAndroid Build Coastguard Worker k = (uintptr_t)(default_hash((u8 *)&k, sizeof(uintptr_t)) & (CMP_MAP_W - 1));
2656*08b48e0bSAndroid Build Coastguard Worker
2657*08b48e0bSAndroid Build Coastguard Worker u32 hits;
2658*08b48e0bSAndroid Build Coastguard Worker
2659*08b48e0bSAndroid Build Coastguard Worker if (__afl_cmp_map->headers[k].type != CMP_TYPE_RTN) {
2660*08b48e0bSAndroid Build Coastguard Worker
2661*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->headers[k].type = CMP_TYPE_RTN;
2662*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->headers[k].hits = 1;
2663*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->headers[k].shape = len - 1;
2664*08b48e0bSAndroid Build Coastguard Worker hits = 0;
2665*08b48e0bSAndroid Build Coastguard Worker
2666*08b48e0bSAndroid Build Coastguard Worker } else {
2667*08b48e0bSAndroid Build Coastguard Worker
2668*08b48e0bSAndroid Build Coastguard Worker hits = __afl_cmp_map->headers[k].hits++;
2669*08b48e0bSAndroid Build Coastguard Worker
2670*08b48e0bSAndroid Build Coastguard Worker if (__afl_cmp_map->headers[k].shape < len) {
2671*08b48e0bSAndroid Build Coastguard Worker
2672*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->headers[k].shape = len - 1;
2673*08b48e0bSAndroid Build Coastguard Worker
2674*08b48e0bSAndroid Build Coastguard Worker }
2675*08b48e0bSAndroid Build Coastguard Worker
2676*08b48e0bSAndroid Build Coastguard Worker }
2677*08b48e0bSAndroid Build Coastguard Worker
2678*08b48e0bSAndroid Build Coastguard Worker struct cmpfn_operands *cmpfn = (struct cmpfn_operands *)__afl_cmp_map->log[k];
2679*08b48e0bSAndroid Build Coastguard Worker hits &= CMP_MAP_RTN_H - 1;
2680*08b48e0bSAndroid Build Coastguard Worker
2681*08b48e0bSAndroid Build Coastguard Worker cmpfn[hits].v0_len = len;
2682*08b48e0bSAndroid Build Coastguard Worker cmpfn[hits].v1_len = len;
2683*08b48e0bSAndroid Build Coastguard Worker __builtin_memcpy(cmpfn[hits].v0, ptr1, len);
2684*08b48e0bSAndroid Build Coastguard Worker __builtin_memcpy(cmpfn[hits].v1, ptr2, len);
2685*08b48e0bSAndroid Build Coastguard Worker // fprintf(stderr, "RTN3\n");
2686*08b48e0bSAndroid Build Coastguard Worker
2687*08b48e0bSAndroid Build Coastguard Worker }
2688*08b48e0bSAndroid Build Coastguard Worker
2689*08b48e0bSAndroid Build Coastguard Worker /* hook for func(ptr, ptr, len, ...) looking functions.
2690*08b48e0bSAndroid Build Coastguard Worker Note that for the time being we ignore len as this could be wrong
2691*08b48e0bSAndroid Build Coastguard Worker information and pass it on to the standard binary rtn hook */
__cmplog_rtn_hook_n(u8 * ptr1,u8 * ptr2,u64 len)2692*08b48e0bSAndroid Build Coastguard Worker void __cmplog_rtn_hook_n(u8 *ptr1, u8 *ptr2, u64 len) {
2693*08b48e0bSAndroid Build Coastguard Worker
2694*08b48e0bSAndroid Build Coastguard Worker (void)(len);
2695*08b48e0bSAndroid Build Coastguard Worker __cmplog_rtn_hook(ptr1, ptr2);
2696*08b48e0bSAndroid Build Coastguard Worker
2697*08b48e0bSAndroid Build Coastguard Worker #if 0
2698*08b48e0bSAndroid Build Coastguard Worker /*
2699*08b48e0bSAndroid Build Coastguard Worker u32 i;
2700*08b48e0bSAndroid Build Coastguard Worker if (area_is_valid(ptr1, 31) <= 0 || area_is_valid(ptr2, 31) <= 0) return;
2701*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr, "rtn_n len=%u arg0=", len);
2702*08b48e0bSAndroid Build Coastguard Worker for (i = 0; i < len; i++)
2703*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr, "%02x", ptr1[i]);
2704*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr, " arg1=");
2705*08b48e0bSAndroid Build Coastguard Worker for (i = 0; i < len; i++)
2706*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr, "%02x", ptr2[i]);
2707*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr, "\n");
2708*08b48e0bSAndroid Build Coastguard Worker */
2709*08b48e0bSAndroid Build Coastguard Worker
2710*08b48e0bSAndroid Build Coastguard Worker // fprintf(stderr, "RTN1 %p %p %u\n", ptr1, ptr2, len);
2711*08b48e0bSAndroid Build Coastguard Worker if (likely(!__afl_cmp_map)) return;
2712*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!len)) return;
2713*08b48e0bSAndroid Build Coastguard Worker int l = MIN(31, len);
2714*08b48e0bSAndroid Build Coastguard Worker
2715*08b48e0bSAndroid Build Coastguard Worker if ((l = area_is_valid(ptr1, l)) <= 0 || (l = area_is_valid(ptr2, l)) <= 0)
2716*08b48e0bSAndroid Build Coastguard Worker return;
2717*08b48e0bSAndroid Build Coastguard Worker
2718*08b48e0bSAndroid Build Coastguard Worker // fprintf(stderr, "RTN2 %u\n", l);
2719*08b48e0bSAndroid Build Coastguard Worker uintptr_t k = (uintptr_t)__builtin_return_address(0);
2720*08b48e0bSAndroid Build Coastguard Worker k = (uintptr_t)(default_hash((u8 *)&k, sizeof(uintptr_t)) & (CMP_MAP_W - 1));
2721*08b48e0bSAndroid Build Coastguard Worker
2722*08b48e0bSAndroid Build Coastguard Worker u32 hits;
2723*08b48e0bSAndroid Build Coastguard Worker
2724*08b48e0bSAndroid Build Coastguard Worker if (__afl_cmp_map->headers[k].type != CMP_TYPE_RTN) {
2725*08b48e0bSAndroid Build Coastguard Worker
2726*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->headers[k].type = CMP_TYPE_RTN;
2727*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->headers[k].hits = 1;
2728*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->headers[k].shape = l - 1;
2729*08b48e0bSAndroid Build Coastguard Worker hits = 0;
2730*08b48e0bSAndroid Build Coastguard Worker
2731*08b48e0bSAndroid Build Coastguard Worker } else {
2732*08b48e0bSAndroid Build Coastguard Worker
2733*08b48e0bSAndroid Build Coastguard Worker hits = __afl_cmp_map->headers[k].hits++;
2734*08b48e0bSAndroid Build Coastguard Worker
2735*08b48e0bSAndroid Build Coastguard Worker if (__afl_cmp_map->headers[k].shape < l) {
2736*08b48e0bSAndroid Build Coastguard Worker
2737*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map->headers[k].shape = l - 1;
2738*08b48e0bSAndroid Build Coastguard Worker
2739*08b48e0bSAndroid Build Coastguard Worker }
2740*08b48e0bSAndroid Build Coastguard Worker
2741*08b48e0bSAndroid Build Coastguard Worker }
2742*08b48e0bSAndroid Build Coastguard Worker
2743*08b48e0bSAndroid Build Coastguard Worker struct cmpfn_operands *cmpfn = (struct cmpfn_operands *)__afl_cmp_map->log[k];
2744*08b48e0bSAndroid Build Coastguard Worker hits &= CMP_MAP_RTN_H - 1;
2745*08b48e0bSAndroid Build Coastguard Worker
2746*08b48e0bSAndroid Build Coastguard Worker cmpfn[hits].v0_len = l;
2747*08b48e0bSAndroid Build Coastguard Worker cmpfn[hits].v1_len = l;
2748*08b48e0bSAndroid Build Coastguard Worker __builtin_memcpy(cmpfn[hits].v0, ptr1, l);
2749*08b48e0bSAndroid Build Coastguard Worker __builtin_memcpy(cmpfn[hits].v1, ptr2, l);
2750*08b48e0bSAndroid Build Coastguard Worker // fprintf(stderr, "RTN3\n");
2751*08b48e0bSAndroid Build Coastguard Worker #endif
2752*08b48e0bSAndroid Build Coastguard Worker
2753*08b48e0bSAndroid Build Coastguard Worker }
2754*08b48e0bSAndroid Build Coastguard Worker
2755*08b48e0bSAndroid Build Coastguard Worker // gcc libstdc++
2756*08b48e0bSAndroid Build Coastguard Worker // _ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7compareEPKc
get_gcc_stdstring(u8 * string)2757*08b48e0bSAndroid Build Coastguard Worker static u8 *get_gcc_stdstring(u8 *string) {
2758*08b48e0bSAndroid Build Coastguard Worker
2759*08b48e0bSAndroid Build Coastguard Worker u32 *len = (u32 *)(string + 8);
2760*08b48e0bSAndroid Build Coastguard Worker
2761*08b48e0bSAndroid Build Coastguard Worker if (*len < 16) { // in structure
2762*08b48e0bSAndroid Build Coastguard Worker
2763*08b48e0bSAndroid Build Coastguard Worker return (string + 16);
2764*08b48e0bSAndroid Build Coastguard Worker
2765*08b48e0bSAndroid Build Coastguard Worker } else { // in memory
2766*08b48e0bSAndroid Build Coastguard Worker
2767*08b48e0bSAndroid Build Coastguard Worker u8 **ptr = (u8 **)string;
2768*08b48e0bSAndroid Build Coastguard Worker return (*ptr);
2769*08b48e0bSAndroid Build Coastguard Worker
2770*08b48e0bSAndroid Build Coastguard Worker }
2771*08b48e0bSAndroid Build Coastguard Worker
2772*08b48e0bSAndroid Build Coastguard Worker }
2773*08b48e0bSAndroid Build Coastguard Worker
2774*08b48e0bSAndroid Build Coastguard Worker // llvm libc++ _ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocator
2775*08b48e0bSAndroid Build Coastguard Worker // IcEEE7compareEmmPKcm
get_llvm_stdstring(u8 * string)2776*08b48e0bSAndroid Build Coastguard Worker static u8 *get_llvm_stdstring(u8 *string) {
2777*08b48e0bSAndroid Build Coastguard Worker
2778*08b48e0bSAndroid Build Coastguard Worker // length is in: if ((string[0] & 1) == 0) u8 len = (string[0] >> 1);
2779*08b48e0bSAndroid Build Coastguard Worker // or: if (string[0] & 1) u32 *len = (u32 *) (string + 8);
2780*08b48e0bSAndroid Build Coastguard Worker
2781*08b48e0bSAndroid Build Coastguard Worker if (string[0] & 1) { // in memory
2782*08b48e0bSAndroid Build Coastguard Worker
2783*08b48e0bSAndroid Build Coastguard Worker u8 **ptr = (u8 **)(string + 16);
2784*08b48e0bSAndroid Build Coastguard Worker return (*ptr);
2785*08b48e0bSAndroid Build Coastguard Worker
2786*08b48e0bSAndroid Build Coastguard Worker } else { // in structure
2787*08b48e0bSAndroid Build Coastguard Worker
2788*08b48e0bSAndroid Build Coastguard Worker return (string + 1);
2789*08b48e0bSAndroid Build Coastguard Worker
2790*08b48e0bSAndroid Build Coastguard Worker }
2791*08b48e0bSAndroid Build Coastguard Worker
2792*08b48e0bSAndroid Build Coastguard Worker }
2793*08b48e0bSAndroid Build Coastguard Worker
__cmplog_rtn_gcc_stdstring_cstring(u8 * stdstring,u8 * cstring)2794*08b48e0bSAndroid Build Coastguard Worker void __cmplog_rtn_gcc_stdstring_cstring(u8 *stdstring, u8 *cstring) {
2795*08b48e0bSAndroid Build Coastguard Worker
2796*08b48e0bSAndroid Build Coastguard Worker if (likely(!__afl_cmp_map)) return;
2797*08b48e0bSAndroid Build Coastguard Worker if (area_is_valid(stdstring, 32) <= 0 || area_is_valid(cstring, 32) <= 0)
2798*08b48e0bSAndroid Build Coastguard Worker return;
2799*08b48e0bSAndroid Build Coastguard Worker
2800*08b48e0bSAndroid Build Coastguard Worker __cmplog_rtn_hook(get_gcc_stdstring(stdstring), cstring);
2801*08b48e0bSAndroid Build Coastguard Worker
2802*08b48e0bSAndroid Build Coastguard Worker }
2803*08b48e0bSAndroid Build Coastguard Worker
__cmplog_rtn_gcc_stdstring_stdstring(u8 * stdstring1,u8 * stdstring2)2804*08b48e0bSAndroid Build Coastguard Worker void __cmplog_rtn_gcc_stdstring_stdstring(u8 *stdstring1, u8 *stdstring2) {
2805*08b48e0bSAndroid Build Coastguard Worker
2806*08b48e0bSAndroid Build Coastguard Worker if (likely(!__afl_cmp_map)) return;
2807*08b48e0bSAndroid Build Coastguard Worker if (area_is_valid(stdstring1, 32) <= 0 || area_is_valid(stdstring2, 32) <= 0)
2808*08b48e0bSAndroid Build Coastguard Worker return;
2809*08b48e0bSAndroid Build Coastguard Worker
2810*08b48e0bSAndroid Build Coastguard Worker __cmplog_rtn_hook(get_gcc_stdstring(stdstring1),
2811*08b48e0bSAndroid Build Coastguard Worker get_gcc_stdstring(stdstring2));
2812*08b48e0bSAndroid Build Coastguard Worker
2813*08b48e0bSAndroid Build Coastguard Worker }
2814*08b48e0bSAndroid Build Coastguard Worker
__cmplog_rtn_llvm_stdstring_cstring(u8 * stdstring,u8 * cstring)2815*08b48e0bSAndroid Build Coastguard Worker void __cmplog_rtn_llvm_stdstring_cstring(u8 *stdstring, u8 *cstring) {
2816*08b48e0bSAndroid Build Coastguard Worker
2817*08b48e0bSAndroid Build Coastguard Worker if (likely(!__afl_cmp_map)) return;
2818*08b48e0bSAndroid Build Coastguard Worker if (area_is_valid(stdstring, 32) <= 0 || area_is_valid(cstring, 32) <= 0)
2819*08b48e0bSAndroid Build Coastguard Worker return;
2820*08b48e0bSAndroid Build Coastguard Worker
2821*08b48e0bSAndroid Build Coastguard Worker __cmplog_rtn_hook(get_llvm_stdstring(stdstring), cstring);
2822*08b48e0bSAndroid Build Coastguard Worker
2823*08b48e0bSAndroid Build Coastguard Worker }
2824*08b48e0bSAndroid Build Coastguard Worker
__cmplog_rtn_llvm_stdstring_stdstring(u8 * stdstring1,u8 * stdstring2)2825*08b48e0bSAndroid Build Coastguard Worker void __cmplog_rtn_llvm_stdstring_stdstring(u8 *stdstring1, u8 *stdstring2) {
2826*08b48e0bSAndroid Build Coastguard Worker
2827*08b48e0bSAndroid Build Coastguard Worker if (likely(!__afl_cmp_map)) return;
2828*08b48e0bSAndroid Build Coastguard Worker if (area_is_valid(stdstring1, 32) <= 0 || area_is_valid(stdstring2, 32) <= 0)
2829*08b48e0bSAndroid Build Coastguard Worker return;
2830*08b48e0bSAndroid Build Coastguard Worker
2831*08b48e0bSAndroid Build Coastguard Worker __cmplog_rtn_hook(get_llvm_stdstring(stdstring1),
2832*08b48e0bSAndroid Build Coastguard Worker get_llvm_stdstring(stdstring2));
2833*08b48e0bSAndroid Build Coastguard Worker
2834*08b48e0bSAndroid Build Coastguard Worker }
2835*08b48e0bSAndroid Build Coastguard Worker
2836*08b48e0bSAndroid Build Coastguard Worker /* COVERAGE manipulation features */
2837*08b48e0bSAndroid Build Coastguard Worker
2838*08b48e0bSAndroid Build Coastguard Worker // this variable is then used in the shm setup to create an additional map
2839*08b48e0bSAndroid Build Coastguard Worker // if __afl_map_size > MAP_SIZE or cmplog is used.
2840*08b48e0bSAndroid Build Coastguard Worker // Especially with cmplog this would result in a ~260MB mem increase per
2841*08b48e0bSAndroid Build Coastguard Worker // target run.
2842*08b48e0bSAndroid Build Coastguard Worker
2843*08b48e0bSAndroid Build Coastguard Worker // disable coverage from this point onwards until turned on again
__afl_coverage_off()2844*08b48e0bSAndroid Build Coastguard Worker void __afl_coverage_off() {
2845*08b48e0bSAndroid Build Coastguard Worker
2846*08b48e0bSAndroid Build Coastguard Worker if (likely(__afl_selective_coverage)) {
2847*08b48e0bSAndroid Build Coastguard Worker
2848*08b48e0bSAndroid Build Coastguard Worker __afl_area_ptr = __afl_area_ptr_dummy;
2849*08b48e0bSAndroid Build Coastguard Worker __afl_cmp_map = NULL;
2850*08b48e0bSAndroid Build Coastguard Worker
2851*08b48e0bSAndroid Build Coastguard Worker }
2852*08b48e0bSAndroid Build Coastguard Worker
2853*08b48e0bSAndroid Build Coastguard Worker }
2854*08b48e0bSAndroid Build Coastguard Worker
2855*08b48e0bSAndroid Build Coastguard Worker // enable coverage
__afl_coverage_on()2856*08b48e0bSAndroid Build Coastguard Worker void __afl_coverage_on() {
2857*08b48e0bSAndroid Build Coastguard Worker
2858*08b48e0bSAndroid Build Coastguard Worker if (likely(__afl_selective_coverage && __afl_selective_coverage_temp)) {
2859*08b48e0bSAndroid Build Coastguard Worker
2860*08b48e0bSAndroid Build Coastguard Worker __afl_area_ptr = __afl_area_ptr_backup;
2861*08b48e0bSAndroid Build Coastguard Worker if (__afl_cmp_map_backup) { __afl_cmp_map = __afl_cmp_map_backup; }
2862*08b48e0bSAndroid Build Coastguard Worker
2863*08b48e0bSAndroid Build Coastguard Worker }
2864*08b48e0bSAndroid Build Coastguard Worker
2865*08b48e0bSAndroid Build Coastguard Worker }
2866*08b48e0bSAndroid Build Coastguard Worker
2867*08b48e0bSAndroid Build Coastguard Worker // discard all coverage up to this point
__afl_coverage_discard()2868*08b48e0bSAndroid Build Coastguard Worker void __afl_coverage_discard() {
2869*08b48e0bSAndroid Build Coastguard Worker
2870*08b48e0bSAndroid Build Coastguard Worker memset(__afl_area_ptr_backup, 0, __afl_map_size);
2871*08b48e0bSAndroid Build Coastguard Worker __afl_area_ptr_backup[0] = 1;
2872*08b48e0bSAndroid Build Coastguard Worker
2873*08b48e0bSAndroid Build Coastguard Worker if (__afl_cmp_map) { memset(__afl_cmp_map, 0, sizeof(struct cmp_map)); }
2874*08b48e0bSAndroid Build Coastguard Worker
2875*08b48e0bSAndroid Build Coastguard Worker }
2876*08b48e0bSAndroid Build Coastguard Worker
2877*08b48e0bSAndroid Build Coastguard Worker // discard the testcase
__afl_coverage_skip()2878*08b48e0bSAndroid Build Coastguard Worker void __afl_coverage_skip() {
2879*08b48e0bSAndroid Build Coastguard Worker
2880*08b48e0bSAndroid Build Coastguard Worker __afl_coverage_discard();
2881*08b48e0bSAndroid Build Coastguard Worker
2882*08b48e0bSAndroid Build Coastguard Worker if (likely(is_persistent && __afl_selective_coverage)) {
2883*08b48e0bSAndroid Build Coastguard Worker
2884*08b48e0bSAndroid Build Coastguard Worker __afl_coverage_off();
2885*08b48e0bSAndroid Build Coastguard Worker __afl_selective_coverage_temp = 0;
2886*08b48e0bSAndroid Build Coastguard Worker
2887*08b48e0bSAndroid Build Coastguard Worker } else {
2888*08b48e0bSAndroid Build Coastguard Worker
2889*08b48e0bSAndroid Build Coastguard Worker exit(0);
2890*08b48e0bSAndroid Build Coastguard Worker
2891*08b48e0bSAndroid Build Coastguard Worker }
2892*08b48e0bSAndroid Build Coastguard Worker
2893*08b48e0bSAndroid Build Coastguard Worker }
2894*08b48e0bSAndroid Build Coastguard Worker
2895*08b48e0bSAndroid Build Coastguard Worker // mark this area as especially interesting
__afl_coverage_interesting(u8 val,u32 id)2896*08b48e0bSAndroid Build Coastguard Worker void __afl_coverage_interesting(u8 val, u32 id) {
2897*08b48e0bSAndroid Build Coastguard Worker
2898*08b48e0bSAndroid Build Coastguard Worker __afl_area_ptr[id] = val;
2899*08b48e0bSAndroid Build Coastguard Worker
2900*08b48e0bSAndroid Build Coastguard Worker }
2901*08b48e0bSAndroid Build Coastguard Worker
__afl_set_persistent_mode(u8 mode)2902*08b48e0bSAndroid Build Coastguard Worker void __afl_set_persistent_mode(u8 mode) {
2903*08b48e0bSAndroid Build Coastguard Worker
2904*08b48e0bSAndroid Build Coastguard Worker is_persistent = mode;
2905*08b48e0bSAndroid Build Coastguard Worker
2906*08b48e0bSAndroid Build Coastguard Worker }
2907*08b48e0bSAndroid Build Coastguard Worker
2908*08b48e0bSAndroid Build Coastguard Worker // Marker: ADD_TO_INJECTIONS
2909*08b48e0bSAndroid Build Coastguard Worker
__afl_injection_sql(u8 * buf)2910*08b48e0bSAndroid Build Coastguard Worker void __afl_injection_sql(u8 *buf) {
2911*08b48e0bSAndroid Build Coastguard Worker
2912*08b48e0bSAndroid Build Coastguard Worker if (likely(buf)) {
2913*08b48e0bSAndroid Build Coastguard Worker
2914*08b48e0bSAndroid Build Coastguard Worker if (unlikely(strstr((char *)buf, "'\"\"'"))) {
2915*08b48e0bSAndroid Build Coastguard Worker
2916*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr, "ALERT: Detected SQL injection in query: %s\n", buf);
2917*08b48e0bSAndroid Build Coastguard Worker abort();
2918*08b48e0bSAndroid Build Coastguard Worker
2919*08b48e0bSAndroid Build Coastguard Worker }
2920*08b48e0bSAndroid Build Coastguard Worker
2921*08b48e0bSAndroid Build Coastguard Worker }
2922*08b48e0bSAndroid Build Coastguard Worker
2923*08b48e0bSAndroid Build Coastguard Worker }
2924*08b48e0bSAndroid Build Coastguard Worker
__afl_injection_ldap(u8 * buf)2925*08b48e0bSAndroid Build Coastguard Worker void __afl_injection_ldap(u8 *buf) {
2926*08b48e0bSAndroid Build Coastguard Worker
2927*08b48e0bSAndroid Build Coastguard Worker if (likely(buf)) {
2928*08b48e0bSAndroid Build Coastguard Worker
2929*08b48e0bSAndroid Build Coastguard Worker if (unlikely(strstr((char *)buf, "*)(1=*))(|"))) {
2930*08b48e0bSAndroid Build Coastguard Worker
2931*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr, "ALERT: Detected LDAP injection in query: %s\n", buf);
2932*08b48e0bSAndroid Build Coastguard Worker abort();
2933*08b48e0bSAndroid Build Coastguard Worker
2934*08b48e0bSAndroid Build Coastguard Worker }
2935*08b48e0bSAndroid Build Coastguard Worker
2936*08b48e0bSAndroid Build Coastguard Worker }
2937*08b48e0bSAndroid Build Coastguard Worker
2938*08b48e0bSAndroid Build Coastguard Worker }
2939*08b48e0bSAndroid Build Coastguard Worker
__afl_injection_xss(u8 * buf)2940*08b48e0bSAndroid Build Coastguard Worker void __afl_injection_xss(u8 *buf) {
2941*08b48e0bSAndroid Build Coastguard Worker
2942*08b48e0bSAndroid Build Coastguard Worker if (likely(buf)) {
2943*08b48e0bSAndroid Build Coastguard Worker
2944*08b48e0bSAndroid Build Coastguard Worker if (unlikely(strstr((char *)buf, "1\"><\""))) {
2945*08b48e0bSAndroid Build Coastguard Worker
2946*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr, "ALERT: Detected XSS injection in content: %s\n", buf);
2947*08b48e0bSAndroid Build Coastguard Worker abort();
2948*08b48e0bSAndroid Build Coastguard Worker
2949*08b48e0bSAndroid Build Coastguard Worker }
2950*08b48e0bSAndroid Build Coastguard Worker
2951*08b48e0bSAndroid Build Coastguard Worker }
2952*08b48e0bSAndroid Build Coastguard Worker
2953*08b48e0bSAndroid Build Coastguard Worker }
2954*08b48e0bSAndroid Build Coastguard Worker
2955*08b48e0bSAndroid Build Coastguard Worker #undef write_error
2956*08b48e0bSAndroid Build Coastguard Worker
2957