1*08b48e0bSAndroid Build Coastguard Worker /*
2*08b48e0bSAndroid Build Coastguard Worker american fuzzy lop++ - map display utility
3*08b48e0bSAndroid Build Coastguard Worker ------------------------------------------
4*08b48e0bSAndroid Build Coastguard Worker
5*08b48e0bSAndroid Build Coastguard Worker Originally written by Michal Zalewski
6*08b48e0bSAndroid Build Coastguard Worker
7*08b48e0bSAndroid Build Coastguard Worker Forkserver design by Jann Horn <[email protected]>
8*08b48e0bSAndroid Build Coastguard Worker
9*08b48e0bSAndroid Build Coastguard Worker Now maintained by Marc Heuse <[email protected]>,
10*08b48e0bSAndroid Build Coastguard Worker Heiko Eißfeldt <[email protected]> and
11*08b48e0bSAndroid Build Coastguard Worker Andrea Fioraldi <[email protected]> and
12*08b48e0bSAndroid Build Coastguard Worker Dominik Maier <[email protected]>
13*08b48e0bSAndroid Build Coastguard Worker
14*08b48e0bSAndroid Build Coastguard Worker Copyright 2016, 2017 Google Inc. All rights reserved.
15*08b48e0bSAndroid Build Coastguard Worker Copyright 2019-2024 AFLplusplus Project. All rights reserved.
16*08b48e0bSAndroid Build Coastguard Worker
17*08b48e0bSAndroid Build Coastguard Worker Licensed under the Apache License, Version 2.0 (the "License");
18*08b48e0bSAndroid Build Coastguard Worker you may not use this file except in compliance with the License.
19*08b48e0bSAndroid Build Coastguard Worker You may obtain a copy of the License at:
20*08b48e0bSAndroid Build Coastguard Worker
21*08b48e0bSAndroid Build Coastguard Worker https://www.apache.org/licenses/LICENSE-2.0
22*08b48e0bSAndroid Build Coastguard Worker
23*08b48e0bSAndroid Build Coastguard Worker A very simple tool that runs the targeted binary and displays
24*08b48e0bSAndroid Build Coastguard Worker the contents of the trace bitmap in a human-readable form. Useful in
25*08b48e0bSAndroid Build Coastguard Worker scripts to eliminate redundant inputs and perform other checks.
26*08b48e0bSAndroid Build Coastguard Worker
27*08b48e0bSAndroid Build Coastguard Worker Exit code is 2 if the target program crashes; 1 if it times out or
28*08b48e0bSAndroid Build Coastguard Worker there is a problem executing it; or 0 if execution is successful.
29*08b48e0bSAndroid Build Coastguard Worker
30*08b48e0bSAndroid Build Coastguard Worker */
31*08b48e0bSAndroid Build Coastguard Worker
32*08b48e0bSAndroid Build Coastguard Worker #define AFL_MAIN
33*08b48e0bSAndroid Build Coastguard Worker #define AFL_SHOWMAP
34*08b48e0bSAndroid Build Coastguard Worker
35*08b48e0bSAndroid Build Coastguard Worker #include "config.h"
36*08b48e0bSAndroid Build Coastguard Worker #include "afl-fuzz.h"
37*08b48e0bSAndroid Build Coastguard Worker #include "types.h"
38*08b48e0bSAndroid Build Coastguard Worker #include "debug.h"
39*08b48e0bSAndroid Build Coastguard Worker #include "alloc-inl.h"
40*08b48e0bSAndroid Build Coastguard Worker #include "hash.h"
41*08b48e0bSAndroid Build Coastguard Worker #include "sharedmem.h"
42*08b48e0bSAndroid Build Coastguard Worker #include "forkserver.h"
43*08b48e0bSAndroid Build Coastguard Worker #include "common.h"
44*08b48e0bSAndroid Build Coastguard Worker #include "hash.h"
45*08b48e0bSAndroid Build Coastguard Worker
46*08b48e0bSAndroid Build Coastguard Worker #include <stdio.h>
47*08b48e0bSAndroid Build Coastguard Worker #include <unistd.h>
48*08b48e0bSAndroid Build Coastguard Worker #include <stdlib.h>
49*08b48e0bSAndroid Build Coastguard Worker #include <string.h>
50*08b48e0bSAndroid Build Coastguard Worker #include <time.h>
51*08b48e0bSAndroid Build Coastguard Worker #include <errno.h>
52*08b48e0bSAndroid Build Coastguard Worker #include <signal.h>
53*08b48e0bSAndroid Build Coastguard Worker #include <dirent.h>
54*08b48e0bSAndroid Build Coastguard Worker #include <fcntl.h>
55*08b48e0bSAndroid Build Coastguard Worker #include <limits.h>
56*08b48e0bSAndroid Build Coastguard Worker
57*08b48e0bSAndroid Build Coastguard Worker #include <dirent.h>
58*08b48e0bSAndroid Build Coastguard Worker #include <sys/wait.h>
59*08b48e0bSAndroid Build Coastguard Worker #include <sys/time.h>
60*08b48e0bSAndroid Build Coastguard Worker #ifndef USEMMAP
61*08b48e0bSAndroid Build Coastguard Worker #include <sys/shm.h>
62*08b48e0bSAndroid Build Coastguard Worker #endif
63*08b48e0bSAndroid Build Coastguard Worker #include <sys/stat.h>
64*08b48e0bSAndroid Build Coastguard Worker #include <sys/types.h>
65*08b48e0bSAndroid Build Coastguard Worker #include <sys/resource.h>
66*08b48e0bSAndroid Build Coastguard Worker
67*08b48e0bSAndroid Build Coastguard Worker static afl_state_t *afl;
68*08b48e0bSAndroid Build Coastguard Worker
69*08b48e0bSAndroid Build Coastguard Worker static char *stdin_file; /* stdin file */
70*08b48e0bSAndroid Build Coastguard Worker
71*08b48e0bSAndroid Build Coastguard Worker static u8 *in_dir = NULL, /* input folder */
72*08b48e0bSAndroid Build Coastguard Worker *out_file = NULL, /* output file or directory */
73*08b48e0bSAndroid Build Coastguard Worker *at_file = NULL, /* Substitution string for @@ */
74*08b48e0bSAndroid Build Coastguard Worker *in_filelist = NULL; /* input file list */
75*08b48e0bSAndroid Build Coastguard Worker
76*08b48e0bSAndroid Build Coastguard Worker static u8 outfile[PATH_MAX];
77*08b48e0bSAndroid Build Coastguard Worker
78*08b48e0bSAndroid Build Coastguard Worker static u8 *in_data, /* Input data */
79*08b48e0bSAndroid Build Coastguard Worker *coverage_map; /* Coverage map */
80*08b48e0bSAndroid Build Coastguard Worker
81*08b48e0bSAndroid Build Coastguard Worker static u64 total; /* tuple content information */
82*08b48e0bSAndroid Build Coastguard Worker static u32 tcnt, highest; /* tuple content information */
83*08b48e0bSAndroid Build Coastguard Worker
84*08b48e0bSAndroid Build Coastguard Worker static u32 in_len; /* Input data length */
85*08b48e0bSAndroid Build Coastguard Worker
86*08b48e0bSAndroid Build Coastguard Worker static u32 map_size = MAP_SIZE, timed_out = 0;
87*08b48e0bSAndroid Build Coastguard Worker
88*08b48e0bSAndroid Build Coastguard Worker static bool quiet_mode, /* Hide non-essential messages? */
89*08b48e0bSAndroid Build Coastguard Worker edges_only, /* Ignore hit counts? */
90*08b48e0bSAndroid Build Coastguard Worker raw_instr_output, /* Do not apply AFL filters */
91*08b48e0bSAndroid Build Coastguard Worker cmin_mode, /* Generate output in afl-cmin mode? */
92*08b48e0bSAndroid Build Coastguard Worker binary_mode, /* Write output as a binary map */
93*08b48e0bSAndroid Build Coastguard Worker keep_cores, /* Allow coredumps? */
94*08b48e0bSAndroid Build Coastguard Worker remove_shm = true, /* remove shmem? */
95*08b48e0bSAndroid Build Coastguard Worker collect_coverage, /* collect coverage */
96*08b48e0bSAndroid Build Coastguard Worker have_coverage, /* have coverage? */
97*08b48e0bSAndroid Build Coastguard Worker no_classify, /* do not classify counts */
98*08b48e0bSAndroid Build Coastguard Worker debug, /* debug mode */
99*08b48e0bSAndroid Build Coastguard Worker print_filenames, /* print the current filename */
100*08b48e0bSAndroid Build Coastguard Worker wait_for_gdb;
101*08b48e0bSAndroid Build Coastguard Worker
102*08b48e0bSAndroid Build Coastguard Worker static volatile u8 stop_soon, /* Ctrl-C pressed? */
103*08b48e0bSAndroid Build Coastguard Worker child_crashed; /* Child crashed? */
104*08b48e0bSAndroid Build Coastguard Worker
105*08b48e0bSAndroid Build Coastguard Worker static sharedmem_t shm;
106*08b48e0bSAndroid Build Coastguard Worker static afl_forkserver_t *fsrv;
107*08b48e0bSAndroid Build Coastguard Worker static sharedmem_t *shm_fuzz;
108*08b48e0bSAndroid Build Coastguard Worker
109*08b48e0bSAndroid Build Coastguard Worker /* Classify tuple counts. Instead of mapping to individual bits, as in
110*08b48e0bSAndroid Build Coastguard Worker afl-fuzz.c, we map to more user-friendly numbers between 1 and 8. */
111*08b48e0bSAndroid Build Coastguard Worker
112*08b48e0bSAndroid Build Coastguard Worker static const u8 count_class_human[256] = {
113*08b48e0bSAndroid Build Coastguard Worker
114*08b48e0bSAndroid Build Coastguard Worker [0] = 0, [1] = 1, [2] = 2, [3] = 3,
115*08b48e0bSAndroid Build Coastguard Worker [4 ... 7] = 4, [8 ... 15] = 5, [16 ... 31] = 6, [32 ... 127] = 7,
116*08b48e0bSAndroid Build Coastguard Worker [128 ... 255] = 8
117*08b48e0bSAndroid Build Coastguard Worker
118*08b48e0bSAndroid Build Coastguard Worker };
119*08b48e0bSAndroid Build Coastguard Worker
120*08b48e0bSAndroid Build Coastguard Worker static const u8 count_class_binary[256] = {
121*08b48e0bSAndroid Build Coastguard Worker
122*08b48e0bSAndroid Build Coastguard Worker [0] = 0,
123*08b48e0bSAndroid Build Coastguard Worker [1] = 1,
124*08b48e0bSAndroid Build Coastguard Worker [2] = 2,
125*08b48e0bSAndroid Build Coastguard Worker [3] = 4,
126*08b48e0bSAndroid Build Coastguard Worker [4 ... 7] = 8,
127*08b48e0bSAndroid Build Coastguard Worker [8 ... 15] = 16,
128*08b48e0bSAndroid Build Coastguard Worker [16 ... 31] = 32,
129*08b48e0bSAndroid Build Coastguard Worker [32 ... 127] = 64,
130*08b48e0bSAndroid Build Coastguard Worker [128 ... 255] = 128
131*08b48e0bSAndroid Build Coastguard Worker
132*08b48e0bSAndroid Build Coastguard Worker };
133*08b48e0bSAndroid Build Coastguard Worker
kill_child()134*08b48e0bSAndroid Build Coastguard Worker static void kill_child() {
135*08b48e0bSAndroid Build Coastguard Worker
136*08b48e0bSAndroid Build Coastguard Worker timed_out = 1;
137*08b48e0bSAndroid Build Coastguard Worker if (fsrv->child_pid > 0) {
138*08b48e0bSAndroid Build Coastguard Worker
139*08b48e0bSAndroid Build Coastguard Worker kill(fsrv->child_pid, fsrv->child_kill_signal);
140*08b48e0bSAndroid Build Coastguard Worker fsrv->child_pid = -1;
141*08b48e0bSAndroid Build Coastguard Worker
142*08b48e0bSAndroid Build Coastguard Worker }
143*08b48e0bSAndroid Build Coastguard Worker
144*08b48e0bSAndroid Build Coastguard Worker }
145*08b48e0bSAndroid Build Coastguard Worker
146*08b48e0bSAndroid Build Coastguard Worker /* dummy functions */
write_to_testcase(afl_state_t * afl,void ** mem,u32 a,u32 b)147*08b48e0bSAndroid Build Coastguard Worker u32 write_to_testcase(afl_state_t *afl, void **mem, u32 a, u32 b) {
148*08b48e0bSAndroid Build Coastguard Worker
149*08b48e0bSAndroid Build Coastguard Worker (void)afl;
150*08b48e0bSAndroid Build Coastguard Worker (void)mem;
151*08b48e0bSAndroid Build Coastguard Worker return a + b;
152*08b48e0bSAndroid Build Coastguard Worker
153*08b48e0bSAndroid Build Coastguard Worker }
154*08b48e0bSAndroid Build Coastguard Worker
show_stats(afl_state_t * afl)155*08b48e0bSAndroid Build Coastguard Worker void show_stats(afl_state_t *afl) {
156*08b48e0bSAndroid Build Coastguard Worker
157*08b48e0bSAndroid Build Coastguard Worker (void)afl;
158*08b48e0bSAndroid Build Coastguard Worker
159*08b48e0bSAndroid Build Coastguard Worker }
160*08b48e0bSAndroid Build Coastguard Worker
update_bitmap_score(afl_state_t * afl,struct queue_entry * q)161*08b48e0bSAndroid Build Coastguard Worker void update_bitmap_score(afl_state_t *afl, struct queue_entry *q) {
162*08b48e0bSAndroid Build Coastguard Worker
163*08b48e0bSAndroid Build Coastguard Worker (void)afl;
164*08b48e0bSAndroid Build Coastguard Worker (void)q;
165*08b48e0bSAndroid Build Coastguard Worker
166*08b48e0bSAndroid Build Coastguard Worker }
167*08b48e0bSAndroid Build Coastguard Worker
fuzz_run_target(afl_state_t * afl,afl_forkserver_t * fsrv,u32 i)168*08b48e0bSAndroid Build Coastguard Worker fsrv_run_result_t fuzz_run_target(afl_state_t *afl, afl_forkserver_t *fsrv,
169*08b48e0bSAndroid Build Coastguard Worker u32 i) {
170*08b48e0bSAndroid Build Coastguard Worker
171*08b48e0bSAndroid Build Coastguard Worker (void)afl;
172*08b48e0bSAndroid Build Coastguard Worker (void)fsrv;
173*08b48e0bSAndroid Build Coastguard Worker (void)i;
174*08b48e0bSAndroid Build Coastguard Worker return 0;
175*08b48e0bSAndroid Build Coastguard Worker
176*08b48e0bSAndroid Build Coastguard Worker }
177*08b48e0bSAndroid Build Coastguard Worker
classify_counts(afl_forkserver_t * fsrv)178*08b48e0bSAndroid Build Coastguard Worker void classify_counts(afl_forkserver_t *fsrv) {
179*08b48e0bSAndroid Build Coastguard Worker
180*08b48e0bSAndroid Build Coastguard Worker u8 *mem = fsrv->trace_bits;
181*08b48e0bSAndroid Build Coastguard Worker const u8 *map = binary_mode ? count_class_binary : count_class_human;
182*08b48e0bSAndroid Build Coastguard Worker
183*08b48e0bSAndroid Build Coastguard Worker u32 i = map_size;
184*08b48e0bSAndroid Build Coastguard Worker
185*08b48e0bSAndroid Build Coastguard Worker if (edges_only) {
186*08b48e0bSAndroid Build Coastguard Worker
187*08b48e0bSAndroid Build Coastguard Worker while (i--) {
188*08b48e0bSAndroid Build Coastguard Worker
189*08b48e0bSAndroid Build Coastguard Worker if (*mem) { *mem = 1; }
190*08b48e0bSAndroid Build Coastguard Worker mem++;
191*08b48e0bSAndroid Build Coastguard Worker
192*08b48e0bSAndroid Build Coastguard Worker }
193*08b48e0bSAndroid Build Coastguard Worker
194*08b48e0bSAndroid Build Coastguard Worker } else if (!raw_instr_output) {
195*08b48e0bSAndroid Build Coastguard Worker
196*08b48e0bSAndroid Build Coastguard Worker while (i--) {
197*08b48e0bSAndroid Build Coastguard Worker
198*08b48e0bSAndroid Build Coastguard Worker *mem = map[*mem];
199*08b48e0bSAndroid Build Coastguard Worker mem++;
200*08b48e0bSAndroid Build Coastguard Worker
201*08b48e0bSAndroid Build Coastguard Worker }
202*08b48e0bSAndroid Build Coastguard Worker
203*08b48e0bSAndroid Build Coastguard Worker }
204*08b48e0bSAndroid Build Coastguard Worker
205*08b48e0bSAndroid Build Coastguard Worker }
206*08b48e0bSAndroid Build Coastguard Worker
deinit_shmem(afl_forkserver_t * fsrv,sharedmem_t * shm_fuzz)207*08b48e0bSAndroid Build Coastguard Worker static sharedmem_t *deinit_shmem(afl_forkserver_t *fsrv,
208*08b48e0bSAndroid Build Coastguard Worker sharedmem_t *shm_fuzz) {
209*08b48e0bSAndroid Build Coastguard Worker
210*08b48e0bSAndroid Build Coastguard Worker afl_shm_deinit(shm_fuzz);
211*08b48e0bSAndroid Build Coastguard Worker fsrv->support_shmem_fuzz = 0;
212*08b48e0bSAndroid Build Coastguard Worker fsrv->shmem_fuzz_len = NULL;
213*08b48e0bSAndroid Build Coastguard Worker fsrv->shmem_fuzz = NULL;
214*08b48e0bSAndroid Build Coastguard Worker ck_free(shm_fuzz);
215*08b48e0bSAndroid Build Coastguard Worker return NULL;
216*08b48e0bSAndroid Build Coastguard Worker
217*08b48e0bSAndroid Build Coastguard Worker }
218*08b48e0bSAndroid Build Coastguard Worker
219*08b48e0bSAndroid Build Coastguard Worker /* Get rid of temp files (atexit handler). */
220*08b48e0bSAndroid Build Coastguard Worker
at_exit_handler(void)221*08b48e0bSAndroid Build Coastguard Worker static void at_exit_handler(void) {
222*08b48e0bSAndroid Build Coastguard Worker
223*08b48e0bSAndroid Build Coastguard Worker if (stdin_file) { unlink(stdin_file); }
224*08b48e0bSAndroid Build Coastguard Worker
225*08b48e0bSAndroid Build Coastguard Worker if (remove_shm) {
226*08b48e0bSAndroid Build Coastguard Worker
227*08b48e0bSAndroid Build Coastguard Worker if (shm.map) afl_shm_deinit(&shm);
228*08b48e0bSAndroid Build Coastguard Worker if (fsrv->use_shmem_fuzz) deinit_shmem(fsrv, shm_fuzz);
229*08b48e0bSAndroid Build Coastguard Worker
230*08b48e0bSAndroid Build Coastguard Worker }
231*08b48e0bSAndroid Build Coastguard Worker
232*08b48e0bSAndroid Build Coastguard Worker afl_fsrv_killall();
233*08b48e0bSAndroid Build Coastguard Worker
234*08b48e0bSAndroid Build Coastguard Worker }
235*08b48e0bSAndroid Build Coastguard Worker
236*08b48e0bSAndroid Build Coastguard Worker /* Analyze results. */
237*08b48e0bSAndroid Build Coastguard Worker
analyze_results(afl_forkserver_t * fsrv)238*08b48e0bSAndroid Build Coastguard Worker static void analyze_results(afl_forkserver_t *fsrv) {
239*08b48e0bSAndroid Build Coastguard Worker
240*08b48e0bSAndroid Build Coastguard Worker u32 i;
241*08b48e0bSAndroid Build Coastguard Worker for (i = 0; i < map_size; i++) {
242*08b48e0bSAndroid Build Coastguard Worker
243*08b48e0bSAndroid Build Coastguard Worker if (fsrv->trace_bits[i]) {
244*08b48e0bSAndroid Build Coastguard Worker
245*08b48e0bSAndroid Build Coastguard Worker total += fsrv->trace_bits[i];
246*08b48e0bSAndroid Build Coastguard Worker if (fsrv->trace_bits[i] > highest) highest = fsrv->trace_bits[i];
247*08b48e0bSAndroid Build Coastguard Worker // if (!coverage_map[i]) { coverage_map[i] = 1; }
248*08b48e0bSAndroid Build Coastguard Worker coverage_map[i] |= fsrv->trace_bits[i];
249*08b48e0bSAndroid Build Coastguard Worker
250*08b48e0bSAndroid Build Coastguard Worker }
251*08b48e0bSAndroid Build Coastguard Worker
252*08b48e0bSAndroid Build Coastguard Worker }
253*08b48e0bSAndroid Build Coastguard Worker
254*08b48e0bSAndroid Build Coastguard Worker }
255*08b48e0bSAndroid Build Coastguard Worker
256*08b48e0bSAndroid Build Coastguard Worker /* Write results. */
257*08b48e0bSAndroid Build Coastguard Worker
write_results_to_file(afl_forkserver_t * fsrv,u8 * outfile)258*08b48e0bSAndroid Build Coastguard Worker static u32 write_results_to_file(afl_forkserver_t *fsrv, u8 *outfile) {
259*08b48e0bSAndroid Build Coastguard Worker
260*08b48e0bSAndroid Build Coastguard Worker s32 fd;
261*08b48e0bSAndroid Build Coastguard Worker u32 i, ret = 0;
262*08b48e0bSAndroid Build Coastguard Worker
263*08b48e0bSAndroid Build Coastguard Worker u8 cco = !!getenv("AFL_CMIN_CRASHES_ONLY"),
264*08b48e0bSAndroid Build Coastguard Worker caa = !!getenv("AFL_CMIN_ALLOW_ANY");
265*08b48e0bSAndroid Build Coastguard Worker
266*08b48e0bSAndroid Build Coastguard Worker if (!outfile || !*outfile) {
267*08b48e0bSAndroid Build Coastguard Worker
268*08b48e0bSAndroid Build Coastguard Worker FATAL("Output filename not set (Bug in AFL++?)");
269*08b48e0bSAndroid Build Coastguard Worker
270*08b48e0bSAndroid Build Coastguard Worker }
271*08b48e0bSAndroid Build Coastguard Worker
272*08b48e0bSAndroid Build Coastguard Worker if (cmin_mode &&
273*08b48e0bSAndroid Build Coastguard Worker (fsrv->last_run_timed_out || (!caa && child_crashed != cco))) {
274*08b48e0bSAndroid Build Coastguard Worker
275*08b48e0bSAndroid Build Coastguard Worker if (strcmp(outfile, "-")) {
276*08b48e0bSAndroid Build Coastguard Worker
277*08b48e0bSAndroid Build Coastguard Worker // create empty file to prevent error messages in afl-cmin
278*08b48e0bSAndroid Build Coastguard Worker fd = open(outfile, O_WRONLY | O_CREAT | O_EXCL, DEFAULT_PERMISSION);
279*08b48e0bSAndroid Build Coastguard Worker close(fd);
280*08b48e0bSAndroid Build Coastguard Worker
281*08b48e0bSAndroid Build Coastguard Worker }
282*08b48e0bSAndroid Build Coastguard Worker
283*08b48e0bSAndroid Build Coastguard Worker return ret;
284*08b48e0bSAndroid Build Coastguard Worker
285*08b48e0bSAndroid Build Coastguard Worker }
286*08b48e0bSAndroid Build Coastguard Worker
287*08b48e0bSAndroid Build Coastguard Worker if (!strncmp(outfile, "/dev/", 5)) {
288*08b48e0bSAndroid Build Coastguard Worker
289*08b48e0bSAndroid Build Coastguard Worker fd = open(outfile, O_WRONLY);
290*08b48e0bSAndroid Build Coastguard Worker
291*08b48e0bSAndroid Build Coastguard Worker if (fd < 0) { PFATAL("Unable to open '%s'", out_file); }
292*08b48e0bSAndroid Build Coastguard Worker
293*08b48e0bSAndroid Build Coastguard Worker } else if (!strcmp(outfile, "-")) {
294*08b48e0bSAndroid Build Coastguard Worker
295*08b48e0bSAndroid Build Coastguard Worker fd = dup(1);
296*08b48e0bSAndroid Build Coastguard Worker if (fd < 0) { PFATAL("Unable to open stdout"); }
297*08b48e0bSAndroid Build Coastguard Worker
298*08b48e0bSAndroid Build Coastguard Worker } else {
299*08b48e0bSAndroid Build Coastguard Worker
300*08b48e0bSAndroid Build Coastguard Worker unlink(outfile); /* Ignore errors */
301*08b48e0bSAndroid Build Coastguard Worker fd = open(outfile, O_WRONLY | O_CREAT | O_EXCL, DEFAULT_PERMISSION);
302*08b48e0bSAndroid Build Coastguard Worker if (fd < 0) { PFATAL("Unable to create '%s'", outfile); }
303*08b48e0bSAndroid Build Coastguard Worker
304*08b48e0bSAndroid Build Coastguard Worker }
305*08b48e0bSAndroid Build Coastguard Worker
306*08b48e0bSAndroid Build Coastguard Worker if (binary_mode) {
307*08b48e0bSAndroid Build Coastguard Worker
308*08b48e0bSAndroid Build Coastguard Worker for (i = 0; i < map_size; i++) {
309*08b48e0bSAndroid Build Coastguard Worker
310*08b48e0bSAndroid Build Coastguard Worker if (fsrv->trace_bits[i]) { ret++; }
311*08b48e0bSAndroid Build Coastguard Worker
312*08b48e0bSAndroid Build Coastguard Worker }
313*08b48e0bSAndroid Build Coastguard Worker
314*08b48e0bSAndroid Build Coastguard Worker ck_write(fd, fsrv->trace_bits, map_size, outfile);
315*08b48e0bSAndroid Build Coastguard Worker close(fd);
316*08b48e0bSAndroid Build Coastguard Worker
317*08b48e0bSAndroid Build Coastguard Worker } else {
318*08b48e0bSAndroid Build Coastguard Worker
319*08b48e0bSAndroid Build Coastguard Worker FILE *f = fdopen(fd, "w");
320*08b48e0bSAndroid Build Coastguard Worker
321*08b48e0bSAndroid Build Coastguard Worker if (!f) { PFATAL("fdopen() failed"); }
322*08b48e0bSAndroid Build Coastguard Worker
323*08b48e0bSAndroid Build Coastguard Worker for (i = 0; i < map_size; i++) {
324*08b48e0bSAndroid Build Coastguard Worker
325*08b48e0bSAndroid Build Coastguard Worker if (!fsrv->trace_bits[i]) { continue; }
326*08b48e0bSAndroid Build Coastguard Worker ret++;
327*08b48e0bSAndroid Build Coastguard Worker
328*08b48e0bSAndroid Build Coastguard Worker total += fsrv->trace_bits[i];
329*08b48e0bSAndroid Build Coastguard Worker if (highest < fsrv->trace_bits[i]) { highest = fsrv->trace_bits[i]; }
330*08b48e0bSAndroid Build Coastguard Worker
331*08b48e0bSAndroid Build Coastguard Worker if (cmin_mode) {
332*08b48e0bSAndroid Build Coastguard Worker
333*08b48e0bSAndroid Build Coastguard Worker fprintf(f, "%u%03u\n", i, fsrv->trace_bits[i]);
334*08b48e0bSAndroid Build Coastguard Worker
335*08b48e0bSAndroid Build Coastguard Worker } else {
336*08b48e0bSAndroid Build Coastguard Worker
337*08b48e0bSAndroid Build Coastguard Worker fprintf(f, "%06u:%u\n", i, fsrv->trace_bits[i]);
338*08b48e0bSAndroid Build Coastguard Worker
339*08b48e0bSAndroid Build Coastguard Worker }
340*08b48e0bSAndroid Build Coastguard Worker
341*08b48e0bSAndroid Build Coastguard Worker }
342*08b48e0bSAndroid Build Coastguard Worker
343*08b48e0bSAndroid Build Coastguard Worker fclose(f);
344*08b48e0bSAndroid Build Coastguard Worker
345*08b48e0bSAndroid Build Coastguard Worker }
346*08b48e0bSAndroid Build Coastguard Worker
347*08b48e0bSAndroid Build Coastguard Worker return ret;
348*08b48e0bSAndroid Build Coastguard Worker
349*08b48e0bSAndroid Build Coastguard Worker }
350*08b48e0bSAndroid Build Coastguard Worker
pre_afl_fsrv_write_to_testcase(afl_forkserver_t * fsrv,u8 * mem,u32 len)351*08b48e0bSAndroid Build Coastguard Worker void pre_afl_fsrv_write_to_testcase(afl_forkserver_t *fsrv, u8 *mem, u32 len) {
352*08b48e0bSAndroid Build Coastguard Worker
353*08b48e0bSAndroid Build Coastguard Worker static u8 buf[MAX_FILE];
354*08b48e0bSAndroid Build Coastguard Worker u32 sent = 0;
355*08b48e0bSAndroid Build Coastguard Worker
356*08b48e0bSAndroid Build Coastguard Worker if (unlikely(afl->custom_mutators_count)) {
357*08b48e0bSAndroid Build Coastguard Worker
358*08b48e0bSAndroid Build Coastguard Worker ssize_t new_size = len;
359*08b48e0bSAndroid Build Coastguard Worker u8 *new_mem = mem;
360*08b48e0bSAndroid Build Coastguard Worker u8 *new_buf = NULL;
361*08b48e0bSAndroid Build Coastguard Worker
362*08b48e0bSAndroid Build Coastguard Worker LIST_FOREACH(&afl->custom_mutator_list, struct custom_mutator, {
363*08b48e0bSAndroid Build Coastguard Worker
364*08b48e0bSAndroid Build Coastguard Worker if (el->afl_custom_post_process) {
365*08b48e0bSAndroid Build Coastguard Worker
366*08b48e0bSAndroid Build Coastguard Worker new_size =
367*08b48e0bSAndroid Build Coastguard Worker el->afl_custom_post_process(el->data, new_mem, new_size, &new_buf);
368*08b48e0bSAndroid Build Coastguard Worker
369*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!new_buf || new_size <= 0)) {
370*08b48e0bSAndroid Build Coastguard Worker
371*08b48e0bSAndroid Build Coastguard Worker return;
372*08b48e0bSAndroid Build Coastguard Worker
373*08b48e0bSAndroid Build Coastguard Worker } else {
374*08b48e0bSAndroid Build Coastguard Worker
375*08b48e0bSAndroid Build Coastguard Worker new_mem = new_buf;
376*08b48e0bSAndroid Build Coastguard Worker len = new_size;
377*08b48e0bSAndroid Build Coastguard Worker
378*08b48e0bSAndroid Build Coastguard Worker }
379*08b48e0bSAndroid Build Coastguard Worker
380*08b48e0bSAndroid Build Coastguard Worker }
381*08b48e0bSAndroid Build Coastguard Worker
382*08b48e0bSAndroid Build Coastguard Worker });
383*08b48e0bSAndroid Build Coastguard Worker
384*08b48e0bSAndroid Build Coastguard Worker if (new_mem != mem && new_mem != NULL) {
385*08b48e0bSAndroid Build Coastguard Worker
386*08b48e0bSAndroid Build Coastguard Worker mem = buf;
387*08b48e0bSAndroid Build Coastguard Worker memcpy(mem, new_mem, new_size);
388*08b48e0bSAndroid Build Coastguard Worker
389*08b48e0bSAndroid Build Coastguard Worker }
390*08b48e0bSAndroid Build Coastguard Worker
391*08b48e0bSAndroid Build Coastguard Worker if (unlikely(afl->custom_mutators_count)) {
392*08b48e0bSAndroid Build Coastguard Worker
393*08b48e0bSAndroid Build Coastguard Worker LIST_FOREACH(&afl->custom_mutator_list, struct custom_mutator, {
394*08b48e0bSAndroid Build Coastguard Worker
395*08b48e0bSAndroid Build Coastguard Worker if (el->afl_custom_fuzz_send) {
396*08b48e0bSAndroid Build Coastguard Worker
397*08b48e0bSAndroid Build Coastguard Worker el->afl_custom_fuzz_send(el->data, mem, len);
398*08b48e0bSAndroid Build Coastguard Worker sent = 1;
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
404*08b48e0bSAndroid Build Coastguard Worker }
405*08b48e0bSAndroid Build Coastguard Worker
406*08b48e0bSAndroid Build Coastguard Worker }
407*08b48e0bSAndroid Build Coastguard Worker
408*08b48e0bSAndroid Build Coastguard Worker if (likely(!sent)) { afl_fsrv_write_to_testcase(fsrv, mem, len); }
409*08b48e0bSAndroid Build Coastguard Worker
410*08b48e0bSAndroid Build Coastguard Worker }
411*08b48e0bSAndroid Build Coastguard Worker
412*08b48e0bSAndroid Build Coastguard Worker /* Execute target application. */
413*08b48e0bSAndroid Build Coastguard Worker
showmap_run_target_forkserver(afl_forkserver_t * fsrv,u8 * mem,u32 len)414*08b48e0bSAndroid Build Coastguard Worker static void showmap_run_target_forkserver(afl_forkserver_t *fsrv, u8 *mem,
415*08b48e0bSAndroid Build Coastguard Worker u32 len) {
416*08b48e0bSAndroid Build Coastguard Worker
417*08b48e0bSAndroid Build Coastguard Worker pre_afl_fsrv_write_to_testcase(fsrv, mem, len);
418*08b48e0bSAndroid Build Coastguard Worker
419*08b48e0bSAndroid Build Coastguard Worker if (!quiet_mode) { SAYF("-- Program output begins --\n" cRST); }
420*08b48e0bSAndroid Build Coastguard Worker
421*08b48e0bSAndroid Build Coastguard Worker if (afl_fsrv_run_target(fsrv, fsrv->exec_tmout, &stop_soon) ==
422*08b48e0bSAndroid Build Coastguard Worker FSRV_RUN_ERROR) {
423*08b48e0bSAndroid Build Coastguard Worker
424*08b48e0bSAndroid Build Coastguard Worker FATAL("Error running target");
425*08b48e0bSAndroid Build Coastguard Worker
426*08b48e0bSAndroid Build Coastguard Worker }
427*08b48e0bSAndroid Build Coastguard Worker
428*08b48e0bSAndroid Build Coastguard Worker if (fsrv->trace_bits[0]) {
429*08b48e0bSAndroid Build Coastguard Worker
430*08b48e0bSAndroid Build Coastguard Worker fsrv->trace_bits[0] -= 1;
431*08b48e0bSAndroid Build Coastguard Worker have_coverage = true;
432*08b48e0bSAndroid Build Coastguard Worker
433*08b48e0bSAndroid Build Coastguard Worker } else {
434*08b48e0bSAndroid Build Coastguard Worker
435*08b48e0bSAndroid Build Coastguard Worker have_coverage = false;
436*08b48e0bSAndroid Build Coastguard Worker
437*08b48e0bSAndroid Build Coastguard Worker }
438*08b48e0bSAndroid Build Coastguard Worker
439*08b48e0bSAndroid Build Coastguard Worker if (!no_classify) { classify_counts(fsrv); }
440*08b48e0bSAndroid Build Coastguard Worker
441*08b48e0bSAndroid Build Coastguard Worker if (!quiet_mode) { SAYF(cRST "-- Program output ends --\n"); }
442*08b48e0bSAndroid Build Coastguard Worker
443*08b48e0bSAndroid Build Coastguard Worker if (!fsrv->last_run_timed_out && !stop_soon &&
444*08b48e0bSAndroid Build Coastguard Worker WIFSIGNALED(fsrv->child_status)) {
445*08b48e0bSAndroid Build Coastguard Worker
446*08b48e0bSAndroid Build Coastguard Worker child_crashed = true;
447*08b48e0bSAndroid Build Coastguard Worker
448*08b48e0bSAndroid Build Coastguard Worker } else {
449*08b48e0bSAndroid Build Coastguard Worker
450*08b48e0bSAndroid Build Coastguard Worker child_crashed = false;
451*08b48e0bSAndroid Build Coastguard Worker
452*08b48e0bSAndroid Build Coastguard Worker }
453*08b48e0bSAndroid Build Coastguard Worker
454*08b48e0bSAndroid Build Coastguard Worker if (!quiet_mode) {
455*08b48e0bSAndroid Build Coastguard Worker
456*08b48e0bSAndroid Build Coastguard Worker if (timed_out || fsrv->last_run_timed_out) {
457*08b48e0bSAndroid Build Coastguard Worker
458*08b48e0bSAndroid Build Coastguard Worker SAYF(cLRD "\n+++ Program timed off +++\n" cRST);
459*08b48e0bSAndroid Build Coastguard Worker timed_out = 0;
460*08b48e0bSAndroid Build Coastguard Worker
461*08b48e0bSAndroid Build Coastguard Worker } else if (stop_soon) {
462*08b48e0bSAndroid Build Coastguard Worker
463*08b48e0bSAndroid Build Coastguard Worker SAYF(cLRD "\n+++ Program aborted by user +++\n" cRST);
464*08b48e0bSAndroid Build Coastguard Worker
465*08b48e0bSAndroid Build Coastguard Worker } else if (child_crashed) {
466*08b48e0bSAndroid Build Coastguard Worker
467*08b48e0bSAndroid Build Coastguard Worker SAYF(cLRD "\n+++ Program killed by signal %u +++\n" cRST,
468*08b48e0bSAndroid Build Coastguard Worker WTERMSIG(fsrv->child_status));
469*08b48e0bSAndroid Build Coastguard Worker
470*08b48e0bSAndroid Build Coastguard Worker }
471*08b48e0bSAndroid Build Coastguard Worker
472*08b48e0bSAndroid Build Coastguard Worker }
473*08b48e0bSAndroid Build Coastguard Worker
474*08b48e0bSAndroid Build Coastguard Worker if (stop_soon) {
475*08b48e0bSAndroid Build Coastguard Worker
476*08b48e0bSAndroid Build Coastguard Worker SAYF(cRST cLRD "\n+++ afl-showmap folder mode aborted by user +++\n" cRST);
477*08b48e0bSAndroid Build Coastguard Worker exit(1);
478*08b48e0bSAndroid Build Coastguard Worker
479*08b48e0bSAndroid Build Coastguard Worker }
480*08b48e0bSAndroid Build Coastguard Worker
481*08b48e0bSAndroid Build Coastguard Worker }
482*08b48e0bSAndroid Build Coastguard Worker
483*08b48e0bSAndroid Build Coastguard Worker /* Read initial file. */
484*08b48e0bSAndroid Build Coastguard Worker
read_file(u8 * in_file)485*08b48e0bSAndroid Build Coastguard Worker static u32 read_file(u8 *in_file) {
486*08b48e0bSAndroid Build Coastguard Worker
487*08b48e0bSAndroid Build Coastguard Worker if (print_filenames) {
488*08b48e0bSAndroid Build Coastguard Worker
489*08b48e0bSAndroid Build Coastguard Worker SAYF("Processing %s\n", in_file);
490*08b48e0bSAndroid Build Coastguard Worker fflush(stdout);
491*08b48e0bSAndroid Build Coastguard Worker
492*08b48e0bSAndroid Build Coastguard Worker }
493*08b48e0bSAndroid Build Coastguard Worker
494*08b48e0bSAndroid Build Coastguard Worker struct stat st;
495*08b48e0bSAndroid Build Coastguard Worker s32 fd = open(in_file, O_RDONLY);
496*08b48e0bSAndroid Build Coastguard Worker
497*08b48e0bSAndroid Build Coastguard Worker if (fd < 0) { WARNF("Unable to open '%s'", in_file); }
498*08b48e0bSAndroid Build Coastguard Worker
499*08b48e0bSAndroid Build Coastguard Worker if (fstat(fd, &st) || !st.st_size) {
500*08b48e0bSAndroid Build Coastguard Worker
501*08b48e0bSAndroid Build Coastguard Worker if (!be_quiet && !quiet_mode) {
502*08b48e0bSAndroid Build Coastguard Worker
503*08b48e0bSAndroid Build Coastguard Worker WARNF("Zero-sized input file '%s'.", in_file);
504*08b48e0bSAndroid Build Coastguard Worker
505*08b48e0bSAndroid Build Coastguard Worker }
506*08b48e0bSAndroid Build Coastguard Worker
507*08b48e0bSAndroid Build Coastguard Worker }
508*08b48e0bSAndroid Build Coastguard Worker
509*08b48e0bSAndroid Build Coastguard Worker if (st.st_size > MAX_FILE) {
510*08b48e0bSAndroid Build Coastguard Worker
511*08b48e0bSAndroid Build Coastguard Worker if (!be_quiet && !quiet_mode) {
512*08b48e0bSAndroid Build Coastguard Worker
513*08b48e0bSAndroid Build Coastguard Worker WARNF("Input file '%s' is too large, only reading %ld bytes.", in_file,
514*08b48e0bSAndroid Build Coastguard Worker MAX_FILE);
515*08b48e0bSAndroid Build Coastguard Worker
516*08b48e0bSAndroid Build Coastguard Worker }
517*08b48e0bSAndroid Build Coastguard Worker
518*08b48e0bSAndroid Build Coastguard Worker in_len = MAX_FILE;
519*08b48e0bSAndroid Build Coastguard Worker
520*08b48e0bSAndroid Build Coastguard Worker } else {
521*08b48e0bSAndroid Build Coastguard Worker
522*08b48e0bSAndroid Build Coastguard Worker in_len = st.st_size;
523*08b48e0bSAndroid Build Coastguard Worker
524*08b48e0bSAndroid Build Coastguard Worker }
525*08b48e0bSAndroid Build Coastguard Worker
526*08b48e0bSAndroid Build Coastguard Worker in_data = ck_alloc_nozero(in_len);
527*08b48e0bSAndroid Build Coastguard Worker
528*08b48e0bSAndroid Build Coastguard Worker ck_read(fd, in_data, in_len, in_file);
529*08b48e0bSAndroid Build Coastguard Worker
530*08b48e0bSAndroid Build Coastguard Worker close(fd);
531*08b48e0bSAndroid Build Coastguard Worker
532*08b48e0bSAndroid Build Coastguard Worker // OKF("Read %u byte%s from '%s'.", in_len, in_len == 1 ? "" : "s", in_file);
533*08b48e0bSAndroid Build Coastguard Worker
534*08b48e0bSAndroid Build Coastguard Worker return in_len;
535*08b48e0bSAndroid Build Coastguard Worker
536*08b48e0bSAndroid Build Coastguard Worker }
537*08b48e0bSAndroid Build Coastguard Worker
538*08b48e0bSAndroid Build Coastguard Worker #ifdef __linux__
539*08b48e0bSAndroid Build Coastguard Worker /* Execute the target application with an empty input (in Nyx mode). */
showmap_run_target_nyx_mode(afl_forkserver_t * fsrv)540*08b48e0bSAndroid Build Coastguard Worker static void showmap_run_target_nyx_mode(afl_forkserver_t *fsrv) {
541*08b48e0bSAndroid Build Coastguard Worker
542*08b48e0bSAndroid Build Coastguard Worker afl_fsrv_write_to_testcase(fsrv, NULL, 0);
543*08b48e0bSAndroid Build Coastguard Worker
544*08b48e0bSAndroid Build Coastguard Worker if (afl_fsrv_run_target(fsrv, fsrv->exec_tmout, &stop_soon) ==
545*08b48e0bSAndroid Build Coastguard Worker FSRV_RUN_ERROR) {
546*08b48e0bSAndroid Build Coastguard Worker
547*08b48e0bSAndroid Build Coastguard Worker FATAL("Error running target in Nyx mode");
548*08b48e0bSAndroid Build Coastguard Worker
549*08b48e0bSAndroid Build Coastguard Worker }
550*08b48e0bSAndroid Build Coastguard Worker
551*08b48e0bSAndroid Build Coastguard Worker }
552*08b48e0bSAndroid Build Coastguard Worker
553*08b48e0bSAndroid Build Coastguard Worker #endif
554*08b48e0bSAndroid Build Coastguard Worker
555*08b48e0bSAndroid Build Coastguard Worker /* Execute target application. */
556*08b48e0bSAndroid Build Coastguard Worker
showmap_run_target(afl_forkserver_t * fsrv,char ** argv)557*08b48e0bSAndroid Build Coastguard Worker static void showmap_run_target(afl_forkserver_t *fsrv, char **argv) {
558*08b48e0bSAndroid Build Coastguard Worker
559*08b48e0bSAndroid Build Coastguard Worker static struct itimerval it;
560*08b48e0bSAndroid Build Coastguard Worker int status = 0;
561*08b48e0bSAndroid Build Coastguard Worker
562*08b48e0bSAndroid Build Coastguard Worker if (!quiet_mode) { SAYF("-- Program output begins --\n" cRST); }
563*08b48e0bSAndroid Build Coastguard Worker
564*08b48e0bSAndroid Build Coastguard Worker MEM_BARRIER();
565*08b48e0bSAndroid Build Coastguard Worker
566*08b48e0bSAndroid Build Coastguard Worker fsrv->child_pid = fork();
567*08b48e0bSAndroid Build Coastguard Worker
568*08b48e0bSAndroid Build Coastguard Worker if (fsrv->child_pid < 0) { PFATAL("fork() failed"); }
569*08b48e0bSAndroid Build Coastguard Worker
570*08b48e0bSAndroid Build Coastguard Worker if (!fsrv->child_pid) {
571*08b48e0bSAndroid Build Coastguard Worker
572*08b48e0bSAndroid Build Coastguard Worker struct rlimit r;
573*08b48e0bSAndroid Build Coastguard Worker
574*08b48e0bSAndroid Build Coastguard Worker if (quiet_mode) {
575*08b48e0bSAndroid Build Coastguard Worker
576*08b48e0bSAndroid Build Coastguard Worker s32 fd = open("/dev/null", O_RDWR);
577*08b48e0bSAndroid Build Coastguard Worker
578*08b48e0bSAndroid Build Coastguard Worker if (fd < 0 || dup2(fd, 1) < 0 || dup2(fd, 2) < 0) {
579*08b48e0bSAndroid Build Coastguard Worker
580*08b48e0bSAndroid Build Coastguard Worker *(u32 *)fsrv->trace_bits = EXEC_FAIL_SIG;
581*08b48e0bSAndroid Build Coastguard Worker PFATAL("Descriptor initialization failed");
582*08b48e0bSAndroid Build Coastguard Worker
583*08b48e0bSAndroid Build Coastguard Worker }
584*08b48e0bSAndroid Build Coastguard Worker
585*08b48e0bSAndroid Build Coastguard Worker close(fd);
586*08b48e0bSAndroid Build Coastguard Worker
587*08b48e0bSAndroid Build Coastguard Worker }
588*08b48e0bSAndroid Build Coastguard Worker
589*08b48e0bSAndroid Build Coastguard Worker if (fsrv->mem_limit) {
590*08b48e0bSAndroid Build Coastguard Worker
591*08b48e0bSAndroid Build Coastguard Worker r.rlim_max = r.rlim_cur = ((rlim_t)fsrv->mem_limit) << 20;
592*08b48e0bSAndroid Build Coastguard Worker
593*08b48e0bSAndroid Build Coastguard Worker #ifdef RLIMIT_AS
594*08b48e0bSAndroid Build Coastguard Worker
595*08b48e0bSAndroid Build Coastguard Worker setrlimit(RLIMIT_AS, &r); /* Ignore errors */
596*08b48e0bSAndroid Build Coastguard Worker
597*08b48e0bSAndroid Build Coastguard Worker #else
598*08b48e0bSAndroid Build Coastguard Worker
599*08b48e0bSAndroid Build Coastguard Worker setrlimit(RLIMIT_DATA, &r); /* Ignore errors */
600*08b48e0bSAndroid Build Coastguard Worker
601*08b48e0bSAndroid Build Coastguard Worker #endif /* ^RLIMIT_AS */
602*08b48e0bSAndroid Build Coastguard Worker
603*08b48e0bSAndroid Build Coastguard Worker }
604*08b48e0bSAndroid Build Coastguard Worker
605*08b48e0bSAndroid Build Coastguard Worker if (!keep_cores) {
606*08b48e0bSAndroid Build Coastguard Worker
607*08b48e0bSAndroid Build Coastguard Worker r.rlim_max = r.rlim_cur = 0;
608*08b48e0bSAndroid Build Coastguard Worker
609*08b48e0bSAndroid Build Coastguard Worker } else {
610*08b48e0bSAndroid Build Coastguard Worker
611*08b48e0bSAndroid Build Coastguard Worker r.rlim_max = r.rlim_cur = RLIM_INFINITY;
612*08b48e0bSAndroid Build Coastguard Worker
613*08b48e0bSAndroid Build Coastguard Worker }
614*08b48e0bSAndroid Build Coastguard Worker
615*08b48e0bSAndroid Build Coastguard Worker setrlimit(RLIMIT_CORE, &r); /* Ignore errors */
616*08b48e0bSAndroid Build Coastguard Worker
617*08b48e0bSAndroid Build Coastguard Worker if (!getenv("LD_BIND_LAZY")) { setenv("LD_BIND_NOW", "1", 0); }
618*08b48e0bSAndroid Build Coastguard Worker
619*08b48e0bSAndroid Build Coastguard Worker setsid();
620*08b48e0bSAndroid Build Coastguard Worker
621*08b48e0bSAndroid Build Coastguard Worker execv(fsrv->target_path, argv);
622*08b48e0bSAndroid Build Coastguard Worker
623*08b48e0bSAndroid Build Coastguard Worker *(u32 *)fsrv->trace_bits = EXEC_FAIL_SIG;
624*08b48e0bSAndroid Build Coastguard Worker exit(0);
625*08b48e0bSAndroid Build Coastguard Worker
626*08b48e0bSAndroid Build Coastguard Worker }
627*08b48e0bSAndroid Build Coastguard Worker
628*08b48e0bSAndroid Build Coastguard Worker /* Configure timeout, wait for child, cancel timeout. */
629*08b48e0bSAndroid Build Coastguard Worker
630*08b48e0bSAndroid Build Coastguard Worker if (fsrv->exec_tmout) {
631*08b48e0bSAndroid Build Coastguard Worker
632*08b48e0bSAndroid Build Coastguard Worker fsrv->last_run_timed_out = 0;
633*08b48e0bSAndroid Build Coastguard Worker it.it_value.tv_sec = (fsrv->exec_tmout / 1000);
634*08b48e0bSAndroid Build Coastguard Worker it.it_value.tv_usec = (fsrv->exec_tmout % 1000) * 1000;
635*08b48e0bSAndroid Build Coastguard Worker
636*08b48e0bSAndroid Build Coastguard Worker signal(SIGALRM, kill_child);
637*08b48e0bSAndroid Build Coastguard Worker
638*08b48e0bSAndroid Build Coastguard Worker setitimer(ITIMER_REAL, &it, NULL);
639*08b48e0bSAndroid Build Coastguard Worker
640*08b48e0bSAndroid Build Coastguard Worker }
641*08b48e0bSAndroid Build Coastguard Worker
642*08b48e0bSAndroid Build Coastguard Worker if (waitpid(fsrv->child_pid, &status, 0) <= 0) { FATAL("waitpid() failed"); }
643*08b48e0bSAndroid Build Coastguard Worker
644*08b48e0bSAndroid Build Coastguard Worker fsrv->child_pid = 0;
645*08b48e0bSAndroid Build Coastguard Worker it.it_value.tv_sec = 0;
646*08b48e0bSAndroid Build Coastguard Worker it.it_value.tv_usec = 0;
647*08b48e0bSAndroid Build Coastguard Worker setitimer(ITIMER_REAL, &it, NULL);
648*08b48e0bSAndroid Build Coastguard Worker
649*08b48e0bSAndroid Build Coastguard Worker MEM_BARRIER();
650*08b48e0bSAndroid Build Coastguard Worker
651*08b48e0bSAndroid Build Coastguard Worker /* Clean up bitmap, analyze exit condition, etc. */
652*08b48e0bSAndroid Build Coastguard Worker
653*08b48e0bSAndroid Build Coastguard Worker if (*(u32 *)fsrv->trace_bits == EXEC_FAIL_SIG) {
654*08b48e0bSAndroid Build Coastguard Worker
655*08b48e0bSAndroid Build Coastguard Worker FATAL("Unable to execute '%s'", argv[0]);
656*08b48e0bSAndroid Build Coastguard Worker
657*08b48e0bSAndroid Build Coastguard Worker }
658*08b48e0bSAndroid Build Coastguard Worker
659*08b48e0bSAndroid Build Coastguard Worker if (fsrv->trace_bits[0]) {
660*08b48e0bSAndroid Build Coastguard Worker
661*08b48e0bSAndroid Build Coastguard Worker fsrv->trace_bits[0] -= 1;
662*08b48e0bSAndroid Build Coastguard Worker have_coverage = true;
663*08b48e0bSAndroid Build Coastguard Worker
664*08b48e0bSAndroid Build Coastguard Worker } else {
665*08b48e0bSAndroid Build Coastguard Worker
666*08b48e0bSAndroid Build Coastguard Worker have_coverage = false;
667*08b48e0bSAndroid Build Coastguard Worker
668*08b48e0bSAndroid Build Coastguard Worker }
669*08b48e0bSAndroid Build Coastguard Worker
670*08b48e0bSAndroid Build Coastguard Worker if (!no_classify) { classify_counts(fsrv); }
671*08b48e0bSAndroid Build Coastguard Worker
672*08b48e0bSAndroid Build Coastguard Worker if (!quiet_mode) { SAYF(cRST "-- Program output ends --\n"); }
673*08b48e0bSAndroid Build Coastguard Worker
674*08b48e0bSAndroid Build Coastguard Worker if (!fsrv->last_run_timed_out && !stop_soon && WIFSIGNALED(status)) {
675*08b48e0bSAndroid Build Coastguard Worker
676*08b48e0bSAndroid Build Coastguard Worker child_crashed = true;
677*08b48e0bSAndroid Build Coastguard Worker
678*08b48e0bSAndroid Build Coastguard Worker }
679*08b48e0bSAndroid Build Coastguard Worker
680*08b48e0bSAndroid Build Coastguard Worker if (!quiet_mode) {
681*08b48e0bSAndroid Build Coastguard Worker
682*08b48e0bSAndroid Build Coastguard Worker if (timed_out || fsrv->last_run_timed_out) {
683*08b48e0bSAndroid Build Coastguard Worker
684*08b48e0bSAndroid Build Coastguard Worker SAYF(cLRD "\n+++ Program timed off +++\n" cRST);
685*08b48e0bSAndroid Build Coastguard Worker timed_out = 0;
686*08b48e0bSAndroid Build Coastguard Worker
687*08b48e0bSAndroid Build Coastguard Worker } else if (stop_soon) {
688*08b48e0bSAndroid Build Coastguard Worker
689*08b48e0bSAndroid Build Coastguard Worker SAYF(cLRD "\n+++ Program aborted by user +++\n" cRST);
690*08b48e0bSAndroid Build Coastguard Worker
691*08b48e0bSAndroid Build Coastguard Worker } else if (child_crashed) {
692*08b48e0bSAndroid Build Coastguard Worker
693*08b48e0bSAndroid Build Coastguard Worker SAYF(cLRD "\n+++ Program killed by signal %u +++\n" cRST,
694*08b48e0bSAndroid Build Coastguard Worker WTERMSIG(status));
695*08b48e0bSAndroid Build Coastguard Worker
696*08b48e0bSAndroid Build Coastguard Worker }
697*08b48e0bSAndroid Build Coastguard Worker
698*08b48e0bSAndroid Build Coastguard Worker }
699*08b48e0bSAndroid Build Coastguard Worker
700*08b48e0bSAndroid Build Coastguard Worker }
701*08b48e0bSAndroid Build Coastguard Worker
702*08b48e0bSAndroid Build Coastguard Worker /* Handle Ctrl-C and the like. */
703*08b48e0bSAndroid Build Coastguard Worker
handle_stop_sig(int sig)704*08b48e0bSAndroid Build Coastguard Worker static void handle_stop_sig(int sig) {
705*08b48e0bSAndroid Build Coastguard Worker
706*08b48e0bSAndroid Build Coastguard Worker (void)sig;
707*08b48e0bSAndroid Build Coastguard Worker stop_soon = true;
708*08b48e0bSAndroid Build Coastguard Worker afl_fsrv_killall();
709*08b48e0bSAndroid Build Coastguard Worker
710*08b48e0bSAndroid Build Coastguard Worker }
711*08b48e0bSAndroid Build Coastguard Worker
712*08b48e0bSAndroid Build Coastguard Worker /* Do basic preparations - persistent fds, filenames, etc. */
713*08b48e0bSAndroid Build Coastguard Worker
set_up_environment(afl_forkserver_t * fsrv,char ** argv)714*08b48e0bSAndroid Build Coastguard Worker static void set_up_environment(afl_forkserver_t *fsrv, char **argv) {
715*08b48e0bSAndroid Build Coastguard Worker
716*08b48e0bSAndroid Build Coastguard Worker char *afl_preload;
717*08b48e0bSAndroid Build Coastguard Worker char *frida_afl_preload = NULL;
718*08b48e0bSAndroid Build Coastguard Worker
719*08b48e0bSAndroid Build Coastguard Worker set_sanitizer_defaults();
720*08b48e0bSAndroid Build Coastguard Worker
721*08b48e0bSAndroid Build Coastguard Worker if (get_afl_env("AFL_PRELOAD")) {
722*08b48e0bSAndroid Build Coastguard Worker
723*08b48e0bSAndroid Build Coastguard Worker if (fsrv->qemu_mode) {
724*08b48e0bSAndroid Build Coastguard Worker
725*08b48e0bSAndroid Build Coastguard Worker /* afl-qemu-trace takes care of converting AFL_PRELOAD. */
726*08b48e0bSAndroid Build Coastguard Worker
727*08b48e0bSAndroid Build Coastguard Worker } else if (fsrv->frida_mode) {
728*08b48e0bSAndroid Build Coastguard Worker
729*08b48e0bSAndroid Build Coastguard Worker afl_preload = getenv("AFL_PRELOAD");
730*08b48e0bSAndroid Build Coastguard Worker u8 *frida_binary = find_afl_binary(argv[0], "afl-frida-trace.so");
731*08b48e0bSAndroid Build Coastguard Worker if (afl_preload) {
732*08b48e0bSAndroid Build Coastguard Worker
733*08b48e0bSAndroid Build Coastguard Worker frida_afl_preload = alloc_printf("%s:%s", afl_preload, frida_binary);
734*08b48e0bSAndroid Build Coastguard Worker
735*08b48e0bSAndroid Build Coastguard Worker } else {
736*08b48e0bSAndroid Build Coastguard Worker
737*08b48e0bSAndroid Build Coastguard Worker frida_afl_preload = alloc_printf("%s", frida_binary);
738*08b48e0bSAndroid Build Coastguard Worker
739*08b48e0bSAndroid Build Coastguard Worker }
740*08b48e0bSAndroid Build Coastguard Worker
741*08b48e0bSAndroid Build Coastguard Worker ck_free(frida_binary);
742*08b48e0bSAndroid Build Coastguard Worker
743*08b48e0bSAndroid Build Coastguard Worker setenv("LD_PRELOAD", frida_afl_preload, 1);
744*08b48e0bSAndroid Build Coastguard Worker setenv("DYLD_INSERT_LIBRARIES", frida_afl_preload, 1);
745*08b48e0bSAndroid Build Coastguard Worker
746*08b48e0bSAndroid Build Coastguard Worker } else {
747*08b48e0bSAndroid Build Coastguard Worker
748*08b48e0bSAndroid Build Coastguard Worker /* CoreSight mode uses the default behavior. */
749*08b48e0bSAndroid Build Coastguard Worker
750*08b48e0bSAndroid Build Coastguard Worker setenv("LD_PRELOAD", getenv("AFL_PRELOAD"), 1);
751*08b48e0bSAndroid Build Coastguard Worker setenv("DYLD_INSERT_LIBRARIES", getenv("AFL_PRELOAD"), 1);
752*08b48e0bSAndroid Build Coastguard Worker
753*08b48e0bSAndroid Build Coastguard Worker }
754*08b48e0bSAndroid Build Coastguard Worker
755*08b48e0bSAndroid Build Coastguard Worker } else if (fsrv->frida_mode) {
756*08b48e0bSAndroid Build Coastguard Worker
757*08b48e0bSAndroid Build Coastguard Worker u8 *frida_binary = find_afl_binary(argv[0], "afl-frida-trace.so");
758*08b48e0bSAndroid Build Coastguard Worker setenv("LD_PRELOAD", frida_binary, 1);
759*08b48e0bSAndroid Build Coastguard Worker setenv("DYLD_INSERT_LIBRARIES", frida_binary, 1);
760*08b48e0bSAndroid Build Coastguard Worker ck_free(frida_binary);
761*08b48e0bSAndroid Build Coastguard Worker
762*08b48e0bSAndroid Build Coastguard Worker }
763*08b48e0bSAndroid Build Coastguard Worker
764*08b48e0bSAndroid Build Coastguard Worker if (frida_afl_preload) { ck_free(frida_afl_preload); }
765*08b48e0bSAndroid Build Coastguard Worker
766*08b48e0bSAndroid Build Coastguard Worker }
767*08b48e0bSAndroid Build Coastguard Worker
768*08b48e0bSAndroid Build Coastguard Worker /* Setup signal handlers, duh. */
769*08b48e0bSAndroid Build Coastguard Worker
setup_signal_handlers(void)770*08b48e0bSAndroid Build Coastguard Worker static void setup_signal_handlers(void) {
771*08b48e0bSAndroid Build Coastguard Worker
772*08b48e0bSAndroid Build Coastguard Worker struct sigaction sa;
773*08b48e0bSAndroid Build Coastguard Worker
774*08b48e0bSAndroid Build Coastguard Worker sa.sa_handler = NULL;
775*08b48e0bSAndroid Build Coastguard Worker #ifdef SA_RESTART
776*08b48e0bSAndroid Build Coastguard Worker sa.sa_flags = SA_RESTART;
777*08b48e0bSAndroid Build Coastguard Worker #else
778*08b48e0bSAndroid Build Coastguard Worker sa.sa_flags = 0;
779*08b48e0bSAndroid Build Coastguard Worker #endif
780*08b48e0bSAndroid Build Coastguard Worker sa.sa_sigaction = NULL;
781*08b48e0bSAndroid Build Coastguard Worker
782*08b48e0bSAndroid Build Coastguard Worker sigemptyset(&sa.sa_mask);
783*08b48e0bSAndroid Build Coastguard Worker
784*08b48e0bSAndroid Build Coastguard Worker /* Various ways of saying "stop". */
785*08b48e0bSAndroid Build Coastguard Worker
786*08b48e0bSAndroid Build Coastguard Worker sa.sa_handler = handle_stop_sig;
787*08b48e0bSAndroid Build Coastguard Worker sigaction(SIGHUP, &sa, NULL);
788*08b48e0bSAndroid Build Coastguard Worker sigaction(SIGINT, &sa, NULL);
789*08b48e0bSAndroid Build Coastguard Worker sigaction(SIGTERM, &sa, NULL);
790*08b48e0bSAndroid Build Coastguard Worker
791*08b48e0bSAndroid Build Coastguard Worker }
792*08b48e0bSAndroid Build Coastguard Worker
execute_testcases(u8 * dir)793*08b48e0bSAndroid Build Coastguard Worker u32 execute_testcases(u8 *dir) {
794*08b48e0bSAndroid Build Coastguard Worker
795*08b48e0bSAndroid Build Coastguard Worker struct dirent **nl;
796*08b48e0bSAndroid Build Coastguard Worker s32 nl_cnt, subdirs = 1;
797*08b48e0bSAndroid Build Coastguard Worker u32 i, done = 0;
798*08b48e0bSAndroid Build Coastguard Worker u8 val_buf[2][STRINGIFY_VAL_SIZE_MAX];
799*08b48e0bSAndroid Build Coastguard Worker
800*08b48e0bSAndroid Build Coastguard Worker if (!be_quiet) { ACTF("Scanning '%s'...", dir); }
801*08b48e0bSAndroid Build Coastguard Worker
802*08b48e0bSAndroid Build Coastguard Worker /* We use scandir() + alphasort() rather than readdir() because otherwise,
803*08b48e0bSAndroid Build Coastguard Worker the ordering of test cases would vary somewhat randomly and would be
804*08b48e0bSAndroid Build Coastguard Worker difficult to control. */
805*08b48e0bSAndroid Build Coastguard Worker
806*08b48e0bSAndroid Build Coastguard Worker nl_cnt = scandir(dir, &nl, NULL, alphasort);
807*08b48e0bSAndroid Build Coastguard Worker
808*08b48e0bSAndroid Build Coastguard Worker if (nl_cnt < 0) { return 0; }
809*08b48e0bSAndroid Build Coastguard Worker
810*08b48e0bSAndroid Build Coastguard Worker for (i = 0; i < (u32)nl_cnt; ++i) {
811*08b48e0bSAndroid Build Coastguard Worker
812*08b48e0bSAndroid Build Coastguard Worker struct stat st;
813*08b48e0bSAndroid Build Coastguard Worker
814*08b48e0bSAndroid Build Coastguard Worker u8 *fn2 = alloc_printf("%s/%s", dir, nl[i]->d_name);
815*08b48e0bSAndroid Build Coastguard Worker
816*08b48e0bSAndroid Build Coastguard Worker if (lstat(fn2, &st) || access(fn2, R_OK)) {
817*08b48e0bSAndroid Build Coastguard Worker
818*08b48e0bSAndroid Build Coastguard Worker PFATAL("Unable to access '%s'", fn2);
819*08b48e0bSAndroid Build Coastguard Worker
820*08b48e0bSAndroid Build Coastguard Worker }
821*08b48e0bSAndroid Build Coastguard Worker
822*08b48e0bSAndroid Build Coastguard Worker /* obviously we want to skip "descending" into . and .. directories,
823*08b48e0bSAndroid Build Coastguard Worker however it is a good idea to skip also directories that start with
824*08b48e0bSAndroid Build Coastguard Worker a dot */
825*08b48e0bSAndroid Build Coastguard Worker if (subdirs && S_ISDIR(st.st_mode) && nl[i]->d_name[0] != '.') {
826*08b48e0bSAndroid Build Coastguard Worker
827*08b48e0bSAndroid Build Coastguard Worker free(nl[i]); /* not tracked */
828*08b48e0bSAndroid Build Coastguard Worker done += execute_testcases(fn2);
829*08b48e0bSAndroid Build Coastguard Worker ck_free(fn2);
830*08b48e0bSAndroid Build Coastguard Worker continue;
831*08b48e0bSAndroid Build Coastguard Worker
832*08b48e0bSAndroid Build Coastguard Worker }
833*08b48e0bSAndroid Build Coastguard Worker
834*08b48e0bSAndroid Build Coastguard Worker if (!S_ISREG(st.st_mode) || !st.st_size) {
835*08b48e0bSAndroid Build Coastguard Worker
836*08b48e0bSAndroid Build Coastguard Worker free(nl[i]);
837*08b48e0bSAndroid Build Coastguard Worker ck_free(fn2);
838*08b48e0bSAndroid Build Coastguard Worker continue;
839*08b48e0bSAndroid Build Coastguard Worker
840*08b48e0bSAndroid Build Coastguard Worker }
841*08b48e0bSAndroid Build Coastguard Worker
842*08b48e0bSAndroid Build Coastguard Worker if (st.st_size > MAX_FILE && !be_quiet && !quiet_mode) {
843*08b48e0bSAndroid Build Coastguard Worker
844*08b48e0bSAndroid Build Coastguard Worker WARNF("Test case '%s' is too big (%s, limit is %s), partial reading", fn2,
845*08b48e0bSAndroid Build Coastguard Worker stringify_mem_size(val_buf[0], sizeof(val_buf[0]), st.st_size),
846*08b48e0bSAndroid Build Coastguard Worker stringify_mem_size(val_buf[1], sizeof(val_buf[1]), MAX_FILE));
847*08b48e0bSAndroid Build Coastguard Worker
848*08b48e0bSAndroid Build Coastguard Worker }
849*08b48e0bSAndroid Build Coastguard Worker
850*08b48e0bSAndroid Build Coastguard Worker if (!collect_coverage)
851*08b48e0bSAndroid Build Coastguard Worker snprintf(outfile, sizeof(outfile), "%s/%s", out_file, nl[i]->d_name);
852*08b48e0bSAndroid Build Coastguard Worker
853*08b48e0bSAndroid Build Coastguard Worker free(nl[i]);
854*08b48e0bSAndroid Build Coastguard Worker
855*08b48e0bSAndroid Build Coastguard Worker if (read_file(fn2)) {
856*08b48e0bSAndroid Build Coastguard Worker
857*08b48e0bSAndroid Build Coastguard Worker if (wait_for_gdb) {
858*08b48e0bSAndroid Build Coastguard Worker
859*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr, "exec: gdb -p %d\n", fsrv->child_pid);
860*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr, "exec: kill -CONT %d\n", getpid());
861*08b48e0bSAndroid Build Coastguard Worker kill(0, SIGSTOP);
862*08b48e0bSAndroid Build Coastguard Worker
863*08b48e0bSAndroid Build Coastguard Worker }
864*08b48e0bSAndroid Build Coastguard Worker
865*08b48e0bSAndroid Build Coastguard Worker showmap_run_target_forkserver(fsrv, in_data, in_len);
866*08b48e0bSAndroid Build Coastguard Worker ck_free(in_data);
867*08b48e0bSAndroid Build Coastguard Worker ++done;
868*08b48e0bSAndroid Build Coastguard Worker
869*08b48e0bSAndroid Build Coastguard Worker if (child_crashed && debug) { WARNF("crashed: %s", fn2); }
870*08b48e0bSAndroid Build Coastguard Worker
871*08b48e0bSAndroid Build Coastguard Worker if (collect_coverage)
872*08b48e0bSAndroid Build Coastguard Worker analyze_results(fsrv);
873*08b48e0bSAndroid Build Coastguard Worker else
874*08b48e0bSAndroid Build Coastguard Worker tcnt = write_results_to_file(fsrv, outfile);
875*08b48e0bSAndroid Build Coastguard Worker
876*08b48e0bSAndroid Build Coastguard Worker }
877*08b48e0bSAndroid Build Coastguard Worker
878*08b48e0bSAndroid Build Coastguard Worker }
879*08b48e0bSAndroid Build Coastguard Worker
880*08b48e0bSAndroid Build Coastguard Worker free(nl); /* not tracked */
881*08b48e0bSAndroid Build Coastguard Worker return done;
882*08b48e0bSAndroid Build Coastguard Worker
883*08b48e0bSAndroid Build Coastguard Worker }
884*08b48e0bSAndroid Build Coastguard Worker
execute_testcases_filelist(u8 * fn)885*08b48e0bSAndroid Build Coastguard Worker u32 execute_testcases_filelist(u8 *fn) {
886*08b48e0bSAndroid Build Coastguard Worker
887*08b48e0bSAndroid Build Coastguard Worker u32 done = 0;
888*08b48e0bSAndroid Build Coastguard Worker u8 buf[4096];
889*08b48e0bSAndroid Build Coastguard Worker u8 val_buf[2][STRINGIFY_VAL_SIZE_MAX];
890*08b48e0bSAndroid Build Coastguard Worker FILE *f;
891*08b48e0bSAndroid Build Coastguard Worker
892*08b48e0bSAndroid Build Coastguard Worker if (!be_quiet) { ACTF("Reading from '%s'...", fn); }
893*08b48e0bSAndroid Build Coastguard Worker
894*08b48e0bSAndroid Build Coastguard Worker if ((f = fopen(fn, "r")) == NULL) { FATAL("could not open '%s'", fn); }
895*08b48e0bSAndroid Build Coastguard Worker
896*08b48e0bSAndroid Build Coastguard Worker while (fgets(buf, sizeof(buf), f) != NULL) {
897*08b48e0bSAndroid Build Coastguard Worker
898*08b48e0bSAndroid Build Coastguard Worker struct stat st;
899*08b48e0bSAndroid Build Coastguard Worker u8 *fn2 = buf, *fn3;
900*08b48e0bSAndroid Build Coastguard Worker
901*08b48e0bSAndroid Build Coastguard Worker while (*fn2 == ' ') {
902*08b48e0bSAndroid Build Coastguard Worker
903*08b48e0bSAndroid Build Coastguard Worker ++fn2;
904*08b48e0bSAndroid Build Coastguard Worker
905*08b48e0bSAndroid Build Coastguard Worker }
906*08b48e0bSAndroid Build Coastguard Worker
907*08b48e0bSAndroid Build Coastguard Worker while (*fn2 &&
908*08b48e0bSAndroid Build Coastguard Worker (fn2[strlen(fn2) - 1] == '\r' || fn2[strlen(fn2) - 1] == '\n' ||
909*08b48e0bSAndroid Build Coastguard Worker fn2[strlen(fn2) - 1] == ' ')) {
910*08b48e0bSAndroid Build Coastguard Worker
911*08b48e0bSAndroid Build Coastguard Worker fn2[strlen(fn2) - 1] = 0;
912*08b48e0bSAndroid Build Coastguard Worker
913*08b48e0bSAndroid Build Coastguard Worker }
914*08b48e0bSAndroid Build Coastguard Worker
915*08b48e0bSAndroid Build Coastguard Worker if (debug) { printf("Getting coverage for '%s'\n", fn2); }
916*08b48e0bSAndroid Build Coastguard Worker
917*08b48e0bSAndroid Build Coastguard Worker if (!*fn2) { continue; }
918*08b48e0bSAndroid Build Coastguard Worker
919*08b48e0bSAndroid Build Coastguard Worker if (lstat(fn2, &st) || access(fn2, R_OK)) {
920*08b48e0bSAndroid Build Coastguard Worker
921*08b48e0bSAndroid Build Coastguard Worker WARNF("Unable to access '%s'", fn2);
922*08b48e0bSAndroid Build Coastguard Worker continue;
923*08b48e0bSAndroid Build Coastguard Worker
924*08b48e0bSAndroid Build Coastguard Worker }
925*08b48e0bSAndroid Build Coastguard Worker
926*08b48e0bSAndroid Build Coastguard Worker ++done;
927*08b48e0bSAndroid Build Coastguard Worker
928*08b48e0bSAndroid Build Coastguard Worker if (!S_ISREG(st.st_mode) || !st.st_size) { continue; }
929*08b48e0bSAndroid Build Coastguard Worker
930*08b48e0bSAndroid Build Coastguard Worker if ((fn3 = strrchr(fn2, '/'))) {
931*08b48e0bSAndroid Build Coastguard Worker
932*08b48e0bSAndroid Build Coastguard Worker ++fn3;
933*08b48e0bSAndroid Build Coastguard Worker
934*08b48e0bSAndroid Build Coastguard Worker } else {
935*08b48e0bSAndroid Build Coastguard Worker
936*08b48e0bSAndroid Build Coastguard Worker fn3 = fn2;
937*08b48e0bSAndroid Build Coastguard Worker
938*08b48e0bSAndroid Build Coastguard Worker }
939*08b48e0bSAndroid Build Coastguard Worker
940*08b48e0bSAndroid Build Coastguard Worker if (st.st_size > MAX_FILE && !be_quiet && !quiet_mode) {
941*08b48e0bSAndroid Build Coastguard Worker
942*08b48e0bSAndroid Build Coastguard Worker WARNF("Test case '%s' is too big (%s, limit is %s), partial reading", fn2,
943*08b48e0bSAndroid Build Coastguard Worker stringify_mem_size(val_buf[0], sizeof(val_buf[0]), st.st_size),
944*08b48e0bSAndroid Build Coastguard Worker stringify_mem_size(val_buf[1], sizeof(val_buf[1]), MAX_FILE));
945*08b48e0bSAndroid Build Coastguard Worker
946*08b48e0bSAndroid Build Coastguard Worker }
947*08b48e0bSAndroid Build Coastguard Worker
948*08b48e0bSAndroid Build Coastguard Worker if (!collect_coverage) {
949*08b48e0bSAndroid Build Coastguard Worker
950*08b48e0bSAndroid Build Coastguard Worker snprintf(outfile, sizeof(outfile), "%s/%s", out_file, fn3);
951*08b48e0bSAndroid Build Coastguard Worker
952*08b48e0bSAndroid Build Coastguard Worker }
953*08b48e0bSAndroid Build Coastguard Worker
954*08b48e0bSAndroid Build Coastguard Worker if (read_file(fn2)) {
955*08b48e0bSAndroid Build Coastguard Worker
956*08b48e0bSAndroid Build Coastguard Worker if (wait_for_gdb) {
957*08b48e0bSAndroid Build Coastguard Worker
958*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr, "exec: gdb -p %d\n", fsrv->child_pid);
959*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr, "exec: kill -CONT %d\n", getpid());
960*08b48e0bSAndroid Build Coastguard Worker kill(0, SIGSTOP);
961*08b48e0bSAndroid Build Coastguard Worker
962*08b48e0bSAndroid Build Coastguard Worker }
963*08b48e0bSAndroid Build Coastguard Worker
964*08b48e0bSAndroid Build Coastguard Worker showmap_run_target_forkserver(fsrv, in_data, in_len);
965*08b48e0bSAndroid Build Coastguard Worker ck_free(in_data);
966*08b48e0bSAndroid Build Coastguard Worker
967*08b48e0bSAndroid Build Coastguard Worker if (child_crashed && debug) { WARNF("crashed: %s", fn2); }
968*08b48e0bSAndroid Build Coastguard Worker
969*08b48e0bSAndroid Build Coastguard Worker if (collect_coverage)
970*08b48e0bSAndroid Build Coastguard Worker analyze_results(fsrv);
971*08b48e0bSAndroid Build Coastguard Worker else
972*08b48e0bSAndroid Build Coastguard Worker tcnt = write_results_to_file(fsrv, outfile);
973*08b48e0bSAndroid Build Coastguard Worker
974*08b48e0bSAndroid Build Coastguard Worker }
975*08b48e0bSAndroid Build Coastguard Worker
976*08b48e0bSAndroid Build Coastguard Worker }
977*08b48e0bSAndroid Build Coastguard Worker
978*08b48e0bSAndroid Build Coastguard Worker return done;
979*08b48e0bSAndroid Build Coastguard Worker
980*08b48e0bSAndroid Build Coastguard Worker }
981*08b48e0bSAndroid Build Coastguard Worker
982*08b48e0bSAndroid Build Coastguard Worker /* Show banner. */
983*08b48e0bSAndroid Build Coastguard Worker
show_banner(void)984*08b48e0bSAndroid Build Coastguard Worker static void show_banner(void) {
985*08b48e0bSAndroid Build Coastguard Worker
986*08b48e0bSAndroid Build Coastguard Worker SAYF(cCYA "afl-showmap" VERSION cRST " by Michal Zalewski\n");
987*08b48e0bSAndroid Build Coastguard Worker
988*08b48e0bSAndroid Build Coastguard Worker }
989*08b48e0bSAndroid Build Coastguard Worker
990*08b48e0bSAndroid Build Coastguard Worker /* Display usage hints. */
991*08b48e0bSAndroid Build Coastguard Worker
usage(u8 * argv0)992*08b48e0bSAndroid Build Coastguard Worker static void usage(u8 *argv0) {
993*08b48e0bSAndroid Build Coastguard Worker
994*08b48e0bSAndroid Build Coastguard Worker show_banner();
995*08b48e0bSAndroid Build Coastguard Worker
996*08b48e0bSAndroid Build Coastguard Worker SAYF(
997*08b48e0bSAndroid Build Coastguard Worker "\n%s [ options ] -- /path/to/target_app [ ... ]\n\n"
998*08b48e0bSAndroid Build Coastguard Worker
999*08b48e0bSAndroid Build Coastguard Worker "Required parameters:\n"
1000*08b48e0bSAndroid Build Coastguard Worker " -o file - file to write the trace data to\n\n"
1001*08b48e0bSAndroid Build Coastguard Worker
1002*08b48e0bSAndroid Build Coastguard Worker "Execution control settings:\n"
1003*08b48e0bSAndroid Build Coastguard Worker " -t msec - timeout for each run (default: 1000ms)\n"
1004*08b48e0bSAndroid Build Coastguard Worker " -m megs - memory limit for child process (default: none)\n"
1005*08b48e0bSAndroid Build Coastguard Worker #if defined(__linux__) && defined(__aarch64__)
1006*08b48e0bSAndroid Build Coastguard Worker " -A - use binary-only instrumentation (ARM CoreSight mode)\n"
1007*08b48e0bSAndroid Build Coastguard Worker #endif
1008*08b48e0bSAndroid Build Coastguard Worker " -O - use binary-only instrumentation (FRIDA mode)\n"
1009*08b48e0bSAndroid Build Coastguard Worker #if defined(__linux__)
1010*08b48e0bSAndroid Build Coastguard Worker " -Q - use binary-only instrumentation (QEMU mode)\n"
1011*08b48e0bSAndroid Build Coastguard Worker " -U - use Unicorn-based instrumentation (Unicorn mode)\n"
1012*08b48e0bSAndroid Build Coastguard Worker " -W - use qemu-based instrumentation with Wine (Wine mode)\n"
1013*08b48e0bSAndroid Build Coastguard Worker " (Not necessary, here for consistency with other afl-* "
1014*08b48e0bSAndroid Build Coastguard Worker "tools)\n"
1015*08b48e0bSAndroid Build Coastguard Worker " -X - use Nyx mode\n"
1016*08b48e0bSAndroid Build Coastguard Worker #endif
1017*08b48e0bSAndroid Build Coastguard Worker "\n"
1018*08b48e0bSAndroid Build Coastguard Worker "Other settings:\n"
1019*08b48e0bSAndroid Build Coastguard Worker " -i dir - process all files below this directory, must be combined "
1020*08b48e0bSAndroid Build Coastguard Worker "with -o.\n"
1021*08b48e0bSAndroid Build Coastguard Worker " With -C, -o is a file, without -C it must be a "
1022*08b48e0bSAndroid Build Coastguard Worker "directory\n"
1023*08b48e0bSAndroid Build Coastguard Worker " and each bitmap will be written there individually.\n"
1024*08b48e0bSAndroid Build Coastguard Worker " -I filelist - alternatively to -i, -I is a list of files\n"
1025*08b48e0bSAndroid Build Coastguard Worker " -C - collect coverage, writes all edges to -o and gives a "
1026*08b48e0bSAndroid Build Coastguard Worker "summary\n"
1027*08b48e0bSAndroid Build Coastguard Worker " Must be combined with -i.\n"
1028*08b48e0bSAndroid Build Coastguard Worker " -q - sink program's output and don't show messages\n"
1029*08b48e0bSAndroid Build Coastguard Worker " -e - show edge coverage only, ignore hit counts\n"
1030*08b48e0bSAndroid Build Coastguard Worker " -r - show real tuple values instead of AFL filter values\n"
1031*08b48e0bSAndroid Build Coastguard Worker " -s - do not classify the map\n"
1032*08b48e0bSAndroid Build Coastguard Worker " -c - allow core dumps\n\n"
1033*08b48e0bSAndroid Build Coastguard Worker
1034*08b48e0bSAndroid Build Coastguard Worker "This tool displays raw tuple data captured by AFL instrumentation.\n"
1035*08b48e0bSAndroid Build Coastguard Worker "For additional help, consult %s/README.md.\n\n"
1036*08b48e0bSAndroid Build Coastguard Worker
1037*08b48e0bSAndroid Build Coastguard Worker "If you use -i/-I mode, then custom mutator post_process send send "
1038*08b48e0bSAndroid Build Coastguard Worker "functionality\n"
1039*08b48e0bSAndroid Build Coastguard Worker "is supported.\n\n"
1040*08b48e0bSAndroid Build Coastguard Worker
1041*08b48e0bSAndroid Build Coastguard Worker "Environment variables used:\n"
1042*08b48e0bSAndroid Build Coastguard Worker "LD_BIND_LAZY: do not set LD_BIND_NOW env var for target\n"
1043*08b48e0bSAndroid Build Coastguard Worker "AFL_CMIN_CRASHES_ONLY: (cmin_mode) only write tuples for crashing "
1044*08b48e0bSAndroid Build Coastguard Worker "inputs\n"
1045*08b48e0bSAndroid Build Coastguard Worker "AFL_CMIN_ALLOW_ANY: (cmin_mode) write tuples for crashing inputs also\n"
1046*08b48e0bSAndroid Build Coastguard Worker "AFL_CRASH_EXITCODE: optional child exit code to be interpreted as "
1047*08b48e0bSAndroid Build Coastguard Worker "crash\n"
1048*08b48e0bSAndroid Build Coastguard Worker "AFL_DEBUG: enable extra developer output\n"
1049*08b48e0bSAndroid Build Coastguard Worker "AFL_FORKSRV_INIT_TMOUT: time spent waiting for forkserver during "
1050*08b48e0bSAndroid Build Coastguard Worker "startup (in milliseconds)\n"
1051*08b48e0bSAndroid Build Coastguard Worker "AFL_KILL_SIGNAL: Signal ID delivered to child processes on timeout, "
1052*08b48e0bSAndroid Build Coastguard Worker "etc.\n"
1053*08b48e0bSAndroid Build Coastguard Worker " (default: SIGKILL)\n"
1054*08b48e0bSAndroid Build Coastguard Worker "AFL_FORK_SERVER_KILL_SIGNAL: Kill signal for the fork server on "
1055*08b48e0bSAndroid Build Coastguard Worker "termination\n"
1056*08b48e0bSAndroid Build Coastguard Worker " (default: SIGTERM). If unset and "
1057*08b48e0bSAndroid Build Coastguard Worker "AFL_KILL_SIGNAL is\n"
1058*08b48e0bSAndroid Build Coastguard Worker " set, that value will be used.\n"
1059*08b48e0bSAndroid Build Coastguard Worker "AFL_MAP_SIZE: the shared memory size for that target. must be >= the "
1060*08b48e0bSAndroid Build Coastguard Worker "size the\n"
1061*08b48e0bSAndroid Build Coastguard Worker " target was compiled for\n"
1062*08b48e0bSAndroid Build Coastguard Worker "AFL_PRELOAD: LD_PRELOAD / DYLD_INSERT_LIBRARIES settings for target\n"
1063*08b48e0bSAndroid Build Coastguard Worker "AFL_PRINT_FILENAMES: Print the queue entry currently processed will to "
1064*08b48e0bSAndroid Build Coastguard Worker "stdout\n"
1065*08b48e0bSAndroid Build Coastguard Worker "AFL_QUIET: do not print extra informational output\n"
1066*08b48e0bSAndroid Build Coastguard Worker "AFL_NO_FORKSRV: run target via execve instead of using the forkserver\n",
1067*08b48e0bSAndroid Build Coastguard Worker argv0, doc_path);
1068*08b48e0bSAndroid Build Coastguard Worker
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 /* Main entry point */
1074*08b48e0bSAndroid Build Coastguard Worker
main(int argc,char ** argv_orig,char ** envp)1075*08b48e0bSAndroid Build Coastguard Worker int main(int argc, char **argv_orig, char **envp) {
1076*08b48e0bSAndroid Build Coastguard Worker
1077*08b48e0bSAndroid Build Coastguard Worker // TODO: u64 mem_limit = MEM_LIMIT; /* Memory limit (MB) */
1078*08b48e0bSAndroid Build Coastguard Worker
1079*08b48e0bSAndroid Build Coastguard Worker s32 opt, i;
1080*08b48e0bSAndroid Build Coastguard Worker bool mem_limit_given = false, timeout_given = false, unicorn_mode = false,
1081*08b48e0bSAndroid Build Coastguard Worker use_wine = false;
1082*08b48e0bSAndroid Build Coastguard Worker char **use_argv;
1083*08b48e0bSAndroid Build Coastguard Worker
1084*08b48e0bSAndroid Build Coastguard Worker char **argv = argv_cpy_dup(argc, argv_orig);
1085*08b48e0bSAndroid Build Coastguard Worker
1086*08b48e0bSAndroid Build Coastguard Worker afl_forkserver_t fsrv_var = {0};
1087*08b48e0bSAndroid Build Coastguard Worker if (getenv("AFL_DEBUG")) { debug = true; }
1088*08b48e0bSAndroid Build Coastguard Worker if (get_afl_env("AFL_PRINT_FILENAMES")) { print_filenames = true; }
1089*08b48e0bSAndroid Build Coastguard Worker
1090*08b48e0bSAndroid Build Coastguard Worker fsrv = &fsrv_var;
1091*08b48e0bSAndroid Build Coastguard Worker afl_fsrv_init(fsrv);
1092*08b48e0bSAndroid Build Coastguard Worker map_size = get_map_size();
1093*08b48e0bSAndroid Build Coastguard Worker fsrv->map_size = map_size;
1094*08b48e0bSAndroid Build Coastguard Worker
1095*08b48e0bSAndroid Build Coastguard Worker doc_path = access(DOC_PATH, F_OK) ? "docs" : DOC_PATH;
1096*08b48e0bSAndroid Build Coastguard Worker
1097*08b48e0bSAndroid Build Coastguard Worker if (getenv("AFL_QUIET") != NULL) { be_quiet = true; }
1098*08b48e0bSAndroid Build Coastguard Worker
1099*08b48e0bSAndroid Build Coastguard Worker while ((opt = getopt(argc, argv, "+i:I:o:f:m:t:AeqCZOH:QUWbcrshXY")) > 0) {
1100*08b48e0bSAndroid Build Coastguard Worker
1101*08b48e0bSAndroid Build Coastguard Worker switch (opt) {
1102*08b48e0bSAndroid Build Coastguard Worker
1103*08b48e0bSAndroid Build Coastguard Worker case 's':
1104*08b48e0bSAndroid Build Coastguard Worker no_classify = true;
1105*08b48e0bSAndroid Build Coastguard Worker break;
1106*08b48e0bSAndroid Build Coastguard Worker
1107*08b48e0bSAndroid Build Coastguard Worker case 'C':
1108*08b48e0bSAndroid Build Coastguard Worker collect_coverage = true;
1109*08b48e0bSAndroid Build Coastguard Worker quiet_mode = true;
1110*08b48e0bSAndroid Build Coastguard Worker break;
1111*08b48e0bSAndroid Build Coastguard Worker
1112*08b48e0bSAndroid Build Coastguard Worker case 'i':
1113*08b48e0bSAndroid Build Coastguard Worker if (in_dir) { FATAL("Multiple -i options not supported"); }
1114*08b48e0bSAndroid Build Coastguard Worker in_dir = optarg;
1115*08b48e0bSAndroid Build Coastguard Worker break;
1116*08b48e0bSAndroid Build Coastguard Worker
1117*08b48e0bSAndroid Build Coastguard Worker case 'I':
1118*08b48e0bSAndroid Build Coastguard Worker if (in_filelist) { FATAL("Multiple -I options not supported"); }
1119*08b48e0bSAndroid Build Coastguard Worker in_filelist = optarg;
1120*08b48e0bSAndroid Build Coastguard Worker break;
1121*08b48e0bSAndroid Build Coastguard Worker
1122*08b48e0bSAndroid Build Coastguard Worker case 'o':
1123*08b48e0bSAndroid Build Coastguard Worker
1124*08b48e0bSAndroid Build Coastguard Worker if (out_file) { FATAL("Multiple -o options not supported"); }
1125*08b48e0bSAndroid Build Coastguard Worker out_file = optarg;
1126*08b48e0bSAndroid Build Coastguard Worker break;
1127*08b48e0bSAndroid Build Coastguard Worker
1128*08b48e0bSAndroid Build Coastguard Worker case 'm': {
1129*08b48e0bSAndroid Build Coastguard Worker
1130*08b48e0bSAndroid Build Coastguard Worker u8 suffix = 'M';
1131*08b48e0bSAndroid Build Coastguard Worker
1132*08b48e0bSAndroid Build Coastguard Worker if (mem_limit_given) { FATAL("Multiple -m options not supported"); }
1133*08b48e0bSAndroid Build Coastguard Worker mem_limit_given = true;
1134*08b48e0bSAndroid Build Coastguard Worker
1135*08b48e0bSAndroid Build Coastguard Worker if (!optarg) { FATAL("Wrong usage of -m"); }
1136*08b48e0bSAndroid Build Coastguard Worker
1137*08b48e0bSAndroid Build Coastguard Worker if (!strcmp(optarg, "none")) {
1138*08b48e0bSAndroid Build Coastguard Worker
1139*08b48e0bSAndroid Build Coastguard Worker fsrv->mem_limit = 0;
1140*08b48e0bSAndroid Build Coastguard Worker break;
1141*08b48e0bSAndroid Build Coastguard Worker
1142*08b48e0bSAndroid Build Coastguard Worker }
1143*08b48e0bSAndroid Build Coastguard Worker
1144*08b48e0bSAndroid Build Coastguard Worker if (sscanf(optarg, "%llu%c", &fsrv->mem_limit, &suffix) < 1 ||
1145*08b48e0bSAndroid Build Coastguard Worker optarg[0] == '-') {
1146*08b48e0bSAndroid Build Coastguard Worker
1147*08b48e0bSAndroid Build Coastguard Worker FATAL("Bad syntax used for -m");
1148*08b48e0bSAndroid Build Coastguard Worker
1149*08b48e0bSAndroid Build Coastguard Worker }
1150*08b48e0bSAndroid Build Coastguard Worker
1151*08b48e0bSAndroid Build Coastguard Worker switch (suffix) {
1152*08b48e0bSAndroid Build Coastguard Worker
1153*08b48e0bSAndroid Build Coastguard Worker case 'T':
1154*08b48e0bSAndroid Build Coastguard Worker fsrv->mem_limit *= 1024 * 1024;
1155*08b48e0bSAndroid Build Coastguard Worker break;
1156*08b48e0bSAndroid Build Coastguard Worker case 'G':
1157*08b48e0bSAndroid Build Coastguard Worker fsrv->mem_limit *= 1024;
1158*08b48e0bSAndroid Build Coastguard Worker break;
1159*08b48e0bSAndroid Build Coastguard Worker case 'k':
1160*08b48e0bSAndroid Build Coastguard Worker fsrv->mem_limit /= 1024;
1161*08b48e0bSAndroid Build Coastguard Worker break;
1162*08b48e0bSAndroid Build Coastguard Worker case 'M':
1163*08b48e0bSAndroid Build Coastguard Worker break;
1164*08b48e0bSAndroid Build Coastguard Worker
1165*08b48e0bSAndroid Build Coastguard Worker default:
1166*08b48e0bSAndroid Build Coastguard Worker FATAL("Unsupported suffix or bad syntax for -m");
1167*08b48e0bSAndroid Build Coastguard Worker
1168*08b48e0bSAndroid Build Coastguard Worker }
1169*08b48e0bSAndroid Build Coastguard Worker
1170*08b48e0bSAndroid Build Coastguard Worker if (fsrv->mem_limit < 5) { FATAL("Dangerously low value of -m"); }
1171*08b48e0bSAndroid Build Coastguard Worker
1172*08b48e0bSAndroid Build Coastguard Worker if (sizeof(rlim_t) == 4 && fsrv->mem_limit > 2000) {
1173*08b48e0bSAndroid Build Coastguard Worker
1174*08b48e0bSAndroid Build Coastguard Worker FATAL("Value of -m out of range on 32-bit systems");
1175*08b48e0bSAndroid Build Coastguard Worker
1176*08b48e0bSAndroid Build Coastguard Worker }
1177*08b48e0bSAndroid Build Coastguard Worker
1178*08b48e0bSAndroid Build Coastguard Worker }
1179*08b48e0bSAndroid Build Coastguard Worker
1180*08b48e0bSAndroid Build Coastguard Worker break;
1181*08b48e0bSAndroid Build Coastguard Worker
1182*08b48e0bSAndroid Build Coastguard Worker case 'f': // only in here to avoid a compiler warning for use_stdin
1183*08b48e0bSAndroid Build Coastguard Worker
1184*08b48e0bSAndroid Build Coastguard Worker FATAL("Option -f is not supported in afl-showmap");
1185*08b48e0bSAndroid Build Coastguard Worker // currently not reached:
1186*08b48e0bSAndroid Build Coastguard Worker fsrv->use_stdin = 0;
1187*08b48e0bSAndroid Build Coastguard Worker fsrv->out_file = strdup(optarg);
1188*08b48e0bSAndroid Build Coastguard Worker
1189*08b48e0bSAndroid Build Coastguard Worker break;
1190*08b48e0bSAndroid Build Coastguard Worker
1191*08b48e0bSAndroid Build Coastguard Worker case 't':
1192*08b48e0bSAndroid Build Coastguard Worker
1193*08b48e0bSAndroid Build Coastguard Worker if (timeout_given) { FATAL("Multiple -t options not supported"); }
1194*08b48e0bSAndroid Build Coastguard Worker timeout_given = true;
1195*08b48e0bSAndroid Build Coastguard Worker
1196*08b48e0bSAndroid Build Coastguard Worker if (!optarg) { FATAL("Wrong usage of -t"); }
1197*08b48e0bSAndroid Build Coastguard Worker
1198*08b48e0bSAndroid Build Coastguard Worker if (strcmp(optarg, "none")) {
1199*08b48e0bSAndroid Build Coastguard Worker
1200*08b48e0bSAndroid Build Coastguard Worker fsrv->exec_tmout = atoi(optarg);
1201*08b48e0bSAndroid Build Coastguard Worker
1202*08b48e0bSAndroid Build Coastguard Worker if (fsrv->exec_tmout < 20 || optarg[0] == '-') {
1203*08b48e0bSAndroid Build Coastguard Worker
1204*08b48e0bSAndroid Build Coastguard Worker FATAL("Dangerously low value of -t");
1205*08b48e0bSAndroid Build Coastguard Worker
1206*08b48e0bSAndroid Build Coastguard Worker }
1207*08b48e0bSAndroid Build Coastguard Worker
1208*08b48e0bSAndroid Build Coastguard Worker } else {
1209*08b48e0bSAndroid Build Coastguard Worker
1210*08b48e0bSAndroid Build Coastguard Worker // The forkserver code does not have a way to completely
1211*08b48e0bSAndroid Build Coastguard Worker // disable the timeout, so we'll use a very, very long
1212*08b48e0bSAndroid Build Coastguard Worker // timeout instead.
1213*08b48e0bSAndroid Build Coastguard Worker WARNF(
1214*08b48e0bSAndroid Build Coastguard Worker "Setting an execution timeout of 120 seconds ('none' is not "
1215*08b48e0bSAndroid Build Coastguard Worker "allowed).");
1216*08b48e0bSAndroid Build Coastguard Worker fsrv->exec_tmout = 120 * 1000;
1217*08b48e0bSAndroid Build Coastguard Worker
1218*08b48e0bSAndroid Build Coastguard Worker }
1219*08b48e0bSAndroid Build Coastguard Worker
1220*08b48e0bSAndroid Build Coastguard Worker break;
1221*08b48e0bSAndroid Build Coastguard Worker
1222*08b48e0bSAndroid Build Coastguard Worker case 'e':
1223*08b48e0bSAndroid Build Coastguard Worker
1224*08b48e0bSAndroid Build Coastguard Worker if (edges_only) { FATAL("Multiple -e options not supported"); }
1225*08b48e0bSAndroid Build Coastguard Worker if (raw_instr_output) { FATAL("-e and -r are mutually exclusive"); }
1226*08b48e0bSAndroid Build Coastguard Worker edges_only = true;
1227*08b48e0bSAndroid Build Coastguard Worker break;
1228*08b48e0bSAndroid Build Coastguard Worker
1229*08b48e0bSAndroid Build Coastguard Worker case 'q':
1230*08b48e0bSAndroid Build Coastguard Worker
1231*08b48e0bSAndroid Build Coastguard Worker quiet_mode = true;
1232*08b48e0bSAndroid Build Coastguard Worker break;
1233*08b48e0bSAndroid Build Coastguard Worker
1234*08b48e0bSAndroid Build Coastguard Worker case 'Z':
1235*08b48e0bSAndroid Build Coastguard Worker
1236*08b48e0bSAndroid Build Coastguard Worker /* This is an undocumented option to write data in the syntax expected
1237*08b48e0bSAndroid Build Coastguard Worker by afl-cmin. Nobody else should have any use for this. */
1238*08b48e0bSAndroid Build Coastguard Worker
1239*08b48e0bSAndroid Build Coastguard Worker cmin_mode = true;
1240*08b48e0bSAndroid Build Coastguard Worker quiet_mode = true;
1241*08b48e0bSAndroid Build Coastguard Worker break;
1242*08b48e0bSAndroid Build Coastguard Worker
1243*08b48e0bSAndroid Build Coastguard Worker case 'H':
1244*08b48e0bSAndroid Build Coastguard Worker /* Another afl-cmin specific feature. */
1245*08b48e0bSAndroid Build Coastguard Worker at_file = optarg;
1246*08b48e0bSAndroid Build Coastguard Worker break;
1247*08b48e0bSAndroid Build Coastguard Worker
1248*08b48e0bSAndroid Build Coastguard Worker case 'O': /* FRIDA mode */
1249*08b48e0bSAndroid Build Coastguard Worker
1250*08b48e0bSAndroid Build Coastguard Worker if (fsrv->frida_mode) { FATAL("Multiple -O options not supported"); }
1251*08b48e0bSAndroid Build Coastguard Worker
1252*08b48e0bSAndroid Build Coastguard Worker fsrv->frida_mode = true;
1253*08b48e0bSAndroid Build Coastguard Worker setenv("AFL_FRIDA_INST_SEED", "1", 1);
1254*08b48e0bSAndroid Build Coastguard Worker
1255*08b48e0bSAndroid Build Coastguard Worker break;
1256*08b48e0bSAndroid Build Coastguard Worker
1257*08b48e0bSAndroid Build Coastguard Worker /* FIXME: We want to use -P for consistency, but it is already unsed for
1258*08b48e0bSAndroid Build Coastguard Worker * undocumenetd feature "Another afl-cmin specific feature." */
1259*08b48e0bSAndroid Build Coastguard Worker case 'A': /* CoreSight mode */
1260*08b48e0bSAndroid Build Coastguard Worker
1261*08b48e0bSAndroid Build Coastguard Worker #if !defined(__aarch64__) || !defined(__linux__)
1262*08b48e0bSAndroid Build Coastguard Worker FATAL("-A option is not supported on this platform");
1263*08b48e0bSAndroid Build Coastguard Worker #endif
1264*08b48e0bSAndroid Build Coastguard Worker
1265*08b48e0bSAndroid Build Coastguard Worker if (fsrv->cs_mode) { FATAL("Multiple -A options not supported"); }
1266*08b48e0bSAndroid Build Coastguard Worker
1267*08b48e0bSAndroid Build Coastguard Worker fsrv->cs_mode = true;
1268*08b48e0bSAndroid Build Coastguard Worker break;
1269*08b48e0bSAndroid Build Coastguard Worker
1270*08b48e0bSAndroid Build Coastguard Worker case 'Q':
1271*08b48e0bSAndroid Build Coastguard Worker
1272*08b48e0bSAndroid Build Coastguard Worker if (fsrv->qemu_mode) { FATAL("Multiple -Q options not supported"); }
1273*08b48e0bSAndroid Build Coastguard Worker
1274*08b48e0bSAndroid Build Coastguard Worker fsrv->qemu_mode = true;
1275*08b48e0bSAndroid Build Coastguard Worker break;
1276*08b48e0bSAndroid Build Coastguard Worker
1277*08b48e0bSAndroid Build Coastguard Worker case 'U':
1278*08b48e0bSAndroid Build Coastguard Worker
1279*08b48e0bSAndroid Build Coastguard Worker if (unicorn_mode) { FATAL("Multiple -U options not supported"); }
1280*08b48e0bSAndroid Build Coastguard Worker
1281*08b48e0bSAndroid Build Coastguard Worker unicorn_mode = true;
1282*08b48e0bSAndroid Build Coastguard Worker break;
1283*08b48e0bSAndroid Build Coastguard Worker
1284*08b48e0bSAndroid Build Coastguard Worker case 'W': /* Wine+QEMU mode */
1285*08b48e0bSAndroid Build Coastguard Worker
1286*08b48e0bSAndroid Build Coastguard Worker if (use_wine) { FATAL("Multiple -W options not supported"); }
1287*08b48e0bSAndroid Build Coastguard Worker fsrv->qemu_mode = true;
1288*08b48e0bSAndroid Build Coastguard Worker use_wine = true;
1289*08b48e0bSAndroid Build Coastguard Worker
1290*08b48e0bSAndroid Build Coastguard Worker break;
1291*08b48e0bSAndroid Build Coastguard Worker
1292*08b48e0bSAndroid Build Coastguard Worker case 'Y': // fallthrough
1293*08b48e0bSAndroid Build Coastguard Worker #ifdef __linux__
1294*08b48e0bSAndroid Build Coastguard Worker case 'X': /* NYX mode */
1295*08b48e0bSAndroid Build Coastguard Worker
1296*08b48e0bSAndroid Build Coastguard Worker if (fsrv->nyx_mode) { FATAL("Multiple -X options not supported"); }
1297*08b48e0bSAndroid Build Coastguard Worker
1298*08b48e0bSAndroid Build Coastguard Worker fsrv->nyx_mode = 1;
1299*08b48e0bSAndroid Build Coastguard Worker fsrv->nyx_parent = true;
1300*08b48e0bSAndroid Build Coastguard Worker fsrv->nyx_standalone = true;
1301*08b48e0bSAndroid Build Coastguard Worker
1302*08b48e0bSAndroid Build Coastguard Worker break;
1303*08b48e0bSAndroid Build Coastguard Worker #else
1304*08b48e0bSAndroid Build Coastguard Worker case 'X':
1305*08b48e0bSAndroid Build Coastguard Worker FATAL("Nyx mode is only availabe on linux...");
1306*08b48e0bSAndroid Build Coastguard Worker break;
1307*08b48e0bSAndroid Build Coastguard Worker #endif
1308*08b48e0bSAndroid Build Coastguard Worker
1309*08b48e0bSAndroid Build Coastguard Worker case 'b':
1310*08b48e0bSAndroid Build Coastguard Worker
1311*08b48e0bSAndroid Build Coastguard Worker /* Secret undocumented mode. Writes output in raw binary format
1312*08b48e0bSAndroid Build Coastguard Worker similar to that dumped by afl-fuzz in <out_dir/queue/fuzz_bitmap. */
1313*08b48e0bSAndroid Build Coastguard Worker
1314*08b48e0bSAndroid Build Coastguard Worker binary_mode = true;
1315*08b48e0bSAndroid Build Coastguard Worker break;
1316*08b48e0bSAndroid Build Coastguard Worker
1317*08b48e0bSAndroid Build Coastguard Worker case 'c':
1318*08b48e0bSAndroid Build Coastguard Worker
1319*08b48e0bSAndroid Build Coastguard Worker if (keep_cores) { FATAL("Multiple -c options not supported"); }
1320*08b48e0bSAndroid Build Coastguard Worker keep_cores = true;
1321*08b48e0bSAndroid Build Coastguard Worker break;
1322*08b48e0bSAndroid Build Coastguard Worker
1323*08b48e0bSAndroid Build Coastguard Worker case 'r':
1324*08b48e0bSAndroid Build Coastguard Worker
1325*08b48e0bSAndroid Build Coastguard Worker if (raw_instr_output) { FATAL("Multiple -r options not supported"); }
1326*08b48e0bSAndroid Build Coastguard Worker if (edges_only) { FATAL("-e and -r are mutually exclusive"); }
1327*08b48e0bSAndroid Build Coastguard Worker raw_instr_output = true;
1328*08b48e0bSAndroid Build Coastguard Worker break;
1329*08b48e0bSAndroid Build Coastguard Worker
1330*08b48e0bSAndroid Build Coastguard Worker case 'h':
1331*08b48e0bSAndroid Build Coastguard Worker usage(argv[0]);
1332*08b48e0bSAndroid Build Coastguard Worker return -1;
1333*08b48e0bSAndroid Build Coastguard Worker break;
1334*08b48e0bSAndroid Build Coastguard Worker
1335*08b48e0bSAndroid Build Coastguard Worker default:
1336*08b48e0bSAndroid Build Coastguard Worker usage(argv[0]);
1337*08b48e0bSAndroid Build Coastguard Worker
1338*08b48e0bSAndroid Build Coastguard Worker }
1339*08b48e0bSAndroid Build Coastguard Worker
1340*08b48e0bSAndroid Build Coastguard Worker }
1341*08b48e0bSAndroid Build Coastguard Worker
1342*08b48e0bSAndroid Build Coastguard Worker if (optind == argc || !out_file) { usage(argv[0]); }
1343*08b48e0bSAndroid Build Coastguard Worker
1344*08b48e0bSAndroid Build Coastguard Worker if (in_dir && in_filelist) { FATAL("you can only specify either -i or -I"); }
1345*08b48e0bSAndroid Build Coastguard Worker
1346*08b48e0bSAndroid Build Coastguard Worker if (in_dir || in_filelist) {
1347*08b48e0bSAndroid Build Coastguard Worker
1348*08b48e0bSAndroid Build Coastguard Worker if (!out_file && !collect_coverage)
1349*08b48e0bSAndroid Build Coastguard Worker FATAL("for -i/-I you need to specify either -C and/or -o");
1350*08b48e0bSAndroid Build Coastguard Worker
1351*08b48e0bSAndroid Build Coastguard Worker }
1352*08b48e0bSAndroid Build Coastguard Worker
1353*08b48e0bSAndroid Build Coastguard Worker if (fsrv->qemu_mode && !mem_limit_given) { fsrv->mem_limit = MEM_LIMIT_QEMU; }
1354*08b48e0bSAndroid Build Coastguard Worker if (unicorn_mode && !mem_limit_given) { fsrv->mem_limit = MEM_LIMIT_UNICORN; }
1355*08b48e0bSAndroid Build Coastguard Worker
1356*08b48e0bSAndroid Build Coastguard Worker check_environment_vars(envp);
1357*08b48e0bSAndroid Build Coastguard Worker
1358*08b48e0bSAndroid Build Coastguard Worker if (getenv("AFL_NO_FORKSRV")) { /* if set, use the fauxserver */
1359*08b48e0bSAndroid Build Coastguard Worker fsrv->use_fauxsrv = true;
1360*08b48e0bSAndroid Build Coastguard Worker
1361*08b48e0bSAndroid Build Coastguard Worker }
1362*08b48e0bSAndroid Build Coastguard Worker
1363*08b48e0bSAndroid Build Coastguard Worker if (getenv("AFL_DEBUG")) {
1364*08b48e0bSAndroid Build Coastguard Worker
1365*08b48e0bSAndroid Build Coastguard Worker DEBUGF("");
1366*08b48e0bSAndroid Build Coastguard Worker for (i = 0; i < argc; i++)
1367*08b48e0bSAndroid Build Coastguard Worker SAYF(" %s", argv[i]);
1368*08b48e0bSAndroid Build Coastguard Worker SAYF("\n");
1369*08b48e0bSAndroid Build Coastguard Worker
1370*08b48e0bSAndroid Build Coastguard Worker }
1371*08b48e0bSAndroid Build Coastguard Worker
1372*08b48e0bSAndroid Build Coastguard Worker // if (afl->shmem_testcase_mode) { setup_testcase_shmem(afl); }
1373*08b48e0bSAndroid Build Coastguard Worker
1374*08b48e0bSAndroid Build Coastguard Worker setenv("AFL_NO_AUTODICT", "1", 1);
1375*08b48e0bSAndroid Build Coastguard Worker
1376*08b48e0bSAndroid Build Coastguard Worker /* initialize cmplog_mode */
1377*08b48e0bSAndroid Build Coastguard Worker shm.cmplog_mode = 0;
1378*08b48e0bSAndroid Build Coastguard Worker setup_signal_handlers();
1379*08b48e0bSAndroid Build Coastguard Worker
1380*08b48e0bSAndroid Build Coastguard Worker set_up_environment(fsrv, argv);
1381*08b48e0bSAndroid Build Coastguard Worker
1382*08b48e0bSAndroid Build Coastguard Worker #ifdef __linux__
1383*08b48e0bSAndroid Build Coastguard Worker if (!fsrv->nyx_mode) {
1384*08b48e0bSAndroid Build Coastguard Worker
1385*08b48e0bSAndroid Build Coastguard Worker fsrv->target_path = find_binary(argv[optind]);
1386*08b48e0bSAndroid Build Coastguard Worker
1387*08b48e0bSAndroid Build Coastguard Worker } else {
1388*08b48e0bSAndroid Build Coastguard Worker
1389*08b48e0bSAndroid Build Coastguard Worker fsrv->target_path = ck_strdup(argv[optind]);
1390*08b48e0bSAndroid Build Coastguard Worker
1391*08b48e0bSAndroid Build Coastguard Worker }
1392*08b48e0bSAndroid Build Coastguard Worker
1393*08b48e0bSAndroid Build Coastguard Worker #else
1394*08b48e0bSAndroid Build Coastguard Worker fsrv->target_path = find_binary(argv[optind]);
1395*08b48e0bSAndroid Build Coastguard Worker #endif
1396*08b48e0bSAndroid Build Coastguard Worker
1397*08b48e0bSAndroid Build Coastguard Worker fsrv->trace_bits = afl_shm_init(&shm, map_size, 0);
1398*08b48e0bSAndroid Build Coastguard Worker
1399*08b48e0bSAndroid Build Coastguard Worker if (!quiet_mode) {
1400*08b48e0bSAndroid Build Coastguard Worker
1401*08b48e0bSAndroid Build Coastguard Worker show_banner();
1402*08b48e0bSAndroid Build Coastguard Worker ACTF("Executing '%s'...", fsrv->target_path);
1403*08b48e0bSAndroid Build Coastguard Worker
1404*08b48e0bSAndroid Build Coastguard Worker }
1405*08b48e0bSAndroid Build Coastguard Worker
1406*08b48e0bSAndroid Build Coastguard Worker if (in_dir || in_filelist) {
1407*08b48e0bSAndroid Build Coastguard Worker
1408*08b48e0bSAndroid Build Coastguard Worker /* If we don't have a file name chosen yet, use a safe default. */
1409*08b48e0bSAndroid Build Coastguard Worker u8 *use_dir = ".";
1410*08b48e0bSAndroid Build Coastguard Worker
1411*08b48e0bSAndroid Build Coastguard Worker if (access(use_dir, R_OK | W_OK | X_OK)) {
1412*08b48e0bSAndroid Build Coastguard Worker
1413*08b48e0bSAndroid Build Coastguard Worker use_dir = get_afl_env("TMPDIR");
1414*08b48e0bSAndroid Build Coastguard Worker if (!use_dir) { use_dir = "/tmp"; }
1415*08b48e0bSAndroid Build Coastguard Worker
1416*08b48e0bSAndroid Build Coastguard Worker }
1417*08b48e0bSAndroid Build Coastguard Worker
1418*08b48e0bSAndroid Build Coastguard Worker stdin_file = at_file ? strdup(at_file)
1419*08b48e0bSAndroid Build Coastguard Worker : (char *)alloc_printf("%s/.afl-showmap-temp-%u",
1420*08b48e0bSAndroid Build Coastguard Worker use_dir, (u32)getpid());
1421*08b48e0bSAndroid Build Coastguard Worker unlink(stdin_file);
1422*08b48e0bSAndroid Build Coastguard Worker
1423*08b48e0bSAndroid Build Coastguard Worker // If @@ are in the target args, replace them and also set use_stdin=false.
1424*08b48e0bSAndroid Build Coastguard Worker detect_file_args(argv + optind, stdin_file, &fsrv->use_stdin);
1425*08b48e0bSAndroid Build Coastguard Worker
1426*08b48e0bSAndroid Build Coastguard Worker fsrv->dev_null_fd = open("/dev/null", O_RDWR);
1427*08b48e0bSAndroid Build Coastguard Worker if (fsrv->dev_null_fd < 0) { PFATAL("Unable to open /dev/null"); }
1428*08b48e0bSAndroid Build Coastguard Worker
1429*08b48e0bSAndroid Build Coastguard Worker fsrv->out_file = stdin_file;
1430*08b48e0bSAndroid Build Coastguard Worker fsrv->out_fd =
1431*08b48e0bSAndroid Build Coastguard Worker open(stdin_file, O_RDWR | O_CREAT | O_EXCL, DEFAULT_PERMISSION);
1432*08b48e0bSAndroid Build Coastguard Worker if (fsrv->out_fd < 0) { PFATAL("Unable to create '%s'", stdin_file); }
1433*08b48e0bSAndroid Build Coastguard Worker
1434*08b48e0bSAndroid Build Coastguard Worker } else {
1435*08b48e0bSAndroid Build Coastguard Worker
1436*08b48e0bSAndroid Build Coastguard Worker // If @@ are in the target args, replace them and also set use_stdin=false.
1437*08b48e0bSAndroid Build Coastguard Worker detect_file_args(argv + optind, at_file, &fsrv->use_stdin);
1438*08b48e0bSAndroid Build Coastguard Worker
1439*08b48e0bSAndroid Build Coastguard Worker }
1440*08b48e0bSAndroid Build Coastguard Worker
1441*08b48e0bSAndroid Build Coastguard Worker if (fsrv->qemu_mode) {
1442*08b48e0bSAndroid Build Coastguard Worker
1443*08b48e0bSAndroid Build Coastguard Worker if (use_wine) {
1444*08b48e0bSAndroid Build Coastguard Worker
1445*08b48e0bSAndroid Build Coastguard Worker use_argv = get_wine_argv(argv[0], &fsrv->target_path, argc - optind,
1446*08b48e0bSAndroid Build Coastguard Worker argv + optind);
1447*08b48e0bSAndroid Build Coastguard Worker
1448*08b48e0bSAndroid Build Coastguard Worker } else {
1449*08b48e0bSAndroid Build Coastguard Worker
1450*08b48e0bSAndroid Build Coastguard Worker use_argv = get_qemu_argv(argv[0], &fsrv->target_path, argc - optind,
1451*08b48e0bSAndroid Build Coastguard Worker argv + optind);
1452*08b48e0bSAndroid Build Coastguard Worker
1453*08b48e0bSAndroid Build Coastguard Worker }
1454*08b48e0bSAndroid Build Coastguard Worker
1455*08b48e0bSAndroid Build Coastguard Worker } else if (fsrv->cs_mode) {
1456*08b48e0bSAndroid Build Coastguard Worker
1457*08b48e0bSAndroid Build Coastguard Worker use_argv =
1458*08b48e0bSAndroid Build Coastguard Worker get_cs_argv(argv[0], &fsrv->target_path, argc - optind, argv + optind);
1459*08b48e0bSAndroid Build Coastguard Worker
1460*08b48e0bSAndroid Build Coastguard Worker #ifdef __linux__
1461*08b48e0bSAndroid Build Coastguard Worker
1462*08b48e0bSAndroid Build Coastguard Worker } else if (fsrv->nyx_mode) {
1463*08b48e0bSAndroid Build Coastguard Worker
1464*08b48e0bSAndroid Build Coastguard Worker use_argv = ck_alloc(sizeof(char *) * (1));
1465*08b48e0bSAndroid Build Coastguard Worker use_argv[0] = argv[0];
1466*08b48e0bSAndroid Build Coastguard Worker
1467*08b48e0bSAndroid Build Coastguard Worker fsrv->nyx_id = 0;
1468*08b48e0bSAndroid Build Coastguard Worker
1469*08b48e0bSAndroid Build Coastguard Worker u8 *libnyx_binary = find_afl_binary(use_argv[0], "libnyx.so");
1470*08b48e0bSAndroid Build Coastguard Worker fsrv->nyx_handlers = afl_load_libnyx_plugin(libnyx_binary);
1471*08b48e0bSAndroid Build Coastguard Worker if (fsrv->nyx_handlers == NULL) {
1472*08b48e0bSAndroid Build Coastguard Worker
1473*08b48e0bSAndroid Build Coastguard Worker FATAL("failed to initialize libnyx.so...");
1474*08b48e0bSAndroid Build Coastguard Worker
1475*08b48e0bSAndroid Build Coastguard Worker }
1476*08b48e0bSAndroid Build Coastguard Worker
1477*08b48e0bSAndroid Build Coastguard Worker fsrv->nyx_use_tmp_workdir = true;
1478*08b48e0bSAndroid Build Coastguard Worker fsrv->nyx_bind_cpu_id = 0;
1479*08b48e0bSAndroid Build Coastguard Worker #endif
1480*08b48e0bSAndroid Build Coastguard Worker
1481*08b48e0bSAndroid Build Coastguard Worker } else {
1482*08b48e0bSAndroid Build Coastguard Worker
1483*08b48e0bSAndroid Build Coastguard Worker use_argv = argv + optind;
1484*08b48e0bSAndroid Build Coastguard Worker
1485*08b48e0bSAndroid Build Coastguard Worker }
1486*08b48e0bSAndroid Build Coastguard Worker
1487*08b48e0bSAndroid Build Coastguard Worker afl = calloc(1, sizeof(afl_state_t));
1488*08b48e0bSAndroid Build Coastguard Worker
1489*08b48e0bSAndroid Build Coastguard Worker if (getenv("AFL_FORKSRV_INIT_TMOUT")) {
1490*08b48e0bSAndroid Build Coastguard Worker
1491*08b48e0bSAndroid Build Coastguard Worker s32 forksrv_init_tmout = atoi(getenv("AFL_FORKSRV_INIT_TMOUT"));
1492*08b48e0bSAndroid Build Coastguard Worker if (forksrv_init_tmout < 1) {
1493*08b48e0bSAndroid Build Coastguard Worker
1494*08b48e0bSAndroid Build Coastguard Worker FATAL("Bad value specified for AFL_FORKSRV_INIT_TMOUT");
1495*08b48e0bSAndroid Build Coastguard Worker
1496*08b48e0bSAndroid Build Coastguard Worker }
1497*08b48e0bSAndroid Build Coastguard Worker
1498*08b48e0bSAndroid Build Coastguard Worker fsrv->init_tmout = (u32)forksrv_init_tmout;
1499*08b48e0bSAndroid Build Coastguard Worker
1500*08b48e0bSAndroid Build Coastguard Worker }
1501*08b48e0bSAndroid Build Coastguard Worker
1502*08b48e0bSAndroid Build Coastguard Worker if (getenv("AFL_CRASH_EXITCODE")) {
1503*08b48e0bSAndroid Build Coastguard Worker
1504*08b48e0bSAndroid Build Coastguard Worker long exitcode = strtol(getenv("AFL_CRASH_EXITCODE"), NULL, 10);
1505*08b48e0bSAndroid Build Coastguard Worker if ((!exitcode && (errno == EINVAL || errno == ERANGE)) ||
1506*08b48e0bSAndroid Build Coastguard Worker exitcode < -127 || exitcode > 128) {
1507*08b48e0bSAndroid Build Coastguard Worker
1508*08b48e0bSAndroid Build Coastguard Worker FATAL("Invalid crash exitcode, expected -127 to 128, but got %s",
1509*08b48e0bSAndroid Build Coastguard Worker getenv("AFL_CRASH_EXITCODE"));
1510*08b48e0bSAndroid Build Coastguard Worker
1511*08b48e0bSAndroid Build Coastguard Worker }
1512*08b48e0bSAndroid Build Coastguard Worker
1513*08b48e0bSAndroid Build Coastguard Worker fsrv->uses_crash_exitcode = true;
1514*08b48e0bSAndroid Build Coastguard Worker // WEXITSTATUS is 8 bit unsigned
1515*08b48e0bSAndroid Build Coastguard Worker fsrv->crash_exitcode = (u8)exitcode;
1516*08b48e0bSAndroid Build Coastguard Worker
1517*08b48e0bSAndroid Build Coastguard Worker }
1518*08b48e0bSAndroid Build Coastguard Worker
1519*08b48e0bSAndroid Build Coastguard Worker #ifdef __linux__
1520*08b48e0bSAndroid Build Coastguard Worker if (!fsrv->nyx_mode && (in_dir || in_filelist)) {
1521*08b48e0bSAndroid Build Coastguard Worker
1522*08b48e0bSAndroid Build Coastguard Worker (void)check_binary_signatures(fsrv->target_path);
1523*08b48e0bSAndroid Build Coastguard Worker
1524*08b48e0bSAndroid Build Coastguard Worker }
1525*08b48e0bSAndroid Build Coastguard Worker
1526*08b48e0bSAndroid Build Coastguard Worker #else
1527*08b48e0bSAndroid Build Coastguard Worker if (in_dir) { (void)check_binary_signatures(fsrv->target_path); }
1528*08b48e0bSAndroid Build Coastguard Worker #endif
1529*08b48e0bSAndroid Build Coastguard Worker
1530*08b48e0bSAndroid Build Coastguard Worker shm_fuzz = ck_alloc(sizeof(sharedmem_t));
1531*08b48e0bSAndroid Build Coastguard Worker
1532*08b48e0bSAndroid Build Coastguard Worker /* initialize cmplog_mode */
1533*08b48e0bSAndroid Build Coastguard Worker shm_fuzz->cmplog_mode = 0;
1534*08b48e0bSAndroid Build Coastguard Worker u8 *map = afl_shm_init(shm_fuzz, MAX_FILE + sizeof(u32), 1);
1535*08b48e0bSAndroid Build Coastguard Worker shm_fuzz->shmemfuzz_mode = true;
1536*08b48e0bSAndroid Build Coastguard Worker if (!map) { FATAL("BUG: Zero return from afl_shm_init."); }
1537*08b48e0bSAndroid Build Coastguard Worker #ifdef USEMMAP
1538*08b48e0bSAndroid Build Coastguard Worker setenv(SHM_FUZZ_ENV_VAR, shm_fuzz->g_shm_file_path, 1);
1539*08b48e0bSAndroid Build Coastguard Worker #else
1540*08b48e0bSAndroid Build Coastguard Worker u8 *shm_str = alloc_printf("%d", shm_fuzz->shm_id);
1541*08b48e0bSAndroid Build Coastguard Worker setenv(SHM_FUZZ_ENV_VAR, shm_str, 1);
1542*08b48e0bSAndroid Build Coastguard Worker ck_free(shm_str);
1543*08b48e0bSAndroid Build Coastguard Worker #endif
1544*08b48e0bSAndroid Build Coastguard Worker fsrv->support_shmem_fuzz = true;
1545*08b48e0bSAndroid Build Coastguard Worker fsrv->shmem_fuzz_len = (u32 *)map;
1546*08b48e0bSAndroid Build Coastguard Worker fsrv->shmem_fuzz = map + sizeof(u32);
1547*08b48e0bSAndroid Build Coastguard Worker
1548*08b48e0bSAndroid Build Coastguard Worker configure_afl_kill_signals(fsrv, NULL, NULL,
1549*08b48e0bSAndroid Build Coastguard Worker (fsrv->qemu_mode || unicorn_mode
1550*08b48e0bSAndroid Build Coastguard Worker #ifdef __linux__
1551*08b48e0bSAndroid Build Coastguard Worker || fsrv->nyx_mode
1552*08b48e0bSAndroid Build Coastguard Worker #endif
1553*08b48e0bSAndroid Build Coastguard Worker )
1554*08b48e0bSAndroid Build Coastguard Worker ? SIGKILL
1555*08b48e0bSAndroid Build Coastguard Worker : SIGTERM);
1556*08b48e0bSAndroid Build Coastguard Worker
1557*08b48e0bSAndroid Build Coastguard Worker if (!fsrv->cs_mode && !fsrv->qemu_mode && !unicorn_mode) {
1558*08b48e0bSAndroid Build Coastguard Worker
1559*08b48e0bSAndroid Build Coastguard Worker u32 save_be_quiet = be_quiet;
1560*08b48e0bSAndroid Build Coastguard Worker be_quiet = !debug;
1561*08b48e0bSAndroid Build Coastguard Worker if (map_size > 4194304) {
1562*08b48e0bSAndroid Build Coastguard Worker
1563*08b48e0bSAndroid Build Coastguard Worker fsrv->map_size = map_size;
1564*08b48e0bSAndroid Build Coastguard Worker
1565*08b48e0bSAndroid Build Coastguard Worker } else {
1566*08b48e0bSAndroid Build Coastguard Worker
1567*08b48e0bSAndroid Build Coastguard Worker fsrv->map_size = 4194304; // dummy temporary value
1568*08b48e0bSAndroid Build Coastguard Worker
1569*08b48e0bSAndroid Build Coastguard Worker }
1570*08b48e0bSAndroid Build Coastguard Worker
1571*08b48e0bSAndroid Build Coastguard Worker u32 new_map_size =
1572*08b48e0bSAndroid Build Coastguard Worker afl_fsrv_get_mapsize(fsrv, use_argv, &stop_soon,
1573*08b48e0bSAndroid Build Coastguard Worker (get_afl_env("AFL_DEBUG_CHILD") ||
1574*08b48e0bSAndroid Build Coastguard Worker get_afl_env("AFL_DEBUG_CHILD_OUTPUT"))
1575*08b48e0bSAndroid Build Coastguard Worker ? 1
1576*08b48e0bSAndroid Build Coastguard Worker : 0);
1577*08b48e0bSAndroid Build Coastguard Worker be_quiet = save_be_quiet;
1578*08b48e0bSAndroid Build Coastguard Worker
1579*08b48e0bSAndroid Build Coastguard Worker if (new_map_size) {
1580*08b48e0bSAndroid Build Coastguard Worker
1581*08b48e0bSAndroid Build Coastguard Worker // only reinitialize when it makes sense
1582*08b48e0bSAndroid Build Coastguard Worker if (map_size < new_map_size ||
1583*08b48e0bSAndroid Build Coastguard Worker (new_map_size > map_size && new_map_size - map_size > MAP_SIZE)) {
1584*08b48e0bSAndroid Build Coastguard Worker
1585*08b48e0bSAndroid Build Coastguard Worker if (!be_quiet)
1586*08b48e0bSAndroid Build Coastguard Worker ACTF("Acquired new map size for target: %u bytes\n", new_map_size);
1587*08b48e0bSAndroid Build Coastguard Worker
1588*08b48e0bSAndroid Build Coastguard Worker afl_shm_deinit(&shm);
1589*08b48e0bSAndroid Build Coastguard Worker afl_fsrv_kill(fsrv);
1590*08b48e0bSAndroid Build Coastguard Worker fsrv->map_size = new_map_size;
1591*08b48e0bSAndroid Build Coastguard Worker fsrv->trace_bits = afl_shm_init(&shm, new_map_size, 0);
1592*08b48e0bSAndroid Build Coastguard Worker
1593*08b48e0bSAndroid Build Coastguard Worker }
1594*08b48e0bSAndroid Build Coastguard Worker
1595*08b48e0bSAndroid Build Coastguard Worker map_size = new_map_size;
1596*08b48e0bSAndroid Build Coastguard Worker
1597*08b48e0bSAndroid Build Coastguard Worker }
1598*08b48e0bSAndroid Build Coastguard Worker
1599*08b48e0bSAndroid Build Coastguard Worker fsrv->map_size = map_size;
1600*08b48e0bSAndroid Build Coastguard Worker
1601*08b48e0bSAndroid Build Coastguard Worker } else {
1602*08b48e0bSAndroid Build Coastguard Worker
1603*08b48e0bSAndroid Build Coastguard Worker afl_fsrv_start(fsrv, use_argv, &stop_soon,
1604*08b48e0bSAndroid Build Coastguard Worker (get_afl_env("AFL_DEBUG_CHILD") ||
1605*08b48e0bSAndroid Build Coastguard Worker get_afl_env("AFL_DEBUG_CHILD_OUTPUT"))
1606*08b48e0bSAndroid Build Coastguard Worker ? 1
1607*08b48e0bSAndroid Build Coastguard Worker : 0);
1608*08b48e0bSAndroid Build Coastguard Worker
1609*08b48e0bSAndroid Build Coastguard Worker }
1610*08b48e0bSAndroid Build Coastguard Worker
1611*08b48e0bSAndroid Build Coastguard Worker if (in_dir || in_filelist) {
1612*08b48e0bSAndroid Build Coastguard Worker
1613*08b48e0bSAndroid Build Coastguard Worker afl->fsrv.dev_urandom_fd = open("/dev/urandom", O_RDONLY);
1614*08b48e0bSAndroid Build Coastguard Worker if (afl->fsrv.dev_urandom_fd < 0) { PFATAL("Unable to open /dev/urandom"); }
1615*08b48e0bSAndroid Build Coastguard Worker afl->afl_env.afl_custom_mutator_library =
1616*08b48e0bSAndroid Build Coastguard Worker getenv("AFL_CUSTOM_MUTATOR_LIBRARY");
1617*08b48e0bSAndroid Build Coastguard Worker afl->afl_env.afl_python_module = getenv("AFL_PYTHON_MODULE");
1618*08b48e0bSAndroid Build Coastguard Worker setup_custom_mutators(afl);
1619*08b48e0bSAndroid Build Coastguard Worker
1620*08b48e0bSAndroid Build Coastguard Worker } else {
1621*08b48e0bSAndroid Build Coastguard Worker
1622*08b48e0bSAndroid Build Coastguard Worker if (getenv("AFL_CUSTOM_MUTATOR_LIBRARY") || getenv("AFL_PYTHON_MODULE")) {
1623*08b48e0bSAndroid Build Coastguard Worker
1624*08b48e0bSAndroid Build Coastguard Worker WARNF(
1625*08b48e0bSAndroid Build Coastguard Worker "Custom mutator environment detected, this is only supported in "
1626*08b48e0bSAndroid Build Coastguard Worker "-i/-I mode!\n");
1627*08b48e0bSAndroid Build Coastguard Worker
1628*08b48e0bSAndroid Build Coastguard Worker }
1629*08b48e0bSAndroid Build Coastguard Worker
1630*08b48e0bSAndroid Build Coastguard Worker }
1631*08b48e0bSAndroid Build Coastguard Worker
1632*08b48e0bSAndroid Build Coastguard Worker if (in_dir || in_filelist) {
1633*08b48e0bSAndroid Build Coastguard Worker
1634*08b48e0bSAndroid Build Coastguard Worker DIR *dir_in, *dir_out = NULL;
1635*08b48e0bSAndroid Build Coastguard Worker u8 *dn = NULL;
1636*08b48e0bSAndroid Build Coastguard Worker
1637*08b48e0bSAndroid Build Coastguard Worker if (getenv("AFL_DEBUG_GDB")) wait_for_gdb = true;
1638*08b48e0bSAndroid Build Coastguard Worker
1639*08b48e0bSAndroid Build Coastguard Worker if (in_filelist) {
1640*08b48e0bSAndroid Build Coastguard Worker
1641*08b48e0bSAndroid Build Coastguard Worker if (!be_quiet) ACTF("Reading from file list '%s'...", in_filelist);
1642*08b48e0bSAndroid Build Coastguard Worker
1643*08b48e0bSAndroid Build Coastguard Worker } else {
1644*08b48e0bSAndroid Build Coastguard Worker
1645*08b48e0bSAndroid Build Coastguard Worker // if a queue subdirectory exists switch to that
1646*08b48e0bSAndroid Build Coastguard Worker dn = alloc_printf("%s/queue", in_dir);
1647*08b48e0bSAndroid Build Coastguard Worker
1648*08b48e0bSAndroid Build Coastguard Worker if ((dir_in = opendir(dn)) != NULL) {
1649*08b48e0bSAndroid Build Coastguard Worker
1650*08b48e0bSAndroid Build Coastguard Worker closedir(dir_in);
1651*08b48e0bSAndroid Build Coastguard Worker in_dir = dn;
1652*08b48e0bSAndroid Build Coastguard Worker
1653*08b48e0bSAndroid Build Coastguard Worker } else {
1654*08b48e0bSAndroid Build Coastguard Worker
1655*08b48e0bSAndroid Build Coastguard Worker ck_free(dn);
1656*08b48e0bSAndroid Build Coastguard Worker
1657*08b48e0bSAndroid Build Coastguard Worker }
1658*08b48e0bSAndroid Build Coastguard Worker
1659*08b48e0bSAndroid Build Coastguard Worker if (!be_quiet) ACTF("Reading from directory '%s'...", in_dir);
1660*08b48e0bSAndroid Build Coastguard Worker
1661*08b48e0bSAndroid Build Coastguard Worker }
1662*08b48e0bSAndroid Build Coastguard Worker
1663*08b48e0bSAndroid Build Coastguard Worker if (!collect_coverage) {
1664*08b48e0bSAndroid Build Coastguard Worker
1665*08b48e0bSAndroid Build Coastguard Worker if (!(dir_out = opendir(out_file))) {
1666*08b48e0bSAndroid Build Coastguard Worker
1667*08b48e0bSAndroid Build Coastguard Worker if (mkdir(out_file, 0700)) {
1668*08b48e0bSAndroid Build Coastguard Worker
1669*08b48e0bSAndroid Build Coastguard Worker PFATAL("cannot create output directory %s", out_file);
1670*08b48e0bSAndroid Build Coastguard Worker
1671*08b48e0bSAndroid Build Coastguard Worker }
1672*08b48e0bSAndroid Build Coastguard Worker
1673*08b48e0bSAndroid Build Coastguard Worker }
1674*08b48e0bSAndroid Build Coastguard Worker
1675*08b48e0bSAndroid Build Coastguard Worker } else {
1676*08b48e0bSAndroid Build Coastguard Worker
1677*08b48e0bSAndroid Build Coastguard Worker if ((coverage_map = (u8 *)malloc(map_size + 64)) == NULL)
1678*08b48e0bSAndroid Build Coastguard Worker FATAL("coult not grab memory");
1679*08b48e0bSAndroid Build Coastguard Worker edges_only = false;
1680*08b48e0bSAndroid Build Coastguard Worker raw_instr_output = true;
1681*08b48e0bSAndroid Build Coastguard Worker
1682*08b48e0bSAndroid Build Coastguard Worker }
1683*08b48e0bSAndroid Build Coastguard Worker
1684*08b48e0bSAndroid Build Coastguard Worker atexit(at_exit_handler);
1685*08b48e0bSAndroid Build Coastguard Worker
1686*08b48e0bSAndroid Build Coastguard Worker if (get_afl_env("AFL_DEBUG")) {
1687*08b48e0bSAndroid Build Coastguard Worker
1688*08b48e0bSAndroid Build Coastguard Worker int j = optind;
1689*08b48e0bSAndroid Build Coastguard Worker DEBUGF("%s:", fsrv->target_path);
1690*08b48e0bSAndroid Build Coastguard Worker while (argv[j] != NULL) {
1691*08b48e0bSAndroid Build Coastguard Worker
1692*08b48e0bSAndroid Build Coastguard Worker SAYF(" \"%s\"", argv[j++]);
1693*08b48e0bSAndroid Build Coastguard Worker
1694*08b48e0bSAndroid Build Coastguard Worker }
1695*08b48e0bSAndroid Build Coastguard Worker
1696*08b48e0bSAndroid Build Coastguard Worker SAYF("\n");
1697*08b48e0bSAndroid Build Coastguard Worker
1698*08b48e0bSAndroid Build Coastguard Worker }
1699*08b48e0bSAndroid Build Coastguard Worker
1700*08b48e0bSAndroid Build Coastguard Worker map_size = fsrv->map_size;
1701*08b48e0bSAndroid Build Coastguard Worker
1702*08b48e0bSAndroid Build Coastguard Worker if (fsrv->support_shmem_fuzz && !fsrv->use_shmem_fuzz)
1703*08b48e0bSAndroid Build Coastguard Worker shm_fuzz = deinit_shmem(fsrv, shm_fuzz);
1704*08b48e0bSAndroid Build Coastguard Worker
1705*08b48e0bSAndroid Build Coastguard Worker if (in_dir) {
1706*08b48e0bSAndroid Build Coastguard Worker
1707*08b48e0bSAndroid Build Coastguard Worker if (execute_testcases(in_dir) == 0) {
1708*08b48e0bSAndroid Build Coastguard Worker
1709*08b48e0bSAndroid Build Coastguard Worker FATAL("could not read input testcases from %s", in_dir);
1710*08b48e0bSAndroid Build Coastguard Worker
1711*08b48e0bSAndroid Build Coastguard Worker }
1712*08b48e0bSAndroid Build Coastguard Worker
1713*08b48e0bSAndroid Build Coastguard Worker } else {
1714*08b48e0bSAndroid Build Coastguard Worker
1715*08b48e0bSAndroid Build Coastguard Worker if (execute_testcases_filelist(in_filelist) == 0) {
1716*08b48e0bSAndroid Build Coastguard Worker
1717*08b48e0bSAndroid Build Coastguard Worker FATAL("could not read input testcases from %s", in_filelist);
1718*08b48e0bSAndroid Build Coastguard Worker
1719*08b48e0bSAndroid Build Coastguard Worker }
1720*08b48e0bSAndroid Build Coastguard Worker
1721*08b48e0bSAndroid Build Coastguard Worker }
1722*08b48e0bSAndroid Build Coastguard Worker
1723*08b48e0bSAndroid Build Coastguard Worker if (!quiet_mode) { OKF("Processed %llu input files.", fsrv->total_execs); }
1724*08b48e0bSAndroid Build Coastguard Worker
1725*08b48e0bSAndroid Build Coastguard Worker if (dir_out) { closedir(dir_out); }
1726*08b48e0bSAndroid Build Coastguard Worker
1727*08b48e0bSAndroid Build Coastguard Worker if (collect_coverage) {
1728*08b48e0bSAndroid Build Coastguard Worker
1729*08b48e0bSAndroid Build Coastguard Worker memcpy(fsrv->trace_bits, coverage_map, map_size);
1730*08b48e0bSAndroid Build Coastguard Worker tcnt = write_results_to_file(fsrv, out_file);
1731*08b48e0bSAndroid Build Coastguard Worker
1732*08b48e0bSAndroid Build Coastguard Worker }
1733*08b48e0bSAndroid Build Coastguard Worker
1734*08b48e0bSAndroid Build Coastguard Worker } else {
1735*08b48e0bSAndroid Build Coastguard Worker
1736*08b48e0bSAndroid Build Coastguard Worker if (fsrv->support_shmem_fuzz && !fsrv->use_shmem_fuzz)
1737*08b48e0bSAndroid Build Coastguard Worker shm_fuzz = deinit_shmem(fsrv, shm_fuzz);
1738*08b48e0bSAndroid Build Coastguard Worker
1739*08b48e0bSAndroid Build Coastguard Worker #ifdef __linux__
1740*08b48e0bSAndroid Build Coastguard Worker if (!fsrv->nyx_mode) {
1741*08b48e0bSAndroid Build Coastguard Worker
1742*08b48e0bSAndroid Build Coastguard Worker #endif
1743*08b48e0bSAndroid Build Coastguard Worker showmap_run_target(fsrv, use_argv);
1744*08b48e0bSAndroid Build Coastguard Worker #ifdef __linux__
1745*08b48e0bSAndroid Build Coastguard Worker
1746*08b48e0bSAndroid Build Coastguard Worker } else {
1747*08b48e0bSAndroid Build Coastguard Worker
1748*08b48e0bSAndroid Build Coastguard Worker showmap_run_target_nyx_mode(fsrv);
1749*08b48e0bSAndroid Build Coastguard Worker
1750*08b48e0bSAndroid Build Coastguard Worker }
1751*08b48e0bSAndroid Build Coastguard Worker
1752*08b48e0bSAndroid Build Coastguard Worker #endif
1753*08b48e0bSAndroid Build Coastguard Worker tcnt = write_results_to_file(fsrv, out_file);
1754*08b48e0bSAndroid Build Coastguard Worker if (!quiet_mode) {
1755*08b48e0bSAndroid Build Coastguard Worker
1756*08b48e0bSAndroid Build Coastguard Worker OKF("Hash of coverage map: %llx",
1757*08b48e0bSAndroid Build Coastguard Worker hash64(fsrv->trace_bits, fsrv->map_size, HASH_CONST));
1758*08b48e0bSAndroid Build Coastguard Worker
1759*08b48e0bSAndroid Build Coastguard Worker }
1760*08b48e0bSAndroid Build Coastguard Worker
1761*08b48e0bSAndroid Build Coastguard Worker }
1762*08b48e0bSAndroid Build Coastguard Worker
1763*08b48e0bSAndroid Build Coastguard Worker if (!quiet_mode || collect_coverage) {
1764*08b48e0bSAndroid Build Coastguard Worker
1765*08b48e0bSAndroid Build Coastguard Worker if (!tcnt && !have_coverage) { FATAL("No instrumentation detected" cRST); }
1766*08b48e0bSAndroid Build Coastguard Worker OKF("Captured %u tuples (map size %u, highest value %u, total values %llu) "
1767*08b48e0bSAndroid Build Coastguard Worker "in '%s'." cRST,
1768*08b48e0bSAndroid Build Coastguard Worker tcnt, fsrv->real_map_size, highest, total, out_file);
1769*08b48e0bSAndroid Build Coastguard Worker if (collect_coverage)
1770*08b48e0bSAndroid Build Coastguard Worker OKF("A coverage of %u edges were achieved out of %u existing (%.02f%%) "
1771*08b48e0bSAndroid Build Coastguard Worker "with %llu input files.",
1772*08b48e0bSAndroid Build Coastguard Worker tcnt, map_size, ((float)tcnt * 100) / (float)map_size,
1773*08b48e0bSAndroid Build Coastguard Worker fsrv->total_execs);
1774*08b48e0bSAndroid Build Coastguard Worker
1775*08b48e0bSAndroid Build Coastguard Worker }
1776*08b48e0bSAndroid Build Coastguard Worker
1777*08b48e0bSAndroid Build Coastguard Worker if (stdin_file) {
1778*08b48e0bSAndroid Build Coastguard Worker
1779*08b48e0bSAndroid Build Coastguard Worker unlink(stdin_file);
1780*08b48e0bSAndroid Build Coastguard Worker ck_free(stdin_file);
1781*08b48e0bSAndroid Build Coastguard Worker stdin_file = NULL;
1782*08b48e0bSAndroid Build Coastguard Worker
1783*08b48e0bSAndroid Build Coastguard Worker }
1784*08b48e0bSAndroid Build Coastguard Worker
1785*08b48e0bSAndroid Build Coastguard Worker remove_shm = 0;
1786*08b48e0bSAndroid Build Coastguard Worker afl_shm_deinit(&shm);
1787*08b48e0bSAndroid Build Coastguard Worker if (fsrv->use_shmem_fuzz) shm_fuzz = deinit_shmem(fsrv, shm_fuzz);
1788*08b48e0bSAndroid Build Coastguard Worker
1789*08b48e0bSAndroid Build Coastguard Worker u32 ret;
1790*08b48e0bSAndroid Build Coastguard Worker
1791*08b48e0bSAndroid Build Coastguard Worker if (cmin_mode && !!getenv("AFL_CMIN_CRASHES_ONLY")) {
1792*08b48e0bSAndroid Build Coastguard Worker
1793*08b48e0bSAndroid Build Coastguard Worker ret = fsrv->last_run_timed_out;
1794*08b48e0bSAndroid Build Coastguard Worker
1795*08b48e0bSAndroid Build Coastguard Worker } else {
1796*08b48e0bSAndroid Build Coastguard Worker
1797*08b48e0bSAndroid Build Coastguard Worker ret = child_crashed * 2 + fsrv->last_run_timed_out;
1798*08b48e0bSAndroid Build Coastguard Worker
1799*08b48e0bSAndroid Build Coastguard Worker }
1800*08b48e0bSAndroid Build Coastguard Worker
1801*08b48e0bSAndroid Build Coastguard Worker if (fsrv->target_path) { ck_free(fsrv->target_path); }
1802*08b48e0bSAndroid Build Coastguard Worker
1803*08b48e0bSAndroid Build Coastguard Worker afl_fsrv_deinit(fsrv);
1804*08b48e0bSAndroid Build Coastguard Worker
1805*08b48e0bSAndroid Build Coastguard Worker if (stdin_file) { ck_free(stdin_file); }
1806*08b48e0bSAndroid Build Coastguard Worker if (collect_coverage) { free(coverage_map); }
1807*08b48e0bSAndroid Build Coastguard Worker
1808*08b48e0bSAndroid Build Coastguard Worker argv_cpy_free(argv);
1809*08b48e0bSAndroid Build Coastguard Worker if (fsrv->qemu_mode) { free(use_argv[2]); }
1810*08b48e0bSAndroid Build Coastguard Worker
1811*08b48e0bSAndroid Build Coastguard Worker exit(ret);
1812*08b48e0bSAndroid Build Coastguard Worker
1813*08b48e0bSAndroid Build Coastguard Worker }
1814*08b48e0bSAndroid Build Coastguard Worker
1815