xref: /aosp_15_r20/external/AFLplusplus/include/common.h (revision 08b48e0b10e97b33e7b60c5b6e2243bd915777f2)
1*08b48e0bSAndroid Build Coastguard Worker /*
2*08b48e0bSAndroid Build Coastguard Worker    american fuzzy lop++ - common routines header
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    Now maintained by Marc Heuse <[email protected]>,
8*08b48e0bSAndroid Build Coastguard Worker                      Heiko Eißfeldt <[email protected]>,
9*08b48e0bSAndroid Build Coastguard Worker                      Andrea Fioraldi <[email protected]>,
10*08b48e0bSAndroid Build Coastguard Worker                      Dominik Maier <[email protected]>
11*08b48e0bSAndroid Build Coastguard Worker 
12*08b48e0bSAndroid Build Coastguard Worker    Copyright 2016, 2017 Google Inc. All rights reserved.
13*08b48e0bSAndroid Build Coastguard Worker    Copyright 2019-2024 AFLplusplus Project. All rights reserved.
14*08b48e0bSAndroid Build Coastguard Worker 
15*08b48e0bSAndroid Build Coastguard Worker    Licensed under the Apache License, Version 2.0 (the "License");
16*08b48e0bSAndroid Build Coastguard Worker    you may not use this file except in compliance with the License.
17*08b48e0bSAndroid Build Coastguard Worker    You may obtain a copy of the License at:
18*08b48e0bSAndroid Build Coastguard Worker 
19*08b48e0bSAndroid Build Coastguard Worker      https://www.apache.org/licenses/LICENSE-2.0
20*08b48e0bSAndroid Build Coastguard Worker 
21*08b48e0bSAndroid Build Coastguard Worker    Gather some functions common to multiple executables
22*08b48e0bSAndroid Build Coastguard Worker 
23*08b48e0bSAndroid Build Coastguard Worker    - detect_file_args
24*08b48e0bSAndroid Build Coastguard Worker 
25*08b48e0bSAndroid Build Coastguard Worker  */
26*08b48e0bSAndroid Build Coastguard Worker 
27*08b48e0bSAndroid Build Coastguard Worker #ifndef __AFLCOMMON_H
28*08b48e0bSAndroid Build Coastguard Worker #define __AFLCOMMON_H
29*08b48e0bSAndroid Build Coastguard Worker 
30*08b48e0bSAndroid Build Coastguard Worker #include <stdio.h>
31*08b48e0bSAndroid Build Coastguard Worker #include <string.h>
32*08b48e0bSAndroid Build Coastguard Worker #include <unistd.h>
33*08b48e0bSAndroid Build Coastguard Worker #include <sys/time.h>
34*08b48e0bSAndroid Build Coastguard Worker #include <stdbool.h>
35*08b48e0bSAndroid Build Coastguard Worker #include "forkserver.h"
36*08b48e0bSAndroid Build Coastguard Worker #include "types.h"
37*08b48e0bSAndroid Build Coastguard Worker 
38*08b48e0bSAndroid Build Coastguard Worker /* STRINGIFY_VAL_SIZE_MAX will fit all stringify_ strings. */
39*08b48e0bSAndroid Build Coastguard Worker 
40*08b48e0bSAndroid Build Coastguard Worker #define STRINGIFY_VAL_SIZE_MAX (16)
41*08b48e0bSAndroid Build Coastguard Worker 
42*08b48e0bSAndroid Build Coastguard Worker u32  check_binary_signatures(u8 *fn);
43*08b48e0bSAndroid Build Coastguard Worker void detect_file_args(char **argv, u8 *prog_in, bool *use_stdin);
44*08b48e0bSAndroid Build Coastguard Worker void print_suggested_envs(char *mispelled_env);
45*08b48e0bSAndroid Build Coastguard Worker void check_environment_vars(char **env);
46*08b48e0bSAndroid Build Coastguard Worker void set_sanitizer_defaults();
47*08b48e0bSAndroid Build Coastguard Worker 
48*08b48e0bSAndroid Build Coastguard Worker char **argv_cpy_dup(int argc, char **argv);
49*08b48e0bSAndroid Build Coastguard Worker void   argv_cpy_free(char **argv);
50*08b48e0bSAndroid Build Coastguard Worker 
51*08b48e0bSAndroid Build Coastguard Worker char **get_cs_argv(u8 *own_loc, u8 **target_path_p, int argc, char **argv);
52*08b48e0bSAndroid Build Coastguard Worker char **get_qemu_argv(u8 *own_loc, u8 **target_path_p, int argc, char **argv);
53*08b48e0bSAndroid Build Coastguard Worker char **get_wine_argv(u8 *own_loc, u8 **target_path_p, int argc, char **argv);
54*08b48e0bSAndroid Build Coastguard Worker char  *get_afl_env(char *env);
55*08b48e0bSAndroid Build Coastguard Worker 
56*08b48e0bSAndroid Build Coastguard Worker /* Extract env vars from input string and set them using setenv()
57*08b48e0bSAndroid Build Coastguard Worker    For use with AFL_TARGET_ENV, ... */
58*08b48e0bSAndroid Build Coastguard Worker bool extract_and_set_env(u8 *env_str);
59*08b48e0bSAndroid Build Coastguard Worker 
60*08b48e0bSAndroid Build Coastguard Worker extern u8  be_quiet;
61*08b48e0bSAndroid Build Coastguard Worker extern u8 *doc_path;                    /* path to documentation dir        */
62*08b48e0bSAndroid Build Coastguard Worker 
63*08b48e0bSAndroid Build Coastguard Worker /* Find binary, used by analyze, showmap, tmin
64*08b48e0bSAndroid Build Coastguard Worker    @returns the path, allocating the string */
65*08b48e0bSAndroid Build Coastguard Worker 
66*08b48e0bSAndroid Build Coastguard Worker u8 *find_binary(u8 *fname);
67*08b48e0bSAndroid Build Coastguard Worker 
68*08b48e0bSAndroid Build Coastguard Worker /* find an afl binary */
69*08b48e0bSAndroid Build Coastguard Worker 
70*08b48e0bSAndroid Build Coastguard Worker u8 *find_afl_binary(u8 *own_loc, u8 *fname);
71*08b48e0bSAndroid Build Coastguard Worker 
72*08b48e0bSAndroid Build Coastguard Worker /* Parses the (numeric) kill signal environment variable passed
73*08b48e0bSAndroid Build Coastguard Worker    via `numeric_signal_as_str`.
74*08b48e0bSAndroid Build Coastguard Worker    If NULL is passed, the `default_signal` value is returned.
75*08b48e0bSAndroid Build Coastguard Worker    FATALs if `numeric_signal_as_str` is not a valid integer .*/
76*08b48e0bSAndroid Build Coastguard Worker int parse_afl_kill_signal(u8 *numeric_signal_as_str, int default_signal);
77*08b48e0bSAndroid Build Coastguard Worker 
78*08b48e0bSAndroid Build Coastguard Worker /* Configure the signals that are used to kill the forkserver
79*08b48e0bSAndroid Build Coastguard Worker    and the forked childs. If `afl_kill_signal_env` or `afl_fsrv_kill_signal_env`
80*08b48e0bSAndroid Build Coastguard Worker    is NULL, the appropiate values are read from the environment. */
81*08b48e0bSAndroid Build Coastguard Worker void configure_afl_kill_signals(afl_forkserver_t *fsrv,
82*08b48e0bSAndroid Build Coastguard Worker                                 char             *afl_kill_signal_env,
83*08b48e0bSAndroid Build Coastguard Worker                                 char             *afl_fsrv_kill_signal_env,
84*08b48e0bSAndroid Build Coastguard Worker                                 int               default_server_kill_signal);
85*08b48e0bSAndroid Build Coastguard Worker 
86*08b48e0bSAndroid Build Coastguard Worker /* Read a bitmap from file fname to memory
87*08b48e0bSAndroid Build Coastguard Worker    This is for the -B option again. */
88*08b48e0bSAndroid Build Coastguard Worker 
89*08b48e0bSAndroid Build Coastguard Worker void read_bitmap(u8 *fname, u8 *map, size_t len);
90*08b48e0bSAndroid Build Coastguard Worker 
91*08b48e0bSAndroid Build Coastguard Worker /* Get unix time in milliseconds */
92*08b48e0bSAndroid Build Coastguard Worker 
93*08b48e0bSAndroid Build Coastguard Worker u64 get_cur_time(void);
94*08b48e0bSAndroid Build Coastguard Worker 
95*08b48e0bSAndroid Build Coastguard Worker /* Get unix time in microseconds */
96*08b48e0bSAndroid Build Coastguard Worker 
97*08b48e0bSAndroid Build Coastguard Worker u64 get_cur_time_us(void);
98*08b48e0bSAndroid Build Coastguard Worker 
99*08b48e0bSAndroid Build Coastguard Worker /* Describe integer. The buf should be
100*08b48e0bSAndroid Build Coastguard Worker    at least 6 bytes to fit all ints we randomly see.
101*08b48e0bSAndroid Build Coastguard Worker    Will return buf for convenience. */
102*08b48e0bSAndroid Build Coastguard Worker 
103*08b48e0bSAndroid Build Coastguard Worker u8 *stringify_int(u8 *buf, size_t len, u64 val);
104*08b48e0bSAndroid Build Coastguard Worker 
105*08b48e0bSAndroid Build Coastguard Worker /* Describe float. Similar as int. */
106*08b48e0bSAndroid Build Coastguard Worker 
107*08b48e0bSAndroid Build Coastguard Worker u8 *stringify_float(u8 *buf, size_t len, double val);
108*08b48e0bSAndroid Build Coastguard Worker 
109*08b48e0bSAndroid Build Coastguard Worker /* Describe integer as memory size. */
110*08b48e0bSAndroid Build Coastguard Worker 
111*08b48e0bSAndroid Build Coastguard Worker u8 *stringify_mem_size(u8 *buf, size_t len, u64 val);
112*08b48e0bSAndroid Build Coastguard Worker 
113*08b48e0bSAndroid Build Coastguard Worker /* Describe time delta as string.
114*08b48e0bSAndroid Build Coastguard Worker    Returns a pointer to buf for convenience. */
115*08b48e0bSAndroid Build Coastguard Worker 
116*08b48e0bSAndroid Build Coastguard Worker u8 *stringify_time_diff(u8 *buf, size_t len, u64 cur_ms, u64 event_ms);
117*08b48e0bSAndroid Build Coastguard Worker 
118*08b48e0bSAndroid Build Coastguard Worker /* Unsafe describe time delta as simple string.
119*08b48e0bSAndroid Build Coastguard Worker    Returns a pointer to buf for convenience. */
120*08b48e0bSAndroid Build Coastguard Worker 
121*08b48e0bSAndroid Build Coastguard Worker u8 *u_simplestring_time_diff(u8 *buf, u64 cur_ms, u64 event_ms);
122*08b48e0bSAndroid Build Coastguard Worker 
123*08b48e0bSAndroid Build Coastguard Worker /* Unsafe Describe integer. The buf sizes are not checked.
124*08b48e0bSAndroid Build Coastguard Worker    This is unsafe but fast.
125*08b48e0bSAndroid Build Coastguard Worker    Will return buf for convenience. */
126*08b48e0bSAndroid Build Coastguard Worker 
127*08b48e0bSAndroid Build Coastguard Worker u8 *u_stringify_int(u8 *buf, u64 val);
128*08b48e0bSAndroid Build Coastguard Worker 
129*08b48e0bSAndroid Build Coastguard Worker /* Unsafe describe float. Similar as unsafe int. */
130*08b48e0bSAndroid Build Coastguard Worker 
131*08b48e0bSAndroid Build Coastguard Worker u8 *u_stringify_float(u8 *buf, double val);
132*08b48e0bSAndroid Build Coastguard Worker 
133*08b48e0bSAndroid Build Coastguard Worker /* Unsafe describe integer as memory size. */
134*08b48e0bSAndroid Build Coastguard Worker 
135*08b48e0bSAndroid Build Coastguard Worker u8 *u_stringify_mem_size(u8 *buf, u64 val);
136*08b48e0bSAndroid Build Coastguard Worker 
137*08b48e0bSAndroid Build Coastguard Worker /* Unsafe describe time delta as string.
138*08b48e0bSAndroid Build Coastguard Worker    Returns a pointer to buf for convenience. */
139*08b48e0bSAndroid Build Coastguard Worker 
140*08b48e0bSAndroid Build Coastguard Worker u8 *u_stringify_time_diff(u8 *buf, u64 cur_ms, u64 event_ms);
141*08b48e0bSAndroid Build Coastguard Worker 
142*08b48e0bSAndroid Build Coastguard Worker /* Reads the map size from ENV */
143*08b48e0bSAndroid Build Coastguard Worker u32 get_map_size(void);
144*08b48e0bSAndroid Build Coastguard Worker 
145*08b48e0bSAndroid Build Coastguard Worker /* create a stream file */
146*08b48e0bSAndroid Build Coastguard Worker FILE *create_ffile(u8 *fn);
147*08b48e0bSAndroid Build Coastguard Worker 
148*08b48e0bSAndroid Build Coastguard Worker /* create a file */
149*08b48e0bSAndroid Build Coastguard Worker s32 create_file(u8 *fn);
150*08b48e0bSAndroid Build Coastguard Worker 
151*08b48e0bSAndroid Build Coastguard Worker /* memmem implementation as not all platforms support this */
152*08b48e0bSAndroid Build Coastguard Worker void *afl_memmem(const void *haystack, size_t haystacklen, const void *needle,
153*08b48e0bSAndroid Build Coastguard Worker                  size_t needlelen);
154*08b48e0bSAndroid Build Coastguard Worker 
155*08b48e0bSAndroid Build Coastguard Worker #ifdef __linux__
156*08b48e0bSAndroid Build Coastguard Worker /* Nyx helper functions to create and remove tmp workdirs */
157*08b48e0bSAndroid Build Coastguard Worker char *create_nyx_tmp_workdir(void);
158*08b48e0bSAndroid Build Coastguard Worker void  remove_nyx_tmp_workdir(afl_forkserver_t *fsrv, char *nyx_out_dir_path);
159*08b48e0bSAndroid Build Coastguard Worker #endif
160*08b48e0bSAndroid Build Coastguard Worker 
161*08b48e0bSAndroid Build Coastguard Worker #endif
162*08b48e0bSAndroid Build Coastguard Worker 
163