xref: /aosp_15_r20/external/AFLplusplus/src/afl-showmap.c (revision 08b48e0b10e97b33e7b60c5b6e2243bd915777f2)
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