1*08b48e0bSAndroid Build Coastguard Worker /*
2*08b48e0bSAndroid Build Coastguard Worker american fuzzy lop++ - fuzze_one routines in different flavours
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]> and
9*08b48e0bSAndroid Build Coastguard Worker Andrea Fioraldi <[email protected]>
10*08b48e0bSAndroid Build Coastguard Worker
11*08b48e0bSAndroid Build Coastguard Worker Copyright 2016, 2017 Google Inc. All rights reserved.
12*08b48e0bSAndroid Build Coastguard Worker Copyright 2019-2024 AFLplusplus Project. All rights reserved.
13*08b48e0bSAndroid Build Coastguard Worker
14*08b48e0bSAndroid Build Coastguard Worker Licensed under the Apache License, Version 2.0 (the "License");
15*08b48e0bSAndroid Build Coastguard Worker you may not use this file except in compliance with the License.
16*08b48e0bSAndroid Build Coastguard Worker You may obtain a copy of the License at:
17*08b48e0bSAndroid Build Coastguard Worker
18*08b48e0bSAndroid Build Coastguard Worker https://www.apache.org/licenses/LICENSE-2.0
19*08b48e0bSAndroid Build Coastguard Worker
20*08b48e0bSAndroid Build Coastguard Worker This is the real deal: the program takes an instrumented binary and
21*08b48e0bSAndroid Build Coastguard Worker attempts a variety of basic fuzzing tricks, paying close attention to
22*08b48e0bSAndroid Build Coastguard Worker how they affect the execution path.
23*08b48e0bSAndroid Build Coastguard Worker
24*08b48e0bSAndroid Build Coastguard Worker */
25*08b48e0bSAndroid Build Coastguard Worker
26*08b48e0bSAndroid Build Coastguard Worker #include "afl-fuzz.h"
27*08b48e0bSAndroid Build Coastguard Worker #include <string.h>
28*08b48e0bSAndroid Build Coastguard Worker #include <limits.h>
29*08b48e0bSAndroid Build Coastguard Worker #include "cmplog.h"
30*08b48e0bSAndroid Build Coastguard Worker #include "afl-mutations.h"
31*08b48e0bSAndroid Build Coastguard Worker
32*08b48e0bSAndroid Build Coastguard Worker /* MOpt */
33*08b48e0bSAndroid Build Coastguard Worker
select_algorithm(afl_state_t * afl,u32 max_algorithm)34*08b48e0bSAndroid Build Coastguard Worker static int select_algorithm(afl_state_t *afl, u32 max_algorithm) {
35*08b48e0bSAndroid Build Coastguard Worker
36*08b48e0bSAndroid Build Coastguard Worker int i_puppet, j_puppet = 0, operator_number = max_algorithm;
37*08b48e0bSAndroid Build Coastguard Worker
38*08b48e0bSAndroid Build Coastguard Worker double range_sele =
39*08b48e0bSAndroid Build Coastguard Worker (double)afl->probability_now[afl->swarm_now][operator_number - 1];
40*08b48e0bSAndroid Build Coastguard Worker double sele = ((double)(rand_below(afl, 10000) * 0.0001 * range_sele));
41*08b48e0bSAndroid Build Coastguard Worker
42*08b48e0bSAndroid Build Coastguard Worker for (i_puppet = 0; i_puppet < operator_num; ++i_puppet) {
43*08b48e0bSAndroid Build Coastguard Worker
44*08b48e0bSAndroid Build Coastguard Worker if (unlikely(i_puppet == 0)) {
45*08b48e0bSAndroid Build Coastguard Worker
46*08b48e0bSAndroid Build Coastguard Worker if (sele < afl->probability_now[afl->swarm_now][i_puppet]) { break; }
47*08b48e0bSAndroid Build Coastguard Worker
48*08b48e0bSAndroid Build Coastguard Worker } else {
49*08b48e0bSAndroid Build Coastguard Worker
50*08b48e0bSAndroid Build Coastguard Worker if (sele < afl->probability_now[afl->swarm_now][i_puppet]) {
51*08b48e0bSAndroid Build Coastguard Worker
52*08b48e0bSAndroid Build Coastguard Worker j_puppet = 1;
53*08b48e0bSAndroid Build Coastguard Worker break;
54*08b48e0bSAndroid Build Coastguard Worker
55*08b48e0bSAndroid Build Coastguard Worker }
56*08b48e0bSAndroid Build Coastguard Worker
57*08b48e0bSAndroid Build Coastguard Worker }
58*08b48e0bSAndroid Build Coastguard Worker
59*08b48e0bSAndroid Build Coastguard Worker }
60*08b48e0bSAndroid Build Coastguard Worker
61*08b48e0bSAndroid Build Coastguard Worker if ((j_puppet == 1 &&
62*08b48e0bSAndroid Build Coastguard Worker sele < afl->probability_now[afl->swarm_now][i_puppet - 1]) ||
63*08b48e0bSAndroid Build Coastguard Worker (i_puppet + 1 < operator_num &&
64*08b48e0bSAndroid Build Coastguard Worker sele > afl->probability_now[afl->swarm_now][i_puppet + 1])) {
65*08b48e0bSAndroid Build Coastguard Worker
66*08b48e0bSAndroid Build Coastguard Worker FATAL("error select_algorithm");
67*08b48e0bSAndroid Build Coastguard Worker
68*08b48e0bSAndroid Build Coastguard Worker }
69*08b48e0bSAndroid Build Coastguard Worker
70*08b48e0bSAndroid Build Coastguard Worker return i_puppet;
71*08b48e0bSAndroid Build Coastguard Worker
72*08b48e0bSAndroid Build Coastguard Worker }
73*08b48e0bSAndroid Build Coastguard Worker
74*08b48e0bSAndroid Build Coastguard Worker /* Helper function to see if a particular change (xor_val = old ^ new) could
75*08b48e0bSAndroid Build Coastguard Worker be a product of deterministic bit flips with the lengths and stepovers
76*08b48e0bSAndroid Build Coastguard Worker attempted by afl-fuzz. This is used to avoid dupes in some of the
77*08b48e0bSAndroid Build Coastguard Worker deterministic fuzzing operations that follow bit flips. We also
78*08b48e0bSAndroid Build Coastguard Worker return 1 if xor_val is zero, which implies that the old and attempted new
79*08b48e0bSAndroid Build Coastguard Worker values are identical and the exec would be a waste of time. */
80*08b48e0bSAndroid Build Coastguard Worker
could_be_bitflip(u32 xor_val)81*08b48e0bSAndroid Build Coastguard Worker static u8 could_be_bitflip(u32 xor_val) {
82*08b48e0bSAndroid Build Coastguard Worker
83*08b48e0bSAndroid Build Coastguard Worker u32 sh = 0;
84*08b48e0bSAndroid Build Coastguard Worker
85*08b48e0bSAndroid Build Coastguard Worker if (!xor_val) { return 1; }
86*08b48e0bSAndroid Build Coastguard Worker
87*08b48e0bSAndroid Build Coastguard Worker /* Shift left until first bit set. */
88*08b48e0bSAndroid Build Coastguard Worker
89*08b48e0bSAndroid Build Coastguard Worker while (!(xor_val & 1)) {
90*08b48e0bSAndroid Build Coastguard Worker
91*08b48e0bSAndroid Build Coastguard Worker ++sh;
92*08b48e0bSAndroid Build Coastguard Worker xor_val >>= 1;
93*08b48e0bSAndroid Build Coastguard Worker
94*08b48e0bSAndroid Build Coastguard Worker }
95*08b48e0bSAndroid Build Coastguard Worker
96*08b48e0bSAndroid Build Coastguard Worker /* 1-, 2-, and 4-bit patterns are OK anywhere. */
97*08b48e0bSAndroid Build Coastguard Worker
98*08b48e0bSAndroid Build Coastguard Worker if (xor_val == 1 || xor_val == 3 || xor_val == 15) { return 1; }
99*08b48e0bSAndroid Build Coastguard Worker
100*08b48e0bSAndroid Build Coastguard Worker /* 8-, 16-, and 32-bit patterns are OK only if shift factor is
101*08b48e0bSAndroid Build Coastguard Worker divisible by 8, since that's the stepover for these ops. */
102*08b48e0bSAndroid Build Coastguard Worker
103*08b48e0bSAndroid Build Coastguard Worker if (sh & 7) { return 0; }
104*08b48e0bSAndroid Build Coastguard Worker
105*08b48e0bSAndroid Build Coastguard Worker if (xor_val == 0xff || xor_val == 0xffff || xor_val == 0xffffffff) {
106*08b48e0bSAndroid Build Coastguard Worker
107*08b48e0bSAndroid Build Coastguard Worker return 1;
108*08b48e0bSAndroid Build Coastguard Worker
109*08b48e0bSAndroid Build Coastguard Worker }
110*08b48e0bSAndroid Build Coastguard Worker
111*08b48e0bSAndroid Build Coastguard Worker return 0;
112*08b48e0bSAndroid Build Coastguard Worker
113*08b48e0bSAndroid Build Coastguard Worker }
114*08b48e0bSAndroid Build Coastguard Worker
115*08b48e0bSAndroid Build Coastguard Worker /* Helper function to see if a particular value is reachable through
116*08b48e0bSAndroid Build Coastguard Worker arithmetic operations. Used for similar purposes. */
117*08b48e0bSAndroid Build Coastguard Worker
could_be_arith(u32 old_val,u32 new_val,u8 blen)118*08b48e0bSAndroid Build Coastguard Worker static u8 could_be_arith(u32 old_val, u32 new_val, u8 blen) {
119*08b48e0bSAndroid Build Coastguard Worker
120*08b48e0bSAndroid Build Coastguard Worker u32 i, ov = 0, nv = 0, diffs = 0;
121*08b48e0bSAndroid Build Coastguard Worker
122*08b48e0bSAndroid Build Coastguard Worker if (old_val == new_val) { return 1; }
123*08b48e0bSAndroid Build Coastguard Worker
124*08b48e0bSAndroid Build Coastguard Worker /* See if one-byte adjustments to any byte could produce this result. */
125*08b48e0bSAndroid Build Coastguard Worker
126*08b48e0bSAndroid Build Coastguard Worker for (i = 0; (u8)i < blen; ++i) {
127*08b48e0bSAndroid Build Coastguard Worker
128*08b48e0bSAndroid Build Coastguard Worker u8 a = old_val >> (8 * i), b = new_val >> (8 * i);
129*08b48e0bSAndroid Build Coastguard Worker
130*08b48e0bSAndroid Build Coastguard Worker if (a != b) {
131*08b48e0bSAndroid Build Coastguard Worker
132*08b48e0bSAndroid Build Coastguard Worker ++diffs;
133*08b48e0bSAndroid Build Coastguard Worker ov = a;
134*08b48e0bSAndroid Build Coastguard Worker nv = b;
135*08b48e0bSAndroid Build Coastguard Worker
136*08b48e0bSAndroid Build Coastguard Worker }
137*08b48e0bSAndroid Build Coastguard Worker
138*08b48e0bSAndroid Build Coastguard Worker }
139*08b48e0bSAndroid Build Coastguard Worker
140*08b48e0bSAndroid Build Coastguard Worker /* If only one byte differs and the values are within range, return 1. */
141*08b48e0bSAndroid Build Coastguard Worker
142*08b48e0bSAndroid Build Coastguard Worker if (diffs == 1) {
143*08b48e0bSAndroid Build Coastguard Worker
144*08b48e0bSAndroid Build Coastguard Worker if ((u8)(ov - nv) <= ARITH_MAX || (u8)(nv - ov) <= ARITH_MAX) { return 1; }
145*08b48e0bSAndroid Build Coastguard Worker
146*08b48e0bSAndroid Build Coastguard Worker }
147*08b48e0bSAndroid Build Coastguard Worker
148*08b48e0bSAndroid Build Coastguard Worker if (blen == 1) { return 0; }
149*08b48e0bSAndroid Build Coastguard Worker
150*08b48e0bSAndroid Build Coastguard Worker /* See if two-byte adjustments to any byte would produce this result. */
151*08b48e0bSAndroid Build Coastguard Worker
152*08b48e0bSAndroid Build Coastguard Worker diffs = 0;
153*08b48e0bSAndroid Build Coastguard Worker
154*08b48e0bSAndroid Build Coastguard Worker for (i = 0; (u8)i < blen / 2; ++i) {
155*08b48e0bSAndroid Build Coastguard Worker
156*08b48e0bSAndroid Build Coastguard Worker u16 a = old_val >> (16 * i), b = new_val >> (16 * i);
157*08b48e0bSAndroid Build Coastguard Worker
158*08b48e0bSAndroid Build Coastguard Worker if (a != b) {
159*08b48e0bSAndroid Build Coastguard Worker
160*08b48e0bSAndroid Build Coastguard Worker ++diffs;
161*08b48e0bSAndroid Build Coastguard Worker ov = a;
162*08b48e0bSAndroid Build Coastguard Worker nv = b;
163*08b48e0bSAndroid Build Coastguard Worker
164*08b48e0bSAndroid Build Coastguard Worker }
165*08b48e0bSAndroid Build Coastguard Worker
166*08b48e0bSAndroid Build Coastguard Worker }
167*08b48e0bSAndroid Build Coastguard Worker
168*08b48e0bSAndroid Build Coastguard Worker /* If only one word differs and the values are within range, return 1. */
169*08b48e0bSAndroid Build Coastguard Worker
170*08b48e0bSAndroid Build Coastguard Worker if (diffs == 1) {
171*08b48e0bSAndroid Build Coastguard Worker
172*08b48e0bSAndroid Build Coastguard Worker if ((u16)(ov - nv) <= ARITH_MAX || (u16)(nv - ov) <= ARITH_MAX) {
173*08b48e0bSAndroid Build Coastguard Worker
174*08b48e0bSAndroid Build Coastguard Worker return 1;
175*08b48e0bSAndroid Build Coastguard Worker
176*08b48e0bSAndroid Build Coastguard Worker }
177*08b48e0bSAndroid Build Coastguard Worker
178*08b48e0bSAndroid Build Coastguard Worker ov = SWAP16(ov);
179*08b48e0bSAndroid Build Coastguard Worker nv = SWAP16(nv);
180*08b48e0bSAndroid Build Coastguard Worker
181*08b48e0bSAndroid Build Coastguard Worker if ((u16)(ov - nv) <= ARITH_MAX || (u16)(nv - ov) <= ARITH_MAX) {
182*08b48e0bSAndroid Build Coastguard Worker
183*08b48e0bSAndroid Build Coastguard Worker return 1;
184*08b48e0bSAndroid Build Coastguard Worker
185*08b48e0bSAndroid Build Coastguard Worker }
186*08b48e0bSAndroid Build Coastguard Worker
187*08b48e0bSAndroid Build Coastguard Worker }
188*08b48e0bSAndroid Build Coastguard Worker
189*08b48e0bSAndroid Build Coastguard Worker /* Finally, let's do the same thing for dwords. */
190*08b48e0bSAndroid Build Coastguard Worker
191*08b48e0bSAndroid Build Coastguard Worker if (blen == 4) {
192*08b48e0bSAndroid Build Coastguard Worker
193*08b48e0bSAndroid Build Coastguard Worker if ((u32)(old_val - new_val) <= ARITH_MAX ||
194*08b48e0bSAndroid Build Coastguard Worker (u32)(new_val - old_val) <= ARITH_MAX) {
195*08b48e0bSAndroid Build Coastguard Worker
196*08b48e0bSAndroid Build Coastguard Worker return 1;
197*08b48e0bSAndroid Build Coastguard Worker
198*08b48e0bSAndroid Build Coastguard Worker }
199*08b48e0bSAndroid Build Coastguard Worker
200*08b48e0bSAndroid Build Coastguard Worker new_val = SWAP32(new_val);
201*08b48e0bSAndroid Build Coastguard Worker old_val = SWAP32(old_val);
202*08b48e0bSAndroid Build Coastguard Worker
203*08b48e0bSAndroid Build Coastguard Worker if ((u32)(old_val - new_val) <= ARITH_MAX ||
204*08b48e0bSAndroid Build Coastguard Worker (u32)(new_val - old_val) <= ARITH_MAX) {
205*08b48e0bSAndroid Build Coastguard Worker
206*08b48e0bSAndroid Build Coastguard Worker return 1;
207*08b48e0bSAndroid Build Coastguard Worker
208*08b48e0bSAndroid Build Coastguard Worker }
209*08b48e0bSAndroid Build Coastguard Worker
210*08b48e0bSAndroid Build Coastguard Worker }
211*08b48e0bSAndroid Build Coastguard Worker
212*08b48e0bSAndroid Build Coastguard Worker return 0;
213*08b48e0bSAndroid Build Coastguard Worker
214*08b48e0bSAndroid Build Coastguard Worker }
215*08b48e0bSAndroid Build Coastguard Worker
216*08b48e0bSAndroid Build Coastguard Worker /* Last but not least, a similar helper to see if insertion of an
217*08b48e0bSAndroid Build Coastguard Worker interesting integer is redundant given the insertions done for
218*08b48e0bSAndroid Build Coastguard Worker shorter blen. The last param (check_le) is set if the caller
219*08b48e0bSAndroid Build Coastguard Worker already executed LE insertion for current blen and wants to see
220*08b48e0bSAndroid Build Coastguard Worker if BE variant passed in new_val is unique. */
221*08b48e0bSAndroid Build Coastguard Worker
could_be_interest(u32 old_val,u32 new_val,u8 blen,u8 check_le)222*08b48e0bSAndroid Build Coastguard Worker static u8 could_be_interest(u32 old_val, u32 new_val, u8 blen, u8 check_le) {
223*08b48e0bSAndroid Build Coastguard Worker
224*08b48e0bSAndroid Build Coastguard Worker u32 i, j;
225*08b48e0bSAndroid Build Coastguard Worker
226*08b48e0bSAndroid Build Coastguard Worker if (old_val == new_val) { return 1; }
227*08b48e0bSAndroid Build Coastguard Worker
228*08b48e0bSAndroid Build Coastguard Worker /* See if one-byte insertions from interesting_8 over old_val could
229*08b48e0bSAndroid Build Coastguard Worker produce new_val. */
230*08b48e0bSAndroid Build Coastguard Worker
231*08b48e0bSAndroid Build Coastguard Worker for (i = 0; i < blen; ++i) {
232*08b48e0bSAndroid Build Coastguard Worker
233*08b48e0bSAndroid Build Coastguard Worker for (j = 0; j < sizeof(interesting_8); ++j) {
234*08b48e0bSAndroid Build Coastguard Worker
235*08b48e0bSAndroid Build Coastguard Worker u32 tval =
236*08b48e0bSAndroid Build Coastguard Worker (old_val & ~(0xff << (i * 8))) | (((u8)interesting_8[j]) << (i * 8));
237*08b48e0bSAndroid Build Coastguard Worker
238*08b48e0bSAndroid Build Coastguard Worker if (new_val == tval) { return 1; }
239*08b48e0bSAndroid Build Coastguard Worker
240*08b48e0bSAndroid Build Coastguard Worker }
241*08b48e0bSAndroid Build Coastguard Worker
242*08b48e0bSAndroid Build Coastguard Worker }
243*08b48e0bSAndroid Build Coastguard Worker
244*08b48e0bSAndroid Build Coastguard Worker /* Bail out unless we're also asked to examine two-byte LE insertions
245*08b48e0bSAndroid Build Coastguard Worker as a preparation for BE attempts. */
246*08b48e0bSAndroid Build Coastguard Worker
247*08b48e0bSAndroid Build Coastguard Worker if (blen == 2 && !check_le) { return 0; }
248*08b48e0bSAndroid Build Coastguard Worker
249*08b48e0bSAndroid Build Coastguard Worker /* See if two-byte insertions over old_val could give us new_val. */
250*08b48e0bSAndroid Build Coastguard Worker
251*08b48e0bSAndroid Build Coastguard Worker for (i = 0; (u8)i < blen - 1; ++i) {
252*08b48e0bSAndroid Build Coastguard Worker
253*08b48e0bSAndroid Build Coastguard Worker for (j = 0; j < sizeof(interesting_16) / 2; ++j) {
254*08b48e0bSAndroid Build Coastguard Worker
255*08b48e0bSAndroid Build Coastguard Worker u32 tval = (old_val & ~(0xffff << (i * 8))) |
256*08b48e0bSAndroid Build Coastguard Worker (((u16)interesting_16[j]) << (i * 8));
257*08b48e0bSAndroid Build Coastguard Worker
258*08b48e0bSAndroid Build Coastguard Worker if (new_val == tval) { return 1; }
259*08b48e0bSAndroid Build Coastguard Worker
260*08b48e0bSAndroid Build Coastguard Worker /* Continue here only if blen > 2. */
261*08b48e0bSAndroid Build Coastguard Worker
262*08b48e0bSAndroid Build Coastguard Worker if (blen > 2) {
263*08b48e0bSAndroid Build Coastguard Worker
264*08b48e0bSAndroid Build Coastguard Worker tval = (old_val & ~(0xffff << (i * 8))) |
265*08b48e0bSAndroid Build Coastguard Worker (SWAP16(interesting_16[j]) << (i * 8));
266*08b48e0bSAndroid Build Coastguard Worker
267*08b48e0bSAndroid Build Coastguard Worker if (new_val == tval) { return 1; }
268*08b48e0bSAndroid Build Coastguard Worker
269*08b48e0bSAndroid Build Coastguard Worker }
270*08b48e0bSAndroid Build Coastguard Worker
271*08b48e0bSAndroid Build Coastguard Worker }
272*08b48e0bSAndroid Build Coastguard Worker
273*08b48e0bSAndroid Build Coastguard Worker }
274*08b48e0bSAndroid Build Coastguard Worker
275*08b48e0bSAndroid Build Coastguard Worker if (blen == 4 && check_le) {
276*08b48e0bSAndroid Build Coastguard Worker
277*08b48e0bSAndroid Build Coastguard Worker /* See if four-byte insertions could produce the same result
278*08b48e0bSAndroid Build Coastguard Worker (LE only). */
279*08b48e0bSAndroid Build Coastguard Worker
280*08b48e0bSAndroid Build Coastguard Worker for (j = 0; j < sizeof(interesting_32) / 4; ++j) {
281*08b48e0bSAndroid Build Coastguard Worker
282*08b48e0bSAndroid Build Coastguard Worker if (new_val == (u32)interesting_32[j]) { return 1; }
283*08b48e0bSAndroid Build Coastguard Worker
284*08b48e0bSAndroid Build Coastguard Worker }
285*08b48e0bSAndroid Build Coastguard Worker
286*08b48e0bSAndroid Build Coastguard Worker }
287*08b48e0bSAndroid Build Coastguard Worker
288*08b48e0bSAndroid Build Coastguard Worker return 0;
289*08b48e0bSAndroid Build Coastguard Worker
290*08b48e0bSAndroid Build Coastguard Worker }
291*08b48e0bSAndroid Build Coastguard Worker
292*08b48e0bSAndroid Build Coastguard Worker #ifndef IGNORE_FINDS
293*08b48e0bSAndroid Build Coastguard Worker
294*08b48e0bSAndroid Build Coastguard Worker /* Helper function to compare buffers; returns first and last differing offset.
295*08b48e0bSAndroid Build Coastguard Worker We use this to find reasonable locations for splicing two files. */
296*08b48e0bSAndroid Build Coastguard Worker
locate_diffs(u8 * ptr1,u8 * ptr2,u32 len,s32 * first,s32 * last)297*08b48e0bSAndroid Build Coastguard Worker static void locate_diffs(u8 *ptr1, u8 *ptr2, u32 len, s32 *first, s32 *last) {
298*08b48e0bSAndroid Build Coastguard Worker
299*08b48e0bSAndroid Build Coastguard Worker s32 f_loc = -1;
300*08b48e0bSAndroid Build Coastguard Worker s32 l_loc = -1;
301*08b48e0bSAndroid Build Coastguard Worker u32 pos;
302*08b48e0bSAndroid Build Coastguard Worker
303*08b48e0bSAndroid Build Coastguard Worker for (pos = 0; pos < len; ++pos) {
304*08b48e0bSAndroid Build Coastguard Worker
305*08b48e0bSAndroid Build Coastguard Worker if (*(ptr1++) != *(ptr2++)) {
306*08b48e0bSAndroid Build Coastguard Worker
307*08b48e0bSAndroid Build Coastguard Worker if (f_loc == -1) { f_loc = pos; }
308*08b48e0bSAndroid Build Coastguard Worker l_loc = pos;
309*08b48e0bSAndroid Build Coastguard Worker
310*08b48e0bSAndroid Build Coastguard Worker }
311*08b48e0bSAndroid Build Coastguard Worker
312*08b48e0bSAndroid Build Coastguard Worker }
313*08b48e0bSAndroid Build Coastguard Worker
314*08b48e0bSAndroid Build Coastguard Worker *first = f_loc;
315*08b48e0bSAndroid Build Coastguard Worker *last = l_loc;
316*08b48e0bSAndroid Build Coastguard Worker
317*08b48e0bSAndroid Build Coastguard Worker return;
318*08b48e0bSAndroid Build Coastguard Worker
319*08b48e0bSAndroid Build Coastguard Worker }
320*08b48e0bSAndroid Build Coastguard Worker
321*08b48e0bSAndroid Build Coastguard Worker #endif /* !IGNORE_FINDS */
322*08b48e0bSAndroid Build Coastguard Worker
323*08b48e0bSAndroid Build Coastguard Worker /* Take the current entry from the queue, fuzz it for a while. This
324*08b48e0bSAndroid Build Coastguard Worker function is a tad too long... returns 0 if fuzzed successfully, 1 if
325*08b48e0bSAndroid Build Coastguard Worker skipped or bailed out. */
326*08b48e0bSAndroid Build Coastguard Worker
fuzz_one_original(afl_state_t * afl)327*08b48e0bSAndroid Build Coastguard Worker u8 fuzz_one_original(afl_state_t *afl) {
328*08b48e0bSAndroid Build Coastguard Worker
329*08b48e0bSAndroid Build Coastguard Worker u32 len, temp_len;
330*08b48e0bSAndroid Build Coastguard Worker u32 j;
331*08b48e0bSAndroid Build Coastguard Worker u32 i;
332*08b48e0bSAndroid Build Coastguard Worker u8 *in_buf, *out_buf, *orig_in, *ex_tmp;
333*08b48e0bSAndroid Build Coastguard Worker u64 havoc_queued = 0, orig_hit_cnt, new_hit_cnt = 0, prev_cksum, _prev_cksum;
334*08b48e0bSAndroid Build Coastguard Worker u32 splice_cycle = 0, perf_score = 100, orig_perf;
335*08b48e0bSAndroid Build Coastguard Worker
336*08b48e0bSAndroid Build Coastguard Worker u8 ret_val = 1, doing_det = 0;
337*08b48e0bSAndroid Build Coastguard Worker
338*08b48e0bSAndroid Build Coastguard Worker u8 a_collect[MAX_AUTO_EXTRA];
339*08b48e0bSAndroid Build Coastguard Worker u32 a_len = 0;
340*08b48e0bSAndroid Build Coastguard Worker
341*08b48e0bSAndroid Build Coastguard Worker #ifdef IGNORE_FINDS
342*08b48e0bSAndroid Build Coastguard Worker
343*08b48e0bSAndroid Build Coastguard Worker /* In IGNORE_FINDS mode, skip any entries that weren't in the
344*08b48e0bSAndroid Build Coastguard Worker initial data set. */
345*08b48e0bSAndroid Build Coastguard Worker
346*08b48e0bSAndroid Build Coastguard Worker if (afl->queue_cur->depth > 1) return 1;
347*08b48e0bSAndroid Build Coastguard Worker
348*08b48e0bSAndroid Build Coastguard Worker #else
349*08b48e0bSAndroid Build Coastguard Worker
350*08b48e0bSAndroid Build Coastguard Worker if (unlikely(afl->custom_mutators_count)) {
351*08b48e0bSAndroid Build Coastguard Worker
352*08b48e0bSAndroid Build Coastguard Worker /* The custom mutator will decide to skip this test case or not. */
353*08b48e0bSAndroid Build Coastguard Worker
354*08b48e0bSAndroid Build Coastguard Worker LIST_FOREACH(&afl->custom_mutator_list, struct custom_mutator, {
355*08b48e0bSAndroid Build Coastguard Worker
356*08b48e0bSAndroid Build Coastguard Worker if (el->afl_custom_queue_get &&
357*08b48e0bSAndroid Build Coastguard Worker !el->afl_custom_queue_get(el->data, afl->queue_cur->fname)) {
358*08b48e0bSAndroid Build Coastguard Worker
359*08b48e0bSAndroid Build Coastguard Worker return 1;
360*08b48e0bSAndroid Build Coastguard Worker
361*08b48e0bSAndroid Build Coastguard Worker }
362*08b48e0bSAndroid Build Coastguard Worker
363*08b48e0bSAndroid Build Coastguard Worker });
364*08b48e0bSAndroid Build Coastguard Worker
365*08b48e0bSAndroid Build Coastguard Worker }
366*08b48e0bSAndroid Build Coastguard Worker
367*08b48e0bSAndroid Build Coastguard Worker if (likely(afl->pending_favored)) {
368*08b48e0bSAndroid Build Coastguard Worker
369*08b48e0bSAndroid Build Coastguard Worker /* If we have any favored, non-fuzzed new arrivals in the queue,
370*08b48e0bSAndroid Build Coastguard Worker possibly skip to them at the expense of already-fuzzed or non-favored
371*08b48e0bSAndroid Build Coastguard Worker cases. */
372*08b48e0bSAndroid Build Coastguard Worker
373*08b48e0bSAndroid Build Coastguard Worker if ((afl->queue_cur->fuzz_level || !afl->queue_cur->favored) &&
374*08b48e0bSAndroid Build Coastguard Worker likely(rand_below(afl, 100) < SKIP_TO_NEW_PROB)) {
375*08b48e0bSAndroid Build Coastguard Worker
376*08b48e0bSAndroid Build Coastguard Worker return 1;
377*08b48e0bSAndroid Build Coastguard Worker
378*08b48e0bSAndroid Build Coastguard Worker }
379*08b48e0bSAndroid Build Coastguard Worker
380*08b48e0bSAndroid Build Coastguard Worker } else if (!afl->non_instrumented_mode && !afl->queue_cur->favored &&
381*08b48e0bSAndroid Build Coastguard Worker
382*08b48e0bSAndroid Build Coastguard Worker afl->queued_items > 10) {
383*08b48e0bSAndroid Build Coastguard Worker
384*08b48e0bSAndroid Build Coastguard Worker /* Otherwise, still possibly skip non-favored cases, albeit less often.
385*08b48e0bSAndroid Build Coastguard Worker The odds of skipping stuff are higher for already-fuzzed inputs and
386*08b48e0bSAndroid Build Coastguard Worker lower for never-fuzzed entries. */
387*08b48e0bSAndroid Build Coastguard Worker
388*08b48e0bSAndroid Build Coastguard Worker if (afl->queue_cycle > 1 && !afl->queue_cur->fuzz_level) {
389*08b48e0bSAndroid Build Coastguard Worker
390*08b48e0bSAndroid Build Coastguard Worker if (likely(rand_below(afl, 100) < SKIP_NFAV_NEW_PROB)) { return 1; }
391*08b48e0bSAndroid Build Coastguard Worker
392*08b48e0bSAndroid Build Coastguard Worker } else {
393*08b48e0bSAndroid Build Coastguard Worker
394*08b48e0bSAndroid Build Coastguard Worker if (likely(rand_below(afl, 100) < SKIP_NFAV_OLD_PROB)) { return 1; }
395*08b48e0bSAndroid Build Coastguard Worker
396*08b48e0bSAndroid Build Coastguard Worker }
397*08b48e0bSAndroid Build Coastguard Worker
398*08b48e0bSAndroid Build Coastguard Worker }
399*08b48e0bSAndroid Build Coastguard Worker
400*08b48e0bSAndroid Build Coastguard Worker #endif /* ^IGNORE_FINDS */
401*08b48e0bSAndroid Build Coastguard Worker
402*08b48e0bSAndroid Build Coastguard Worker if (likely(afl->not_on_tty)) {
403*08b48e0bSAndroid Build Coastguard Worker
404*08b48e0bSAndroid Build Coastguard Worker u8 time_tmp[64];
405*08b48e0bSAndroid Build Coastguard Worker
406*08b48e0bSAndroid Build Coastguard Worker u_simplestring_time_diff(time_tmp, afl->prev_run_time + get_cur_time(),
407*08b48e0bSAndroid Build Coastguard Worker afl->start_time);
408*08b48e0bSAndroid Build Coastguard Worker ACTF(
409*08b48e0bSAndroid Build Coastguard Worker "Fuzzing test case #%u (%u total, %llu crashes saved, state: %s, "
410*08b48e0bSAndroid Build Coastguard Worker "mode=%s, "
411*08b48e0bSAndroid Build Coastguard Worker "perf_score=%0.0f, weight=%0.0f, favorite=%u, was_fuzzed=%u, "
412*08b48e0bSAndroid Build Coastguard Worker "exec_us=%llu, hits=%u, map=%u, ascii=%u, run_time=%s)...",
413*08b48e0bSAndroid Build Coastguard Worker afl->current_entry, afl->queued_items, afl->saved_crashes,
414*08b48e0bSAndroid Build Coastguard Worker get_fuzzing_state(afl), afl->fuzz_mode ? "exploit" : "explore",
415*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->perf_score, afl->queue_cur->weight,
416*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->favored, afl->queue_cur->was_fuzzed,
417*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->exec_us,
418*08b48e0bSAndroid Build Coastguard Worker likely(afl->n_fuzz) ? afl->n_fuzz[afl->queue_cur->n_fuzz_entry] : 0,
419*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->bitmap_size, afl->queue_cur->is_ascii, time_tmp);
420*08b48e0bSAndroid Build Coastguard Worker fflush(stdout);
421*08b48e0bSAndroid Build Coastguard Worker
422*08b48e0bSAndroid Build Coastguard Worker }
423*08b48e0bSAndroid Build Coastguard Worker
424*08b48e0bSAndroid Build Coastguard Worker orig_in = in_buf = queue_testcase_get(afl, afl->queue_cur);
425*08b48e0bSAndroid Build Coastguard Worker len = afl->queue_cur->len;
426*08b48e0bSAndroid Build Coastguard Worker
427*08b48e0bSAndroid Build Coastguard Worker out_buf = afl_realloc(AFL_BUF_PARAM(out), len);
428*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!out_buf)) { PFATAL("alloc"); }
429*08b48e0bSAndroid Build Coastguard Worker
430*08b48e0bSAndroid Build Coastguard Worker afl->subseq_tmouts = 0;
431*08b48e0bSAndroid Build Coastguard Worker
432*08b48e0bSAndroid Build Coastguard Worker afl->cur_depth = afl->queue_cur->depth;
433*08b48e0bSAndroid Build Coastguard Worker
434*08b48e0bSAndroid Build Coastguard Worker /*******************************************
435*08b48e0bSAndroid Build Coastguard Worker * CALIBRATION (only if failed earlier on) *
436*08b48e0bSAndroid Build Coastguard Worker *******************************************/
437*08b48e0bSAndroid Build Coastguard Worker
438*08b48e0bSAndroid Build Coastguard Worker if (unlikely(afl->queue_cur->cal_failed)) {
439*08b48e0bSAndroid Build Coastguard Worker
440*08b48e0bSAndroid Build Coastguard Worker u8 res = FSRV_RUN_TMOUT;
441*08b48e0bSAndroid Build Coastguard Worker
442*08b48e0bSAndroid Build Coastguard Worker if (afl->queue_cur->cal_failed < CAL_CHANCES) {
443*08b48e0bSAndroid Build Coastguard Worker
444*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->exec_cksum = 0;
445*08b48e0bSAndroid Build Coastguard Worker
446*08b48e0bSAndroid Build Coastguard Worker res =
447*08b48e0bSAndroid Build Coastguard Worker calibrate_case(afl, afl->queue_cur, in_buf, afl->queue_cycle - 1, 0);
448*08b48e0bSAndroid Build Coastguard Worker
449*08b48e0bSAndroid Build Coastguard Worker if (unlikely(res == FSRV_RUN_ERROR)) {
450*08b48e0bSAndroid Build Coastguard Worker
451*08b48e0bSAndroid Build Coastguard Worker FATAL("Unable to execute target application");
452*08b48e0bSAndroid Build Coastguard Worker
453*08b48e0bSAndroid Build Coastguard Worker }
454*08b48e0bSAndroid Build Coastguard Worker
455*08b48e0bSAndroid Build Coastguard Worker }
456*08b48e0bSAndroid Build Coastguard Worker
457*08b48e0bSAndroid Build Coastguard Worker if (unlikely(afl->stop_soon) || res != afl->crash_mode) {
458*08b48e0bSAndroid Build Coastguard Worker
459*08b48e0bSAndroid Build Coastguard Worker ++afl->cur_skipped_items;
460*08b48e0bSAndroid Build Coastguard Worker goto abandon_entry;
461*08b48e0bSAndroid Build Coastguard Worker
462*08b48e0bSAndroid Build Coastguard Worker }
463*08b48e0bSAndroid Build Coastguard Worker
464*08b48e0bSAndroid Build Coastguard Worker }
465*08b48e0bSAndroid Build Coastguard Worker
466*08b48e0bSAndroid Build Coastguard Worker /************
467*08b48e0bSAndroid Build Coastguard Worker * TRIMMING *
468*08b48e0bSAndroid Build Coastguard Worker ************/
469*08b48e0bSAndroid Build Coastguard Worker
470*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!afl->non_instrumented_mode && !afl->queue_cur->trim_done &&
471*08b48e0bSAndroid Build Coastguard Worker !afl->disable_trim)) {
472*08b48e0bSAndroid Build Coastguard Worker
473*08b48e0bSAndroid Build Coastguard Worker u32 old_len = afl->queue_cur->len;
474*08b48e0bSAndroid Build Coastguard Worker
475*08b48e0bSAndroid Build Coastguard Worker u8 res = trim_case(afl, afl->queue_cur, in_buf);
476*08b48e0bSAndroid Build Coastguard Worker orig_in = in_buf = queue_testcase_get(afl, afl->queue_cur);
477*08b48e0bSAndroid Build Coastguard Worker
478*08b48e0bSAndroid Build Coastguard Worker if (unlikely(res == FSRV_RUN_ERROR)) {
479*08b48e0bSAndroid Build Coastguard Worker
480*08b48e0bSAndroid Build Coastguard Worker FATAL("Unable to execute target application");
481*08b48e0bSAndroid Build Coastguard Worker
482*08b48e0bSAndroid Build Coastguard Worker }
483*08b48e0bSAndroid Build Coastguard Worker
484*08b48e0bSAndroid Build Coastguard Worker if (unlikely(afl->stop_soon)) {
485*08b48e0bSAndroid Build Coastguard Worker
486*08b48e0bSAndroid Build Coastguard Worker ++afl->cur_skipped_items;
487*08b48e0bSAndroid Build Coastguard Worker goto abandon_entry;
488*08b48e0bSAndroid Build Coastguard Worker
489*08b48e0bSAndroid Build Coastguard Worker }
490*08b48e0bSAndroid Build Coastguard Worker
491*08b48e0bSAndroid Build Coastguard Worker /* Don't retry trimming, even if it failed. */
492*08b48e0bSAndroid Build Coastguard Worker
493*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->trim_done = 1;
494*08b48e0bSAndroid Build Coastguard Worker
495*08b48e0bSAndroid Build Coastguard Worker len = afl->queue_cur->len;
496*08b48e0bSAndroid Build Coastguard Worker
497*08b48e0bSAndroid Build Coastguard Worker /* maybe current entry is not ready for splicing anymore */
498*08b48e0bSAndroid Build Coastguard Worker if (unlikely(len <= 4 && old_len > 4)) --afl->ready_for_splicing_count;
499*08b48e0bSAndroid Build Coastguard Worker
500*08b48e0bSAndroid Build Coastguard Worker }
501*08b48e0bSAndroid Build Coastguard Worker
502*08b48e0bSAndroid Build Coastguard Worker memcpy(out_buf, in_buf, len);
503*08b48e0bSAndroid Build Coastguard Worker
504*08b48e0bSAndroid Build Coastguard Worker /*********************
505*08b48e0bSAndroid Build Coastguard Worker * PERFORMANCE SCORE *
506*08b48e0bSAndroid Build Coastguard Worker *********************/
507*08b48e0bSAndroid Build Coastguard Worker
508*08b48e0bSAndroid Build Coastguard Worker if (likely(!afl->old_seed_selection))
509*08b48e0bSAndroid Build Coastguard Worker orig_perf = perf_score = afl->queue_cur->perf_score;
510*08b48e0bSAndroid Build Coastguard Worker else
511*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->perf_score = orig_perf = perf_score =
512*08b48e0bSAndroid Build Coastguard Worker calculate_score(afl, afl->queue_cur);
513*08b48e0bSAndroid Build Coastguard Worker
514*08b48e0bSAndroid Build Coastguard Worker if (unlikely(perf_score <= 0 && afl->active_items > 1)) {
515*08b48e0bSAndroid Build Coastguard Worker
516*08b48e0bSAndroid Build Coastguard Worker goto abandon_entry;
517*08b48e0bSAndroid Build Coastguard Worker
518*08b48e0bSAndroid Build Coastguard Worker }
519*08b48e0bSAndroid Build Coastguard Worker
520*08b48e0bSAndroid Build Coastguard Worker if (unlikely(afl->shm.cmplog_mode &&
521*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->colorized < afl->cmplog_lvl &&
522*08b48e0bSAndroid Build Coastguard Worker (u32)len <= afl->cmplog_max_filesize)) {
523*08b48e0bSAndroid Build Coastguard Worker
524*08b48e0bSAndroid Build Coastguard Worker if (unlikely(len < 4)) {
525*08b48e0bSAndroid Build Coastguard Worker
526*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->colorized = CMPLOG_LVL_MAX;
527*08b48e0bSAndroid Build Coastguard Worker
528*08b48e0bSAndroid Build Coastguard Worker } else {
529*08b48e0bSAndroid Build Coastguard Worker
530*08b48e0bSAndroid Build Coastguard Worker if (afl->queue_cur->favored || afl->cmplog_lvl == 3 ||
531*08b48e0bSAndroid Build Coastguard Worker (afl->cmplog_lvl == 2 &&
532*08b48e0bSAndroid Build Coastguard Worker (afl->queue_cur->tc_ref ||
533*08b48e0bSAndroid Build Coastguard Worker afl->fsrv.total_execs % afl->queued_items <= 10)) ||
534*08b48e0bSAndroid Build Coastguard Worker get_cur_time() - afl->last_find_time > 250000) { // 250 seconds
535*08b48e0bSAndroid Build Coastguard Worker
536*08b48e0bSAndroid Build Coastguard Worker if (input_to_state_stage(afl, in_buf, out_buf, len)) {
537*08b48e0bSAndroid Build Coastguard Worker
538*08b48e0bSAndroid Build Coastguard Worker goto abandon_entry;
539*08b48e0bSAndroid Build Coastguard Worker
540*08b48e0bSAndroid Build Coastguard Worker }
541*08b48e0bSAndroid Build Coastguard Worker
542*08b48e0bSAndroid Build Coastguard Worker }
543*08b48e0bSAndroid Build Coastguard Worker
544*08b48e0bSAndroid Build Coastguard Worker }
545*08b48e0bSAndroid Build Coastguard Worker
546*08b48e0bSAndroid Build Coastguard Worker }
547*08b48e0bSAndroid Build Coastguard Worker
548*08b48e0bSAndroid Build Coastguard Worker u64 before_det_time = get_cur_time();
549*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
550*08b48e0bSAndroid Build Coastguard Worker
551*08b48e0bSAndroid Build Coastguard Worker u64 before_havoc_time;
552*08b48e0bSAndroid Build Coastguard Worker u32 before_det_findings = afl->queued_items,
553*08b48e0bSAndroid Build Coastguard Worker before_det_edges = count_non_255_bytes(afl, afl->virgin_bits),
554*08b48e0bSAndroid Build Coastguard Worker before_havoc_findings, before_havoc_edges;
555*08b48e0bSAndroid Build Coastguard Worker u8 is_logged = 0;
556*08b48e0bSAndroid Build Coastguard Worker
557*08b48e0bSAndroid Build Coastguard Worker #endif
558*08b48e0bSAndroid Build Coastguard Worker if (!afl->skip_deterministic) {
559*08b48e0bSAndroid Build Coastguard Worker
560*08b48e0bSAndroid Build Coastguard Worker if (!skip_deterministic_stage(afl, in_buf, out_buf, len, before_det_time)) {
561*08b48e0bSAndroid Build Coastguard Worker
562*08b48e0bSAndroid Build Coastguard Worker goto abandon_entry;
563*08b48e0bSAndroid Build Coastguard Worker
564*08b48e0bSAndroid Build Coastguard Worker }
565*08b48e0bSAndroid Build Coastguard Worker
566*08b48e0bSAndroid Build Coastguard Worker }
567*08b48e0bSAndroid Build Coastguard Worker
568*08b48e0bSAndroid Build Coastguard Worker u8 *skip_eff_map = afl->queue_cur->skipdet_e->skip_eff_map;
569*08b48e0bSAndroid Build Coastguard Worker
570*08b48e0bSAndroid Build Coastguard Worker /* Skip right away if -d is given, if it has not been chosen sufficiently
571*08b48e0bSAndroid Build Coastguard Worker often to warrant the expensive deterministic stage (fuzz_level), or
572*08b48e0bSAndroid Build Coastguard Worker if it has gone through deterministic testing in earlier, resumed runs
573*08b48e0bSAndroid Build Coastguard Worker (passed_det). */
574*08b48e0bSAndroid Build Coastguard Worker /* if skipdet decide to skip the seed or no interesting bytes found,
575*08b48e0bSAndroid Build Coastguard Worker we skip the whole deterministic stage as well */
576*08b48e0bSAndroid Build Coastguard Worker
577*08b48e0bSAndroid Build Coastguard Worker if (likely(afl->skip_deterministic) || likely(afl->queue_cur->passed_det) ||
578*08b48e0bSAndroid Build Coastguard Worker likely(!afl->queue_cur->skipdet_e->quick_eff_bytes) ||
579*08b48e0bSAndroid Build Coastguard Worker likely(perf_score <
580*08b48e0bSAndroid Build Coastguard Worker (afl->queue_cur->depth * 30 <= afl->havoc_max_mult * 100
581*08b48e0bSAndroid Build Coastguard Worker ? afl->queue_cur->depth * 30
582*08b48e0bSAndroid Build Coastguard Worker : afl->havoc_max_mult * 100))) {
583*08b48e0bSAndroid Build Coastguard Worker
584*08b48e0bSAndroid Build Coastguard Worker goto custom_mutator_stage;
585*08b48e0bSAndroid Build Coastguard Worker
586*08b48e0bSAndroid Build Coastguard Worker }
587*08b48e0bSAndroid Build Coastguard Worker
588*08b48e0bSAndroid Build Coastguard Worker /* Skip deterministic fuzzing if exec path checksum puts this out of scope
589*08b48e0bSAndroid Build Coastguard Worker for this main instance. */
590*08b48e0bSAndroid Build Coastguard Worker
591*08b48e0bSAndroid Build Coastguard Worker if (unlikely(afl->main_node_max &&
592*08b48e0bSAndroid Build Coastguard Worker (afl->queue_cur->exec_cksum % afl->main_node_max) !=
593*08b48e0bSAndroid Build Coastguard Worker afl->main_node_id - 1)) {
594*08b48e0bSAndroid Build Coastguard Worker
595*08b48e0bSAndroid Build Coastguard Worker goto custom_mutator_stage;
596*08b48e0bSAndroid Build Coastguard Worker
597*08b48e0bSAndroid Build Coastguard Worker }
598*08b48e0bSAndroid Build Coastguard Worker
599*08b48e0bSAndroid Build Coastguard Worker doing_det = 1;
600*08b48e0bSAndroid Build Coastguard Worker
601*08b48e0bSAndroid Build Coastguard Worker /*********************************************
602*08b48e0bSAndroid Build Coastguard Worker * SIMPLE BITFLIP (+dictionary construction) *
603*08b48e0bSAndroid Build Coastguard Worker *********************************************/
604*08b48e0bSAndroid Build Coastguard Worker
605*08b48e0bSAndroid Build Coastguard Worker #define FLIP_BIT(_ar, _b) \
606*08b48e0bSAndroid Build Coastguard Worker do { \
607*08b48e0bSAndroid Build Coastguard Worker \
608*08b48e0bSAndroid Build Coastguard Worker u8 *_arf = (u8 *)(_ar); \
609*08b48e0bSAndroid Build Coastguard Worker u32 _bf = (_b); \
610*08b48e0bSAndroid Build Coastguard Worker _arf[(_bf) >> 3] ^= (128 >> ((_bf) & 7)); \
611*08b48e0bSAndroid Build Coastguard Worker \
612*08b48e0bSAndroid Build Coastguard Worker } while (0)
613*08b48e0bSAndroid Build Coastguard Worker
614*08b48e0bSAndroid Build Coastguard Worker /* Single walking bit. */
615*08b48e0bSAndroid Build Coastguard Worker
616*08b48e0bSAndroid Build Coastguard Worker afl->stage_short = "flip1";
617*08b48e0bSAndroid Build Coastguard Worker afl->stage_max = len << 3;
618*08b48e0bSAndroid Build Coastguard Worker afl->stage_name = "bitflip 1/1";
619*08b48e0bSAndroid Build Coastguard Worker
620*08b48e0bSAndroid Build Coastguard Worker afl->stage_val_type = STAGE_VAL_NONE;
621*08b48e0bSAndroid Build Coastguard Worker
622*08b48e0bSAndroid Build Coastguard Worker orig_hit_cnt = afl->queued_items + afl->saved_crashes;
623*08b48e0bSAndroid Build Coastguard Worker
624*08b48e0bSAndroid Build Coastguard Worker /* Get a clean cksum. */
625*08b48e0bSAndroid Build Coastguard Worker
626*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, out_buf, len)) { goto abandon_entry; }
627*08b48e0bSAndroid Build Coastguard Worker
628*08b48e0bSAndroid Build Coastguard Worker prev_cksum = hash64(afl->fsrv.trace_bits, afl->fsrv.map_size, HASH_CONST);
629*08b48e0bSAndroid Build Coastguard Worker _prev_cksum = prev_cksum;
630*08b48e0bSAndroid Build Coastguard Worker
631*08b48e0bSAndroid Build Coastguard Worker /* Now flip bits. */
632*08b48e0bSAndroid Build Coastguard Worker
633*08b48e0bSAndroid Build Coastguard Worker for (afl->stage_cur = 0; afl->stage_cur < afl->stage_max; ++afl->stage_cur) {
634*08b48e0bSAndroid Build Coastguard Worker
635*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_byte = afl->stage_cur >> 3;
636*08b48e0bSAndroid Build Coastguard Worker
637*08b48e0bSAndroid Build Coastguard Worker if (!skip_eff_map[afl->stage_cur_byte]) continue;
638*08b48e0bSAndroid Build Coastguard Worker
639*08b48e0bSAndroid Build Coastguard Worker if (is_det_timeout(before_det_time, 0)) { goto custom_mutator_stage; }
640*08b48e0bSAndroid Build Coastguard Worker
641*08b48e0bSAndroid Build Coastguard Worker FLIP_BIT(out_buf, afl->stage_cur);
642*08b48e0bSAndroid Build Coastguard Worker
643*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
644*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->mutation, sizeof(afl->mutation), "%s FLIP_BIT1-%u",
645*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->fname, afl->stage_cur);
646*08b48e0bSAndroid Build Coastguard Worker #endif
647*08b48e0bSAndroid Build Coastguard Worker
648*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, out_buf, len)) { goto abandon_entry; }
649*08b48e0bSAndroid Build Coastguard Worker
650*08b48e0bSAndroid Build Coastguard Worker FLIP_BIT(out_buf, afl->stage_cur);
651*08b48e0bSAndroid Build Coastguard Worker
652*08b48e0bSAndroid Build Coastguard Worker /* While flipping the least significant bit in every byte, pull of an extra
653*08b48e0bSAndroid Build Coastguard Worker trick to detect possible syntax tokens. In essence, the idea is that if
654*08b48e0bSAndroid Build Coastguard Worker you have a binary blob like this:
655*08b48e0bSAndroid Build Coastguard Worker
656*08b48e0bSAndroid Build Coastguard Worker xxxxxxxxIHDRxxxxxxxx
657*08b48e0bSAndroid Build Coastguard Worker
658*08b48e0bSAndroid Build Coastguard Worker ...and changing the leading and trailing bytes causes variable or no
659*08b48e0bSAndroid Build Coastguard Worker changes in program flow, but touching any character in the "IHDR" string
660*08b48e0bSAndroid Build Coastguard Worker always produces the same, distinctive path, it's highly likely that
661*08b48e0bSAndroid Build Coastguard Worker "IHDR" is an atomically-checked magic value of special significance to
662*08b48e0bSAndroid Build Coastguard Worker the fuzzed format.
663*08b48e0bSAndroid Build Coastguard Worker
664*08b48e0bSAndroid Build Coastguard Worker We do this here, rather than as a separate stage, because it's a nice
665*08b48e0bSAndroid Build Coastguard Worker way to keep the operation approximately "free" (i.e., no extra execs).
666*08b48e0bSAndroid Build Coastguard Worker
667*08b48e0bSAndroid Build Coastguard Worker Empirically, performing the check when flipping the least significant bit
668*08b48e0bSAndroid Build Coastguard Worker is advantageous, compared to doing it at the time of more disruptive
669*08b48e0bSAndroid Build Coastguard Worker changes, where the program flow may be affected in more violent ways.
670*08b48e0bSAndroid Build Coastguard Worker
671*08b48e0bSAndroid Build Coastguard Worker The caveat is that we won't generate dictionaries in the -d mode or -S
672*08b48e0bSAndroid Build Coastguard Worker mode - but that's probably a fair trade-off.
673*08b48e0bSAndroid Build Coastguard Worker
674*08b48e0bSAndroid Build Coastguard Worker This won't work particularly well with paths that exhibit variable
675*08b48e0bSAndroid Build Coastguard Worker behavior, but fails gracefully, so we'll carry out the checks anyway.
676*08b48e0bSAndroid Build Coastguard Worker
677*08b48e0bSAndroid Build Coastguard Worker */
678*08b48e0bSAndroid Build Coastguard Worker
679*08b48e0bSAndroid Build Coastguard Worker if (!afl->non_instrumented_mode && (afl->stage_cur & 7) == 7) {
680*08b48e0bSAndroid Build Coastguard Worker
681*08b48e0bSAndroid Build Coastguard Worker u64 cksum = hash64(afl->fsrv.trace_bits, afl->fsrv.map_size, HASH_CONST);
682*08b48e0bSAndroid Build Coastguard Worker
683*08b48e0bSAndroid Build Coastguard Worker if (afl->stage_cur == afl->stage_max - 1 && cksum == prev_cksum) {
684*08b48e0bSAndroid Build Coastguard Worker
685*08b48e0bSAndroid Build Coastguard Worker /* If at end of file and we are still collecting a string, grab the
686*08b48e0bSAndroid Build Coastguard Worker final character and force output. */
687*08b48e0bSAndroid Build Coastguard Worker
688*08b48e0bSAndroid Build Coastguard Worker if (a_len < MAX_AUTO_EXTRA) {
689*08b48e0bSAndroid Build Coastguard Worker
690*08b48e0bSAndroid Build Coastguard Worker a_collect[a_len] = out_buf[afl->stage_cur >> 3];
691*08b48e0bSAndroid Build Coastguard Worker
692*08b48e0bSAndroid Build Coastguard Worker }
693*08b48e0bSAndroid Build Coastguard Worker
694*08b48e0bSAndroid Build Coastguard Worker ++a_len;
695*08b48e0bSAndroid Build Coastguard Worker
696*08b48e0bSAndroid Build Coastguard Worker if (a_len >= MIN_AUTO_EXTRA && a_len <= MAX_AUTO_EXTRA) {
697*08b48e0bSAndroid Build Coastguard Worker
698*08b48e0bSAndroid Build Coastguard Worker maybe_add_auto(afl, a_collect, a_len);
699*08b48e0bSAndroid Build Coastguard Worker
700*08b48e0bSAndroid Build Coastguard Worker }
701*08b48e0bSAndroid Build Coastguard Worker
702*08b48e0bSAndroid Build Coastguard Worker } else if (cksum != prev_cksum) {
703*08b48e0bSAndroid Build Coastguard Worker
704*08b48e0bSAndroid Build Coastguard Worker /* Otherwise, if the checksum has changed, see if we have something
705*08b48e0bSAndroid Build Coastguard Worker worthwhile queued up, and collect that if the answer is yes. */
706*08b48e0bSAndroid Build Coastguard Worker
707*08b48e0bSAndroid Build Coastguard Worker if (a_len >= MIN_AUTO_EXTRA && a_len <= MAX_AUTO_EXTRA) {
708*08b48e0bSAndroid Build Coastguard Worker
709*08b48e0bSAndroid Build Coastguard Worker maybe_add_auto(afl, a_collect, a_len);
710*08b48e0bSAndroid Build Coastguard Worker
711*08b48e0bSAndroid Build Coastguard Worker }
712*08b48e0bSAndroid Build Coastguard Worker
713*08b48e0bSAndroid Build Coastguard Worker a_len = 0;
714*08b48e0bSAndroid Build Coastguard Worker prev_cksum = cksum;
715*08b48e0bSAndroid Build Coastguard Worker
716*08b48e0bSAndroid Build Coastguard Worker }
717*08b48e0bSAndroid Build Coastguard Worker
718*08b48e0bSAndroid Build Coastguard Worker /* Continue collecting string, but only if the bit flip actually made
719*08b48e0bSAndroid Build Coastguard Worker any difference - we don't want no-op tokens. */
720*08b48e0bSAndroid Build Coastguard Worker
721*08b48e0bSAndroid Build Coastguard Worker if (cksum != _prev_cksum) {
722*08b48e0bSAndroid Build Coastguard Worker
723*08b48e0bSAndroid Build Coastguard Worker if (a_len < MAX_AUTO_EXTRA) {
724*08b48e0bSAndroid Build Coastguard Worker
725*08b48e0bSAndroid Build Coastguard Worker a_collect[a_len] = out_buf[afl->stage_cur >> 3];
726*08b48e0bSAndroid Build Coastguard Worker
727*08b48e0bSAndroid Build Coastguard Worker }
728*08b48e0bSAndroid Build Coastguard Worker
729*08b48e0bSAndroid Build Coastguard Worker ++a_len;
730*08b48e0bSAndroid Build Coastguard Worker
731*08b48e0bSAndroid Build Coastguard Worker }
732*08b48e0bSAndroid Build Coastguard Worker
733*08b48e0bSAndroid Build Coastguard Worker }
734*08b48e0bSAndroid Build Coastguard Worker
735*08b48e0bSAndroid Build Coastguard Worker }
736*08b48e0bSAndroid Build Coastguard Worker
737*08b48e0bSAndroid Build Coastguard Worker new_hit_cnt = afl->queued_items + afl->saved_crashes;
738*08b48e0bSAndroid Build Coastguard Worker
739*08b48e0bSAndroid Build Coastguard Worker afl->stage_finds[STAGE_FLIP1] += new_hit_cnt - orig_hit_cnt;
740*08b48e0bSAndroid Build Coastguard Worker afl->stage_cycles[STAGE_FLIP1] += afl->stage_max;
741*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
742*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->stats_mutated += afl->stage_max;
743*08b48e0bSAndroid Build Coastguard Worker #endif
744*08b48e0bSAndroid Build Coastguard Worker
745*08b48e0bSAndroid Build Coastguard Worker /* Two walking bits. */
746*08b48e0bSAndroid Build Coastguard Worker
747*08b48e0bSAndroid Build Coastguard Worker afl->stage_name = "bitflip 2/1";
748*08b48e0bSAndroid Build Coastguard Worker afl->stage_short = "flip2";
749*08b48e0bSAndroid Build Coastguard Worker afl->stage_max = (len << 3) - 1;
750*08b48e0bSAndroid Build Coastguard Worker
751*08b48e0bSAndroid Build Coastguard Worker orig_hit_cnt = new_hit_cnt;
752*08b48e0bSAndroid Build Coastguard Worker
753*08b48e0bSAndroid Build Coastguard Worker for (afl->stage_cur = 0; afl->stage_cur < afl->stage_max; ++afl->stage_cur) {
754*08b48e0bSAndroid Build Coastguard Worker
755*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_byte = afl->stage_cur >> 3;
756*08b48e0bSAndroid Build Coastguard Worker
757*08b48e0bSAndroid Build Coastguard Worker if (!skip_eff_map[afl->stage_cur_byte]) continue;
758*08b48e0bSAndroid Build Coastguard Worker
759*08b48e0bSAndroid Build Coastguard Worker if (is_det_timeout(before_det_time, 0)) { goto custom_mutator_stage; }
760*08b48e0bSAndroid Build Coastguard Worker
761*08b48e0bSAndroid Build Coastguard Worker FLIP_BIT(out_buf, afl->stage_cur);
762*08b48e0bSAndroid Build Coastguard Worker FLIP_BIT(out_buf, afl->stage_cur + 1);
763*08b48e0bSAndroid Build Coastguard Worker
764*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
765*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->mutation, sizeof(afl->mutation), "%s FLIP_BIT2-%u",
766*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->fname, afl->stage_cur);
767*08b48e0bSAndroid Build Coastguard Worker #endif
768*08b48e0bSAndroid Build Coastguard Worker
769*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, out_buf, len)) { goto abandon_entry; }
770*08b48e0bSAndroid Build Coastguard Worker
771*08b48e0bSAndroid Build Coastguard Worker FLIP_BIT(out_buf, afl->stage_cur);
772*08b48e0bSAndroid Build Coastguard Worker FLIP_BIT(out_buf, afl->stage_cur + 1);
773*08b48e0bSAndroid Build Coastguard Worker
774*08b48e0bSAndroid Build Coastguard Worker }
775*08b48e0bSAndroid Build Coastguard Worker
776*08b48e0bSAndroid Build Coastguard Worker new_hit_cnt = afl->queued_items + afl->saved_crashes;
777*08b48e0bSAndroid Build Coastguard Worker
778*08b48e0bSAndroid Build Coastguard Worker afl->stage_finds[STAGE_FLIP2] += new_hit_cnt - orig_hit_cnt;
779*08b48e0bSAndroid Build Coastguard Worker afl->stage_cycles[STAGE_FLIP2] += afl->stage_max;
780*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
781*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->stats_mutated += afl->stage_max;
782*08b48e0bSAndroid Build Coastguard Worker #endif
783*08b48e0bSAndroid Build Coastguard Worker
784*08b48e0bSAndroid Build Coastguard Worker /* Four walking bits. */
785*08b48e0bSAndroid Build Coastguard Worker
786*08b48e0bSAndroid Build Coastguard Worker afl->stage_name = "bitflip 4/1";
787*08b48e0bSAndroid Build Coastguard Worker afl->stage_short = "flip4";
788*08b48e0bSAndroid Build Coastguard Worker afl->stage_max = (len << 3) - 3;
789*08b48e0bSAndroid Build Coastguard Worker
790*08b48e0bSAndroid Build Coastguard Worker orig_hit_cnt = new_hit_cnt;
791*08b48e0bSAndroid Build Coastguard Worker
792*08b48e0bSAndroid Build Coastguard Worker for (afl->stage_cur = 0; afl->stage_cur < afl->stage_max; ++afl->stage_cur) {
793*08b48e0bSAndroid Build Coastguard Worker
794*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_byte = afl->stage_cur >> 3;
795*08b48e0bSAndroid Build Coastguard Worker
796*08b48e0bSAndroid Build Coastguard Worker if (!skip_eff_map[afl->stage_cur_byte]) continue;
797*08b48e0bSAndroid Build Coastguard Worker
798*08b48e0bSAndroid Build Coastguard Worker if (is_det_timeout(before_det_time, 0)) { goto custom_mutator_stage; }
799*08b48e0bSAndroid Build Coastguard Worker
800*08b48e0bSAndroid Build Coastguard Worker FLIP_BIT(out_buf, afl->stage_cur);
801*08b48e0bSAndroid Build Coastguard Worker FLIP_BIT(out_buf, afl->stage_cur + 1);
802*08b48e0bSAndroid Build Coastguard Worker FLIP_BIT(out_buf, afl->stage_cur + 2);
803*08b48e0bSAndroid Build Coastguard Worker FLIP_BIT(out_buf, afl->stage_cur + 3);
804*08b48e0bSAndroid Build Coastguard Worker
805*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
806*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->mutation, sizeof(afl->mutation), "%s FLIP_BIT4-%u",
807*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->fname, afl->stage_cur);
808*08b48e0bSAndroid Build Coastguard Worker #endif
809*08b48e0bSAndroid Build Coastguard Worker
810*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, out_buf, len)) { goto abandon_entry; }
811*08b48e0bSAndroid Build Coastguard Worker
812*08b48e0bSAndroid Build Coastguard Worker FLIP_BIT(out_buf, afl->stage_cur);
813*08b48e0bSAndroid Build Coastguard Worker FLIP_BIT(out_buf, afl->stage_cur + 1);
814*08b48e0bSAndroid Build Coastguard Worker FLIP_BIT(out_buf, afl->stage_cur + 2);
815*08b48e0bSAndroid Build Coastguard Worker FLIP_BIT(out_buf, afl->stage_cur + 3);
816*08b48e0bSAndroid Build Coastguard Worker
817*08b48e0bSAndroid Build Coastguard Worker }
818*08b48e0bSAndroid Build Coastguard Worker
819*08b48e0bSAndroid Build Coastguard Worker new_hit_cnt = afl->queued_items + afl->saved_crashes;
820*08b48e0bSAndroid Build Coastguard Worker
821*08b48e0bSAndroid Build Coastguard Worker afl->stage_finds[STAGE_FLIP4] += new_hit_cnt - orig_hit_cnt;
822*08b48e0bSAndroid Build Coastguard Worker afl->stage_cycles[STAGE_FLIP4] += afl->stage_max;
823*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
824*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->stats_mutated += afl->stage_max;
825*08b48e0bSAndroid Build Coastguard Worker #endif
826*08b48e0bSAndroid Build Coastguard Worker
827*08b48e0bSAndroid Build Coastguard Worker /* Walking byte. */
828*08b48e0bSAndroid Build Coastguard Worker
829*08b48e0bSAndroid Build Coastguard Worker afl->stage_name = "bitflip 8/8";
830*08b48e0bSAndroid Build Coastguard Worker afl->stage_short = "flip8";
831*08b48e0bSAndroid Build Coastguard Worker afl->stage_max = len;
832*08b48e0bSAndroid Build Coastguard Worker
833*08b48e0bSAndroid Build Coastguard Worker orig_hit_cnt = new_hit_cnt;
834*08b48e0bSAndroid Build Coastguard Worker prev_cksum = _prev_cksum;
835*08b48e0bSAndroid Build Coastguard Worker
836*08b48e0bSAndroid Build Coastguard Worker for (afl->stage_cur = 0; afl->stage_cur < afl->stage_max; ++afl->stage_cur) {
837*08b48e0bSAndroid Build Coastguard Worker
838*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_byte = afl->stage_cur;
839*08b48e0bSAndroid Build Coastguard Worker
840*08b48e0bSAndroid Build Coastguard Worker if (!skip_eff_map[afl->stage_cur_byte]) continue;
841*08b48e0bSAndroid Build Coastguard Worker
842*08b48e0bSAndroid Build Coastguard Worker if (is_det_timeout(before_det_time, 0)) { goto custom_mutator_stage; }
843*08b48e0bSAndroid Build Coastguard Worker
844*08b48e0bSAndroid Build Coastguard Worker out_buf[afl->stage_cur] ^= 0xFF;
845*08b48e0bSAndroid Build Coastguard Worker
846*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
847*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->mutation, sizeof(afl->mutation), "%s FLIP_BIT8-%u",
848*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->fname, afl->stage_cur);
849*08b48e0bSAndroid Build Coastguard Worker #endif
850*08b48e0bSAndroid Build Coastguard Worker
851*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, out_buf, len)) { goto abandon_entry; }
852*08b48e0bSAndroid Build Coastguard Worker
853*08b48e0bSAndroid Build Coastguard Worker out_buf[afl->stage_cur] ^= 0xFF;
854*08b48e0bSAndroid Build Coastguard Worker
855*08b48e0bSAndroid Build Coastguard Worker }
856*08b48e0bSAndroid Build Coastguard Worker
857*08b48e0bSAndroid Build Coastguard Worker /* New effective bytes calculation. */
858*08b48e0bSAndroid Build Coastguard Worker
859*08b48e0bSAndroid Build Coastguard Worker for (i = 0; i < len; i++) {
860*08b48e0bSAndroid Build Coastguard Worker
861*08b48e0bSAndroid Build Coastguard Worker if (skip_eff_map[i]) afl->blocks_eff_select += 1;
862*08b48e0bSAndroid Build Coastguard Worker
863*08b48e0bSAndroid Build Coastguard Worker }
864*08b48e0bSAndroid Build Coastguard Worker
865*08b48e0bSAndroid Build Coastguard Worker afl->blocks_eff_total += len;
866*08b48e0bSAndroid Build Coastguard Worker
867*08b48e0bSAndroid Build Coastguard Worker new_hit_cnt = afl->queued_items + afl->saved_crashes;
868*08b48e0bSAndroid Build Coastguard Worker
869*08b48e0bSAndroid Build Coastguard Worker afl->stage_finds[STAGE_FLIP8] += new_hit_cnt - orig_hit_cnt;
870*08b48e0bSAndroid Build Coastguard Worker afl->stage_cycles[STAGE_FLIP8] += afl->stage_max;
871*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
872*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->stats_mutated += afl->stage_max;
873*08b48e0bSAndroid Build Coastguard Worker #endif
874*08b48e0bSAndroid Build Coastguard Worker
875*08b48e0bSAndroid Build Coastguard Worker /* Two walking bytes. */
876*08b48e0bSAndroid Build Coastguard Worker
877*08b48e0bSAndroid Build Coastguard Worker if (len < 2) { goto skip_bitflip; }
878*08b48e0bSAndroid Build Coastguard Worker
879*08b48e0bSAndroid Build Coastguard Worker afl->stage_name = "bitflip 16/8";
880*08b48e0bSAndroid Build Coastguard Worker afl->stage_short = "flip16";
881*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur = 0;
882*08b48e0bSAndroid Build Coastguard Worker afl->stage_max = len - 1;
883*08b48e0bSAndroid Build Coastguard Worker
884*08b48e0bSAndroid Build Coastguard Worker orig_hit_cnt = new_hit_cnt;
885*08b48e0bSAndroid Build Coastguard Worker
886*08b48e0bSAndroid Build Coastguard Worker for (i = 0; i < len - 1; ++i) {
887*08b48e0bSAndroid Build Coastguard Worker
888*08b48e0bSAndroid Build Coastguard Worker /* Let's consult the effector map... */
889*08b48e0bSAndroid Build Coastguard Worker
890*08b48e0bSAndroid Build Coastguard Worker if (!skip_eff_map[i]) continue;
891*08b48e0bSAndroid Build Coastguard Worker
892*08b48e0bSAndroid Build Coastguard Worker if (is_det_timeout(before_det_time, 0)) { goto custom_mutator_stage; }
893*08b48e0bSAndroid Build Coastguard Worker
894*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_byte = i;
895*08b48e0bSAndroid Build Coastguard Worker
896*08b48e0bSAndroid Build Coastguard Worker *(u16 *)(out_buf + i) ^= 0xFFFF;
897*08b48e0bSAndroid Build Coastguard Worker
898*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
899*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->mutation, sizeof(afl->mutation), "%s FLIP_BIT16-%u",
900*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->fname, afl->stage_cur);
901*08b48e0bSAndroid Build Coastguard Worker #endif
902*08b48e0bSAndroid Build Coastguard Worker
903*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, out_buf, len)) { goto abandon_entry; }
904*08b48e0bSAndroid Build Coastguard Worker ++afl->stage_cur;
905*08b48e0bSAndroid Build Coastguard Worker
906*08b48e0bSAndroid Build Coastguard Worker *(u16 *)(out_buf + i) ^= 0xFFFF;
907*08b48e0bSAndroid Build Coastguard Worker
908*08b48e0bSAndroid Build Coastguard Worker }
909*08b48e0bSAndroid Build Coastguard Worker
910*08b48e0bSAndroid Build Coastguard Worker new_hit_cnt = afl->queued_items + afl->saved_crashes;
911*08b48e0bSAndroid Build Coastguard Worker
912*08b48e0bSAndroid Build Coastguard Worker afl->stage_finds[STAGE_FLIP16] += new_hit_cnt - orig_hit_cnt;
913*08b48e0bSAndroid Build Coastguard Worker afl->stage_cycles[STAGE_FLIP16] += afl->stage_max;
914*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
915*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->stats_mutated += afl->stage_max;
916*08b48e0bSAndroid Build Coastguard Worker #endif
917*08b48e0bSAndroid Build Coastguard Worker
918*08b48e0bSAndroid Build Coastguard Worker if (len < 4) { goto skip_bitflip; }
919*08b48e0bSAndroid Build Coastguard Worker
920*08b48e0bSAndroid Build Coastguard Worker /* Four walking bytes. */
921*08b48e0bSAndroid Build Coastguard Worker
922*08b48e0bSAndroid Build Coastguard Worker afl->stage_name = "bitflip 32/8";
923*08b48e0bSAndroid Build Coastguard Worker afl->stage_short = "flip32";
924*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur = 0;
925*08b48e0bSAndroid Build Coastguard Worker afl->stage_max = len - 3;
926*08b48e0bSAndroid Build Coastguard Worker
927*08b48e0bSAndroid Build Coastguard Worker orig_hit_cnt = new_hit_cnt;
928*08b48e0bSAndroid Build Coastguard Worker
929*08b48e0bSAndroid Build Coastguard Worker for (i = 0; i < len - 3; ++i) {
930*08b48e0bSAndroid Build Coastguard Worker
931*08b48e0bSAndroid Build Coastguard Worker /* Let's consult the effector map... */
932*08b48e0bSAndroid Build Coastguard Worker
933*08b48e0bSAndroid Build Coastguard Worker if (!skip_eff_map[i]) continue;
934*08b48e0bSAndroid Build Coastguard Worker
935*08b48e0bSAndroid Build Coastguard Worker if (is_det_timeout(before_det_time, 0)) { goto custom_mutator_stage; }
936*08b48e0bSAndroid Build Coastguard Worker
937*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_byte = i;
938*08b48e0bSAndroid Build Coastguard Worker
939*08b48e0bSAndroid Build Coastguard Worker *(u32 *)(out_buf + i) ^= 0xFFFFFFFF;
940*08b48e0bSAndroid Build Coastguard Worker
941*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
942*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->mutation, sizeof(afl->mutation), "%s FLIP_BIT32-%u",
943*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->fname, afl->stage_cur);
944*08b48e0bSAndroid Build Coastguard Worker #endif
945*08b48e0bSAndroid Build Coastguard Worker
946*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, out_buf, len)) { goto abandon_entry; }
947*08b48e0bSAndroid Build Coastguard Worker ++afl->stage_cur;
948*08b48e0bSAndroid Build Coastguard Worker
949*08b48e0bSAndroid Build Coastguard Worker *(u32 *)(out_buf + i) ^= 0xFFFFFFFF;
950*08b48e0bSAndroid Build Coastguard Worker
951*08b48e0bSAndroid Build Coastguard Worker }
952*08b48e0bSAndroid Build Coastguard Worker
953*08b48e0bSAndroid Build Coastguard Worker new_hit_cnt = afl->queued_items + afl->saved_crashes;
954*08b48e0bSAndroid Build Coastguard Worker
955*08b48e0bSAndroid Build Coastguard Worker afl->stage_finds[STAGE_FLIP32] += new_hit_cnt - orig_hit_cnt;
956*08b48e0bSAndroid Build Coastguard Worker afl->stage_cycles[STAGE_FLIP32] += afl->stage_max;
957*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
958*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->stats_mutated += afl->stage_max;
959*08b48e0bSAndroid Build Coastguard Worker #endif
960*08b48e0bSAndroid Build Coastguard Worker
961*08b48e0bSAndroid Build Coastguard Worker skip_bitflip:
962*08b48e0bSAndroid Build Coastguard Worker
963*08b48e0bSAndroid Build Coastguard Worker if (afl->no_arith) { goto skip_arith; }
964*08b48e0bSAndroid Build Coastguard Worker
965*08b48e0bSAndroid Build Coastguard Worker /**********************
966*08b48e0bSAndroid Build Coastguard Worker * ARITHMETIC INC/DEC *
967*08b48e0bSAndroid Build Coastguard Worker **********************/
968*08b48e0bSAndroid Build Coastguard Worker
969*08b48e0bSAndroid Build Coastguard Worker /* 8-bit arithmetics. */
970*08b48e0bSAndroid Build Coastguard Worker
971*08b48e0bSAndroid Build Coastguard Worker afl->stage_name = "arith 8/8";
972*08b48e0bSAndroid Build Coastguard Worker afl->stage_short = "arith8";
973*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur = 0;
974*08b48e0bSAndroid Build Coastguard Worker afl->stage_max = 2 * len * ARITH_MAX;
975*08b48e0bSAndroid Build Coastguard Worker
976*08b48e0bSAndroid Build Coastguard Worker afl->stage_val_type = STAGE_VAL_LE;
977*08b48e0bSAndroid Build Coastguard Worker
978*08b48e0bSAndroid Build Coastguard Worker orig_hit_cnt = new_hit_cnt;
979*08b48e0bSAndroid Build Coastguard Worker
980*08b48e0bSAndroid Build Coastguard Worker for (i = 0; i < (u32)len; ++i) {
981*08b48e0bSAndroid Build Coastguard Worker
982*08b48e0bSAndroid Build Coastguard Worker u8 orig = out_buf[i];
983*08b48e0bSAndroid Build Coastguard Worker
984*08b48e0bSAndroid Build Coastguard Worker /* Let's consult the effector map... */
985*08b48e0bSAndroid Build Coastguard Worker
986*08b48e0bSAndroid Build Coastguard Worker if (!skip_eff_map[i]) continue;
987*08b48e0bSAndroid Build Coastguard Worker
988*08b48e0bSAndroid Build Coastguard Worker if (is_det_timeout(before_det_time, 0)) { goto custom_mutator_stage; }
989*08b48e0bSAndroid Build Coastguard Worker
990*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_byte = i;
991*08b48e0bSAndroid Build Coastguard Worker
992*08b48e0bSAndroid Build Coastguard Worker for (j = 1; j <= ARITH_MAX; ++j) {
993*08b48e0bSAndroid Build Coastguard Worker
994*08b48e0bSAndroid Build Coastguard Worker u8 r = orig ^ (orig + j);
995*08b48e0bSAndroid Build Coastguard Worker
996*08b48e0bSAndroid Build Coastguard Worker /* Do arithmetic operations only if the result couldn't be a product
997*08b48e0bSAndroid Build Coastguard Worker of a bitflip. */
998*08b48e0bSAndroid Build Coastguard Worker
999*08b48e0bSAndroid Build Coastguard Worker if (!could_be_bitflip(r)) {
1000*08b48e0bSAndroid Build Coastguard Worker
1001*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_val = j;
1002*08b48e0bSAndroid Build Coastguard Worker out_buf[i] = orig + j;
1003*08b48e0bSAndroid Build Coastguard Worker
1004*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
1005*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->mutation, sizeof(afl->mutation), "%s ARITH8+-%u-%u",
1006*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->fname, i, j);
1007*08b48e0bSAndroid Build Coastguard Worker #endif
1008*08b48e0bSAndroid Build Coastguard Worker
1009*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, out_buf, len)) { goto abandon_entry; }
1010*08b48e0bSAndroid Build Coastguard Worker ++afl->stage_cur;
1011*08b48e0bSAndroid Build Coastguard Worker
1012*08b48e0bSAndroid Build Coastguard Worker } else {
1013*08b48e0bSAndroid Build Coastguard Worker
1014*08b48e0bSAndroid Build Coastguard Worker --afl->stage_max;
1015*08b48e0bSAndroid Build Coastguard Worker
1016*08b48e0bSAndroid Build Coastguard Worker }
1017*08b48e0bSAndroid Build Coastguard Worker
1018*08b48e0bSAndroid Build Coastguard Worker r = orig ^ (orig - j);
1019*08b48e0bSAndroid Build Coastguard Worker
1020*08b48e0bSAndroid Build Coastguard Worker if (!could_be_bitflip(r)) {
1021*08b48e0bSAndroid Build Coastguard Worker
1022*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_val = -j;
1023*08b48e0bSAndroid Build Coastguard Worker out_buf[i] = orig - j;
1024*08b48e0bSAndroid Build Coastguard Worker
1025*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
1026*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->mutation, sizeof(afl->mutation), "%s ARITH8--%u-%u",
1027*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->fname, i, j);
1028*08b48e0bSAndroid Build Coastguard Worker #endif
1029*08b48e0bSAndroid Build Coastguard Worker
1030*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, out_buf, len)) { goto abandon_entry; }
1031*08b48e0bSAndroid Build Coastguard Worker ++afl->stage_cur;
1032*08b48e0bSAndroid Build Coastguard Worker
1033*08b48e0bSAndroid Build Coastguard Worker } else {
1034*08b48e0bSAndroid Build Coastguard Worker
1035*08b48e0bSAndroid Build Coastguard Worker --afl->stage_max;
1036*08b48e0bSAndroid Build Coastguard Worker
1037*08b48e0bSAndroid Build Coastguard Worker }
1038*08b48e0bSAndroid Build Coastguard Worker
1039*08b48e0bSAndroid Build Coastguard Worker out_buf[i] = orig;
1040*08b48e0bSAndroid Build Coastguard Worker
1041*08b48e0bSAndroid Build Coastguard Worker }
1042*08b48e0bSAndroid Build Coastguard Worker
1043*08b48e0bSAndroid Build Coastguard Worker }
1044*08b48e0bSAndroid Build Coastguard Worker
1045*08b48e0bSAndroid Build Coastguard Worker new_hit_cnt = afl->queued_items + afl->saved_crashes;
1046*08b48e0bSAndroid Build Coastguard Worker
1047*08b48e0bSAndroid Build Coastguard Worker afl->stage_finds[STAGE_ARITH8] += new_hit_cnt - orig_hit_cnt;
1048*08b48e0bSAndroid Build Coastguard Worker afl->stage_cycles[STAGE_ARITH8] += afl->stage_max;
1049*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
1050*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->stats_mutated += afl->stage_max;
1051*08b48e0bSAndroid Build Coastguard Worker #endif
1052*08b48e0bSAndroid Build Coastguard Worker
1053*08b48e0bSAndroid Build Coastguard Worker /* 16-bit arithmetics, both endians. */
1054*08b48e0bSAndroid Build Coastguard Worker
1055*08b48e0bSAndroid Build Coastguard Worker if (len < 2) { goto skip_arith; }
1056*08b48e0bSAndroid Build Coastguard Worker
1057*08b48e0bSAndroid Build Coastguard Worker afl->stage_name = "arith 16/8";
1058*08b48e0bSAndroid Build Coastguard Worker afl->stage_short = "arith16";
1059*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur = 0;
1060*08b48e0bSAndroid Build Coastguard Worker afl->stage_max = 4 * (len - 1) * ARITH_MAX;
1061*08b48e0bSAndroid Build Coastguard Worker
1062*08b48e0bSAndroid Build Coastguard Worker orig_hit_cnt = new_hit_cnt;
1063*08b48e0bSAndroid Build Coastguard Worker
1064*08b48e0bSAndroid Build Coastguard Worker for (i = 0; i < (u32)len - 1; ++i) {
1065*08b48e0bSAndroid Build Coastguard Worker
1066*08b48e0bSAndroid Build Coastguard Worker u16 orig = *(u16 *)(out_buf + i);
1067*08b48e0bSAndroid Build Coastguard Worker
1068*08b48e0bSAndroid Build Coastguard Worker /* Let's consult the effector map... */
1069*08b48e0bSAndroid Build Coastguard Worker
1070*08b48e0bSAndroid Build Coastguard Worker if (!skip_eff_map[i]) continue;
1071*08b48e0bSAndroid Build Coastguard Worker
1072*08b48e0bSAndroid Build Coastguard Worker if (is_det_timeout(before_det_time, 0)) { goto custom_mutator_stage; }
1073*08b48e0bSAndroid Build Coastguard Worker
1074*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_byte = i;
1075*08b48e0bSAndroid Build Coastguard Worker
1076*08b48e0bSAndroid Build Coastguard Worker for (j = 1; j <= ARITH_MAX; ++j) {
1077*08b48e0bSAndroid Build Coastguard Worker
1078*08b48e0bSAndroid Build Coastguard Worker u16 r1 = orig ^ (orig + j), r2 = orig ^ (orig - j),
1079*08b48e0bSAndroid Build Coastguard Worker r3 = orig ^ SWAP16(SWAP16(orig) + j),
1080*08b48e0bSAndroid Build Coastguard Worker r4 = orig ^ SWAP16(SWAP16(orig) - j);
1081*08b48e0bSAndroid Build Coastguard Worker
1082*08b48e0bSAndroid Build Coastguard Worker /* Try little endian addition and subtraction first. Do it only
1083*08b48e0bSAndroid Build Coastguard Worker if the operation would affect more than one byte (hence the
1084*08b48e0bSAndroid Build Coastguard Worker & 0xff overflow checks) and if it couldn't be a product of
1085*08b48e0bSAndroid Build Coastguard Worker a bitflip. */
1086*08b48e0bSAndroid Build Coastguard Worker
1087*08b48e0bSAndroid Build Coastguard Worker afl->stage_val_type = STAGE_VAL_LE;
1088*08b48e0bSAndroid Build Coastguard Worker
1089*08b48e0bSAndroid Build Coastguard Worker if ((orig & 0xff) + j > 0xff && !could_be_bitflip(r1)) {
1090*08b48e0bSAndroid Build Coastguard Worker
1091*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_val = j;
1092*08b48e0bSAndroid Build Coastguard Worker *(u16 *)(out_buf + i) = orig + j;
1093*08b48e0bSAndroid Build Coastguard Worker
1094*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
1095*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->mutation, sizeof(afl->mutation), "%s ARITH16+-%u-%u",
1096*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->fname, i, j);
1097*08b48e0bSAndroid Build Coastguard Worker #endif
1098*08b48e0bSAndroid Build Coastguard Worker
1099*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, out_buf, len)) { goto abandon_entry; }
1100*08b48e0bSAndroid Build Coastguard Worker ++afl->stage_cur;
1101*08b48e0bSAndroid Build Coastguard Worker
1102*08b48e0bSAndroid Build Coastguard Worker } else {
1103*08b48e0bSAndroid Build Coastguard Worker
1104*08b48e0bSAndroid Build Coastguard Worker --afl->stage_max;
1105*08b48e0bSAndroid Build Coastguard Worker
1106*08b48e0bSAndroid Build Coastguard Worker }
1107*08b48e0bSAndroid Build Coastguard Worker
1108*08b48e0bSAndroid Build Coastguard Worker if ((orig & 0xff) < j && !could_be_bitflip(r2)) {
1109*08b48e0bSAndroid Build Coastguard Worker
1110*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_val = -j;
1111*08b48e0bSAndroid Build Coastguard Worker *(u16 *)(out_buf + i) = orig - j;
1112*08b48e0bSAndroid Build Coastguard Worker
1113*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
1114*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->mutation, sizeof(afl->mutation), "%s ARITH16--%u-%u",
1115*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->fname, i, j);
1116*08b48e0bSAndroid Build Coastguard Worker #endif
1117*08b48e0bSAndroid Build Coastguard Worker
1118*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, out_buf, len)) { goto abandon_entry; }
1119*08b48e0bSAndroid Build Coastguard Worker ++afl->stage_cur;
1120*08b48e0bSAndroid Build Coastguard Worker
1121*08b48e0bSAndroid Build Coastguard Worker } else {
1122*08b48e0bSAndroid Build Coastguard Worker
1123*08b48e0bSAndroid Build Coastguard Worker --afl->stage_max;
1124*08b48e0bSAndroid Build Coastguard Worker
1125*08b48e0bSAndroid Build Coastguard Worker }
1126*08b48e0bSAndroid Build Coastguard Worker
1127*08b48e0bSAndroid Build Coastguard Worker /* Big endian comes next. Same deal. */
1128*08b48e0bSAndroid Build Coastguard Worker
1129*08b48e0bSAndroid Build Coastguard Worker afl->stage_val_type = STAGE_VAL_BE;
1130*08b48e0bSAndroid Build Coastguard Worker
1131*08b48e0bSAndroid Build Coastguard Worker if ((orig >> 8) + j > 0xff && !could_be_bitflip(r3)) {
1132*08b48e0bSAndroid Build Coastguard Worker
1133*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_val = j;
1134*08b48e0bSAndroid Build Coastguard Worker *(u16 *)(out_buf + i) = SWAP16(SWAP16(orig) + j);
1135*08b48e0bSAndroid Build Coastguard Worker
1136*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
1137*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->mutation, sizeof(afl->mutation), "%s ARITH16+BE-%u-%u",
1138*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->fname, i, j);
1139*08b48e0bSAndroid Build Coastguard Worker #endif
1140*08b48e0bSAndroid Build Coastguard Worker
1141*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, out_buf, len)) { goto abandon_entry; }
1142*08b48e0bSAndroid Build Coastguard Worker ++afl->stage_cur;
1143*08b48e0bSAndroid Build Coastguard Worker
1144*08b48e0bSAndroid Build Coastguard Worker } else {
1145*08b48e0bSAndroid Build Coastguard Worker
1146*08b48e0bSAndroid Build Coastguard Worker --afl->stage_max;
1147*08b48e0bSAndroid Build Coastguard Worker
1148*08b48e0bSAndroid Build Coastguard Worker }
1149*08b48e0bSAndroid Build Coastguard Worker
1150*08b48e0bSAndroid Build Coastguard Worker if ((orig >> 8) < j && !could_be_bitflip(r4)) {
1151*08b48e0bSAndroid Build Coastguard Worker
1152*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_val = -j;
1153*08b48e0bSAndroid Build Coastguard Worker *(u16 *)(out_buf + i) = SWAP16(SWAP16(orig) - j);
1154*08b48e0bSAndroid Build Coastguard Worker
1155*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
1156*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->mutation, sizeof(afl->mutation), "%s ARITH16_BE-%u-%u",
1157*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->fname, i, j);
1158*08b48e0bSAndroid Build Coastguard Worker #endif
1159*08b48e0bSAndroid Build Coastguard Worker
1160*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, out_buf, len)) { goto abandon_entry; }
1161*08b48e0bSAndroid Build Coastguard Worker ++afl->stage_cur;
1162*08b48e0bSAndroid Build Coastguard Worker
1163*08b48e0bSAndroid Build Coastguard Worker } else {
1164*08b48e0bSAndroid Build Coastguard Worker
1165*08b48e0bSAndroid Build Coastguard Worker --afl->stage_max;
1166*08b48e0bSAndroid Build Coastguard Worker
1167*08b48e0bSAndroid Build Coastguard Worker }
1168*08b48e0bSAndroid Build Coastguard Worker
1169*08b48e0bSAndroid Build Coastguard Worker *(u16 *)(out_buf + i) = orig;
1170*08b48e0bSAndroid Build Coastguard Worker
1171*08b48e0bSAndroid Build Coastguard Worker }
1172*08b48e0bSAndroid Build Coastguard Worker
1173*08b48e0bSAndroid Build Coastguard Worker }
1174*08b48e0bSAndroid Build Coastguard Worker
1175*08b48e0bSAndroid Build Coastguard Worker new_hit_cnt = afl->queued_items + afl->saved_crashes;
1176*08b48e0bSAndroid Build Coastguard Worker
1177*08b48e0bSAndroid Build Coastguard Worker afl->stage_finds[STAGE_ARITH16] += new_hit_cnt - orig_hit_cnt;
1178*08b48e0bSAndroid Build Coastguard Worker afl->stage_cycles[STAGE_ARITH16] += afl->stage_max;
1179*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
1180*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->stats_mutated += afl->stage_max;
1181*08b48e0bSAndroid Build Coastguard Worker #endif
1182*08b48e0bSAndroid Build Coastguard Worker
1183*08b48e0bSAndroid Build Coastguard Worker /* 32-bit arithmetics, both endians. */
1184*08b48e0bSAndroid Build Coastguard Worker
1185*08b48e0bSAndroid Build Coastguard Worker if (len < 4) { goto skip_arith; }
1186*08b48e0bSAndroid Build Coastguard Worker
1187*08b48e0bSAndroid Build Coastguard Worker afl->stage_name = "arith 32/8";
1188*08b48e0bSAndroid Build Coastguard Worker afl->stage_short = "arith32";
1189*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur = 0;
1190*08b48e0bSAndroid Build Coastguard Worker afl->stage_max = 4 * (len - 3) * ARITH_MAX;
1191*08b48e0bSAndroid Build Coastguard Worker
1192*08b48e0bSAndroid Build Coastguard Worker orig_hit_cnt = new_hit_cnt;
1193*08b48e0bSAndroid Build Coastguard Worker
1194*08b48e0bSAndroid Build Coastguard Worker for (i = 0; i < (u32)len - 3; ++i) {
1195*08b48e0bSAndroid Build Coastguard Worker
1196*08b48e0bSAndroid Build Coastguard Worker u32 orig = *(u32 *)(out_buf + i);
1197*08b48e0bSAndroid Build Coastguard Worker
1198*08b48e0bSAndroid Build Coastguard Worker /* Let's consult the effector map... */
1199*08b48e0bSAndroid Build Coastguard Worker
1200*08b48e0bSAndroid Build Coastguard Worker if (!skip_eff_map[i]) continue;
1201*08b48e0bSAndroid Build Coastguard Worker
1202*08b48e0bSAndroid Build Coastguard Worker if (is_det_timeout(before_det_time, 0)) { goto custom_mutator_stage; }
1203*08b48e0bSAndroid Build Coastguard Worker
1204*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_byte = i;
1205*08b48e0bSAndroid Build Coastguard Worker
1206*08b48e0bSAndroid Build Coastguard Worker for (j = 1; j <= ARITH_MAX; ++j) {
1207*08b48e0bSAndroid Build Coastguard Worker
1208*08b48e0bSAndroid Build Coastguard Worker u32 r1 = orig ^ (orig + j), r2 = orig ^ (orig - j),
1209*08b48e0bSAndroid Build Coastguard Worker r3 = orig ^ SWAP32(SWAP32(orig) + j),
1210*08b48e0bSAndroid Build Coastguard Worker r4 = orig ^ SWAP32(SWAP32(orig) - j);
1211*08b48e0bSAndroid Build Coastguard Worker
1212*08b48e0bSAndroid Build Coastguard Worker /* Little endian first. Same deal as with 16-bit: we only want to
1213*08b48e0bSAndroid Build Coastguard Worker try if the operation would have effect on more than two bytes. */
1214*08b48e0bSAndroid Build Coastguard Worker
1215*08b48e0bSAndroid Build Coastguard Worker afl->stage_val_type = STAGE_VAL_LE;
1216*08b48e0bSAndroid Build Coastguard Worker
1217*08b48e0bSAndroid Build Coastguard Worker if ((orig & 0xffff) + j > 0xffff && !could_be_bitflip(r1)) {
1218*08b48e0bSAndroid Build Coastguard Worker
1219*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_val = j;
1220*08b48e0bSAndroid Build Coastguard Worker *(u32 *)(out_buf + i) = orig + j;
1221*08b48e0bSAndroid Build Coastguard Worker
1222*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
1223*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->mutation, sizeof(afl->mutation), "%s ARITH32+-%u-%u",
1224*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->fname, i, j);
1225*08b48e0bSAndroid Build Coastguard Worker #endif
1226*08b48e0bSAndroid Build Coastguard Worker
1227*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, out_buf, len)) { goto abandon_entry; }
1228*08b48e0bSAndroid Build Coastguard Worker ++afl->stage_cur;
1229*08b48e0bSAndroid Build Coastguard Worker
1230*08b48e0bSAndroid Build Coastguard Worker } else {
1231*08b48e0bSAndroid Build Coastguard Worker
1232*08b48e0bSAndroid Build Coastguard Worker --afl->stage_max;
1233*08b48e0bSAndroid Build Coastguard Worker
1234*08b48e0bSAndroid Build Coastguard Worker }
1235*08b48e0bSAndroid Build Coastguard Worker
1236*08b48e0bSAndroid Build Coastguard Worker if ((orig & 0xffff) < (u32)j && !could_be_bitflip(r2)) {
1237*08b48e0bSAndroid Build Coastguard Worker
1238*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_val = -j;
1239*08b48e0bSAndroid Build Coastguard Worker *(u32 *)(out_buf + i) = orig - j;
1240*08b48e0bSAndroid Build Coastguard Worker
1241*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
1242*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->mutation, sizeof(afl->mutation), "%s ARITH32_-%u-%u",
1243*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->fname, i, j);
1244*08b48e0bSAndroid Build Coastguard Worker #endif
1245*08b48e0bSAndroid Build Coastguard Worker
1246*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, out_buf, len)) { goto abandon_entry; }
1247*08b48e0bSAndroid Build Coastguard Worker ++afl->stage_cur;
1248*08b48e0bSAndroid Build Coastguard Worker
1249*08b48e0bSAndroid Build Coastguard Worker } else {
1250*08b48e0bSAndroid Build Coastguard Worker
1251*08b48e0bSAndroid Build Coastguard Worker --afl->stage_max;
1252*08b48e0bSAndroid Build Coastguard Worker
1253*08b48e0bSAndroid Build Coastguard Worker }
1254*08b48e0bSAndroid Build Coastguard Worker
1255*08b48e0bSAndroid Build Coastguard Worker /* Big endian next. */
1256*08b48e0bSAndroid Build Coastguard Worker
1257*08b48e0bSAndroid Build Coastguard Worker afl->stage_val_type = STAGE_VAL_BE;
1258*08b48e0bSAndroid Build Coastguard Worker
1259*08b48e0bSAndroid Build Coastguard Worker if ((SWAP32(orig) & 0xffff) + j > 0xffff && !could_be_bitflip(r3)) {
1260*08b48e0bSAndroid Build Coastguard Worker
1261*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_val = j;
1262*08b48e0bSAndroid Build Coastguard Worker *(u32 *)(out_buf + i) = SWAP32(SWAP32(orig) + j);
1263*08b48e0bSAndroid Build Coastguard Worker
1264*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
1265*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->mutation, sizeof(afl->mutation), "%s ARITH32+BE-%u-%u",
1266*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->fname, i, j);
1267*08b48e0bSAndroid Build Coastguard Worker #endif
1268*08b48e0bSAndroid Build Coastguard Worker
1269*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, out_buf, len)) { goto abandon_entry; }
1270*08b48e0bSAndroid Build Coastguard Worker ++afl->stage_cur;
1271*08b48e0bSAndroid Build Coastguard Worker
1272*08b48e0bSAndroid Build Coastguard Worker } else {
1273*08b48e0bSAndroid Build Coastguard Worker
1274*08b48e0bSAndroid Build Coastguard Worker --afl->stage_max;
1275*08b48e0bSAndroid Build Coastguard Worker
1276*08b48e0bSAndroid Build Coastguard Worker }
1277*08b48e0bSAndroid Build Coastguard Worker
1278*08b48e0bSAndroid Build Coastguard Worker if ((SWAP32(orig) & 0xffff) < (u32)j && !could_be_bitflip(r4)) {
1279*08b48e0bSAndroid Build Coastguard Worker
1280*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_val = -j;
1281*08b48e0bSAndroid Build Coastguard Worker *(u32 *)(out_buf + i) = SWAP32(SWAP32(orig) - j);
1282*08b48e0bSAndroid Build Coastguard Worker
1283*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
1284*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->mutation, sizeof(afl->mutation), "%s ARITH32_BE-%u-%u",
1285*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->fname, i, j);
1286*08b48e0bSAndroid Build Coastguard Worker #endif
1287*08b48e0bSAndroid Build Coastguard Worker
1288*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, out_buf, len)) { goto abandon_entry; }
1289*08b48e0bSAndroid Build Coastguard Worker ++afl->stage_cur;
1290*08b48e0bSAndroid Build Coastguard Worker
1291*08b48e0bSAndroid Build Coastguard Worker } else {
1292*08b48e0bSAndroid Build Coastguard Worker
1293*08b48e0bSAndroid Build Coastguard Worker --afl->stage_max;
1294*08b48e0bSAndroid Build Coastguard Worker
1295*08b48e0bSAndroid Build Coastguard Worker }
1296*08b48e0bSAndroid Build Coastguard Worker
1297*08b48e0bSAndroid Build Coastguard Worker *(u32 *)(out_buf + i) = orig;
1298*08b48e0bSAndroid Build Coastguard Worker
1299*08b48e0bSAndroid Build Coastguard Worker }
1300*08b48e0bSAndroid Build Coastguard Worker
1301*08b48e0bSAndroid Build Coastguard Worker }
1302*08b48e0bSAndroid Build Coastguard Worker
1303*08b48e0bSAndroid Build Coastguard Worker new_hit_cnt = afl->queued_items + afl->saved_crashes;
1304*08b48e0bSAndroid Build Coastguard Worker
1305*08b48e0bSAndroid Build Coastguard Worker afl->stage_finds[STAGE_ARITH32] += new_hit_cnt - orig_hit_cnt;
1306*08b48e0bSAndroid Build Coastguard Worker afl->stage_cycles[STAGE_ARITH32] += afl->stage_max;
1307*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
1308*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->stats_mutated += afl->stage_max;
1309*08b48e0bSAndroid Build Coastguard Worker #endif
1310*08b48e0bSAndroid Build Coastguard Worker
1311*08b48e0bSAndroid Build Coastguard Worker skip_arith:
1312*08b48e0bSAndroid Build Coastguard Worker
1313*08b48e0bSAndroid Build Coastguard Worker /**********************
1314*08b48e0bSAndroid Build Coastguard Worker * INTERESTING VALUES *
1315*08b48e0bSAndroid Build Coastguard Worker **********************/
1316*08b48e0bSAndroid Build Coastguard Worker
1317*08b48e0bSAndroid Build Coastguard Worker afl->stage_name = "interest 8/8";
1318*08b48e0bSAndroid Build Coastguard Worker afl->stage_short = "int8";
1319*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur = 0;
1320*08b48e0bSAndroid Build Coastguard Worker afl->stage_max = len * sizeof(interesting_8);
1321*08b48e0bSAndroid Build Coastguard Worker
1322*08b48e0bSAndroid Build Coastguard Worker afl->stage_val_type = STAGE_VAL_LE;
1323*08b48e0bSAndroid Build Coastguard Worker
1324*08b48e0bSAndroid Build Coastguard Worker orig_hit_cnt = new_hit_cnt;
1325*08b48e0bSAndroid Build Coastguard Worker
1326*08b48e0bSAndroid Build Coastguard Worker /* Setting 8-bit integers. */
1327*08b48e0bSAndroid Build Coastguard Worker
1328*08b48e0bSAndroid Build Coastguard Worker for (i = 0; i < (u32)len; ++i) {
1329*08b48e0bSAndroid Build Coastguard Worker
1330*08b48e0bSAndroid Build Coastguard Worker u8 orig = out_buf[i];
1331*08b48e0bSAndroid Build Coastguard Worker
1332*08b48e0bSAndroid Build Coastguard Worker /* Let's consult the effector map... */
1333*08b48e0bSAndroid Build Coastguard Worker
1334*08b48e0bSAndroid Build Coastguard Worker if (!skip_eff_map[i]) continue;
1335*08b48e0bSAndroid Build Coastguard Worker
1336*08b48e0bSAndroid Build Coastguard Worker if (is_det_timeout(before_det_time, 0)) { goto custom_mutator_stage; }
1337*08b48e0bSAndroid Build Coastguard Worker
1338*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_byte = i;
1339*08b48e0bSAndroid Build Coastguard Worker
1340*08b48e0bSAndroid Build Coastguard Worker for (j = 0; j < (u32)sizeof(interesting_8); ++j) {
1341*08b48e0bSAndroid Build Coastguard Worker
1342*08b48e0bSAndroid Build Coastguard Worker /* Skip if the value could be a product of bitflips or arithmetics. */
1343*08b48e0bSAndroid Build Coastguard Worker
1344*08b48e0bSAndroid Build Coastguard Worker if (could_be_bitflip(orig ^ (u8)interesting_8[j]) ||
1345*08b48e0bSAndroid Build Coastguard Worker could_be_arith(orig, (u8)interesting_8[j], 1)) {
1346*08b48e0bSAndroid Build Coastguard Worker
1347*08b48e0bSAndroid Build Coastguard Worker --afl->stage_max;
1348*08b48e0bSAndroid Build Coastguard Worker continue;
1349*08b48e0bSAndroid Build Coastguard Worker
1350*08b48e0bSAndroid Build Coastguard Worker }
1351*08b48e0bSAndroid Build Coastguard Worker
1352*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_val = interesting_8[j];
1353*08b48e0bSAndroid Build Coastguard Worker out_buf[i] = interesting_8[j];
1354*08b48e0bSAndroid Build Coastguard Worker
1355*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
1356*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->mutation, sizeof(afl->mutation), "%s INTERESTING8_%u_%u",
1357*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->fname, i, j);
1358*08b48e0bSAndroid Build Coastguard Worker #endif
1359*08b48e0bSAndroid Build Coastguard Worker
1360*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, out_buf, len)) { goto abandon_entry; }
1361*08b48e0bSAndroid Build Coastguard Worker
1362*08b48e0bSAndroid Build Coastguard Worker out_buf[i] = orig;
1363*08b48e0bSAndroid Build Coastguard Worker ++afl->stage_cur;
1364*08b48e0bSAndroid Build Coastguard Worker
1365*08b48e0bSAndroid Build Coastguard Worker }
1366*08b48e0bSAndroid Build Coastguard Worker
1367*08b48e0bSAndroid Build Coastguard Worker }
1368*08b48e0bSAndroid Build Coastguard Worker
1369*08b48e0bSAndroid Build Coastguard Worker new_hit_cnt = afl->queued_items + afl->saved_crashes;
1370*08b48e0bSAndroid Build Coastguard Worker
1371*08b48e0bSAndroid Build Coastguard Worker afl->stage_finds[STAGE_INTEREST8] += new_hit_cnt - orig_hit_cnt;
1372*08b48e0bSAndroid Build Coastguard Worker afl->stage_cycles[STAGE_INTEREST8] += afl->stage_max;
1373*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
1374*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->stats_mutated += afl->stage_max;
1375*08b48e0bSAndroid Build Coastguard Worker #endif
1376*08b48e0bSAndroid Build Coastguard Worker
1377*08b48e0bSAndroid Build Coastguard Worker /* Setting 16-bit integers, both endians. */
1378*08b48e0bSAndroid Build Coastguard Worker
1379*08b48e0bSAndroid Build Coastguard Worker if (afl->no_arith || len < 2) { goto skip_interest; }
1380*08b48e0bSAndroid Build Coastguard Worker
1381*08b48e0bSAndroid Build Coastguard Worker afl->stage_name = "interest 16/8";
1382*08b48e0bSAndroid Build Coastguard Worker afl->stage_short = "int16";
1383*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur = 0;
1384*08b48e0bSAndroid Build Coastguard Worker afl->stage_max = 2 * (len - 1) * (sizeof(interesting_16) >> 1);
1385*08b48e0bSAndroid Build Coastguard Worker
1386*08b48e0bSAndroid Build Coastguard Worker orig_hit_cnt = new_hit_cnt;
1387*08b48e0bSAndroid Build Coastguard Worker
1388*08b48e0bSAndroid Build Coastguard Worker for (i = 0; i < len - 1; ++i) {
1389*08b48e0bSAndroid Build Coastguard Worker
1390*08b48e0bSAndroid Build Coastguard Worker u16 orig = *(u16 *)(out_buf + i);
1391*08b48e0bSAndroid Build Coastguard Worker
1392*08b48e0bSAndroid Build Coastguard Worker /* Let's consult the effector map... */
1393*08b48e0bSAndroid Build Coastguard Worker
1394*08b48e0bSAndroid Build Coastguard Worker if (!skip_eff_map[i]) continue;
1395*08b48e0bSAndroid Build Coastguard Worker
1396*08b48e0bSAndroid Build Coastguard Worker if (is_det_timeout(before_det_time, 0)) { goto custom_mutator_stage; }
1397*08b48e0bSAndroid Build Coastguard Worker
1398*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_byte = i;
1399*08b48e0bSAndroid Build Coastguard Worker
1400*08b48e0bSAndroid Build Coastguard Worker for (j = 0; j < sizeof(interesting_16) / 2; ++j) {
1401*08b48e0bSAndroid Build Coastguard Worker
1402*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_val = interesting_16[j];
1403*08b48e0bSAndroid Build Coastguard Worker
1404*08b48e0bSAndroid Build Coastguard Worker /* Skip if this could be a product of a bitflip, arithmetics,
1405*08b48e0bSAndroid Build Coastguard Worker or single-byte interesting value insertion. */
1406*08b48e0bSAndroid Build Coastguard Worker
1407*08b48e0bSAndroid Build Coastguard Worker if (!could_be_bitflip(orig ^ (u16)interesting_16[j]) &&
1408*08b48e0bSAndroid Build Coastguard Worker !could_be_arith(orig, (u16)interesting_16[j], 2) &&
1409*08b48e0bSAndroid Build Coastguard Worker !could_be_interest(orig, (u16)interesting_16[j], 2, 0)) {
1410*08b48e0bSAndroid Build Coastguard Worker
1411*08b48e0bSAndroid Build Coastguard Worker afl->stage_val_type = STAGE_VAL_LE;
1412*08b48e0bSAndroid Build Coastguard Worker
1413*08b48e0bSAndroid Build Coastguard Worker *(u16 *)(out_buf + i) = interesting_16[j];
1414*08b48e0bSAndroid Build Coastguard Worker
1415*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
1416*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->mutation, sizeof(afl->mutation), "%s INTERESTING16_%u_%u",
1417*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->fname, i, j);
1418*08b48e0bSAndroid Build Coastguard Worker #endif
1419*08b48e0bSAndroid Build Coastguard Worker
1420*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, out_buf, len)) { goto abandon_entry; }
1421*08b48e0bSAndroid Build Coastguard Worker ++afl->stage_cur;
1422*08b48e0bSAndroid Build Coastguard Worker
1423*08b48e0bSAndroid Build Coastguard Worker } else {
1424*08b48e0bSAndroid Build Coastguard Worker
1425*08b48e0bSAndroid Build Coastguard Worker --afl->stage_max;
1426*08b48e0bSAndroid Build Coastguard Worker
1427*08b48e0bSAndroid Build Coastguard Worker }
1428*08b48e0bSAndroid Build Coastguard Worker
1429*08b48e0bSAndroid Build Coastguard Worker if ((u16)interesting_16[j] != SWAP16(interesting_16[j]) &&
1430*08b48e0bSAndroid Build Coastguard Worker !could_be_bitflip(orig ^ SWAP16(interesting_16[j])) &&
1431*08b48e0bSAndroid Build Coastguard Worker !could_be_arith(orig, SWAP16(interesting_16[j]), 2) &&
1432*08b48e0bSAndroid Build Coastguard Worker !could_be_interest(orig, SWAP16(interesting_16[j]), 2, 1)) {
1433*08b48e0bSAndroid Build Coastguard Worker
1434*08b48e0bSAndroid Build Coastguard Worker afl->stage_val_type = STAGE_VAL_BE;
1435*08b48e0bSAndroid Build Coastguard Worker
1436*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
1437*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->mutation, sizeof(afl->mutation),
1438*08b48e0bSAndroid Build Coastguard Worker "%s INTERESTING16BE_%u_%u", afl->queue_cur->fname, i, j);
1439*08b48e0bSAndroid Build Coastguard Worker #endif
1440*08b48e0bSAndroid Build Coastguard Worker
1441*08b48e0bSAndroid Build Coastguard Worker *(u16 *)(out_buf + i) = SWAP16(interesting_16[j]);
1442*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, out_buf, len)) { goto abandon_entry; }
1443*08b48e0bSAndroid Build Coastguard Worker ++afl->stage_cur;
1444*08b48e0bSAndroid Build Coastguard Worker
1445*08b48e0bSAndroid Build Coastguard Worker } else {
1446*08b48e0bSAndroid Build Coastguard Worker
1447*08b48e0bSAndroid Build Coastguard Worker --afl->stage_max;
1448*08b48e0bSAndroid Build Coastguard Worker
1449*08b48e0bSAndroid Build Coastguard Worker }
1450*08b48e0bSAndroid Build Coastguard Worker
1451*08b48e0bSAndroid Build Coastguard Worker }
1452*08b48e0bSAndroid Build Coastguard Worker
1453*08b48e0bSAndroid Build Coastguard Worker *(u16 *)(out_buf + i) = orig;
1454*08b48e0bSAndroid Build Coastguard Worker
1455*08b48e0bSAndroid Build Coastguard Worker }
1456*08b48e0bSAndroid Build Coastguard Worker
1457*08b48e0bSAndroid Build Coastguard Worker new_hit_cnt = afl->queued_items + afl->saved_crashes;
1458*08b48e0bSAndroid Build Coastguard Worker
1459*08b48e0bSAndroid Build Coastguard Worker afl->stage_finds[STAGE_INTEREST16] += new_hit_cnt - orig_hit_cnt;
1460*08b48e0bSAndroid Build Coastguard Worker afl->stage_cycles[STAGE_INTEREST16] += afl->stage_max;
1461*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
1462*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->stats_mutated += afl->stage_max;
1463*08b48e0bSAndroid Build Coastguard Worker #endif
1464*08b48e0bSAndroid Build Coastguard Worker
1465*08b48e0bSAndroid Build Coastguard Worker if (len < 4) { goto skip_interest; }
1466*08b48e0bSAndroid Build Coastguard Worker
1467*08b48e0bSAndroid Build Coastguard Worker /* Setting 32-bit integers, both endians. */
1468*08b48e0bSAndroid Build Coastguard Worker
1469*08b48e0bSAndroid Build Coastguard Worker afl->stage_name = "interest 32/8";
1470*08b48e0bSAndroid Build Coastguard Worker afl->stage_short = "int32";
1471*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur = 0;
1472*08b48e0bSAndroid Build Coastguard Worker afl->stage_max = 2 * (len - 3) * (sizeof(interesting_32) >> 2);
1473*08b48e0bSAndroid Build Coastguard Worker
1474*08b48e0bSAndroid Build Coastguard Worker orig_hit_cnt = new_hit_cnt;
1475*08b48e0bSAndroid Build Coastguard Worker
1476*08b48e0bSAndroid Build Coastguard Worker for (i = 0; i < len - 3; i++) {
1477*08b48e0bSAndroid Build Coastguard Worker
1478*08b48e0bSAndroid Build Coastguard Worker u32 orig = *(u32 *)(out_buf + i);
1479*08b48e0bSAndroid Build Coastguard Worker
1480*08b48e0bSAndroid Build Coastguard Worker /* Let's consult the effector map... */
1481*08b48e0bSAndroid Build Coastguard Worker
1482*08b48e0bSAndroid Build Coastguard Worker if (!skip_eff_map[i]) continue;
1483*08b48e0bSAndroid Build Coastguard Worker
1484*08b48e0bSAndroid Build Coastguard Worker if (is_det_timeout(before_det_time, 0)) { goto custom_mutator_stage; }
1485*08b48e0bSAndroid Build Coastguard Worker
1486*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_byte = i;
1487*08b48e0bSAndroid Build Coastguard Worker
1488*08b48e0bSAndroid Build Coastguard Worker for (j = 0; j < sizeof(interesting_32) / 4; ++j) {
1489*08b48e0bSAndroid Build Coastguard Worker
1490*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_val = interesting_32[j];
1491*08b48e0bSAndroid Build Coastguard Worker
1492*08b48e0bSAndroid Build Coastguard Worker /* Skip if this could be a product of a bitflip, arithmetics,
1493*08b48e0bSAndroid Build Coastguard Worker or word interesting value insertion. */
1494*08b48e0bSAndroid Build Coastguard Worker
1495*08b48e0bSAndroid Build Coastguard Worker if (!could_be_bitflip(orig ^ (u32)interesting_32[j]) &&
1496*08b48e0bSAndroid Build Coastguard Worker !could_be_arith(orig, interesting_32[j], 4) &&
1497*08b48e0bSAndroid Build Coastguard Worker !could_be_interest(orig, interesting_32[j], 4, 0)) {
1498*08b48e0bSAndroid Build Coastguard Worker
1499*08b48e0bSAndroid Build Coastguard Worker afl->stage_val_type = STAGE_VAL_LE;
1500*08b48e0bSAndroid Build Coastguard Worker
1501*08b48e0bSAndroid Build Coastguard Worker *(u32 *)(out_buf + i) = interesting_32[j];
1502*08b48e0bSAndroid Build Coastguard Worker
1503*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
1504*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->mutation, sizeof(afl->mutation), "%s INTERESTING32_%u_%u",
1505*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->fname, i, j);
1506*08b48e0bSAndroid Build Coastguard Worker #endif
1507*08b48e0bSAndroid Build Coastguard Worker
1508*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, out_buf, len)) { goto abandon_entry; }
1509*08b48e0bSAndroid Build Coastguard Worker ++afl->stage_cur;
1510*08b48e0bSAndroid Build Coastguard Worker
1511*08b48e0bSAndroid Build Coastguard Worker } else {
1512*08b48e0bSAndroid Build Coastguard Worker
1513*08b48e0bSAndroid Build Coastguard Worker --afl->stage_max;
1514*08b48e0bSAndroid Build Coastguard Worker
1515*08b48e0bSAndroid Build Coastguard Worker }
1516*08b48e0bSAndroid Build Coastguard Worker
1517*08b48e0bSAndroid Build Coastguard Worker if ((u32)interesting_32[j] != SWAP32(interesting_32[j]) &&
1518*08b48e0bSAndroid Build Coastguard Worker !could_be_bitflip(orig ^ SWAP32(interesting_32[j])) &&
1519*08b48e0bSAndroid Build Coastguard Worker !could_be_arith(orig, SWAP32(interesting_32[j]), 4) &&
1520*08b48e0bSAndroid Build Coastguard Worker !could_be_interest(orig, SWAP32(interesting_32[j]), 4, 1)) {
1521*08b48e0bSAndroid Build Coastguard Worker
1522*08b48e0bSAndroid Build Coastguard Worker afl->stage_val_type = STAGE_VAL_BE;
1523*08b48e0bSAndroid Build Coastguard Worker
1524*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
1525*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->mutation, sizeof(afl->mutation),
1526*08b48e0bSAndroid Build Coastguard Worker "%s INTERESTING32BE_%u_%u", afl->queue_cur->fname, i, j);
1527*08b48e0bSAndroid Build Coastguard Worker #endif
1528*08b48e0bSAndroid Build Coastguard Worker
1529*08b48e0bSAndroid Build Coastguard Worker *(u32 *)(out_buf + i) = SWAP32(interesting_32[j]);
1530*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, out_buf, len)) { goto abandon_entry; }
1531*08b48e0bSAndroid Build Coastguard Worker ++afl->stage_cur;
1532*08b48e0bSAndroid Build Coastguard Worker
1533*08b48e0bSAndroid Build Coastguard Worker } else {
1534*08b48e0bSAndroid Build Coastguard Worker
1535*08b48e0bSAndroid Build Coastguard Worker --afl->stage_max;
1536*08b48e0bSAndroid Build Coastguard Worker
1537*08b48e0bSAndroid Build Coastguard Worker }
1538*08b48e0bSAndroid Build Coastguard Worker
1539*08b48e0bSAndroid Build Coastguard Worker }
1540*08b48e0bSAndroid Build Coastguard Worker
1541*08b48e0bSAndroid Build Coastguard Worker *(u32 *)(out_buf + i) = orig;
1542*08b48e0bSAndroid Build Coastguard Worker
1543*08b48e0bSAndroid Build Coastguard Worker }
1544*08b48e0bSAndroid Build Coastguard Worker
1545*08b48e0bSAndroid Build Coastguard Worker new_hit_cnt = afl->queued_items + afl->saved_crashes;
1546*08b48e0bSAndroid Build Coastguard Worker
1547*08b48e0bSAndroid Build Coastguard Worker afl->stage_finds[STAGE_INTEREST32] += new_hit_cnt - orig_hit_cnt;
1548*08b48e0bSAndroid Build Coastguard Worker afl->stage_cycles[STAGE_INTEREST32] += afl->stage_max;
1549*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
1550*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->stats_mutated += afl->stage_max;
1551*08b48e0bSAndroid Build Coastguard Worker #endif
1552*08b48e0bSAndroid Build Coastguard Worker
1553*08b48e0bSAndroid Build Coastguard Worker skip_interest:
1554*08b48e0bSAndroid Build Coastguard Worker
1555*08b48e0bSAndroid Build Coastguard Worker /********************
1556*08b48e0bSAndroid Build Coastguard Worker * DICTIONARY STUFF *
1557*08b48e0bSAndroid Build Coastguard Worker ********************/
1558*08b48e0bSAndroid Build Coastguard Worker
1559*08b48e0bSAndroid Build Coastguard Worker if (!afl->extras_cnt) { goto skip_user_extras; }
1560*08b48e0bSAndroid Build Coastguard Worker
1561*08b48e0bSAndroid Build Coastguard Worker /* Overwrite with user-supplied extras. */
1562*08b48e0bSAndroid Build Coastguard Worker
1563*08b48e0bSAndroid Build Coastguard Worker afl->stage_name = "user extras (over)";
1564*08b48e0bSAndroid Build Coastguard Worker afl->stage_short = "ext_UO";
1565*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur = 0;
1566*08b48e0bSAndroid Build Coastguard Worker afl->stage_max = afl->extras_cnt * len;
1567*08b48e0bSAndroid Build Coastguard Worker
1568*08b48e0bSAndroid Build Coastguard Worker afl->stage_val_type = STAGE_VAL_NONE;
1569*08b48e0bSAndroid Build Coastguard Worker
1570*08b48e0bSAndroid Build Coastguard Worker orig_hit_cnt = new_hit_cnt;
1571*08b48e0bSAndroid Build Coastguard Worker
1572*08b48e0bSAndroid Build Coastguard Worker for (i = 0; i < (u32)len; ++i) {
1573*08b48e0bSAndroid Build Coastguard Worker
1574*08b48e0bSAndroid Build Coastguard Worker u32 last_len = 0;
1575*08b48e0bSAndroid Build Coastguard Worker
1576*08b48e0bSAndroid Build Coastguard Worker if (!skip_eff_map[i]) continue;
1577*08b48e0bSAndroid Build Coastguard Worker
1578*08b48e0bSAndroid Build Coastguard Worker if (is_det_timeout(before_det_time, 0)) { goto custom_mutator_stage; }
1579*08b48e0bSAndroid Build Coastguard Worker
1580*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_byte = i;
1581*08b48e0bSAndroid Build Coastguard Worker
1582*08b48e0bSAndroid Build Coastguard Worker /* Extras are sorted by size, from smallest to largest. This means
1583*08b48e0bSAndroid Build Coastguard Worker that we don't have to worry about restoring the buffer in
1584*08b48e0bSAndroid Build Coastguard Worker between writes at a particular offset determined by the outer
1585*08b48e0bSAndroid Build Coastguard Worker loop. */
1586*08b48e0bSAndroid Build Coastguard Worker
1587*08b48e0bSAndroid Build Coastguard Worker for (j = 0; j < afl->extras_cnt; ++j) {
1588*08b48e0bSAndroid Build Coastguard Worker
1589*08b48e0bSAndroid Build Coastguard Worker /* Skip extras probabilistically if afl->extras_cnt > AFL_MAX_DET_EXTRAS.
1590*08b48e0bSAndroid Build Coastguard Worker Also skip them if there's no room to insert the payload, if the token
1591*08b48e0bSAndroid Build Coastguard Worker is redundant, or if its entire span has no bytes set in the effector
1592*08b48e0bSAndroid Build Coastguard Worker map. */
1593*08b48e0bSAndroid Build Coastguard Worker
1594*08b48e0bSAndroid Build Coastguard Worker if ((afl->extras_cnt > afl->max_det_extras &&
1595*08b48e0bSAndroid Build Coastguard Worker rand_below(afl, afl->extras_cnt) >= afl->max_det_extras) ||
1596*08b48e0bSAndroid Build Coastguard Worker afl->extras[j].len > len - i ||
1597*08b48e0bSAndroid Build Coastguard Worker !memcmp(afl->extras[j].data, out_buf + i, afl->extras[j].len)) {
1598*08b48e0bSAndroid Build Coastguard Worker
1599*08b48e0bSAndroid Build Coastguard Worker --afl->stage_max;
1600*08b48e0bSAndroid Build Coastguard Worker continue;
1601*08b48e0bSAndroid Build Coastguard Worker
1602*08b48e0bSAndroid Build Coastguard Worker }
1603*08b48e0bSAndroid Build Coastguard Worker
1604*08b48e0bSAndroid Build Coastguard Worker last_len = afl->extras[j].len;
1605*08b48e0bSAndroid Build Coastguard Worker memcpy(out_buf + i, afl->extras[j].data, last_len);
1606*08b48e0bSAndroid Build Coastguard Worker
1607*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
1608*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->mutation, sizeof(afl->mutation),
1609*08b48e0bSAndroid Build Coastguard Worker "%s EXTRAS_overwrite-%u-%u", afl->queue_cur->fname, i, j);
1610*08b48e0bSAndroid Build Coastguard Worker #endif
1611*08b48e0bSAndroid Build Coastguard Worker
1612*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, out_buf, len)) { goto abandon_entry; }
1613*08b48e0bSAndroid Build Coastguard Worker
1614*08b48e0bSAndroid Build Coastguard Worker ++afl->stage_cur;
1615*08b48e0bSAndroid Build Coastguard Worker
1616*08b48e0bSAndroid Build Coastguard Worker }
1617*08b48e0bSAndroid Build Coastguard Worker
1618*08b48e0bSAndroid Build Coastguard Worker /* Restore all the clobbered memory. */
1619*08b48e0bSAndroid Build Coastguard Worker memcpy(out_buf + i, in_buf + i, last_len);
1620*08b48e0bSAndroid Build Coastguard Worker
1621*08b48e0bSAndroid Build Coastguard Worker }
1622*08b48e0bSAndroid Build Coastguard Worker
1623*08b48e0bSAndroid Build Coastguard Worker new_hit_cnt = afl->queued_items + afl->saved_crashes;
1624*08b48e0bSAndroid Build Coastguard Worker
1625*08b48e0bSAndroid Build Coastguard Worker afl->stage_finds[STAGE_EXTRAS_UO] += new_hit_cnt - orig_hit_cnt;
1626*08b48e0bSAndroid Build Coastguard Worker afl->stage_cycles[STAGE_EXTRAS_UO] += afl->stage_max;
1627*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
1628*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->stats_mutated += afl->stage_max;
1629*08b48e0bSAndroid Build Coastguard Worker #endif
1630*08b48e0bSAndroid Build Coastguard Worker
1631*08b48e0bSAndroid Build Coastguard Worker /* Insertion of user-supplied extras. */
1632*08b48e0bSAndroid Build Coastguard Worker
1633*08b48e0bSAndroid Build Coastguard Worker afl->stage_name = "user extras (insert)";
1634*08b48e0bSAndroid Build Coastguard Worker afl->stage_short = "ext_UI";
1635*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur = 0;
1636*08b48e0bSAndroid Build Coastguard Worker afl->stage_max = afl->extras_cnt * (len + 1);
1637*08b48e0bSAndroid Build Coastguard Worker
1638*08b48e0bSAndroid Build Coastguard Worker orig_hit_cnt = new_hit_cnt;
1639*08b48e0bSAndroid Build Coastguard Worker
1640*08b48e0bSAndroid Build Coastguard Worker ex_tmp = afl_realloc(AFL_BUF_PARAM(ex), len + MAX_DICT_FILE);
1641*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!ex_tmp)) { PFATAL("alloc"); }
1642*08b48e0bSAndroid Build Coastguard Worker
1643*08b48e0bSAndroid Build Coastguard Worker for (i = 0; i <= (u32)len; ++i) {
1644*08b48e0bSAndroid Build Coastguard Worker
1645*08b48e0bSAndroid Build Coastguard Worker if (!skip_eff_map[i % len]) continue;
1646*08b48e0bSAndroid Build Coastguard Worker
1647*08b48e0bSAndroid Build Coastguard Worker if (is_det_timeout(before_det_time, 0)) { goto custom_mutator_stage; }
1648*08b48e0bSAndroid Build Coastguard Worker
1649*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_byte = i;
1650*08b48e0bSAndroid Build Coastguard Worker
1651*08b48e0bSAndroid Build Coastguard Worker for (j = 0; j < afl->extras_cnt; ++j) {
1652*08b48e0bSAndroid Build Coastguard Worker
1653*08b48e0bSAndroid Build Coastguard Worker if (len + afl->extras[j].len > MAX_FILE) {
1654*08b48e0bSAndroid Build Coastguard Worker
1655*08b48e0bSAndroid Build Coastguard Worker --afl->stage_max;
1656*08b48e0bSAndroid Build Coastguard Worker continue;
1657*08b48e0bSAndroid Build Coastguard Worker
1658*08b48e0bSAndroid Build Coastguard Worker }
1659*08b48e0bSAndroid Build Coastguard Worker
1660*08b48e0bSAndroid Build Coastguard Worker /* Insert token */
1661*08b48e0bSAndroid Build Coastguard Worker memcpy(ex_tmp + i, afl->extras[j].data, afl->extras[j].len);
1662*08b48e0bSAndroid Build Coastguard Worker
1663*08b48e0bSAndroid Build Coastguard Worker /* Copy tail */
1664*08b48e0bSAndroid Build Coastguard Worker memcpy(ex_tmp + i + afl->extras[j].len, out_buf + i, len - i);
1665*08b48e0bSAndroid Build Coastguard Worker
1666*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
1667*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->mutation, sizeof(afl->mutation), "%s EXTRAS_insert-%u-%u",
1668*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->fname, i, j);
1669*08b48e0bSAndroid Build Coastguard Worker #endif
1670*08b48e0bSAndroid Build Coastguard Worker
1671*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, ex_tmp, len + afl->extras[j].len)) {
1672*08b48e0bSAndroid Build Coastguard Worker
1673*08b48e0bSAndroid Build Coastguard Worker goto abandon_entry;
1674*08b48e0bSAndroid Build Coastguard Worker
1675*08b48e0bSAndroid Build Coastguard Worker }
1676*08b48e0bSAndroid Build Coastguard Worker
1677*08b48e0bSAndroid Build Coastguard Worker ++afl->stage_cur;
1678*08b48e0bSAndroid Build Coastguard Worker
1679*08b48e0bSAndroid Build Coastguard Worker }
1680*08b48e0bSAndroid Build Coastguard Worker
1681*08b48e0bSAndroid Build Coastguard Worker /* Copy head */
1682*08b48e0bSAndroid Build Coastguard Worker ex_tmp[i] = out_buf[i];
1683*08b48e0bSAndroid Build Coastguard Worker
1684*08b48e0bSAndroid Build Coastguard Worker }
1685*08b48e0bSAndroid Build Coastguard Worker
1686*08b48e0bSAndroid Build Coastguard Worker new_hit_cnt = afl->queued_items + afl->saved_crashes;
1687*08b48e0bSAndroid Build Coastguard Worker
1688*08b48e0bSAndroid Build Coastguard Worker afl->stage_finds[STAGE_EXTRAS_UI] += new_hit_cnt - orig_hit_cnt;
1689*08b48e0bSAndroid Build Coastguard Worker afl->stage_cycles[STAGE_EXTRAS_UI] += afl->stage_max;
1690*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
1691*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->stats_mutated += afl->stage_max;
1692*08b48e0bSAndroid Build Coastguard Worker #endif
1693*08b48e0bSAndroid Build Coastguard Worker
1694*08b48e0bSAndroid Build Coastguard Worker skip_user_extras:
1695*08b48e0bSAndroid Build Coastguard Worker
1696*08b48e0bSAndroid Build Coastguard Worker if (!afl->a_extras_cnt) { goto skip_extras; }
1697*08b48e0bSAndroid Build Coastguard Worker
1698*08b48e0bSAndroid Build Coastguard Worker afl->stage_name = "auto extras (over)";
1699*08b48e0bSAndroid Build Coastguard Worker afl->stage_short = "ext_AO";
1700*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur = 0;
1701*08b48e0bSAndroid Build Coastguard Worker afl->stage_max = MIN(afl->a_extras_cnt, (u32)USE_AUTO_EXTRAS) * len;
1702*08b48e0bSAndroid Build Coastguard Worker
1703*08b48e0bSAndroid Build Coastguard Worker afl->stage_val_type = STAGE_VAL_NONE;
1704*08b48e0bSAndroid Build Coastguard Worker
1705*08b48e0bSAndroid Build Coastguard Worker orig_hit_cnt = new_hit_cnt;
1706*08b48e0bSAndroid Build Coastguard Worker
1707*08b48e0bSAndroid Build Coastguard Worker for (i = 0; i < (u32)len; ++i) {
1708*08b48e0bSAndroid Build Coastguard Worker
1709*08b48e0bSAndroid Build Coastguard Worker u32 last_len = 0;
1710*08b48e0bSAndroid Build Coastguard Worker
1711*08b48e0bSAndroid Build Coastguard Worker if (!skip_eff_map[i]) continue;
1712*08b48e0bSAndroid Build Coastguard Worker
1713*08b48e0bSAndroid Build Coastguard Worker if (is_det_timeout(before_det_time, 0)) { goto custom_mutator_stage; }
1714*08b48e0bSAndroid Build Coastguard Worker
1715*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_byte = i;
1716*08b48e0bSAndroid Build Coastguard Worker
1717*08b48e0bSAndroid Build Coastguard Worker u32 min_extra_len = MIN(afl->a_extras_cnt, (u32)USE_AUTO_EXTRAS);
1718*08b48e0bSAndroid Build Coastguard Worker for (j = 0; j < min_extra_len; ++j) {
1719*08b48e0bSAndroid Build Coastguard Worker
1720*08b48e0bSAndroid Build Coastguard Worker /* See the comment in the earlier code; extras are sorted by size. */
1721*08b48e0bSAndroid Build Coastguard Worker
1722*08b48e0bSAndroid Build Coastguard Worker if (afl->a_extras[j].len > len - i ||
1723*08b48e0bSAndroid Build Coastguard Worker !memcmp(afl->a_extras[j].data, out_buf + i, afl->a_extras[j].len)) {
1724*08b48e0bSAndroid Build Coastguard Worker
1725*08b48e0bSAndroid Build Coastguard Worker --afl->stage_max;
1726*08b48e0bSAndroid Build Coastguard Worker continue;
1727*08b48e0bSAndroid Build Coastguard Worker
1728*08b48e0bSAndroid Build Coastguard Worker }
1729*08b48e0bSAndroid Build Coastguard Worker
1730*08b48e0bSAndroid Build Coastguard Worker last_len = afl->a_extras[j].len;
1731*08b48e0bSAndroid Build Coastguard Worker memcpy(out_buf + i, afl->a_extras[j].data, last_len);
1732*08b48e0bSAndroid Build Coastguard Worker
1733*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
1734*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->mutation, sizeof(afl->mutation),
1735*08b48e0bSAndroid Build Coastguard Worker "%s AUTO_EXTRAS_overwrite-%u-%u", afl->queue_cur->fname, i, j);
1736*08b48e0bSAndroid Build Coastguard Worker #endif
1737*08b48e0bSAndroid Build Coastguard Worker
1738*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, out_buf, len)) { goto abandon_entry; }
1739*08b48e0bSAndroid Build Coastguard Worker
1740*08b48e0bSAndroid Build Coastguard Worker ++afl->stage_cur;
1741*08b48e0bSAndroid Build Coastguard Worker
1742*08b48e0bSAndroid Build Coastguard Worker }
1743*08b48e0bSAndroid Build Coastguard Worker
1744*08b48e0bSAndroid Build Coastguard Worker /* Restore all the clobbered memory. */
1745*08b48e0bSAndroid Build Coastguard Worker memcpy(out_buf + i, in_buf + i, last_len);
1746*08b48e0bSAndroid Build Coastguard Worker
1747*08b48e0bSAndroid Build Coastguard Worker }
1748*08b48e0bSAndroid Build Coastguard Worker
1749*08b48e0bSAndroid Build Coastguard Worker new_hit_cnt = afl->queued_items + afl->saved_crashes;
1750*08b48e0bSAndroid Build Coastguard Worker
1751*08b48e0bSAndroid Build Coastguard Worker afl->stage_finds[STAGE_EXTRAS_AO] += new_hit_cnt - orig_hit_cnt;
1752*08b48e0bSAndroid Build Coastguard Worker afl->stage_cycles[STAGE_EXTRAS_AO] += afl->stage_max;
1753*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
1754*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->stats_mutated += afl->stage_max;
1755*08b48e0bSAndroid Build Coastguard Worker #endif
1756*08b48e0bSAndroid Build Coastguard Worker
1757*08b48e0bSAndroid Build Coastguard Worker /* Insertion of auto extras. */
1758*08b48e0bSAndroid Build Coastguard Worker
1759*08b48e0bSAndroid Build Coastguard Worker afl->stage_name = "auto extras (insert)";
1760*08b48e0bSAndroid Build Coastguard Worker afl->stage_short = "ext_AI";
1761*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur = 0;
1762*08b48e0bSAndroid Build Coastguard Worker afl->stage_max = afl->a_extras_cnt * (len + 1);
1763*08b48e0bSAndroid Build Coastguard Worker
1764*08b48e0bSAndroid Build Coastguard Worker orig_hit_cnt = new_hit_cnt;
1765*08b48e0bSAndroid Build Coastguard Worker
1766*08b48e0bSAndroid Build Coastguard Worker ex_tmp = afl_realloc(AFL_BUF_PARAM(ex), len + MAX_DICT_FILE);
1767*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!ex_tmp)) { PFATAL("alloc"); }
1768*08b48e0bSAndroid Build Coastguard Worker
1769*08b48e0bSAndroid Build Coastguard Worker for (i = 0; i <= (u32)len; ++i) {
1770*08b48e0bSAndroid Build Coastguard Worker
1771*08b48e0bSAndroid Build Coastguard Worker if (!skip_eff_map[i % len]) continue;
1772*08b48e0bSAndroid Build Coastguard Worker
1773*08b48e0bSAndroid Build Coastguard Worker if (is_det_timeout(before_det_time, 0)) { goto custom_mutator_stage; }
1774*08b48e0bSAndroid Build Coastguard Worker
1775*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_byte = i;
1776*08b48e0bSAndroid Build Coastguard Worker
1777*08b48e0bSAndroid Build Coastguard Worker for (j = 0; j < afl->a_extras_cnt; ++j) {
1778*08b48e0bSAndroid Build Coastguard Worker
1779*08b48e0bSAndroid Build Coastguard Worker if (len + afl->a_extras[j].len > MAX_FILE) {
1780*08b48e0bSAndroid Build Coastguard Worker
1781*08b48e0bSAndroid Build Coastguard Worker --afl->stage_max;
1782*08b48e0bSAndroid Build Coastguard Worker continue;
1783*08b48e0bSAndroid Build Coastguard Worker
1784*08b48e0bSAndroid Build Coastguard Worker }
1785*08b48e0bSAndroid Build Coastguard Worker
1786*08b48e0bSAndroid Build Coastguard Worker /* Insert token */
1787*08b48e0bSAndroid Build Coastguard Worker memcpy(ex_tmp + i, afl->a_extras[j].data, afl->a_extras[j].len);
1788*08b48e0bSAndroid Build Coastguard Worker
1789*08b48e0bSAndroid Build Coastguard Worker /* Copy tail */
1790*08b48e0bSAndroid Build Coastguard Worker memcpy(ex_tmp + i + afl->a_extras[j].len, out_buf + i, len - i);
1791*08b48e0bSAndroid Build Coastguard Worker
1792*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
1793*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->mutation, sizeof(afl->mutation),
1794*08b48e0bSAndroid Build Coastguard Worker "%s AUTO_EXTRAS_insert-%u-%u", afl->queue_cur->fname, i, j);
1795*08b48e0bSAndroid Build Coastguard Worker #endif
1796*08b48e0bSAndroid Build Coastguard Worker
1797*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, ex_tmp, len + afl->a_extras[j].len)) {
1798*08b48e0bSAndroid Build Coastguard Worker
1799*08b48e0bSAndroid Build Coastguard Worker goto abandon_entry;
1800*08b48e0bSAndroid Build Coastguard Worker
1801*08b48e0bSAndroid Build Coastguard Worker }
1802*08b48e0bSAndroid Build Coastguard Worker
1803*08b48e0bSAndroid Build Coastguard Worker ++afl->stage_cur;
1804*08b48e0bSAndroid Build Coastguard Worker
1805*08b48e0bSAndroid Build Coastguard Worker }
1806*08b48e0bSAndroid Build Coastguard Worker
1807*08b48e0bSAndroid Build Coastguard Worker /* Copy head */
1808*08b48e0bSAndroid Build Coastguard Worker ex_tmp[i] = out_buf[i];
1809*08b48e0bSAndroid Build Coastguard Worker
1810*08b48e0bSAndroid Build Coastguard Worker }
1811*08b48e0bSAndroid Build Coastguard Worker
1812*08b48e0bSAndroid Build Coastguard Worker new_hit_cnt = afl->queued_items + afl->saved_crashes;
1813*08b48e0bSAndroid Build Coastguard Worker
1814*08b48e0bSAndroid Build Coastguard Worker afl->stage_finds[STAGE_EXTRAS_AI] += new_hit_cnt - orig_hit_cnt;
1815*08b48e0bSAndroid Build Coastguard Worker afl->stage_cycles[STAGE_EXTRAS_AI] += afl->stage_max;
1816*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
1817*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->stats_mutated += afl->stage_max;
1818*08b48e0bSAndroid Build Coastguard Worker #endif
1819*08b48e0bSAndroid Build Coastguard Worker
1820*08b48e0bSAndroid Build Coastguard Worker skip_extras:
1821*08b48e0bSAndroid Build Coastguard Worker
1822*08b48e0bSAndroid Build Coastguard Worker /* If we made this to here without jumping to havoc_stage or abandon_entry,
1823*08b48e0bSAndroid Build Coastguard Worker we're properly done with deterministic steps and can mark it as such
1824*08b48e0bSAndroid Build Coastguard Worker in the .state/ directory. */
1825*08b48e0bSAndroid Build Coastguard Worker
1826*08b48e0bSAndroid Build Coastguard Worker if (!afl->queue_cur->passed_det) { mark_as_det_done(afl, afl->queue_cur); }
1827*08b48e0bSAndroid Build Coastguard Worker
1828*08b48e0bSAndroid Build Coastguard Worker custom_mutator_stage:
1829*08b48e0bSAndroid Build Coastguard Worker /*******************
1830*08b48e0bSAndroid Build Coastguard Worker * CUSTOM MUTATORS *
1831*08b48e0bSAndroid Build Coastguard Worker *******************/
1832*08b48e0bSAndroid Build Coastguard Worker
1833*08b48e0bSAndroid Build Coastguard Worker if (likely(!afl->custom_mutators_count)) { goto havoc_stage; }
1834*08b48e0bSAndroid Build Coastguard Worker
1835*08b48e0bSAndroid Build Coastguard Worker afl->stage_name = "custom mutator";
1836*08b48e0bSAndroid Build Coastguard Worker afl->stage_short = "custom";
1837*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur = 0;
1838*08b48e0bSAndroid Build Coastguard Worker afl->stage_val_type = STAGE_VAL_NONE;
1839*08b48e0bSAndroid Build Coastguard Worker bool has_custom_fuzz = false;
1840*08b48e0bSAndroid Build Coastguard Worker u32 shift = unlikely(afl->custom_only) ? 7 : 8;
1841*08b48e0bSAndroid Build Coastguard Worker afl->stage_max = (HAVOC_CYCLES * perf_score / afl->havoc_div) >> shift;
1842*08b48e0bSAndroid Build Coastguard Worker
1843*08b48e0bSAndroid Build Coastguard Worker if (afl->stage_max < HAVOC_MIN) { afl->stage_max = HAVOC_MIN; }
1844*08b48e0bSAndroid Build Coastguard Worker
1845*08b48e0bSAndroid Build Coastguard Worker const u32 max_seed_size = MAX_FILE, saved_max = afl->stage_max;
1846*08b48e0bSAndroid Build Coastguard Worker
1847*08b48e0bSAndroid Build Coastguard Worker orig_hit_cnt = afl->queued_items + afl->saved_crashes;
1848*08b48e0bSAndroid Build Coastguard Worker
1849*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
1850*08b48e0bSAndroid Build Coastguard Worker afl->mutation[0] = 0;
1851*08b48e0bSAndroid Build Coastguard Worker #endif
1852*08b48e0bSAndroid Build Coastguard Worker
1853*08b48e0bSAndroid Build Coastguard Worker LIST_FOREACH(&afl->custom_mutator_list, struct custom_mutator, {
1854*08b48e0bSAndroid Build Coastguard Worker
1855*08b48e0bSAndroid Build Coastguard Worker if (el->afl_custom_fuzz) {
1856*08b48e0bSAndroid Build Coastguard Worker
1857*08b48e0bSAndroid Build Coastguard Worker havoc_queued = afl->queued_items;
1858*08b48e0bSAndroid Build Coastguard Worker
1859*08b48e0bSAndroid Build Coastguard Worker afl->current_custom_fuzz = el;
1860*08b48e0bSAndroid Build Coastguard Worker afl->stage_name = el->name_short;
1861*08b48e0bSAndroid Build Coastguard Worker
1862*08b48e0bSAndroid Build Coastguard Worker if (el->afl_custom_fuzz_count) {
1863*08b48e0bSAndroid Build Coastguard Worker
1864*08b48e0bSAndroid Build Coastguard Worker afl->stage_max = el->afl_custom_fuzz_count(el->data, out_buf, len);
1865*08b48e0bSAndroid Build Coastguard Worker
1866*08b48e0bSAndroid Build Coastguard Worker } else {
1867*08b48e0bSAndroid Build Coastguard Worker
1868*08b48e0bSAndroid Build Coastguard Worker afl->stage_max = saved_max;
1869*08b48e0bSAndroid Build Coastguard Worker
1870*08b48e0bSAndroid Build Coastguard Worker }
1871*08b48e0bSAndroid Build Coastguard Worker
1872*08b48e0bSAndroid Build Coastguard Worker has_custom_fuzz = true;
1873*08b48e0bSAndroid Build Coastguard Worker
1874*08b48e0bSAndroid Build Coastguard Worker afl->stage_short = el->name_short;
1875*08b48e0bSAndroid Build Coastguard Worker
1876*08b48e0bSAndroid Build Coastguard Worker if (afl->stage_max) {
1877*08b48e0bSAndroid Build Coastguard Worker
1878*08b48e0bSAndroid Build Coastguard Worker for (afl->stage_cur = 0; afl->stage_cur < afl->stage_max;
1879*08b48e0bSAndroid Build Coastguard Worker ++afl->stage_cur) {
1880*08b48e0bSAndroid Build Coastguard Worker
1881*08b48e0bSAndroid Build Coastguard Worker struct queue_entry *target = NULL;
1882*08b48e0bSAndroid Build Coastguard Worker u32 tid;
1883*08b48e0bSAndroid Build Coastguard Worker u8 *new_buf = NULL;
1884*08b48e0bSAndroid Build Coastguard Worker u32 target_len = 0;
1885*08b48e0bSAndroid Build Coastguard Worker
1886*08b48e0bSAndroid Build Coastguard Worker /* check if splicing makes sense yet (enough entries) */
1887*08b48e0bSAndroid Build Coastguard Worker if (likely(!afl->custom_splice_optout &&
1888*08b48e0bSAndroid Build Coastguard Worker afl->ready_for_splicing_count > 1)) {
1889*08b48e0bSAndroid Build Coastguard Worker
1890*08b48e0bSAndroid Build Coastguard Worker /* Pick a random other queue entry for passing to external API
1891*08b48e0bSAndroid Build Coastguard Worker that has the necessary length */
1892*08b48e0bSAndroid Build Coastguard Worker
1893*08b48e0bSAndroid Build Coastguard Worker do {
1894*08b48e0bSAndroid Build Coastguard Worker
1895*08b48e0bSAndroid Build Coastguard Worker tid = rand_below(afl, afl->queued_items);
1896*08b48e0bSAndroid Build Coastguard Worker
1897*08b48e0bSAndroid Build Coastguard Worker } while (unlikely(tid == afl->current_entry ||
1898*08b48e0bSAndroid Build Coastguard Worker
1899*08b48e0bSAndroid Build Coastguard Worker afl->queue_buf[tid]->len < 4));
1900*08b48e0bSAndroid Build Coastguard Worker
1901*08b48e0bSAndroid Build Coastguard Worker target = afl->queue_buf[tid];
1902*08b48e0bSAndroid Build Coastguard Worker afl->splicing_with = tid;
1903*08b48e0bSAndroid Build Coastguard Worker
1904*08b48e0bSAndroid Build Coastguard Worker /* Read the additional testcase into a new buffer. */
1905*08b48e0bSAndroid Build Coastguard Worker new_buf = queue_testcase_get(afl, target);
1906*08b48e0bSAndroid Build Coastguard Worker target_len = target->len;
1907*08b48e0bSAndroid Build Coastguard Worker
1908*08b48e0bSAndroid Build Coastguard Worker }
1909*08b48e0bSAndroid Build Coastguard Worker
1910*08b48e0bSAndroid Build Coastguard Worker u8 *mutated_buf = NULL;
1911*08b48e0bSAndroid Build Coastguard Worker
1912*08b48e0bSAndroid Build Coastguard Worker size_t mutated_size =
1913*08b48e0bSAndroid Build Coastguard Worker el->afl_custom_fuzz(el->data, out_buf, len, &mutated_buf, new_buf,
1914*08b48e0bSAndroid Build Coastguard Worker target_len, max_seed_size);
1915*08b48e0bSAndroid Build Coastguard Worker
1916*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!mutated_buf)) {
1917*08b48e0bSAndroid Build Coastguard Worker
1918*08b48e0bSAndroid Build Coastguard Worker // FATAL("Error in custom_fuzz. Size returned: %zu", mutated_size);
1919*08b48e0bSAndroid Build Coastguard Worker break;
1920*08b48e0bSAndroid Build Coastguard Worker
1921*08b48e0bSAndroid Build Coastguard Worker }
1922*08b48e0bSAndroid Build Coastguard Worker
1923*08b48e0bSAndroid Build Coastguard Worker if (mutated_size > 0) {
1924*08b48e0bSAndroid Build Coastguard Worker
1925*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, mutated_buf, (u32)mutated_size)) {
1926*08b48e0bSAndroid Build Coastguard Worker
1927*08b48e0bSAndroid Build Coastguard Worker goto abandon_entry;
1928*08b48e0bSAndroid Build Coastguard Worker
1929*08b48e0bSAndroid Build Coastguard Worker }
1930*08b48e0bSAndroid Build Coastguard Worker
1931*08b48e0bSAndroid Build Coastguard Worker if (!el->afl_custom_fuzz_count) {
1932*08b48e0bSAndroid Build Coastguard Worker
1933*08b48e0bSAndroid Build Coastguard Worker /* If we're finding new stuff, let's run for a bit longer, limits
1934*08b48e0bSAndroid Build Coastguard Worker permitting. */
1935*08b48e0bSAndroid Build Coastguard Worker
1936*08b48e0bSAndroid Build Coastguard Worker if (afl->queued_items != havoc_queued) {
1937*08b48e0bSAndroid Build Coastguard Worker
1938*08b48e0bSAndroid Build Coastguard Worker if (perf_score <= afl->havoc_max_mult * 100) {
1939*08b48e0bSAndroid Build Coastguard Worker
1940*08b48e0bSAndroid Build Coastguard Worker afl->stage_max *= 2;
1941*08b48e0bSAndroid Build Coastguard Worker perf_score *= 2;
1942*08b48e0bSAndroid Build Coastguard Worker
1943*08b48e0bSAndroid Build Coastguard Worker }
1944*08b48e0bSAndroid Build Coastguard Worker
1945*08b48e0bSAndroid Build Coastguard Worker havoc_queued = afl->queued_items;
1946*08b48e0bSAndroid Build Coastguard Worker
1947*08b48e0bSAndroid Build Coastguard Worker }
1948*08b48e0bSAndroid Build Coastguard Worker
1949*08b48e0bSAndroid Build Coastguard Worker }
1950*08b48e0bSAndroid Build Coastguard Worker
1951*08b48e0bSAndroid Build Coastguard Worker }
1952*08b48e0bSAndroid Build Coastguard Worker
1953*08b48e0bSAndroid Build Coastguard Worker /* out_buf may have been changed by the call to custom_fuzz */
1954*08b48e0bSAndroid Build Coastguard Worker memcpy(out_buf, in_buf, len);
1955*08b48e0bSAndroid Build Coastguard Worker
1956*08b48e0bSAndroid Build Coastguard Worker }
1957*08b48e0bSAndroid Build Coastguard Worker
1958*08b48e0bSAndroid Build Coastguard Worker }
1959*08b48e0bSAndroid Build Coastguard Worker
1960*08b48e0bSAndroid Build Coastguard Worker }
1961*08b48e0bSAndroid Build Coastguard Worker
1962*08b48e0bSAndroid Build Coastguard Worker });
1963*08b48e0bSAndroid Build Coastguard Worker
1964*08b48e0bSAndroid Build Coastguard Worker afl->current_custom_fuzz = NULL;
1965*08b48e0bSAndroid Build Coastguard Worker
1966*08b48e0bSAndroid Build Coastguard Worker if (!has_custom_fuzz) goto havoc_stage;
1967*08b48e0bSAndroid Build Coastguard Worker
1968*08b48e0bSAndroid Build Coastguard Worker new_hit_cnt = afl->queued_items + afl->saved_crashes;
1969*08b48e0bSAndroid Build Coastguard Worker
1970*08b48e0bSAndroid Build Coastguard Worker afl->stage_finds[STAGE_CUSTOM_MUTATOR] += new_hit_cnt - orig_hit_cnt;
1971*08b48e0bSAndroid Build Coastguard Worker afl->stage_cycles[STAGE_CUSTOM_MUTATOR] += afl->stage_cur;
1972*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
1973*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->stats_mutated += afl->stage_max;
1974*08b48e0bSAndroid Build Coastguard Worker #endif
1975*08b48e0bSAndroid Build Coastguard Worker
1976*08b48e0bSAndroid Build Coastguard Worker /****************
1977*08b48e0bSAndroid Build Coastguard Worker * RANDOM HAVOC *
1978*08b48e0bSAndroid Build Coastguard Worker ****************/
1979*08b48e0bSAndroid Build Coastguard Worker
1980*08b48e0bSAndroid Build Coastguard Worker havoc_stage:
1981*08b48e0bSAndroid Build Coastguard Worker
1982*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
1983*08b48e0bSAndroid Build Coastguard Worker
1984*08b48e0bSAndroid Build Coastguard Worker if (!is_logged) {
1985*08b48e0bSAndroid Build Coastguard Worker
1986*08b48e0bSAndroid Build Coastguard Worker is_logged = 1;
1987*08b48e0bSAndroid Build Coastguard Worker before_havoc_findings = afl->queued_items;
1988*08b48e0bSAndroid Build Coastguard Worker before_havoc_edges = count_non_255_bytes(afl, afl->virgin_bits);
1989*08b48e0bSAndroid Build Coastguard Worker before_havoc_time = get_cur_time();
1990*08b48e0bSAndroid Build Coastguard Worker
1991*08b48e0bSAndroid Build Coastguard Worker }
1992*08b48e0bSAndroid Build Coastguard Worker
1993*08b48e0bSAndroid Build Coastguard Worker #endif
1994*08b48e0bSAndroid Build Coastguard Worker
1995*08b48e0bSAndroid Build Coastguard Worker if (unlikely(afl->custom_only)) {
1996*08b48e0bSAndroid Build Coastguard Worker
1997*08b48e0bSAndroid Build Coastguard Worker /* Force UI update */
1998*08b48e0bSAndroid Build Coastguard Worker show_stats(afl);
1999*08b48e0bSAndroid Build Coastguard Worker /* Skip other stages */
2000*08b48e0bSAndroid Build Coastguard Worker ret_val = 0;
2001*08b48e0bSAndroid Build Coastguard Worker goto abandon_entry;
2002*08b48e0bSAndroid Build Coastguard Worker
2003*08b48e0bSAndroid Build Coastguard Worker }
2004*08b48e0bSAndroid Build Coastguard Worker
2005*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_byte = -1;
2006*08b48e0bSAndroid Build Coastguard Worker
2007*08b48e0bSAndroid Build Coastguard Worker /* The havoc stage mutation code is also invoked when splicing files; if the
2008*08b48e0bSAndroid Build Coastguard Worker splice_cycle variable is set, generate different descriptions and such. */
2009*08b48e0bSAndroid Build Coastguard Worker
2010*08b48e0bSAndroid Build Coastguard Worker if (!splice_cycle) {
2011*08b48e0bSAndroid Build Coastguard Worker
2012*08b48e0bSAndroid Build Coastguard Worker afl->stage_name = "havoc";
2013*08b48e0bSAndroid Build Coastguard Worker afl->stage_short = "havoc";
2014*08b48e0bSAndroid Build Coastguard Worker afl->stage_max = ((doing_det ? HAVOC_CYCLES_INIT : HAVOC_CYCLES) *
2015*08b48e0bSAndroid Build Coastguard Worker perf_score / afl->havoc_div) >>
2016*08b48e0bSAndroid Build Coastguard Worker 8;
2017*08b48e0bSAndroid Build Coastguard Worker
2018*08b48e0bSAndroid Build Coastguard Worker } else {
2019*08b48e0bSAndroid Build Coastguard Worker
2020*08b48e0bSAndroid Build Coastguard Worker perf_score = orig_perf;
2021*08b48e0bSAndroid Build Coastguard Worker
2022*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->stage_name_buf, STAGE_BUF_SIZE, "splice %u", splice_cycle);
2023*08b48e0bSAndroid Build Coastguard Worker afl->stage_name = afl->stage_name_buf;
2024*08b48e0bSAndroid Build Coastguard Worker afl->stage_short = "splice";
2025*08b48e0bSAndroid Build Coastguard Worker afl->stage_max = (SPLICE_HAVOC * perf_score / afl->havoc_div) >> 8;
2026*08b48e0bSAndroid Build Coastguard Worker
2027*08b48e0bSAndroid Build Coastguard Worker }
2028*08b48e0bSAndroid Build Coastguard Worker
2029*08b48e0bSAndroid Build Coastguard Worker if (unlikely(afl->stage_max < HAVOC_MIN)) { afl->stage_max = HAVOC_MIN; }
2030*08b48e0bSAndroid Build Coastguard Worker
2031*08b48e0bSAndroid Build Coastguard Worker temp_len = len;
2032*08b48e0bSAndroid Build Coastguard Worker
2033*08b48e0bSAndroid Build Coastguard Worker orig_hit_cnt = afl->queued_items + afl->saved_crashes;
2034*08b48e0bSAndroid Build Coastguard Worker
2035*08b48e0bSAndroid Build Coastguard Worker havoc_queued = afl->queued_items;
2036*08b48e0bSAndroid Build Coastguard Worker
2037*08b48e0bSAndroid Build Coastguard Worker if (afl->custom_mutators_count) {
2038*08b48e0bSAndroid Build Coastguard Worker
2039*08b48e0bSAndroid Build Coastguard Worker LIST_FOREACH(&afl->custom_mutator_list, struct custom_mutator, {
2040*08b48e0bSAndroid Build Coastguard Worker
2041*08b48e0bSAndroid Build Coastguard Worker if (el->stacked_custom && el->afl_custom_havoc_mutation_probability) {
2042*08b48e0bSAndroid Build Coastguard Worker
2043*08b48e0bSAndroid Build Coastguard Worker el->stacked_custom_prob =
2044*08b48e0bSAndroid Build Coastguard Worker el->afl_custom_havoc_mutation_probability(el->data);
2045*08b48e0bSAndroid Build Coastguard Worker if (el->stacked_custom_prob > 100) {
2046*08b48e0bSAndroid Build Coastguard Worker
2047*08b48e0bSAndroid Build Coastguard Worker FATAL(
2048*08b48e0bSAndroid Build Coastguard Worker "The probability returned by "
2049*08b48e0bSAndroid Build Coastguard Worker "afl_custom_havoc_mutation_propability "
2050*08b48e0bSAndroid Build Coastguard Worker "has to be in the range 0-100.");
2051*08b48e0bSAndroid Build Coastguard Worker
2052*08b48e0bSAndroid Build Coastguard Worker }
2053*08b48e0bSAndroid Build Coastguard Worker
2054*08b48e0bSAndroid Build Coastguard Worker }
2055*08b48e0bSAndroid Build Coastguard Worker
2056*08b48e0bSAndroid Build Coastguard Worker });
2057*08b48e0bSAndroid Build Coastguard Worker
2058*08b48e0bSAndroid Build Coastguard Worker }
2059*08b48e0bSAndroid Build Coastguard Worker
2060*08b48e0bSAndroid Build Coastguard Worker /* We essentially just do several thousand runs (depending on perf_score)
2061*08b48e0bSAndroid Build Coastguard Worker where we take the input file and make random stacked tweaks. */
2062*08b48e0bSAndroid Build Coastguard Worker
2063*08b48e0bSAndroid Build Coastguard Worker u32 *mutation_array;
2064*08b48e0bSAndroid Build Coastguard Worker u32 stack_max, rand_max; // stack_max_pow = afl->havoc_stack_pow2;
2065*08b48e0bSAndroid Build Coastguard Worker
2066*08b48e0bSAndroid Build Coastguard Worker switch (afl->input_mode) {
2067*08b48e0bSAndroid Build Coastguard Worker
2068*08b48e0bSAndroid Build Coastguard Worker case 1: { // TEXT
2069*08b48e0bSAndroid Build Coastguard Worker
2070*08b48e0bSAndroid Build Coastguard Worker if (likely(afl->fuzz_mode == 0)) { // is exploration?
2071*08b48e0bSAndroid Build Coastguard Worker mutation_array = (unsigned int *)&binary_array;
2072*08b48e0bSAndroid Build Coastguard Worker rand_max = MUT_BIN_ARRAY_SIZE;
2073*08b48e0bSAndroid Build Coastguard Worker
2074*08b48e0bSAndroid Build Coastguard Worker } else { // exploitation mode
2075*08b48e0bSAndroid Build Coastguard Worker
2076*08b48e0bSAndroid Build Coastguard Worker mutation_array = (unsigned int *)&text_array;
2077*08b48e0bSAndroid Build Coastguard Worker rand_max = MUT_TXT_ARRAY_SIZE;
2078*08b48e0bSAndroid Build Coastguard Worker
2079*08b48e0bSAndroid Build Coastguard Worker }
2080*08b48e0bSAndroid Build Coastguard Worker
2081*08b48e0bSAndroid Build Coastguard Worker break;
2082*08b48e0bSAndroid Build Coastguard Worker
2083*08b48e0bSAndroid Build Coastguard Worker }
2084*08b48e0bSAndroid Build Coastguard Worker
2085*08b48e0bSAndroid Build Coastguard Worker case 2: { // BINARY
2086*08b48e0bSAndroid Build Coastguard Worker
2087*08b48e0bSAndroid Build Coastguard Worker if (likely(afl->fuzz_mode == 0)) { // is exploration?
2088*08b48e0bSAndroid Build Coastguard Worker mutation_array = (unsigned int *)&mutation_strategy_exploration_binary;
2089*08b48e0bSAndroid Build Coastguard Worker rand_max = MUT_STRATEGY_ARRAY_SIZE;
2090*08b48e0bSAndroid Build Coastguard Worker
2091*08b48e0bSAndroid Build Coastguard Worker } else { // exploitation mode
2092*08b48e0bSAndroid Build Coastguard Worker
2093*08b48e0bSAndroid Build Coastguard Worker mutation_array = (unsigned int *)&mutation_strategy_exploitation_binary;
2094*08b48e0bSAndroid Build Coastguard Worker rand_max = MUT_STRATEGY_ARRAY_SIZE;
2095*08b48e0bSAndroid Build Coastguard Worker // or this one? we do not have enough binary bug benchmarks :-(
2096*08b48e0bSAndroid Build Coastguard Worker // mutation_array = (unsigned int *)&binary_array;
2097*08b48e0bSAndroid Build Coastguard Worker // rand_max = MUT_BIN_ARRAY_SIZE;
2098*08b48e0bSAndroid Build Coastguard Worker
2099*08b48e0bSAndroid Build Coastguard Worker }
2100*08b48e0bSAndroid Build Coastguard Worker
2101*08b48e0bSAndroid Build Coastguard Worker break;
2102*08b48e0bSAndroid Build Coastguard Worker
2103*08b48e0bSAndroid Build Coastguard Worker }
2104*08b48e0bSAndroid Build Coastguard Worker
2105*08b48e0bSAndroid Build Coastguard Worker default: { // DEFAULT/GENERIC
2106*08b48e0bSAndroid Build Coastguard Worker
2107*08b48e0bSAndroid Build Coastguard Worker if (likely(afl->fuzz_mode == 0)) { // is exploration?
2108*08b48e0bSAndroid Build Coastguard Worker mutation_array = (unsigned int *)&binary_array;
2109*08b48e0bSAndroid Build Coastguard Worker rand_max = MUT_BIN_ARRAY_SIZE;
2110*08b48e0bSAndroid Build Coastguard Worker
2111*08b48e0bSAndroid Build Coastguard Worker } else { // exploitation mode
2112*08b48e0bSAndroid Build Coastguard Worker
2113*08b48e0bSAndroid Build Coastguard Worker mutation_array = (unsigned int *)&text_array;
2114*08b48e0bSAndroid Build Coastguard Worker rand_max = MUT_TXT_ARRAY_SIZE;
2115*08b48e0bSAndroid Build Coastguard Worker
2116*08b48e0bSAndroid Build Coastguard Worker }
2117*08b48e0bSAndroid Build Coastguard Worker
2118*08b48e0bSAndroid Build Coastguard Worker break;
2119*08b48e0bSAndroid Build Coastguard Worker
2120*08b48e0bSAndroid Build Coastguard Worker }
2121*08b48e0bSAndroid Build Coastguard Worker
2122*08b48e0bSAndroid Build Coastguard Worker }
2123*08b48e0bSAndroid Build Coastguard Worker
2124*08b48e0bSAndroid Build Coastguard Worker /*
2125*08b48e0bSAndroid Build Coastguard Worker if (temp_len < 64) {
2126*08b48e0bSAndroid Build Coastguard Worker
2127*08b48e0bSAndroid Build Coastguard Worker --stack_max_pow;
2128*08b48e0bSAndroid Build Coastguard Worker
2129*08b48e0bSAndroid Build Coastguard Worker } else if (temp_len <= 8096) {
2130*08b48e0bSAndroid Build Coastguard Worker
2131*08b48e0bSAndroid Build Coastguard Worker ++stack_max_pow;
2132*08b48e0bSAndroid Build Coastguard Worker
2133*08b48e0bSAndroid Build Coastguard Worker } else {
2134*08b48e0bSAndroid Build Coastguard Worker
2135*08b48e0bSAndroid Build Coastguard Worker ++stack_max_pow;
2136*08b48e0bSAndroid Build Coastguard Worker
2137*08b48e0bSAndroid Build Coastguard Worker }
2138*08b48e0bSAndroid Build Coastguard Worker
2139*08b48e0bSAndroid Build Coastguard Worker */
2140*08b48e0bSAndroid Build Coastguard Worker
2141*08b48e0bSAndroid Build Coastguard Worker stack_max = 1 << (1 + rand_below(afl, afl->havoc_stack_pow2));
2142*08b48e0bSAndroid Build Coastguard Worker
2143*08b48e0bSAndroid Build Coastguard Worker // + (afl->extras_cnt ? 2 : 0) + (afl->a_extras_cnt ? 2 : 0);
2144*08b48e0bSAndroid Build Coastguard Worker
2145*08b48e0bSAndroid Build Coastguard Worker for (afl->stage_cur = 0; afl->stage_cur < afl->stage_max; ++afl->stage_cur) {
2146*08b48e0bSAndroid Build Coastguard Worker
2147*08b48e0bSAndroid Build Coastguard Worker u32 use_stacking = 1 + rand_below(afl, stack_max);
2148*08b48e0bSAndroid Build Coastguard Worker
2149*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_val = use_stacking;
2150*08b48e0bSAndroid Build Coastguard Worker
2151*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
2152*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->mutation, sizeof(afl->mutation), "%s HAVOC-%u-%u",
2153*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->fname, afl->queue_cur->is_ascii, use_stacking);
2154*08b48e0bSAndroid Build Coastguard Worker #endif
2155*08b48e0bSAndroid Build Coastguard Worker
2156*08b48e0bSAndroid Build Coastguard Worker for (i = 0; i < use_stacking; ++i) {
2157*08b48e0bSAndroid Build Coastguard Worker
2158*08b48e0bSAndroid Build Coastguard Worker if (afl->custom_mutators_count) {
2159*08b48e0bSAndroid Build Coastguard Worker
2160*08b48e0bSAndroid Build Coastguard Worker LIST_FOREACH(&afl->custom_mutator_list, struct custom_mutator, {
2161*08b48e0bSAndroid Build Coastguard Worker
2162*08b48e0bSAndroid Build Coastguard Worker if (unlikely(el->stacked_custom &&
2163*08b48e0bSAndroid Build Coastguard Worker rand_below(afl, 100) < el->stacked_custom_prob)) {
2164*08b48e0bSAndroid Build Coastguard Worker
2165*08b48e0bSAndroid Build Coastguard Worker u8 *custom_havoc_buf = NULL;
2166*08b48e0bSAndroid Build Coastguard Worker size_t new_len = el->afl_custom_havoc_mutation(
2167*08b48e0bSAndroid Build Coastguard Worker el->data, out_buf, temp_len, &custom_havoc_buf, MAX_FILE);
2168*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!custom_havoc_buf)) {
2169*08b48e0bSAndroid Build Coastguard Worker
2170*08b48e0bSAndroid Build Coastguard Worker FATAL("Error in custom_havoc (return %zu)", new_len);
2171*08b48e0bSAndroid Build Coastguard Worker
2172*08b48e0bSAndroid Build Coastguard Worker }
2173*08b48e0bSAndroid Build Coastguard Worker
2174*08b48e0bSAndroid Build Coastguard Worker if (likely(new_len > 0 && custom_havoc_buf)) {
2175*08b48e0bSAndroid Build Coastguard Worker
2176*08b48e0bSAndroid Build Coastguard Worker temp_len = new_len;
2177*08b48e0bSAndroid Build Coastguard Worker if (out_buf != custom_havoc_buf) {
2178*08b48e0bSAndroid Build Coastguard Worker
2179*08b48e0bSAndroid Build Coastguard Worker out_buf = afl_realloc(AFL_BUF_PARAM(out), temp_len);
2180*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!afl->out_buf)) { PFATAL("alloc"); }
2181*08b48e0bSAndroid Build Coastguard Worker memcpy(out_buf, custom_havoc_buf, temp_len);
2182*08b48e0bSAndroid Build Coastguard Worker
2183*08b48e0bSAndroid Build Coastguard Worker }
2184*08b48e0bSAndroid Build Coastguard Worker
2185*08b48e0bSAndroid Build Coastguard Worker }
2186*08b48e0bSAndroid Build Coastguard Worker
2187*08b48e0bSAndroid Build Coastguard Worker }
2188*08b48e0bSAndroid Build Coastguard Worker
2189*08b48e0bSAndroid Build Coastguard Worker });
2190*08b48e0bSAndroid Build Coastguard Worker
2191*08b48e0bSAndroid Build Coastguard Worker }
2192*08b48e0bSAndroid Build Coastguard Worker
2193*08b48e0bSAndroid Build Coastguard Worker retry_havoc_step: {
2194*08b48e0bSAndroid Build Coastguard Worker
2195*08b48e0bSAndroid Build Coastguard Worker u32 r = rand_below(afl, rand_max), item;
2196*08b48e0bSAndroid Build Coastguard Worker
2197*08b48e0bSAndroid Build Coastguard Worker switch (mutation_array[r]) {
2198*08b48e0bSAndroid Build Coastguard Worker
2199*08b48e0bSAndroid Build Coastguard Worker case MUT_FLIPBIT: {
2200*08b48e0bSAndroid Build Coastguard Worker
2201*08b48e0bSAndroid Build Coastguard Worker /* Flip a single bit somewhere. Spooky! */
2202*08b48e0bSAndroid Build Coastguard Worker u8 bit = rand_below(afl, 8);
2203*08b48e0bSAndroid Build Coastguard Worker u32 off = rand_below(afl, temp_len);
2204*08b48e0bSAndroid Build Coastguard Worker out_buf[off] ^= 1 << bit;
2205*08b48e0bSAndroid Build Coastguard Worker
2206*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
2207*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " FLIP-BIT_%u", bit);
2208*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
2209*08b48e0bSAndroid Build Coastguard Worker #endif
2210*08b48e0bSAndroid Build Coastguard Worker break;
2211*08b48e0bSAndroid Build Coastguard Worker
2212*08b48e0bSAndroid Build Coastguard Worker }
2213*08b48e0bSAndroid Build Coastguard Worker
2214*08b48e0bSAndroid Build Coastguard Worker case MUT_INTERESTING8: {
2215*08b48e0bSAndroid Build Coastguard Worker
2216*08b48e0bSAndroid Build Coastguard Worker /* Set byte to interesting value. */
2217*08b48e0bSAndroid Build Coastguard Worker
2218*08b48e0bSAndroid Build Coastguard Worker item = rand_below(afl, sizeof(interesting_8));
2219*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
2220*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " INTERESTING8_%u", item);
2221*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
2222*08b48e0bSAndroid Build Coastguard Worker #endif
2223*08b48e0bSAndroid Build Coastguard Worker out_buf[rand_below(afl, temp_len)] = interesting_8[item];
2224*08b48e0bSAndroid Build Coastguard Worker break;
2225*08b48e0bSAndroid Build Coastguard Worker
2226*08b48e0bSAndroid Build Coastguard Worker }
2227*08b48e0bSAndroid Build Coastguard Worker
2228*08b48e0bSAndroid Build Coastguard Worker case MUT_INTERESTING16: {
2229*08b48e0bSAndroid Build Coastguard Worker
2230*08b48e0bSAndroid Build Coastguard Worker /* Set word to interesting value, little endian. */
2231*08b48e0bSAndroid Build Coastguard Worker
2232*08b48e0bSAndroid Build Coastguard Worker if (unlikely(temp_len < 2)) { break; } // no retry
2233*08b48e0bSAndroid Build Coastguard Worker
2234*08b48e0bSAndroid Build Coastguard Worker item = rand_below(afl, sizeof(interesting_16) >> 1);
2235*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
2236*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " INTERESTING16_%u", item);
2237*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
2238*08b48e0bSAndroid Build Coastguard Worker #endif
2239*08b48e0bSAndroid Build Coastguard Worker
2240*08b48e0bSAndroid Build Coastguard Worker *(u16 *)(out_buf + rand_below(afl, temp_len - 1)) =
2241*08b48e0bSAndroid Build Coastguard Worker interesting_16[item];
2242*08b48e0bSAndroid Build Coastguard Worker
2243*08b48e0bSAndroid Build Coastguard Worker break;
2244*08b48e0bSAndroid Build Coastguard Worker
2245*08b48e0bSAndroid Build Coastguard Worker }
2246*08b48e0bSAndroid Build Coastguard Worker
2247*08b48e0bSAndroid Build Coastguard Worker case MUT_INTERESTING16BE: {
2248*08b48e0bSAndroid Build Coastguard Worker
2249*08b48e0bSAndroid Build Coastguard Worker /* Set word to interesting value, big endian. */
2250*08b48e0bSAndroid Build Coastguard Worker
2251*08b48e0bSAndroid Build Coastguard Worker if (unlikely(temp_len < 2)) { break; } // no retry
2252*08b48e0bSAndroid Build Coastguard Worker
2253*08b48e0bSAndroid Build Coastguard Worker item = rand_below(afl, sizeof(interesting_16) >> 1);
2254*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
2255*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " INTERESTING16BE_%u", item);
2256*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
2257*08b48e0bSAndroid Build Coastguard Worker #endif
2258*08b48e0bSAndroid Build Coastguard Worker *(u16 *)(out_buf + rand_below(afl, temp_len - 1)) =
2259*08b48e0bSAndroid Build Coastguard Worker SWAP16(interesting_16[item]);
2260*08b48e0bSAndroid Build Coastguard Worker
2261*08b48e0bSAndroid Build Coastguard Worker break;
2262*08b48e0bSAndroid Build Coastguard Worker
2263*08b48e0bSAndroid Build Coastguard Worker }
2264*08b48e0bSAndroid Build Coastguard Worker
2265*08b48e0bSAndroid Build Coastguard Worker case MUT_INTERESTING32: {
2266*08b48e0bSAndroid Build Coastguard Worker
2267*08b48e0bSAndroid Build Coastguard Worker /* Set dword to interesting value, little endian. */
2268*08b48e0bSAndroid Build Coastguard Worker
2269*08b48e0bSAndroid Build Coastguard Worker if (unlikely(temp_len < 4)) { break; } // no retry
2270*08b48e0bSAndroid Build Coastguard Worker
2271*08b48e0bSAndroid Build Coastguard Worker item = rand_below(afl, sizeof(interesting_32) >> 2);
2272*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
2273*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " INTERESTING32_%u", item);
2274*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
2275*08b48e0bSAndroid Build Coastguard Worker #endif
2276*08b48e0bSAndroid Build Coastguard Worker
2277*08b48e0bSAndroid Build Coastguard Worker *(u32 *)(out_buf + rand_below(afl, temp_len - 3)) =
2278*08b48e0bSAndroid Build Coastguard Worker interesting_32[item];
2279*08b48e0bSAndroid Build Coastguard Worker
2280*08b48e0bSAndroid Build Coastguard Worker break;
2281*08b48e0bSAndroid Build Coastguard Worker
2282*08b48e0bSAndroid Build Coastguard Worker }
2283*08b48e0bSAndroid Build Coastguard Worker
2284*08b48e0bSAndroid Build Coastguard Worker case MUT_INTERESTING32BE: {
2285*08b48e0bSAndroid Build Coastguard Worker
2286*08b48e0bSAndroid Build Coastguard Worker /* Set dword to interesting value, big endian. */
2287*08b48e0bSAndroid Build Coastguard Worker
2288*08b48e0bSAndroid Build Coastguard Worker if (unlikely(temp_len < 4)) { break; } // no retry
2289*08b48e0bSAndroid Build Coastguard Worker
2290*08b48e0bSAndroid Build Coastguard Worker item = rand_below(afl, sizeof(interesting_32) >> 2);
2291*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
2292*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " INTERESTING32BE_%u", item);
2293*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
2294*08b48e0bSAndroid Build Coastguard Worker #endif
2295*08b48e0bSAndroid Build Coastguard Worker *(u32 *)(out_buf + rand_below(afl, temp_len - 3)) =
2296*08b48e0bSAndroid Build Coastguard Worker SWAP32(interesting_32[item]);
2297*08b48e0bSAndroid Build Coastguard Worker
2298*08b48e0bSAndroid Build Coastguard Worker break;
2299*08b48e0bSAndroid Build Coastguard Worker
2300*08b48e0bSAndroid Build Coastguard Worker }
2301*08b48e0bSAndroid Build Coastguard Worker
2302*08b48e0bSAndroid Build Coastguard Worker case MUT_ARITH8_: {
2303*08b48e0bSAndroid Build Coastguard Worker
2304*08b48e0bSAndroid Build Coastguard Worker /* Randomly subtract from byte. */
2305*08b48e0bSAndroid Build Coastguard Worker
2306*08b48e0bSAndroid Build Coastguard Worker item = 1 + rand_below(afl, ARITH_MAX);
2307*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
2308*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " ARITH8-_%u", item);
2309*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
2310*08b48e0bSAndroid Build Coastguard Worker #endif
2311*08b48e0bSAndroid Build Coastguard Worker out_buf[rand_below(afl, temp_len)] -= item;
2312*08b48e0bSAndroid Build Coastguard Worker break;
2313*08b48e0bSAndroid Build Coastguard Worker
2314*08b48e0bSAndroid Build Coastguard Worker }
2315*08b48e0bSAndroid Build Coastguard Worker
2316*08b48e0bSAndroid Build Coastguard Worker case MUT_ARITH8: {
2317*08b48e0bSAndroid Build Coastguard Worker
2318*08b48e0bSAndroid Build Coastguard Worker /* Randomly add to byte. */
2319*08b48e0bSAndroid Build Coastguard Worker
2320*08b48e0bSAndroid Build Coastguard Worker item = 1 + rand_below(afl, ARITH_MAX);
2321*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
2322*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " ARITH8+_%u", item);
2323*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
2324*08b48e0bSAndroid Build Coastguard Worker #endif
2325*08b48e0bSAndroid Build Coastguard Worker out_buf[rand_below(afl, temp_len)] += item;
2326*08b48e0bSAndroid Build Coastguard Worker break;
2327*08b48e0bSAndroid Build Coastguard Worker
2328*08b48e0bSAndroid Build Coastguard Worker }
2329*08b48e0bSAndroid Build Coastguard Worker
2330*08b48e0bSAndroid Build Coastguard Worker case MUT_ARITH16_: {
2331*08b48e0bSAndroid Build Coastguard Worker
2332*08b48e0bSAndroid Build Coastguard Worker /* Randomly subtract from word, little endian. */
2333*08b48e0bSAndroid Build Coastguard Worker
2334*08b48e0bSAndroid Build Coastguard Worker if (unlikely(temp_len < 2)) { break; } // no retry
2335*08b48e0bSAndroid Build Coastguard Worker
2336*08b48e0bSAndroid Build Coastguard Worker u32 pos = rand_below(afl, temp_len - 1);
2337*08b48e0bSAndroid Build Coastguard Worker item = 1 + rand_below(afl, ARITH_MAX);
2338*08b48e0bSAndroid Build Coastguard Worker
2339*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
2340*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " ARITH16-_%u", item);
2341*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
2342*08b48e0bSAndroid Build Coastguard Worker #endif
2343*08b48e0bSAndroid Build Coastguard Worker *(u16 *)(out_buf + pos) -= item;
2344*08b48e0bSAndroid Build Coastguard Worker
2345*08b48e0bSAndroid Build Coastguard Worker break;
2346*08b48e0bSAndroid Build Coastguard Worker
2347*08b48e0bSAndroid Build Coastguard Worker }
2348*08b48e0bSAndroid Build Coastguard Worker
2349*08b48e0bSAndroid Build Coastguard Worker case MUT_ARITH16BE_: {
2350*08b48e0bSAndroid Build Coastguard Worker
2351*08b48e0bSAndroid Build Coastguard Worker /* Randomly subtract from word, big endian. */
2352*08b48e0bSAndroid Build Coastguard Worker
2353*08b48e0bSAndroid Build Coastguard Worker if (unlikely(temp_len < 2)) { break; } // no retry
2354*08b48e0bSAndroid Build Coastguard Worker
2355*08b48e0bSAndroid Build Coastguard Worker u32 pos = rand_below(afl, temp_len - 1);
2356*08b48e0bSAndroid Build Coastguard Worker u16 num = 1 + rand_below(afl, ARITH_MAX);
2357*08b48e0bSAndroid Build Coastguard Worker
2358*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
2359*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " ARITH16BE-_%u", num);
2360*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
2361*08b48e0bSAndroid Build Coastguard Worker #endif
2362*08b48e0bSAndroid Build Coastguard Worker *(u16 *)(out_buf + pos) =
2363*08b48e0bSAndroid Build Coastguard Worker SWAP16(SWAP16(*(u16 *)(out_buf + pos)) - num);
2364*08b48e0bSAndroid Build Coastguard Worker
2365*08b48e0bSAndroid Build Coastguard Worker break;
2366*08b48e0bSAndroid Build Coastguard Worker
2367*08b48e0bSAndroid Build Coastguard Worker }
2368*08b48e0bSAndroid Build Coastguard Worker
2369*08b48e0bSAndroid Build Coastguard Worker case MUT_ARITH16: {
2370*08b48e0bSAndroid Build Coastguard Worker
2371*08b48e0bSAndroid Build Coastguard Worker /* Randomly add to word, little endian. */
2372*08b48e0bSAndroid Build Coastguard Worker
2373*08b48e0bSAndroid Build Coastguard Worker if (unlikely(temp_len < 2)) { break; } // no retry
2374*08b48e0bSAndroid Build Coastguard Worker
2375*08b48e0bSAndroid Build Coastguard Worker u32 pos = rand_below(afl, temp_len - 1);
2376*08b48e0bSAndroid Build Coastguard Worker item = 1 + rand_below(afl, ARITH_MAX);
2377*08b48e0bSAndroid Build Coastguard Worker
2378*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
2379*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " ARITH16+_%u", item);
2380*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
2381*08b48e0bSAndroid Build Coastguard Worker #endif
2382*08b48e0bSAndroid Build Coastguard Worker *(u16 *)(out_buf + pos) += item;
2383*08b48e0bSAndroid Build Coastguard Worker
2384*08b48e0bSAndroid Build Coastguard Worker break;
2385*08b48e0bSAndroid Build Coastguard Worker
2386*08b48e0bSAndroid Build Coastguard Worker }
2387*08b48e0bSAndroid Build Coastguard Worker
2388*08b48e0bSAndroid Build Coastguard Worker case MUT_ARITH16BE: {
2389*08b48e0bSAndroid Build Coastguard Worker
2390*08b48e0bSAndroid Build Coastguard Worker /* Randomly add to word, big endian. */
2391*08b48e0bSAndroid Build Coastguard Worker
2392*08b48e0bSAndroid Build Coastguard Worker if (unlikely(temp_len < 2)) { break; } // no retry
2393*08b48e0bSAndroid Build Coastguard Worker
2394*08b48e0bSAndroid Build Coastguard Worker u32 pos = rand_below(afl, temp_len - 1);
2395*08b48e0bSAndroid Build Coastguard Worker u16 num = 1 + rand_below(afl, ARITH_MAX);
2396*08b48e0bSAndroid Build Coastguard Worker
2397*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
2398*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " ARITH16BE+__%u", num);
2399*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
2400*08b48e0bSAndroid Build Coastguard Worker #endif
2401*08b48e0bSAndroid Build Coastguard Worker *(u16 *)(out_buf + pos) =
2402*08b48e0bSAndroid Build Coastguard Worker SWAP16(SWAP16(*(u16 *)(out_buf + pos)) + num);
2403*08b48e0bSAndroid Build Coastguard Worker
2404*08b48e0bSAndroid Build Coastguard Worker break;
2405*08b48e0bSAndroid Build Coastguard Worker
2406*08b48e0bSAndroid Build Coastguard Worker }
2407*08b48e0bSAndroid Build Coastguard Worker
2408*08b48e0bSAndroid Build Coastguard Worker case MUT_ARITH32_: {
2409*08b48e0bSAndroid Build Coastguard Worker
2410*08b48e0bSAndroid Build Coastguard Worker /* Randomly subtract from dword, little endian. */
2411*08b48e0bSAndroid Build Coastguard Worker
2412*08b48e0bSAndroid Build Coastguard Worker if (unlikely(temp_len < 4)) { break; } // no retry
2413*08b48e0bSAndroid Build Coastguard Worker
2414*08b48e0bSAndroid Build Coastguard Worker u32 pos = rand_below(afl, temp_len - 3);
2415*08b48e0bSAndroid Build Coastguard Worker item = 1 + rand_below(afl, ARITH_MAX);
2416*08b48e0bSAndroid Build Coastguard Worker
2417*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
2418*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " ARITH32-_%u", item);
2419*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
2420*08b48e0bSAndroid Build Coastguard Worker #endif
2421*08b48e0bSAndroid Build Coastguard Worker *(u32 *)(out_buf + pos) -= item;
2422*08b48e0bSAndroid Build Coastguard Worker
2423*08b48e0bSAndroid Build Coastguard Worker break;
2424*08b48e0bSAndroid Build Coastguard Worker
2425*08b48e0bSAndroid Build Coastguard Worker }
2426*08b48e0bSAndroid Build Coastguard Worker
2427*08b48e0bSAndroid Build Coastguard Worker case MUT_ARITH32BE_: {
2428*08b48e0bSAndroid Build Coastguard Worker
2429*08b48e0bSAndroid Build Coastguard Worker /* Randomly subtract from dword, big endian. */
2430*08b48e0bSAndroid Build Coastguard Worker
2431*08b48e0bSAndroid Build Coastguard Worker if (unlikely(temp_len < 4)) { break; } // no retry
2432*08b48e0bSAndroid Build Coastguard Worker
2433*08b48e0bSAndroid Build Coastguard Worker u32 pos = rand_below(afl, temp_len - 3);
2434*08b48e0bSAndroid Build Coastguard Worker u32 num = 1 + rand_below(afl, ARITH_MAX);
2435*08b48e0bSAndroid Build Coastguard Worker
2436*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
2437*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " ARITH32BE-_%u", num);
2438*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
2439*08b48e0bSAndroid Build Coastguard Worker #endif
2440*08b48e0bSAndroid Build Coastguard Worker *(u32 *)(out_buf + pos) =
2441*08b48e0bSAndroid Build Coastguard Worker SWAP32(SWAP32(*(u32 *)(out_buf + pos)) - num);
2442*08b48e0bSAndroid Build Coastguard Worker
2443*08b48e0bSAndroid Build Coastguard Worker break;
2444*08b48e0bSAndroid Build Coastguard Worker
2445*08b48e0bSAndroid Build Coastguard Worker }
2446*08b48e0bSAndroid Build Coastguard Worker
2447*08b48e0bSAndroid Build Coastguard Worker case MUT_ARITH32: {
2448*08b48e0bSAndroid Build Coastguard Worker
2449*08b48e0bSAndroid Build Coastguard Worker /* Randomly add to dword, little endian. */
2450*08b48e0bSAndroid Build Coastguard Worker
2451*08b48e0bSAndroid Build Coastguard Worker if (unlikely(temp_len < 4)) { break; } // no retry
2452*08b48e0bSAndroid Build Coastguard Worker
2453*08b48e0bSAndroid Build Coastguard Worker u32 pos = rand_below(afl, temp_len - 3);
2454*08b48e0bSAndroid Build Coastguard Worker item = 1 + rand_below(afl, ARITH_MAX);
2455*08b48e0bSAndroid Build Coastguard Worker
2456*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
2457*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " ARITH32+_%u", item);
2458*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
2459*08b48e0bSAndroid Build Coastguard Worker #endif
2460*08b48e0bSAndroid Build Coastguard Worker *(u32 *)(out_buf + pos) += item;
2461*08b48e0bSAndroid Build Coastguard Worker
2462*08b48e0bSAndroid Build Coastguard Worker break;
2463*08b48e0bSAndroid Build Coastguard Worker
2464*08b48e0bSAndroid Build Coastguard Worker }
2465*08b48e0bSAndroid Build Coastguard Worker
2466*08b48e0bSAndroid Build Coastguard Worker case MUT_ARITH32BE: {
2467*08b48e0bSAndroid Build Coastguard Worker
2468*08b48e0bSAndroid Build Coastguard Worker /* Randomly add to dword, big endian. */
2469*08b48e0bSAndroid Build Coastguard Worker
2470*08b48e0bSAndroid Build Coastguard Worker if (unlikely(temp_len < 4)) { break; } // no retry
2471*08b48e0bSAndroid Build Coastguard Worker
2472*08b48e0bSAndroid Build Coastguard Worker u32 pos = rand_below(afl, temp_len - 3);
2473*08b48e0bSAndroid Build Coastguard Worker u32 num = 1 + rand_below(afl, ARITH_MAX);
2474*08b48e0bSAndroid Build Coastguard Worker
2475*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
2476*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " ARITH32BE+_%u", num);
2477*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
2478*08b48e0bSAndroid Build Coastguard Worker #endif
2479*08b48e0bSAndroid Build Coastguard Worker *(u32 *)(out_buf + pos) =
2480*08b48e0bSAndroid Build Coastguard Worker SWAP32(SWAP32(*(u32 *)(out_buf + pos)) + num);
2481*08b48e0bSAndroid Build Coastguard Worker
2482*08b48e0bSAndroid Build Coastguard Worker break;
2483*08b48e0bSAndroid Build Coastguard Worker
2484*08b48e0bSAndroid Build Coastguard Worker }
2485*08b48e0bSAndroid Build Coastguard Worker
2486*08b48e0bSAndroid Build Coastguard Worker case MUT_RAND8: {
2487*08b48e0bSAndroid Build Coastguard Worker
2488*08b48e0bSAndroid Build Coastguard Worker /* Just set a random byte to a random value. Because,
2489*08b48e0bSAndroid Build Coastguard Worker why not. We use XOR with 1-255 to eliminate the
2490*08b48e0bSAndroid Build Coastguard Worker possibility of a no-op. */
2491*08b48e0bSAndroid Build Coastguard Worker
2492*08b48e0bSAndroid Build Coastguard Worker u32 pos = rand_below(afl, temp_len);
2493*08b48e0bSAndroid Build Coastguard Worker item = 1 + rand_below(afl, 255);
2494*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
2495*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " RAND8_%u",
2496*08b48e0bSAndroid Build Coastguard Worker out_buf[pos] ^ item);
2497*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
2498*08b48e0bSAndroid Build Coastguard Worker #endif
2499*08b48e0bSAndroid Build Coastguard Worker out_buf[pos] ^= item;
2500*08b48e0bSAndroid Build Coastguard Worker break;
2501*08b48e0bSAndroid Build Coastguard Worker
2502*08b48e0bSAndroid Build Coastguard Worker }
2503*08b48e0bSAndroid Build Coastguard Worker
2504*08b48e0bSAndroid Build Coastguard Worker case MUT_CLONE_COPY: {
2505*08b48e0bSAndroid Build Coastguard Worker
2506*08b48e0bSAndroid Build Coastguard Worker if (likely(temp_len + HAVOC_BLK_XL < MAX_FILE)) {
2507*08b48e0bSAndroid Build Coastguard Worker
2508*08b48e0bSAndroid Build Coastguard Worker /* Clone bytes. */
2509*08b48e0bSAndroid Build Coastguard Worker
2510*08b48e0bSAndroid Build Coastguard Worker u32 clone_len = choose_block_len(afl, temp_len);
2511*08b48e0bSAndroid Build Coastguard Worker u32 clone_from = rand_below(afl, temp_len - clone_len + 1);
2512*08b48e0bSAndroid Build Coastguard Worker u32 clone_to = rand_below(afl, temp_len);
2513*08b48e0bSAndroid Build Coastguard Worker
2514*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
2515*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " CLONE-%s_%u_%u_%u",
2516*08b48e0bSAndroid Build Coastguard Worker "COPY", clone_from, clone_to, clone_len);
2517*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
2518*08b48e0bSAndroid Build Coastguard Worker #endif
2519*08b48e0bSAndroid Build Coastguard Worker u8 *new_buf =
2520*08b48e0bSAndroid Build Coastguard Worker afl_realloc(AFL_BUF_PARAM(out_scratch), temp_len + clone_len);
2521*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!new_buf)) { PFATAL("alloc"); }
2522*08b48e0bSAndroid Build Coastguard Worker
2523*08b48e0bSAndroid Build Coastguard Worker /* Head */
2524*08b48e0bSAndroid Build Coastguard Worker
2525*08b48e0bSAndroid Build Coastguard Worker memcpy(new_buf, out_buf, clone_to);
2526*08b48e0bSAndroid Build Coastguard Worker
2527*08b48e0bSAndroid Build Coastguard Worker /* Inserted part */
2528*08b48e0bSAndroid Build Coastguard Worker
2529*08b48e0bSAndroid Build Coastguard Worker memcpy(new_buf + clone_to, out_buf + clone_from, clone_len);
2530*08b48e0bSAndroid Build Coastguard Worker
2531*08b48e0bSAndroid Build Coastguard Worker /* Tail */
2532*08b48e0bSAndroid Build Coastguard Worker memcpy(new_buf + clone_to + clone_len, out_buf + clone_to,
2533*08b48e0bSAndroid Build Coastguard Worker temp_len - clone_to);
2534*08b48e0bSAndroid Build Coastguard Worker
2535*08b48e0bSAndroid Build Coastguard Worker out_buf = new_buf;
2536*08b48e0bSAndroid Build Coastguard Worker afl_swap_bufs(AFL_BUF_PARAM(out), AFL_BUF_PARAM(out_scratch));
2537*08b48e0bSAndroid Build Coastguard Worker temp_len += clone_len;
2538*08b48e0bSAndroid Build Coastguard Worker
2539*08b48e0bSAndroid Build Coastguard Worker } else if (unlikely(temp_len < 8)) {
2540*08b48e0bSAndroid Build Coastguard Worker
2541*08b48e0bSAndroid Build Coastguard Worker break;
2542*08b48e0bSAndroid Build Coastguard Worker
2543*08b48e0bSAndroid Build Coastguard Worker } else {
2544*08b48e0bSAndroid Build Coastguard Worker
2545*08b48e0bSAndroid Build Coastguard Worker goto retry_havoc_step;
2546*08b48e0bSAndroid Build Coastguard Worker
2547*08b48e0bSAndroid Build Coastguard Worker }
2548*08b48e0bSAndroid Build Coastguard Worker
2549*08b48e0bSAndroid Build Coastguard Worker break;
2550*08b48e0bSAndroid Build Coastguard Worker
2551*08b48e0bSAndroid Build Coastguard Worker }
2552*08b48e0bSAndroid Build Coastguard Worker
2553*08b48e0bSAndroid Build Coastguard Worker case MUT_CLONE_FIXED: {
2554*08b48e0bSAndroid Build Coastguard Worker
2555*08b48e0bSAndroid Build Coastguard Worker if (likely(temp_len + HAVOC_BLK_XL < MAX_FILE)) {
2556*08b48e0bSAndroid Build Coastguard Worker
2557*08b48e0bSAndroid Build Coastguard Worker /* Insert a block of constant bytes (25%). */
2558*08b48e0bSAndroid Build Coastguard Worker
2559*08b48e0bSAndroid Build Coastguard Worker u32 clone_len = choose_block_len(afl, HAVOC_BLK_XL);
2560*08b48e0bSAndroid Build Coastguard Worker u32 clone_to = rand_below(afl, temp_len);
2561*08b48e0bSAndroid Build Coastguard Worker u32 strat = rand_below(afl, 2);
2562*08b48e0bSAndroid Build Coastguard Worker u32 clone_from = clone_to ? clone_to - 1 : 0;
2563*08b48e0bSAndroid Build Coastguard Worker item = strat ? rand_below(afl, 256) : out_buf[clone_from];
2564*08b48e0bSAndroid Build Coastguard Worker
2565*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
2566*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " CLONE-%s_%u_%u_%u",
2567*08b48e0bSAndroid Build Coastguard Worker "FIXED", strat, clone_to, clone_len);
2568*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
2569*08b48e0bSAndroid Build Coastguard Worker #endif
2570*08b48e0bSAndroid Build Coastguard Worker u8 *new_buf =
2571*08b48e0bSAndroid Build Coastguard Worker afl_realloc(AFL_BUF_PARAM(out_scratch), temp_len + clone_len);
2572*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!new_buf)) { PFATAL("alloc"); }
2573*08b48e0bSAndroid Build Coastguard Worker
2574*08b48e0bSAndroid Build Coastguard Worker /* Head */
2575*08b48e0bSAndroid Build Coastguard Worker
2576*08b48e0bSAndroid Build Coastguard Worker memcpy(new_buf, out_buf, clone_to);
2577*08b48e0bSAndroid Build Coastguard Worker
2578*08b48e0bSAndroid Build Coastguard Worker /* Inserted part */
2579*08b48e0bSAndroid Build Coastguard Worker
2580*08b48e0bSAndroid Build Coastguard Worker memset(new_buf + clone_to, item, clone_len);
2581*08b48e0bSAndroid Build Coastguard Worker
2582*08b48e0bSAndroid Build Coastguard Worker /* Tail */
2583*08b48e0bSAndroid Build Coastguard Worker memcpy(new_buf + clone_to + clone_len, out_buf + clone_to,
2584*08b48e0bSAndroid Build Coastguard Worker temp_len - clone_to);
2585*08b48e0bSAndroid Build Coastguard Worker
2586*08b48e0bSAndroid Build Coastguard Worker out_buf = new_buf;
2587*08b48e0bSAndroid Build Coastguard Worker afl_swap_bufs(AFL_BUF_PARAM(out), AFL_BUF_PARAM(out_scratch));
2588*08b48e0bSAndroid Build Coastguard Worker temp_len += clone_len;
2589*08b48e0bSAndroid Build Coastguard Worker
2590*08b48e0bSAndroid Build Coastguard Worker } else if (unlikely(temp_len < 8)) {
2591*08b48e0bSAndroid Build Coastguard Worker
2592*08b48e0bSAndroid Build Coastguard Worker break;
2593*08b48e0bSAndroid Build Coastguard Worker
2594*08b48e0bSAndroid Build Coastguard Worker } else {
2595*08b48e0bSAndroid Build Coastguard Worker
2596*08b48e0bSAndroid Build Coastguard Worker goto retry_havoc_step;
2597*08b48e0bSAndroid Build Coastguard Worker
2598*08b48e0bSAndroid Build Coastguard Worker }
2599*08b48e0bSAndroid Build Coastguard Worker
2600*08b48e0bSAndroid Build Coastguard Worker break;
2601*08b48e0bSAndroid Build Coastguard Worker
2602*08b48e0bSAndroid Build Coastguard Worker }
2603*08b48e0bSAndroid Build Coastguard Worker
2604*08b48e0bSAndroid Build Coastguard Worker case MUT_OVERWRITE_COPY: {
2605*08b48e0bSAndroid Build Coastguard Worker
2606*08b48e0bSAndroid Build Coastguard Worker /* Overwrite bytes with a randomly selected chunk bytes. */
2607*08b48e0bSAndroid Build Coastguard Worker
2608*08b48e0bSAndroid Build Coastguard Worker if (unlikely(temp_len < 2)) { break; } // no retry
2609*08b48e0bSAndroid Build Coastguard Worker
2610*08b48e0bSAndroid Build Coastguard Worker u32 copy_from, copy_to,
2611*08b48e0bSAndroid Build Coastguard Worker copy_len = choose_block_len(afl, temp_len - 1);
2612*08b48e0bSAndroid Build Coastguard Worker
2613*08b48e0bSAndroid Build Coastguard Worker do {
2614*08b48e0bSAndroid Build Coastguard Worker
2615*08b48e0bSAndroid Build Coastguard Worker copy_from = rand_below(afl, temp_len - copy_len + 1);
2616*08b48e0bSAndroid Build Coastguard Worker copy_to = rand_below(afl, temp_len - copy_len + 1);
2617*08b48e0bSAndroid Build Coastguard Worker
2618*08b48e0bSAndroid Build Coastguard Worker } while (unlikely(copy_from == copy_to));
2619*08b48e0bSAndroid Build Coastguard Worker
2620*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
2621*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " OVERWRITE-COPY_%u_%u_%u",
2622*08b48e0bSAndroid Build Coastguard Worker copy_from, copy_to, copy_len);
2623*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
2624*08b48e0bSAndroid Build Coastguard Worker #endif
2625*08b48e0bSAndroid Build Coastguard Worker memmove(out_buf + copy_to, out_buf + copy_from, copy_len);
2626*08b48e0bSAndroid Build Coastguard Worker
2627*08b48e0bSAndroid Build Coastguard Worker break;
2628*08b48e0bSAndroid Build Coastguard Worker
2629*08b48e0bSAndroid Build Coastguard Worker }
2630*08b48e0bSAndroid Build Coastguard Worker
2631*08b48e0bSAndroid Build Coastguard Worker case MUT_OVERWRITE_FIXED: {
2632*08b48e0bSAndroid Build Coastguard Worker
2633*08b48e0bSAndroid Build Coastguard Worker /* Overwrite bytes with fixed bytes. */
2634*08b48e0bSAndroid Build Coastguard Worker
2635*08b48e0bSAndroid Build Coastguard Worker if (unlikely(temp_len < 2)) { break; } // no retry
2636*08b48e0bSAndroid Build Coastguard Worker
2637*08b48e0bSAndroid Build Coastguard Worker u32 copy_len = choose_block_len(afl, temp_len - 1);
2638*08b48e0bSAndroid Build Coastguard Worker u32 copy_to = rand_below(afl, temp_len - copy_len + 1);
2639*08b48e0bSAndroid Build Coastguard Worker u32 strat = rand_below(afl, 2);
2640*08b48e0bSAndroid Build Coastguard Worker u32 copy_from = copy_to ? copy_to - 1 : 0;
2641*08b48e0bSAndroid Build Coastguard Worker item = strat ? rand_below(afl, 256) : out_buf[copy_from];
2642*08b48e0bSAndroid Build Coastguard Worker
2643*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
2644*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp),
2645*08b48e0bSAndroid Build Coastguard Worker " OVERWRITE-FIXED_%u_%u_%u-%u", strat, item, copy_to,
2646*08b48e0bSAndroid Build Coastguard Worker copy_len);
2647*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
2648*08b48e0bSAndroid Build Coastguard Worker #endif
2649*08b48e0bSAndroid Build Coastguard Worker memset(out_buf + copy_to, item, copy_len);
2650*08b48e0bSAndroid Build Coastguard Worker
2651*08b48e0bSAndroid Build Coastguard Worker break;
2652*08b48e0bSAndroid Build Coastguard Worker
2653*08b48e0bSAndroid Build Coastguard Worker }
2654*08b48e0bSAndroid Build Coastguard Worker
2655*08b48e0bSAndroid Build Coastguard Worker case MUT_BYTEADD: {
2656*08b48e0bSAndroid Build Coastguard Worker
2657*08b48e0bSAndroid Build Coastguard Worker /* Increase byte by 1. */
2658*08b48e0bSAndroid Build Coastguard Worker
2659*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
2660*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " BYTEADD_");
2661*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
2662*08b48e0bSAndroid Build Coastguard Worker #endif
2663*08b48e0bSAndroid Build Coastguard Worker out_buf[rand_below(afl, temp_len)]++;
2664*08b48e0bSAndroid Build Coastguard Worker break;
2665*08b48e0bSAndroid Build Coastguard Worker
2666*08b48e0bSAndroid Build Coastguard Worker }
2667*08b48e0bSAndroid Build Coastguard Worker
2668*08b48e0bSAndroid Build Coastguard Worker case MUT_BYTESUB: {
2669*08b48e0bSAndroid Build Coastguard Worker
2670*08b48e0bSAndroid Build Coastguard Worker /* Decrease byte by 1. */
2671*08b48e0bSAndroid Build Coastguard Worker
2672*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
2673*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " BYTESUB_");
2674*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
2675*08b48e0bSAndroid Build Coastguard Worker #endif
2676*08b48e0bSAndroid Build Coastguard Worker out_buf[rand_below(afl, temp_len)]--;
2677*08b48e0bSAndroid Build Coastguard Worker break;
2678*08b48e0bSAndroid Build Coastguard Worker
2679*08b48e0bSAndroid Build Coastguard Worker }
2680*08b48e0bSAndroid Build Coastguard Worker
2681*08b48e0bSAndroid Build Coastguard Worker case MUT_FLIP8: {
2682*08b48e0bSAndroid Build Coastguard Worker
2683*08b48e0bSAndroid Build Coastguard Worker /* Flip byte with a XOR 0xff. This is the same as NEG. */
2684*08b48e0bSAndroid Build Coastguard Worker
2685*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
2686*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " FLIP8_");
2687*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
2688*08b48e0bSAndroid Build Coastguard Worker #endif
2689*08b48e0bSAndroid Build Coastguard Worker out_buf[rand_below(afl, temp_len)] ^= 0xff;
2690*08b48e0bSAndroid Build Coastguard Worker break;
2691*08b48e0bSAndroid Build Coastguard Worker
2692*08b48e0bSAndroid Build Coastguard Worker }
2693*08b48e0bSAndroid Build Coastguard Worker
2694*08b48e0bSAndroid Build Coastguard Worker case MUT_SWITCH: {
2695*08b48e0bSAndroid Build Coastguard Worker
2696*08b48e0bSAndroid Build Coastguard Worker if (unlikely(temp_len < 4)) { break; } // no retry
2697*08b48e0bSAndroid Build Coastguard Worker
2698*08b48e0bSAndroid Build Coastguard Worker /* Switch bytes. */
2699*08b48e0bSAndroid Build Coastguard Worker
2700*08b48e0bSAndroid Build Coastguard Worker u32 to_end, switch_to, switch_len, switch_from;
2701*08b48e0bSAndroid Build Coastguard Worker switch_from = rand_below(afl, temp_len);
2702*08b48e0bSAndroid Build Coastguard Worker do {
2703*08b48e0bSAndroid Build Coastguard Worker
2704*08b48e0bSAndroid Build Coastguard Worker switch_to = rand_below(afl, temp_len);
2705*08b48e0bSAndroid Build Coastguard Worker
2706*08b48e0bSAndroid Build Coastguard Worker } while (unlikely(switch_from == switch_to));
2707*08b48e0bSAndroid Build Coastguard Worker
2708*08b48e0bSAndroid Build Coastguard Worker if (switch_from < switch_to) {
2709*08b48e0bSAndroid Build Coastguard Worker
2710*08b48e0bSAndroid Build Coastguard Worker switch_len = switch_to - switch_from;
2711*08b48e0bSAndroid Build Coastguard Worker to_end = temp_len - switch_to;
2712*08b48e0bSAndroid Build Coastguard Worker
2713*08b48e0bSAndroid Build Coastguard Worker } else {
2714*08b48e0bSAndroid Build Coastguard Worker
2715*08b48e0bSAndroid Build Coastguard Worker switch_len = switch_from - switch_to;
2716*08b48e0bSAndroid Build Coastguard Worker to_end = temp_len - switch_from;
2717*08b48e0bSAndroid Build Coastguard Worker
2718*08b48e0bSAndroid Build Coastguard Worker }
2719*08b48e0bSAndroid Build Coastguard Worker
2720*08b48e0bSAndroid Build Coastguard Worker switch_len = choose_block_len(afl, MIN(switch_len, to_end));
2721*08b48e0bSAndroid Build Coastguard Worker
2722*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
2723*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " SWITCH-%s_%u_%u_%u",
2724*08b48e0bSAndroid Build Coastguard Worker "switch", switch_from, switch_to, switch_len);
2725*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
2726*08b48e0bSAndroid Build Coastguard Worker #endif
2727*08b48e0bSAndroid Build Coastguard Worker u8 *new_buf = afl_realloc(AFL_BUF_PARAM(out_scratch), switch_len);
2728*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!new_buf)) { PFATAL("alloc"); }
2729*08b48e0bSAndroid Build Coastguard Worker
2730*08b48e0bSAndroid Build Coastguard Worker /* Backup */
2731*08b48e0bSAndroid Build Coastguard Worker
2732*08b48e0bSAndroid Build Coastguard Worker memcpy(new_buf, out_buf + switch_from, switch_len);
2733*08b48e0bSAndroid Build Coastguard Worker
2734*08b48e0bSAndroid Build Coastguard Worker /* Switch 1 */
2735*08b48e0bSAndroid Build Coastguard Worker
2736*08b48e0bSAndroid Build Coastguard Worker memcpy(out_buf + switch_from, out_buf + switch_to, switch_len);
2737*08b48e0bSAndroid Build Coastguard Worker
2738*08b48e0bSAndroid Build Coastguard Worker /* Switch 2 */
2739*08b48e0bSAndroid Build Coastguard Worker
2740*08b48e0bSAndroid Build Coastguard Worker memcpy(out_buf + switch_to, new_buf, switch_len);
2741*08b48e0bSAndroid Build Coastguard Worker
2742*08b48e0bSAndroid Build Coastguard Worker break;
2743*08b48e0bSAndroid Build Coastguard Worker
2744*08b48e0bSAndroid Build Coastguard Worker }
2745*08b48e0bSAndroid Build Coastguard Worker
2746*08b48e0bSAndroid Build Coastguard Worker case MUT_DEL: {
2747*08b48e0bSAndroid Build Coastguard Worker
2748*08b48e0bSAndroid Build Coastguard Worker /* Delete bytes. */
2749*08b48e0bSAndroid Build Coastguard Worker
2750*08b48e0bSAndroid Build Coastguard Worker if (unlikely(temp_len < 2)) { break; } // no retry
2751*08b48e0bSAndroid Build Coastguard Worker
2752*08b48e0bSAndroid Build Coastguard Worker /* Don't delete too much. */
2753*08b48e0bSAndroid Build Coastguard Worker
2754*08b48e0bSAndroid Build Coastguard Worker u32 del_len = choose_block_len(afl, temp_len - 1);
2755*08b48e0bSAndroid Build Coastguard Worker u32 del_from = rand_below(afl, temp_len - del_len + 1);
2756*08b48e0bSAndroid Build Coastguard Worker
2757*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
2758*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " DEL_%u_%u", del_from,
2759*08b48e0bSAndroid Build Coastguard Worker del_len);
2760*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
2761*08b48e0bSAndroid Build Coastguard Worker #endif
2762*08b48e0bSAndroid Build Coastguard Worker memmove(out_buf + del_from, out_buf + del_from + del_len,
2763*08b48e0bSAndroid Build Coastguard Worker temp_len - del_from - del_len);
2764*08b48e0bSAndroid Build Coastguard Worker
2765*08b48e0bSAndroid Build Coastguard Worker temp_len -= del_len;
2766*08b48e0bSAndroid Build Coastguard Worker
2767*08b48e0bSAndroid Build Coastguard Worker break;
2768*08b48e0bSAndroid Build Coastguard Worker
2769*08b48e0bSAndroid Build Coastguard Worker }
2770*08b48e0bSAndroid Build Coastguard Worker
2771*08b48e0bSAndroid Build Coastguard Worker case MUT_SHUFFLE: {
2772*08b48e0bSAndroid Build Coastguard Worker
2773*08b48e0bSAndroid Build Coastguard Worker /* Shuffle bytes. */
2774*08b48e0bSAndroid Build Coastguard Worker
2775*08b48e0bSAndroid Build Coastguard Worker if (unlikely(temp_len < 4)) { break; } // no retry
2776*08b48e0bSAndroid Build Coastguard Worker
2777*08b48e0bSAndroid Build Coastguard Worker u32 len = choose_block_len(afl, temp_len - 1);
2778*08b48e0bSAndroid Build Coastguard Worker u32 off = rand_below(afl, temp_len - len + 1);
2779*08b48e0bSAndroid Build Coastguard Worker
2780*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
2781*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " SHUFFLE_%u", len);
2782*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
2783*08b48e0bSAndroid Build Coastguard Worker #endif
2784*08b48e0bSAndroid Build Coastguard Worker
2785*08b48e0bSAndroid Build Coastguard Worker for (u32 i = len - 1; i > 0; i--) {
2786*08b48e0bSAndroid Build Coastguard Worker
2787*08b48e0bSAndroid Build Coastguard Worker u32 j;
2788*08b48e0bSAndroid Build Coastguard Worker do {
2789*08b48e0bSAndroid Build Coastguard Worker
2790*08b48e0bSAndroid Build Coastguard Worker j = rand_below(afl, i + 1);
2791*08b48e0bSAndroid Build Coastguard Worker
2792*08b48e0bSAndroid Build Coastguard Worker } while (unlikely(i == j));
2793*08b48e0bSAndroid Build Coastguard Worker
2794*08b48e0bSAndroid Build Coastguard Worker unsigned char temp = out_buf[off + i];
2795*08b48e0bSAndroid Build Coastguard Worker out_buf[off + i] = out_buf[off + j];
2796*08b48e0bSAndroid Build Coastguard Worker out_buf[off + j] = temp;
2797*08b48e0bSAndroid Build Coastguard Worker
2798*08b48e0bSAndroid Build Coastguard Worker }
2799*08b48e0bSAndroid Build Coastguard Worker
2800*08b48e0bSAndroid Build Coastguard Worker break;
2801*08b48e0bSAndroid Build Coastguard Worker
2802*08b48e0bSAndroid Build Coastguard Worker }
2803*08b48e0bSAndroid Build Coastguard Worker
2804*08b48e0bSAndroid Build Coastguard Worker case MUT_DELONE: {
2805*08b48e0bSAndroid Build Coastguard Worker
2806*08b48e0bSAndroid Build Coastguard Worker /* Delete bytes. */
2807*08b48e0bSAndroid Build Coastguard Worker
2808*08b48e0bSAndroid Build Coastguard Worker if (unlikely(temp_len < 2)) { break; } // no retry
2809*08b48e0bSAndroid Build Coastguard Worker
2810*08b48e0bSAndroid Build Coastguard Worker /* Don't delete too much. */
2811*08b48e0bSAndroid Build Coastguard Worker
2812*08b48e0bSAndroid Build Coastguard Worker u32 del_len = 1;
2813*08b48e0bSAndroid Build Coastguard Worker u32 del_from = rand_below(afl, temp_len - del_len + 1);
2814*08b48e0bSAndroid Build Coastguard Worker
2815*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
2816*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " DELONE_%u", del_from);
2817*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
2818*08b48e0bSAndroid Build Coastguard Worker #endif
2819*08b48e0bSAndroid Build Coastguard Worker memmove(out_buf + del_from, out_buf + del_from + del_len,
2820*08b48e0bSAndroid Build Coastguard Worker temp_len - del_from - del_len);
2821*08b48e0bSAndroid Build Coastguard Worker
2822*08b48e0bSAndroid Build Coastguard Worker temp_len -= del_len;
2823*08b48e0bSAndroid Build Coastguard Worker
2824*08b48e0bSAndroid Build Coastguard Worker break;
2825*08b48e0bSAndroid Build Coastguard Worker
2826*08b48e0bSAndroid Build Coastguard Worker }
2827*08b48e0bSAndroid Build Coastguard Worker
2828*08b48e0bSAndroid Build Coastguard Worker case MUT_INSERTONE: {
2829*08b48e0bSAndroid Build Coastguard Worker
2830*08b48e0bSAndroid Build Coastguard Worker if (unlikely(temp_len < 2)) { break; } // no retry
2831*08b48e0bSAndroid Build Coastguard Worker
2832*08b48e0bSAndroid Build Coastguard Worker u32 clone_len = 1;
2833*08b48e0bSAndroid Build Coastguard Worker u32 clone_to = rand_below(afl, temp_len);
2834*08b48e0bSAndroid Build Coastguard Worker u32 strat = rand_below(afl, 2);
2835*08b48e0bSAndroid Build Coastguard Worker u32 clone_from = clone_to ? clone_to - 1 : 0;
2836*08b48e0bSAndroid Build Coastguard Worker item = strat ? rand_below(afl, 256) : out_buf[clone_from];
2837*08b48e0bSAndroid Build Coastguard Worker
2838*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
2839*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " INSERTONE_%u_%u", strat,
2840*08b48e0bSAndroid Build Coastguard Worker clone_to);
2841*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
2842*08b48e0bSAndroid Build Coastguard Worker #endif
2843*08b48e0bSAndroid Build Coastguard Worker u8 *new_buf =
2844*08b48e0bSAndroid Build Coastguard Worker afl_realloc(AFL_BUF_PARAM(out_scratch), temp_len + clone_len);
2845*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!new_buf)) { PFATAL("alloc"); }
2846*08b48e0bSAndroid Build Coastguard Worker
2847*08b48e0bSAndroid Build Coastguard Worker /* Head */
2848*08b48e0bSAndroid Build Coastguard Worker
2849*08b48e0bSAndroid Build Coastguard Worker memcpy(new_buf, out_buf, clone_to);
2850*08b48e0bSAndroid Build Coastguard Worker
2851*08b48e0bSAndroid Build Coastguard Worker /* Inserted part */
2852*08b48e0bSAndroid Build Coastguard Worker
2853*08b48e0bSAndroid Build Coastguard Worker memset(new_buf + clone_to, item, clone_len);
2854*08b48e0bSAndroid Build Coastguard Worker
2855*08b48e0bSAndroid Build Coastguard Worker /* Tail */
2856*08b48e0bSAndroid Build Coastguard Worker memcpy(new_buf + clone_to + clone_len, out_buf + clone_to,
2857*08b48e0bSAndroid Build Coastguard Worker temp_len - clone_to);
2858*08b48e0bSAndroid Build Coastguard Worker
2859*08b48e0bSAndroid Build Coastguard Worker out_buf = new_buf;
2860*08b48e0bSAndroid Build Coastguard Worker afl_swap_bufs(AFL_BUF_PARAM(out), AFL_BUF_PARAM(out_scratch));
2861*08b48e0bSAndroid Build Coastguard Worker temp_len += clone_len;
2862*08b48e0bSAndroid Build Coastguard Worker
2863*08b48e0bSAndroid Build Coastguard Worker break;
2864*08b48e0bSAndroid Build Coastguard Worker
2865*08b48e0bSAndroid Build Coastguard Worker }
2866*08b48e0bSAndroid Build Coastguard Worker
2867*08b48e0bSAndroid Build Coastguard Worker case MUT_ASCIINUM: {
2868*08b48e0bSAndroid Build Coastguard Worker
2869*08b48e0bSAndroid Build Coastguard Worker if (unlikely(temp_len < 4)) { break; } // no retry
2870*08b48e0bSAndroid Build Coastguard Worker
2871*08b48e0bSAndroid Build Coastguard Worker u32 off = rand_below(afl, temp_len), off2 = off, cnt = 0;
2872*08b48e0bSAndroid Build Coastguard Worker
2873*08b48e0bSAndroid Build Coastguard Worker while (off2 + cnt < temp_len && !isdigit(out_buf[off2 + cnt])) {
2874*08b48e0bSAndroid Build Coastguard Worker
2875*08b48e0bSAndroid Build Coastguard Worker ++cnt;
2876*08b48e0bSAndroid Build Coastguard Worker
2877*08b48e0bSAndroid Build Coastguard Worker }
2878*08b48e0bSAndroid Build Coastguard Worker
2879*08b48e0bSAndroid Build Coastguard Worker // none found, wrap
2880*08b48e0bSAndroid Build Coastguard Worker if (off2 + cnt == temp_len) {
2881*08b48e0bSAndroid Build Coastguard Worker
2882*08b48e0bSAndroid Build Coastguard Worker off2 = 0;
2883*08b48e0bSAndroid Build Coastguard Worker cnt = 0;
2884*08b48e0bSAndroid Build Coastguard Worker
2885*08b48e0bSAndroid Build Coastguard Worker while (cnt < off && !isdigit(out_buf[off2 + cnt])) {
2886*08b48e0bSAndroid Build Coastguard Worker
2887*08b48e0bSAndroid Build Coastguard Worker ++cnt;
2888*08b48e0bSAndroid Build Coastguard Worker
2889*08b48e0bSAndroid Build Coastguard Worker }
2890*08b48e0bSAndroid Build Coastguard Worker
2891*08b48e0bSAndroid Build Coastguard Worker if (cnt == off) {
2892*08b48e0bSAndroid Build Coastguard Worker
2893*08b48e0bSAndroid Build Coastguard Worker if (temp_len < 8) {
2894*08b48e0bSAndroid Build Coastguard Worker
2895*08b48e0bSAndroid Build Coastguard Worker break;
2896*08b48e0bSAndroid Build Coastguard Worker
2897*08b48e0bSAndroid Build Coastguard Worker } else {
2898*08b48e0bSAndroid Build Coastguard Worker
2899*08b48e0bSAndroid Build Coastguard Worker goto retry_havoc_step;
2900*08b48e0bSAndroid Build Coastguard Worker
2901*08b48e0bSAndroid Build Coastguard Worker }
2902*08b48e0bSAndroid Build Coastguard Worker
2903*08b48e0bSAndroid Build Coastguard Worker }
2904*08b48e0bSAndroid Build Coastguard Worker
2905*08b48e0bSAndroid Build Coastguard Worker }
2906*08b48e0bSAndroid Build Coastguard Worker
2907*08b48e0bSAndroid Build Coastguard Worker off = off2 + cnt;
2908*08b48e0bSAndroid Build Coastguard Worker off2 = off + 1;
2909*08b48e0bSAndroid Build Coastguard Worker
2910*08b48e0bSAndroid Build Coastguard Worker while (off2 < temp_len && isdigit(out_buf[off2])) {
2911*08b48e0bSAndroid Build Coastguard Worker
2912*08b48e0bSAndroid Build Coastguard Worker ++off2;
2913*08b48e0bSAndroid Build Coastguard Worker
2914*08b48e0bSAndroid Build Coastguard Worker }
2915*08b48e0bSAndroid Build Coastguard Worker
2916*08b48e0bSAndroid Build Coastguard Worker s64 val = out_buf[off] - '0';
2917*08b48e0bSAndroid Build Coastguard Worker for (u32 i = off + 1; i < off2; ++i) {
2918*08b48e0bSAndroid Build Coastguard Worker
2919*08b48e0bSAndroid Build Coastguard Worker val = (val * 10) + out_buf[i] - '0';
2920*08b48e0bSAndroid Build Coastguard Worker
2921*08b48e0bSAndroid Build Coastguard Worker }
2922*08b48e0bSAndroid Build Coastguard Worker
2923*08b48e0bSAndroid Build Coastguard Worker if (off && out_buf[off - 1] == '-') { val = -val; }
2924*08b48e0bSAndroid Build Coastguard Worker
2925*08b48e0bSAndroid Build Coastguard Worker u32 strat = rand_below(afl, 8);
2926*08b48e0bSAndroid Build Coastguard Worker switch (strat) {
2927*08b48e0bSAndroid Build Coastguard Worker
2928*08b48e0bSAndroid Build Coastguard Worker case 0:
2929*08b48e0bSAndroid Build Coastguard Worker val++;
2930*08b48e0bSAndroid Build Coastguard Worker break;
2931*08b48e0bSAndroid Build Coastguard Worker case 1:
2932*08b48e0bSAndroid Build Coastguard Worker val--;
2933*08b48e0bSAndroid Build Coastguard Worker break;
2934*08b48e0bSAndroid Build Coastguard Worker case 2:
2935*08b48e0bSAndroid Build Coastguard Worker val *= 2;
2936*08b48e0bSAndroid Build Coastguard Worker break;
2937*08b48e0bSAndroid Build Coastguard Worker case 3:
2938*08b48e0bSAndroid Build Coastguard Worker val /= 2;
2939*08b48e0bSAndroid Build Coastguard Worker break;
2940*08b48e0bSAndroid Build Coastguard Worker case 4:
2941*08b48e0bSAndroid Build Coastguard Worker if (likely(val && (u64)val < 0x19999999)) {
2942*08b48e0bSAndroid Build Coastguard Worker
2943*08b48e0bSAndroid Build Coastguard Worker val = (u64)rand_next(afl) % (u64)((u64)val * 10);
2944*08b48e0bSAndroid Build Coastguard Worker
2945*08b48e0bSAndroid Build Coastguard Worker } else {
2946*08b48e0bSAndroid Build Coastguard Worker
2947*08b48e0bSAndroid Build Coastguard Worker val = rand_below(afl, 256);
2948*08b48e0bSAndroid Build Coastguard Worker
2949*08b48e0bSAndroid Build Coastguard Worker }
2950*08b48e0bSAndroid Build Coastguard Worker
2951*08b48e0bSAndroid Build Coastguard Worker break;
2952*08b48e0bSAndroid Build Coastguard Worker case 5:
2953*08b48e0bSAndroid Build Coastguard Worker val += rand_below(afl, 256);
2954*08b48e0bSAndroid Build Coastguard Worker break;
2955*08b48e0bSAndroid Build Coastguard Worker case 6:
2956*08b48e0bSAndroid Build Coastguard Worker val -= rand_below(afl, 256);
2957*08b48e0bSAndroid Build Coastguard Worker break;
2958*08b48e0bSAndroid Build Coastguard Worker case 7:
2959*08b48e0bSAndroid Build Coastguard Worker val = ~(val);
2960*08b48e0bSAndroid Build Coastguard Worker break;
2961*08b48e0bSAndroid Build Coastguard Worker
2962*08b48e0bSAndroid Build Coastguard Worker }
2963*08b48e0bSAndroid Build Coastguard Worker
2964*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
2965*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " ASCIINUM_%u_%u_%u",
2966*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->is_ascii, strat, off);
2967*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
2968*08b48e0bSAndroid Build Coastguard Worker #endif
2969*08b48e0bSAndroid Build Coastguard Worker // fprintf(stderr, "val: %u-%u = %ld\n", off, off2, val);
2970*08b48e0bSAndroid Build Coastguard Worker
2971*08b48e0bSAndroid Build Coastguard Worker char buf[20];
2972*08b48e0bSAndroid Build Coastguard Worker snprintf(buf, sizeof(buf), "%" PRId64, val);
2973*08b48e0bSAndroid Build Coastguard Worker
2974*08b48e0bSAndroid Build Coastguard Worker // fprintf(stderr, "BEFORE: %s\n", out_buf);
2975*08b48e0bSAndroid Build Coastguard Worker
2976*08b48e0bSAndroid Build Coastguard Worker u32 old_len = off2 - off;
2977*08b48e0bSAndroid Build Coastguard Worker u32 new_len = strlen(buf);
2978*08b48e0bSAndroid Build Coastguard Worker
2979*08b48e0bSAndroid Build Coastguard Worker if (old_len == new_len) {
2980*08b48e0bSAndroid Build Coastguard Worker
2981*08b48e0bSAndroid Build Coastguard Worker memcpy(out_buf + off, buf, new_len);
2982*08b48e0bSAndroid Build Coastguard Worker
2983*08b48e0bSAndroid Build Coastguard Worker } else {
2984*08b48e0bSAndroid Build Coastguard Worker
2985*08b48e0bSAndroid Build Coastguard Worker u8 *new_buf = afl_realloc(AFL_BUF_PARAM(out_scratch),
2986*08b48e0bSAndroid Build Coastguard Worker temp_len + new_len - old_len);
2987*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!new_buf)) { PFATAL("alloc"); }
2988*08b48e0bSAndroid Build Coastguard Worker
2989*08b48e0bSAndroid Build Coastguard Worker /* Head */
2990*08b48e0bSAndroid Build Coastguard Worker
2991*08b48e0bSAndroid Build Coastguard Worker memcpy(new_buf, out_buf, off);
2992*08b48e0bSAndroid Build Coastguard Worker
2993*08b48e0bSAndroid Build Coastguard Worker /* Inserted part */
2994*08b48e0bSAndroid Build Coastguard Worker
2995*08b48e0bSAndroid Build Coastguard Worker memcpy(new_buf + off, buf, new_len);
2996*08b48e0bSAndroid Build Coastguard Worker
2997*08b48e0bSAndroid Build Coastguard Worker /* Tail */
2998*08b48e0bSAndroid Build Coastguard Worker memcpy(new_buf + off + new_len, out_buf + off2, temp_len - off2);
2999*08b48e0bSAndroid Build Coastguard Worker
3000*08b48e0bSAndroid Build Coastguard Worker out_buf = new_buf;
3001*08b48e0bSAndroid Build Coastguard Worker afl_swap_bufs(AFL_BUF_PARAM(out), AFL_BUF_PARAM(out_scratch));
3002*08b48e0bSAndroid Build Coastguard Worker temp_len += (new_len - old_len);
3003*08b48e0bSAndroid Build Coastguard Worker
3004*08b48e0bSAndroid Build Coastguard Worker }
3005*08b48e0bSAndroid Build Coastguard Worker
3006*08b48e0bSAndroid Build Coastguard Worker // fprintf(stderr, "AFTER : %s\n", out_buf);
3007*08b48e0bSAndroid Build Coastguard Worker break;
3008*08b48e0bSAndroid Build Coastguard Worker
3009*08b48e0bSAndroid Build Coastguard Worker }
3010*08b48e0bSAndroid Build Coastguard Worker
3011*08b48e0bSAndroid Build Coastguard Worker case MUT_INSERTASCIINUM: {
3012*08b48e0bSAndroid Build Coastguard Worker
3013*08b48e0bSAndroid Build Coastguard Worker u32 len = 1 + rand_below(afl, 8);
3014*08b48e0bSAndroid Build Coastguard Worker u32 pos = rand_below(afl, temp_len);
3015*08b48e0bSAndroid Build Coastguard Worker /* Insert ascii number. */
3016*08b48e0bSAndroid Build Coastguard Worker if (unlikely(temp_len < pos + len)) {
3017*08b48e0bSAndroid Build Coastguard Worker
3018*08b48e0bSAndroid Build Coastguard Worker if (unlikely(temp_len < 8)) {
3019*08b48e0bSAndroid Build Coastguard Worker
3020*08b48e0bSAndroid Build Coastguard Worker break;
3021*08b48e0bSAndroid Build Coastguard Worker
3022*08b48e0bSAndroid Build Coastguard Worker } else {
3023*08b48e0bSAndroid Build Coastguard Worker
3024*08b48e0bSAndroid Build Coastguard Worker goto retry_havoc_step;
3025*08b48e0bSAndroid Build Coastguard Worker
3026*08b48e0bSAndroid Build Coastguard Worker }
3027*08b48e0bSAndroid Build Coastguard Worker
3028*08b48e0bSAndroid Build Coastguard Worker }
3029*08b48e0bSAndroid Build Coastguard Worker
3030*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
3031*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " INSERTASCIINUM_");
3032*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
3033*08b48e0bSAndroid Build Coastguard Worker #endif
3034*08b48e0bSAndroid Build Coastguard Worker u64 val = rand_next(afl);
3035*08b48e0bSAndroid Build Coastguard Worker char buf[20];
3036*08b48e0bSAndroid Build Coastguard Worker snprintf(buf, sizeof(buf), "%llu", val);
3037*08b48e0bSAndroid Build Coastguard Worker memcpy(out_buf + pos, buf, len);
3038*08b48e0bSAndroid Build Coastguard Worker
3039*08b48e0bSAndroid Build Coastguard Worker break;
3040*08b48e0bSAndroid Build Coastguard Worker
3041*08b48e0bSAndroid Build Coastguard Worker }
3042*08b48e0bSAndroid Build Coastguard Worker
3043*08b48e0bSAndroid Build Coastguard Worker case MUT_EXTRA_OVERWRITE: {
3044*08b48e0bSAndroid Build Coastguard Worker
3045*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!afl->extras_cnt)) { goto retry_havoc_step; }
3046*08b48e0bSAndroid Build Coastguard Worker
3047*08b48e0bSAndroid Build Coastguard Worker /* Use the dictionary. */
3048*08b48e0bSAndroid Build Coastguard Worker
3049*08b48e0bSAndroid Build Coastguard Worker u32 use_extra = rand_below(afl, afl->extras_cnt);
3050*08b48e0bSAndroid Build Coastguard Worker u32 extra_len = afl->extras[use_extra].len;
3051*08b48e0bSAndroid Build Coastguard Worker
3052*08b48e0bSAndroid Build Coastguard Worker if (unlikely(extra_len > temp_len)) { goto retry_havoc_step; }
3053*08b48e0bSAndroid Build Coastguard Worker
3054*08b48e0bSAndroid Build Coastguard Worker u32 insert_at = rand_below(afl, temp_len - extra_len + 1);
3055*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
3056*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " EXTRA-OVERWRITE_%u_%u",
3057*08b48e0bSAndroid Build Coastguard Worker insert_at, extra_len);
3058*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
3059*08b48e0bSAndroid Build Coastguard Worker #endif
3060*08b48e0bSAndroid Build Coastguard Worker memcpy(out_buf + insert_at, afl->extras[use_extra].data, extra_len);
3061*08b48e0bSAndroid Build Coastguard Worker
3062*08b48e0bSAndroid Build Coastguard Worker break;
3063*08b48e0bSAndroid Build Coastguard Worker
3064*08b48e0bSAndroid Build Coastguard Worker }
3065*08b48e0bSAndroid Build Coastguard Worker
3066*08b48e0bSAndroid Build Coastguard Worker case MUT_EXTRA_INSERT: {
3067*08b48e0bSAndroid Build Coastguard Worker
3068*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!afl->extras_cnt)) { goto retry_havoc_step; }
3069*08b48e0bSAndroid Build Coastguard Worker
3070*08b48e0bSAndroid Build Coastguard Worker u32 use_extra = rand_below(afl, afl->extras_cnt);
3071*08b48e0bSAndroid Build Coastguard Worker u32 extra_len = afl->extras[use_extra].len;
3072*08b48e0bSAndroid Build Coastguard Worker if (unlikely(temp_len + extra_len >= MAX_FILE)) {
3073*08b48e0bSAndroid Build Coastguard Worker
3074*08b48e0bSAndroid Build Coastguard Worker goto retry_havoc_step;
3075*08b48e0bSAndroid Build Coastguard Worker
3076*08b48e0bSAndroid Build Coastguard Worker }
3077*08b48e0bSAndroid Build Coastguard Worker
3078*08b48e0bSAndroid Build Coastguard Worker u8 *ptr = afl->extras[use_extra].data;
3079*08b48e0bSAndroid Build Coastguard Worker u32 insert_at = rand_below(afl, temp_len + 1);
3080*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
3081*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " EXTRA-INSERT_%u_%u",
3082*08b48e0bSAndroid Build Coastguard Worker insert_at, extra_len);
3083*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
3084*08b48e0bSAndroid Build Coastguard Worker #endif
3085*08b48e0bSAndroid Build Coastguard Worker
3086*08b48e0bSAndroid Build Coastguard Worker out_buf = afl_realloc(AFL_BUF_PARAM(out), temp_len + extra_len);
3087*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!out_buf)) { PFATAL("alloc"); }
3088*08b48e0bSAndroid Build Coastguard Worker
3089*08b48e0bSAndroid Build Coastguard Worker /* Tail */
3090*08b48e0bSAndroid Build Coastguard Worker memmove(out_buf + insert_at + extra_len, out_buf + insert_at,
3091*08b48e0bSAndroid Build Coastguard Worker temp_len - insert_at);
3092*08b48e0bSAndroid Build Coastguard Worker
3093*08b48e0bSAndroid Build Coastguard Worker /* Inserted part */
3094*08b48e0bSAndroid Build Coastguard Worker memcpy(out_buf + insert_at, ptr, extra_len);
3095*08b48e0bSAndroid Build Coastguard Worker temp_len += extra_len;
3096*08b48e0bSAndroid Build Coastguard Worker
3097*08b48e0bSAndroid Build Coastguard Worker break;
3098*08b48e0bSAndroid Build Coastguard Worker
3099*08b48e0bSAndroid Build Coastguard Worker }
3100*08b48e0bSAndroid Build Coastguard Worker
3101*08b48e0bSAndroid Build Coastguard Worker case MUT_AUTO_EXTRA_OVERWRITE: {
3102*08b48e0bSAndroid Build Coastguard Worker
3103*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!afl->a_extras_cnt)) { goto retry_havoc_step; }
3104*08b48e0bSAndroid Build Coastguard Worker
3105*08b48e0bSAndroid Build Coastguard Worker /* Use the dictionary. */
3106*08b48e0bSAndroid Build Coastguard Worker
3107*08b48e0bSAndroid Build Coastguard Worker u32 use_extra = rand_below(afl, afl->a_extras_cnt);
3108*08b48e0bSAndroid Build Coastguard Worker u32 extra_len = afl->a_extras[use_extra].len;
3109*08b48e0bSAndroid Build Coastguard Worker
3110*08b48e0bSAndroid Build Coastguard Worker if (unlikely(extra_len > temp_len)) { goto retry_havoc_step; }
3111*08b48e0bSAndroid Build Coastguard Worker
3112*08b48e0bSAndroid Build Coastguard Worker u32 insert_at = rand_below(afl, temp_len - extra_len + 1);
3113*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
3114*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp),
3115*08b48e0bSAndroid Build Coastguard Worker " AUTO-EXTRA-OVERWRITE_%u_%u", insert_at, extra_len);
3116*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
3117*08b48e0bSAndroid Build Coastguard Worker #endif
3118*08b48e0bSAndroid Build Coastguard Worker memcpy(out_buf + insert_at, afl->a_extras[use_extra].data, extra_len);
3119*08b48e0bSAndroid Build Coastguard Worker
3120*08b48e0bSAndroid Build Coastguard Worker break;
3121*08b48e0bSAndroid Build Coastguard Worker
3122*08b48e0bSAndroid Build Coastguard Worker }
3123*08b48e0bSAndroid Build Coastguard Worker
3124*08b48e0bSAndroid Build Coastguard Worker case MUT_AUTO_EXTRA_INSERT: {
3125*08b48e0bSAndroid Build Coastguard Worker
3126*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!afl->a_extras_cnt)) { goto retry_havoc_step; }
3127*08b48e0bSAndroid Build Coastguard Worker
3128*08b48e0bSAndroid Build Coastguard Worker u32 use_extra = rand_below(afl, afl->a_extras_cnt);
3129*08b48e0bSAndroid Build Coastguard Worker u32 extra_len = afl->a_extras[use_extra].len;
3130*08b48e0bSAndroid Build Coastguard Worker if (unlikely(temp_len + extra_len >= MAX_FILE)) {
3131*08b48e0bSAndroid Build Coastguard Worker
3132*08b48e0bSAndroid Build Coastguard Worker goto retry_havoc_step;
3133*08b48e0bSAndroid Build Coastguard Worker
3134*08b48e0bSAndroid Build Coastguard Worker }
3135*08b48e0bSAndroid Build Coastguard Worker
3136*08b48e0bSAndroid Build Coastguard Worker u8 *ptr = afl->a_extras[use_extra].data;
3137*08b48e0bSAndroid Build Coastguard Worker u32 insert_at = rand_below(afl, temp_len + 1);
3138*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
3139*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " AUTO-EXTRA-INSERT_%u_%u",
3140*08b48e0bSAndroid Build Coastguard Worker insert_at, extra_len);
3141*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
3142*08b48e0bSAndroid Build Coastguard Worker #endif
3143*08b48e0bSAndroid Build Coastguard Worker
3144*08b48e0bSAndroid Build Coastguard Worker out_buf = afl_realloc(AFL_BUF_PARAM(out), temp_len + extra_len);
3145*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!out_buf)) { PFATAL("alloc"); }
3146*08b48e0bSAndroid Build Coastguard Worker
3147*08b48e0bSAndroid Build Coastguard Worker /* Tail */
3148*08b48e0bSAndroid Build Coastguard Worker memmove(out_buf + insert_at + extra_len, out_buf + insert_at,
3149*08b48e0bSAndroid Build Coastguard Worker temp_len - insert_at);
3150*08b48e0bSAndroid Build Coastguard Worker
3151*08b48e0bSAndroid Build Coastguard Worker /* Inserted part */
3152*08b48e0bSAndroid Build Coastguard Worker memcpy(out_buf + insert_at, ptr, extra_len);
3153*08b48e0bSAndroid Build Coastguard Worker temp_len += extra_len;
3154*08b48e0bSAndroid Build Coastguard Worker
3155*08b48e0bSAndroid Build Coastguard Worker break;
3156*08b48e0bSAndroid Build Coastguard Worker
3157*08b48e0bSAndroid Build Coastguard Worker }
3158*08b48e0bSAndroid Build Coastguard Worker
3159*08b48e0bSAndroid Build Coastguard Worker case MUT_SPLICE_OVERWRITE: {
3160*08b48e0bSAndroid Build Coastguard Worker
3161*08b48e0bSAndroid Build Coastguard Worker if (unlikely(afl->ready_for_splicing_count <= 1)) {
3162*08b48e0bSAndroid Build Coastguard Worker
3163*08b48e0bSAndroid Build Coastguard Worker goto retry_havoc_step;
3164*08b48e0bSAndroid Build Coastguard Worker
3165*08b48e0bSAndroid Build Coastguard Worker }
3166*08b48e0bSAndroid Build Coastguard Worker
3167*08b48e0bSAndroid Build Coastguard Worker /* Pick a random queue entry and seek to it. */
3168*08b48e0bSAndroid Build Coastguard Worker
3169*08b48e0bSAndroid Build Coastguard Worker u32 tid;
3170*08b48e0bSAndroid Build Coastguard Worker do {
3171*08b48e0bSAndroid Build Coastguard Worker
3172*08b48e0bSAndroid Build Coastguard Worker tid = rand_below(afl, afl->queued_items);
3173*08b48e0bSAndroid Build Coastguard Worker
3174*08b48e0bSAndroid Build Coastguard Worker } while (unlikely(tid == afl->current_entry ||
3175*08b48e0bSAndroid Build Coastguard Worker
3176*08b48e0bSAndroid Build Coastguard Worker afl->queue_buf[tid]->len < 4));
3177*08b48e0bSAndroid Build Coastguard Worker
3178*08b48e0bSAndroid Build Coastguard Worker /* Get the testcase for splicing. */
3179*08b48e0bSAndroid Build Coastguard Worker struct queue_entry *target = afl->queue_buf[tid];
3180*08b48e0bSAndroid Build Coastguard Worker u32 new_len = target->len;
3181*08b48e0bSAndroid Build Coastguard Worker u8 *new_buf = queue_testcase_get(afl, target);
3182*08b48e0bSAndroid Build Coastguard Worker
3183*08b48e0bSAndroid Build Coastguard Worker /* overwrite mode */
3184*08b48e0bSAndroid Build Coastguard Worker
3185*08b48e0bSAndroid Build Coastguard Worker u32 copy_from, copy_to, copy_len;
3186*08b48e0bSAndroid Build Coastguard Worker
3187*08b48e0bSAndroid Build Coastguard Worker copy_len = choose_block_len(afl, new_len - 1);
3188*08b48e0bSAndroid Build Coastguard Worker if (copy_len > temp_len) copy_len = temp_len;
3189*08b48e0bSAndroid Build Coastguard Worker
3190*08b48e0bSAndroid Build Coastguard Worker copy_from = rand_below(afl, new_len - copy_len + 1);
3191*08b48e0bSAndroid Build Coastguard Worker copy_to = rand_below(afl, temp_len - copy_len + 1);
3192*08b48e0bSAndroid Build Coastguard Worker
3193*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
3194*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp),
3195*08b48e0bSAndroid Build Coastguard Worker " SPLICE-OVERWRITE_%u_%u_%u_%s", copy_from, copy_to,
3196*08b48e0bSAndroid Build Coastguard Worker copy_len, target->fname);
3197*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
3198*08b48e0bSAndroid Build Coastguard Worker #endif
3199*08b48e0bSAndroid Build Coastguard Worker memmove(out_buf + copy_to, new_buf + copy_from, copy_len);
3200*08b48e0bSAndroid Build Coastguard Worker
3201*08b48e0bSAndroid Build Coastguard Worker break;
3202*08b48e0bSAndroid Build Coastguard Worker
3203*08b48e0bSAndroid Build Coastguard Worker }
3204*08b48e0bSAndroid Build Coastguard Worker
3205*08b48e0bSAndroid Build Coastguard Worker case MUT_SPLICE_INSERT: {
3206*08b48e0bSAndroid Build Coastguard Worker
3207*08b48e0bSAndroid Build Coastguard Worker if (unlikely(afl->ready_for_splicing_count <= 1)) {
3208*08b48e0bSAndroid Build Coastguard Worker
3209*08b48e0bSAndroid Build Coastguard Worker goto retry_havoc_step;
3210*08b48e0bSAndroid Build Coastguard Worker
3211*08b48e0bSAndroid Build Coastguard Worker }
3212*08b48e0bSAndroid Build Coastguard Worker
3213*08b48e0bSAndroid Build Coastguard Worker if (unlikely(temp_len + HAVOC_BLK_XL >= MAX_FILE)) {
3214*08b48e0bSAndroid Build Coastguard Worker
3215*08b48e0bSAndroid Build Coastguard Worker goto retry_havoc_step;
3216*08b48e0bSAndroid Build Coastguard Worker
3217*08b48e0bSAndroid Build Coastguard Worker }
3218*08b48e0bSAndroid Build Coastguard Worker
3219*08b48e0bSAndroid Build Coastguard Worker /* Pick a random queue entry and seek to it. */
3220*08b48e0bSAndroid Build Coastguard Worker
3221*08b48e0bSAndroid Build Coastguard Worker u32 tid;
3222*08b48e0bSAndroid Build Coastguard Worker do {
3223*08b48e0bSAndroid Build Coastguard Worker
3224*08b48e0bSAndroid Build Coastguard Worker tid = rand_below(afl, afl->queued_items);
3225*08b48e0bSAndroid Build Coastguard Worker
3226*08b48e0bSAndroid Build Coastguard Worker } while (unlikely(tid == afl->current_entry ||
3227*08b48e0bSAndroid Build Coastguard Worker
3228*08b48e0bSAndroid Build Coastguard Worker afl->queue_buf[tid]->len < 4));
3229*08b48e0bSAndroid Build Coastguard Worker
3230*08b48e0bSAndroid Build Coastguard Worker /* Get the testcase for splicing. */
3231*08b48e0bSAndroid Build Coastguard Worker struct queue_entry *target = afl->queue_buf[tid];
3232*08b48e0bSAndroid Build Coastguard Worker u32 new_len = target->len;
3233*08b48e0bSAndroid Build Coastguard Worker u8 *new_buf = queue_testcase_get(afl, target);
3234*08b48e0bSAndroid Build Coastguard Worker
3235*08b48e0bSAndroid Build Coastguard Worker /* insert mode */
3236*08b48e0bSAndroid Build Coastguard Worker
3237*08b48e0bSAndroid Build Coastguard Worker u32 clone_from, clone_to, clone_len;
3238*08b48e0bSAndroid Build Coastguard Worker
3239*08b48e0bSAndroid Build Coastguard Worker clone_len = choose_block_len(afl, new_len);
3240*08b48e0bSAndroid Build Coastguard Worker clone_from = rand_below(afl, new_len - clone_len + 1);
3241*08b48e0bSAndroid Build Coastguard Worker clone_to = rand_below(afl, temp_len + 1);
3242*08b48e0bSAndroid Build Coastguard Worker
3243*08b48e0bSAndroid Build Coastguard Worker u8 *temp_buf =
3244*08b48e0bSAndroid Build Coastguard Worker afl_realloc(AFL_BUF_PARAM(out_scratch), temp_len + clone_len + 1);
3245*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!temp_buf)) { PFATAL("alloc"); }
3246*08b48e0bSAndroid Build Coastguard Worker
3247*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
3248*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " SPLICE-INSERT_%u_%u_%u_%s",
3249*08b48e0bSAndroid Build Coastguard Worker clone_from, clone_to, clone_len, target->fname);
3250*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
3251*08b48e0bSAndroid Build Coastguard Worker #endif
3252*08b48e0bSAndroid Build Coastguard Worker /* Head */
3253*08b48e0bSAndroid Build Coastguard Worker
3254*08b48e0bSAndroid Build Coastguard Worker memcpy(temp_buf, out_buf, clone_to);
3255*08b48e0bSAndroid Build Coastguard Worker
3256*08b48e0bSAndroid Build Coastguard Worker /* Inserted part */
3257*08b48e0bSAndroid Build Coastguard Worker
3258*08b48e0bSAndroid Build Coastguard Worker memcpy(temp_buf + clone_to, new_buf + clone_from, clone_len);
3259*08b48e0bSAndroid Build Coastguard Worker
3260*08b48e0bSAndroid Build Coastguard Worker /* Tail */
3261*08b48e0bSAndroid Build Coastguard Worker memcpy(temp_buf + clone_to + clone_len, out_buf + clone_to,
3262*08b48e0bSAndroid Build Coastguard Worker temp_len - clone_to);
3263*08b48e0bSAndroid Build Coastguard Worker
3264*08b48e0bSAndroid Build Coastguard Worker out_buf = temp_buf;
3265*08b48e0bSAndroid Build Coastguard Worker afl_swap_bufs(AFL_BUF_PARAM(out), AFL_BUF_PARAM(out_scratch));
3266*08b48e0bSAndroid Build Coastguard Worker temp_len += clone_len;
3267*08b48e0bSAndroid Build Coastguard Worker
3268*08b48e0bSAndroid Build Coastguard Worker break;
3269*08b48e0bSAndroid Build Coastguard Worker
3270*08b48e0bSAndroid Build Coastguard Worker }
3271*08b48e0bSAndroid Build Coastguard Worker
3272*08b48e0bSAndroid Build Coastguard Worker }
3273*08b48e0bSAndroid Build Coastguard Worker
3274*08b48e0bSAndroid Build Coastguard Worker }
3275*08b48e0bSAndroid Build Coastguard Worker
3276*08b48e0bSAndroid Build Coastguard Worker }
3277*08b48e0bSAndroid Build Coastguard Worker
3278*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, out_buf, temp_len)) { goto abandon_entry; }
3279*08b48e0bSAndroid Build Coastguard Worker
3280*08b48e0bSAndroid Build Coastguard Worker /* out_buf might have been mangled a bit, so let's restore it to its
3281*08b48e0bSAndroid Build Coastguard Worker original size and shape. */
3282*08b48e0bSAndroid Build Coastguard Worker
3283*08b48e0bSAndroid Build Coastguard Worker out_buf = afl_realloc(AFL_BUF_PARAM(out), len);
3284*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!out_buf)) { PFATAL("alloc"); }
3285*08b48e0bSAndroid Build Coastguard Worker temp_len = len;
3286*08b48e0bSAndroid Build Coastguard Worker memcpy(out_buf, in_buf, len);
3287*08b48e0bSAndroid Build Coastguard Worker
3288*08b48e0bSAndroid Build Coastguard Worker /* If we're finding new stuff, let's run for a bit longer, limits
3289*08b48e0bSAndroid Build Coastguard Worker permitting. */
3290*08b48e0bSAndroid Build Coastguard Worker
3291*08b48e0bSAndroid Build Coastguard Worker if (afl->queued_items != havoc_queued) {
3292*08b48e0bSAndroid Build Coastguard Worker
3293*08b48e0bSAndroid Build Coastguard Worker if (perf_score <= afl->havoc_max_mult * 100) {
3294*08b48e0bSAndroid Build Coastguard Worker
3295*08b48e0bSAndroid Build Coastguard Worker afl->stage_max *= 2;
3296*08b48e0bSAndroid Build Coastguard Worker perf_score *= 2;
3297*08b48e0bSAndroid Build Coastguard Worker
3298*08b48e0bSAndroid Build Coastguard Worker }
3299*08b48e0bSAndroid Build Coastguard Worker
3300*08b48e0bSAndroid Build Coastguard Worker havoc_queued = afl->queued_items;
3301*08b48e0bSAndroid Build Coastguard Worker
3302*08b48e0bSAndroid Build Coastguard Worker }
3303*08b48e0bSAndroid Build Coastguard Worker
3304*08b48e0bSAndroid Build Coastguard Worker }
3305*08b48e0bSAndroid Build Coastguard Worker
3306*08b48e0bSAndroid Build Coastguard Worker new_hit_cnt = afl->queued_items + afl->saved_crashes;
3307*08b48e0bSAndroid Build Coastguard Worker
3308*08b48e0bSAndroid Build Coastguard Worker if (!splice_cycle) {
3309*08b48e0bSAndroid Build Coastguard Worker
3310*08b48e0bSAndroid Build Coastguard Worker afl->stage_finds[STAGE_HAVOC] += new_hit_cnt - orig_hit_cnt;
3311*08b48e0bSAndroid Build Coastguard Worker afl->stage_cycles[STAGE_HAVOC] += afl->stage_max;
3312*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
3313*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->stats_mutated += afl->stage_max;
3314*08b48e0bSAndroid Build Coastguard Worker #endif
3315*08b48e0bSAndroid Build Coastguard Worker
3316*08b48e0bSAndroid Build Coastguard Worker } else {
3317*08b48e0bSAndroid Build Coastguard Worker
3318*08b48e0bSAndroid Build Coastguard Worker afl->stage_finds[STAGE_SPLICE] += new_hit_cnt - orig_hit_cnt;
3319*08b48e0bSAndroid Build Coastguard Worker afl->stage_cycles[STAGE_SPLICE] += afl->stage_max;
3320*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
3321*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->stats_mutated += afl->stage_max;
3322*08b48e0bSAndroid Build Coastguard Worker #endif
3323*08b48e0bSAndroid Build Coastguard Worker
3324*08b48e0bSAndroid Build Coastguard Worker }
3325*08b48e0bSAndroid Build Coastguard Worker
3326*08b48e0bSAndroid Build Coastguard Worker #ifndef IGNORE_FINDS
3327*08b48e0bSAndroid Build Coastguard Worker
3328*08b48e0bSAndroid Build Coastguard Worker /************
3329*08b48e0bSAndroid Build Coastguard Worker * SPLICING *
3330*08b48e0bSAndroid Build Coastguard Worker ************/
3331*08b48e0bSAndroid Build Coastguard Worker
3332*08b48e0bSAndroid Build Coastguard Worker /* This is a last-resort strategy triggered by a full round with no findings.
3333*08b48e0bSAndroid Build Coastguard Worker It takes the current input file, randomly selects another input, and
3334*08b48e0bSAndroid Build Coastguard Worker splices them together at some offset, then relies on the havoc
3335*08b48e0bSAndroid Build Coastguard Worker code to mutate that blob. */
3336*08b48e0bSAndroid Build Coastguard Worker
3337*08b48e0bSAndroid Build Coastguard Worker retry_splicing:
3338*08b48e0bSAndroid Build Coastguard Worker
3339*08b48e0bSAndroid Build Coastguard Worker if (afl->use_splicing && splice_cycle++ < SPLICE_CYCLES &&
3340*08b48e0bSAndroid Build Coastguard Worker afl->ready_for_splicing_count > 1 && afl->queue_cur->len >= 4) {
3341*08b48e0bSAndroid Build Coastguard Worker
3342*08b48e0bSAndroid Build Coastguard Worker struct queue_entry *target;
3343*08b48e0bSAndroid Build Coastguard Worker u32 tid, split_at;
3344*08b48e0bSAndroid Build Coastguard Worker u8 *new_buf;
3345*08b48e0bSAndroid Build Coastguard Worker s32 f_diff, l_diff;
3346*08b48e0bSAndroid Build Coastguard Worker
3347*08b48e0bSAndroid Build Coastguard Worker /* First of all, if we've modified in_buf for havoc, let's clean that
3348*08b48e0bSAndroid Build Coastguard Worker up... */
3349*08b48e0bSAndroid Build Coastguard Worker
3350*08b48e0bSAndroid Build Coastguard Worker if (in_buf != orig_in) {
3351*08b48e0bSAndroid Build Coastguard Worker
3352*08b48e0bSAndroid Build Coastguard Worker in_buf = orig_in;
3353*08b48e0bSAndroid Build Coastguard Worker len = afl->queue_cur->len;
3354*08b48e0bSAndroid Build Coastguard Worker
3355*08b48e0bSAndroid Build Coastguard Worker }
3356*08b48e0bSAndroid Build Coastguard Worker
3357*08b48e0bSAndroid Build Coastguard Worker /* Pick a random queue entry and seek to it. Don't splice with yourself. */
3358*08b48e0bSAndroid Build Coastguard Worker
3359*08b48e0bSAndroid Build Coastguard Worker do {
3360*08b48e0bSAndroid Build Coastguard Worker
3361*08b48e0bSAndroid Build Coastguard Worker tid = rand_below(afl, afl->queued_items);
3362*08b48e0bSAndroid Build Coastguard Worker
3363*08b48e0bSAndroid Build Coastguard Worker } while (
3364*08b48e0bSAndroid Build Coastguard Worker
3365*08b48e0bSAndroid Build Coastguard Worker unlikely(tid == afl->current_entry || afl->queue_buf[tid]->len < 4));
3366*08b48e0bSAndroid Build Coastguard Worker
3367*08b48e0bSAndroid Build Coastguard Worker /* Get the testcase */
3368*08b48e0bSAndroid Build Coastguard Worker afl->splicing_with = tid;
3369*08b48e0bSAndroid Build Coastguard Worker target = afl->queue_buf[tid];
3370*08b48e0bSAndroid Build Coastguard Worker new_buf = queue_testcase_get(afl, target);
3371*08b48e0bSAndroid Build Coastguard Worker
3372*08b48e0bSAndroid Build Coastguard Worker /* Find a suitable splicing location, somewhere between the first and
3373*08b48e0bSAndroid Build Coastguard Worker the last differing byte. Bail out if the difference is just a single
3374*08b48e0bSAndroid Build Coastguard Worker byte or so. */
3375*08b48e0bSAndroid Build Coastguard Worker
3376*08b48e0bSAndroid Build Coastguard Worker locate_diffs(in_buf, new_buf, MIN(len, (s64)target->len), &f_diff, &l_diff);
3377*08b48e0bSAndroid Build Coastguard Worker
3378*08b48e0bSAndroid Build Coastguard Worker if (f_diff < 0 || l_diff < 2 || f_diff == l_diff) { goto retry_splicing; }
3379*08b48e0bSAndroid Build Coastguard Worker
3380*08b48e0bSAndroid Build Coastguard Worker /* Split somewhere between the first and last differing byte. */
3381*08b48e0bSAndroid Build Coastguard Worker
3382*08b48e0bSAndroid Build Coastguard Worker split_at = f_diff + rand_below(afl, l_diff - f_diff);
3383*08b48e0bSAndroid Build Coastguard Worker
3384*08b48e0bSAndroid Build Coastguard Worker /* Do the thing. */
3385*08b48e0bSAndroid Build Coastguard Worker
3386*08b48e0bSAndroid Build Coastguard Worker len = target->len;
3387*08b48e0bSAndroid Build Coastguard Worker afl->in_scratch_buf = afl_realloc(AFL_BUF_PARAM(in_scratch), len);
3388*08b48e0bSAndroid Build Coastguard Worker memcpy(afl->in_scratch_buf, in_buf, split_at);
3389*08b48e0bSAndroid Build Coastguard Worker memcpy(afl->in_scratch_buf + split_at, new_buf, len - split_at);
3390*08b48e0bSAndroid Build Coastguard Worker in_buf = afl->in_scratch_buf;
3391*08b48e0bSAndroid Build Coastguard Worker afl_swap_bufs(AFL_BUF_PARAM(in), AFL_BUF_PARAM(in_scratch));
3392*08b48e0bSAndroid Build Coastguard Worker
3393*08b48e0bSAndroid Build Coastguard Worker out_buf = afl_realloc(AFL_BUF_PARAM(out), len);
3394*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!out_buf)) { PFATAL("alloc"); }
3395*08b48e0bSAndroid Build Coastguard Worker memcpy(out_buf, in_buf, len);
3396*08b48e0bSAndroid Build Coastguard Worker
3397*08b48e0bSAndroid Build Coastguard Worker goto custom_mutator_stage;
3398*08b48e0bSAndroid Build Coastguard Worker
3399*08b48e0bSAndroid Build Coastguard Worker }
3400*08b48e0bSAndroid Build Coastguard Worker
3401*08b48e0bSAndroid Build Coastguard Worker #endif /* !IGNORE_FINDS */
3402*08b48e0bSAndroid Build Coastguard Worker
3403*08b48e0bSAndroid Build Coastguard Worker ret_val = 0;
3404*08b48e0bSAndroid Build Coastguard Worker
3405*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
3406*08b48e0bSAndroid Build Coastguard Worker
3407*08b48e0bSAndroid Build Coastguard Worker afl->havoc_prof->queued_det_stage =
3408*08b48e0bSAndroid Build Coastguard Worker before_havoc_findings - before_det_findings;
3409*08b48e0bSAndroid Build Coastguard Worker afl->havoc_prof->queued_havoc_stage =
3410*08b48e0bSAndroid Build Coastguard Worker afl->queued_items - before_havoc_findings;
3411*08b48e0bSAndroid Build Coastguard Worker afl->havoc_prof->total_queued_det += afl->havoc_prof->queued_det_stage;
3412*08b48e0bSAndroid Build Coastguard Worker afl->havoc_prof->edge_det_stage = before_havoc_edges - before_det_edges;
3413*08b48e0bSAndroid Build Coastguard Worker afl->havoc_prof->edge_havoc_stage =
3414*08b48e0bSAndroid Build Coastguard Worker count_non_255_bytes(afl, afl->virgin_bits) - before_havoc_edges;
3415*08b48e0bSAndroid Build Coastguard Worker afl->havoc_prof->total_det_edge += afl->havoc_prof->edge_det_stage;
3416*08b48e0bSAndroid Build Coastguard Worker afl->havoc_prof->det_stage_time = before_havoc_time - before_det_time;
3417*08b48e0bSAndroid Build Coastguard Worker afl->havoc_prof->havoc_stage_time = get_cur_time() - before_havoc_time;
3418*08b48e0bSAndroid Build Coastguard Worker afl->havoc_prof->total_det_time += afl->havoc_prof->det_stage_time;
3419*08b48e0bSAndroid Build Coastguard Worker
3420*08b48e0bSAndroid Build Coastguard Worker plot_profile_data(afl, afl->queue_cur);
3421*08b48e0bSAndroid Build Coastguard Worker
3422*08b48e0bSAndroid Build Coastguard Worker #endif
3423*08b48e0bSAndroid Build Coastguard Worker
3424*08b48e0bSAndroid Build Coastguard Worker /* we are through with this queue entry - for this iteration */
3425*08b48e0bSAndroid Build Coastguard Worker abandon_entry:
3426*08b48e0bSAndroid Build Coastguard Worker
3427*08b48e0bSAndroid Build Coastguard Worker afl->splicing_with = -1;
3428*08b48e0bSAndroid Build Coastguard Worker
3429*08b48e0bSAndroid Build Coastguard Worker /* Update afl->pending_not_fuzzed count if we made it through the calibration
3430*08b48e0bSAndroid Build Coastguard Worker cycle and have not seen this entry before. */
3431*08b48e0bSAndroid Build Coastguard Worker
3432*08b48e0bSAndroid Build Coastguard Worker if (!afl->stop_soon && !afl->queue_cur->cal_failed &&
3433*08b48e0bSAndroid Build Coastguard Worker !afl->queue_cur->was_fuzzed && !afl->queue_cur->disabled) {
3434*08b48e0bSAndroid Build Coastguard Worker
3435*08b48e0bSAndroid Build Coastguard Worker --afl->pending_not_fuzzed;
3436*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->was_fuzzed = 1;
3437*08b48e0bSAndroid Build Coastguard Worker afl->reinit_table = 1;
3438*08b48e0bSAndroid Build Coastguard Worker if (afl->queue_cur->favored) {
3439*08b48e0bSAndroid Build Coastguard Worker
3440*08b48e0bSAndroid Build Coastguard Worker --afl->pending_favored;
3441*08b48e0bSAndroid Build Coastguard Worker afl->smallest_favored = -1;
3442*08b48e0bSAndroid Build Coastguard Worker
3443*08b48e0bSAndroid Build Coastguard Worker }
3444*08b48e0bSAndroid Build Coastguard Worker
3445*08b48e0bSAndroid Build Coastguard Worker }
3446*08b48e0bSAndroid Build Coastguard Worker
3447*08b48e0bSAndroid Build Coastguard Worker ++afl->queue_cur->fuzz_level;
3448*08b48e0bSAndroid Build Coastguard Worker orig_in = NULL;
3449*08b48e0bSAndroid Build Coastguard Worker return ret_val;
3450*08b48e0bSAndroid Build Coastguard Worker
3451*08b48e0bSAndroid Build Coastguard Worker #undef FLIP_BIT
3452*08b48e0bSAndroid Build Coastguard Worker
3453*08b48e0bSAndroid Build Coastguard Worker }
3454*08b48e0bSAndroid Build Coastguard Worker
3455*08b48e0bSAndroid Build Coastguard Worker /* MOpt mode */
mopt_common_fuzzing(afl_state_t * afl,MOpt_globals_t MOpt_globals)3456*08b48e0bSAndroid Build Coastguard Worker static u8 mopt_common_fuzzing(afl_state_t *afl, MOpt_globals_t MOpt_globals) {
3457*08b48e0bSAndroid Build Coastguard Worker
3458*08b48e0bSAndroid Build Coastguard Worker if (!MOpt_globals.is_pilot_mode) {
3459*08b48e0bSAndroid Build Coastguard Worker
3460*08b48e0bSAndroid Build Coastguard Worker if (swarm_num == 1) {
3461*08b48e0bSAndroid Build Coastguard Worker
3462*08b48e0bSAndroid Build Coastguard Worker afl->key_module = 2;
3463*08b48e0bSAndroid Build Coastguard Worker return 0;
3464*08b48e0bSAndroid Build Coastguard Worker
3465*08b48e0bSAndroid Build Coastguard Worker }
3466*08b48e0bSAndroid Build Coastguard Worker
3467*08b48e0bSAndroid Build Coastguard Worker }
3468*08b48e0bSAndroid Build Coastguard Worker
3469*08b48e0bSAndroid Build Coastguard Worker u32 len, temp_len;
3470*08b48e0bSAndroid Build Coastguard Worker u32 i;
3471*08b48e0bSAndroid Build Coastguard Worker u32 j;
3472*08b48e0bSAndroid Build Coastguard Worker u8 *in_buf, *out_buf, *orig_in, *ex_tmp, *eff_map = 0;
3473*08b48e0bSAndroid Build Coastguard Worker u64 havoc_queued = 0, orig_hit_cnt, new_hit_cnt = 0, cur_ms_lv, prev_cksum,
3474*08b48e0bSAndroid Build Coastguard Worker _prev_cksum;
3475*08b48e0bSAndroid Build Coastguard Worker u32 splice_cycle = 0, perf_score = 100, orig_perf, eff_cnt = 1;
3476*08b48e0bSAndroid Build Coastguard Worker
3477*08b48e0bSAndroid Build Coastguard Worker u8 ret_val = 1, doing_det = 0;
3478*08b48e0bSAndroid Build Coastguard Worker
3479*08b48e0bSAndroid Build Coastguard Worker u8 a_collect[MAX_AUTO_EXTRA];
3480*08b48e0bSAndroid Build Coastguard Worker u32 a_len = 0;
3481*08b48e0bSAndroid Build Coastguard Worker
3482*08b48e0bSAndroid Build Coastguard Worker #ifdef IGNORE_FINDS
3483*08b48e0bSAndroid Build Coastguard Worker
3484*08b48e0bSAndroid Build Coastguard Worker /* In IGNORE_FINDS mode, skip any entries that weren't in the
3485*08b48e0bSAndroid Build Coastguard Worker initial data set. */
3486*08b48e0bSAndroid Build Coastguard Worker
3487*08b48e0bSAndroid Build Coastguard Worker if (afl->queue_cur->depth > 1) return 1;
3488*08b48e0bSAndroid Build Coastguard Worker
3489*08b48e0bSAndroid Build Coastguard Worker #else
3490*08b48e0bSAndroid Build Coastguard Worker
3491*08b48e0bSAndroid Build Coastguard Worker if (likely(afl->pending_favored)) {
3492*08b48e0bSAndroid Build Coastguard Worker
3493*08b48e0bSAndroid Build Coastguard Worker /* If we have any favored, non-fuzzed new arrivals in the queue,
3494*08b48e0bSAndroid Build Coastguard Worker possibly skip to them at the expense of already-fuzzed or non-favored
3495*08b48e0bSAndroid Build Coastguard Worker cases. */
3496*08b48e0bSAndroid Build Coastguard Worker
3497*08b48e0bSAndroid Build Coastguard Worker if ((afl->queue_cur->fuzz_level || !afl->queue_cur->favored) &&
3498*08b48e0bSAndroid Build Coastguard Worker rand_below(afl, 100) < SKIP_TO_NEW_PROB) {
3499*08b48e0bSAndroid Build Coastguard Worker
3500*08b48e0bSAndroid Build Coastguard Worker return 1;
3501*08b48e0bSAndroid Build Coastguard Worker
3502*08b48e0bSAndroid Build Coastguard Worker }
3503*08b48e0bSAndroid Build Coastguard Worker
3504*08b48e0bSAndroid Build Coastguard Worker } else if (!afl->non_instrumented_mode && !afl->queue_cur->favored &&
3505*08b48e0bSAndroid Build Coastguard Worker
3506*08b48e0bSAndroid Build Coastguard Worker afl->queued_items > 10) {
3507*08b48e0bSAndroid Build Coastguard Worker
3508*08b48e0bSAndroid Build Coastguard Worker /* Otherwise, still possibly skip non-favored cases, albeit less often.
3509*08b48e0bSAndroid Build Coastguard Worker The odds of skipping stuff are higher for already-fuzzed inputs and
3510*08b48e0bSAndroid Build Coastguard Worker lower for never-fuzzed entries. */
3511*08b48e0bSAndroid Build Coastguard Worker
3512*08b48e0bSAndroid Build Coastguard Worker if (afl->queue_cycle > 1 && !afl->queue_cur->fuzz_level) {
3513*08b48e0bSAndroid Build Coastguard Worker
3514*08b48e0bSAndroid Build Coastguard Worker if (likely(rand_below(afl, 100) < SKIP_NFAV_NEW_PROB)) { return 1; }
3515*08b48e0bSAndroid Build Coastguard Worker
3516*08b48e0bSAndroid Build Coastguard Worker } else {
3517*08b48e0bSAndroid Build Coastguard Worker
3518*08b48e0bSAndroid Build Coastguard Worker if (likely(rand_below(afl, 100) < SKIP_NFAV_OLD_PROB)) { return 1; }
3519*08b48e0bSAndroid Build Coastguard Worker
3520*08b48e0bSAndroid Build Coastguard Worker }
3521*08b48e0bSAndroid Build Coastguard Worker
3522*08b48e0bSAndroid Build Coastguard Worker }
3523*08b48e0bSAndroid Build Coastguard Worker
3524*08b48e0bSAndroid Build Coastguard Worker #endif /* ^IGNORE_FINDS */
3525*08b48e0bSAndroid Build Coastguard Worker
3526*08b48e0bSAndroid Build Coastguard Worker if (afl->not_on_tty) {
3527*08b48e0bSAndroid Build Coastguard Worker
3528*08b48e0bSAndroid Build Coastguard Worker ACTF("Fuzzing test case #%u (%u total, %llu crashes saved)...",
3529*08b48e0bSAndroid Build Coastguard Worker afl->current_entry, afl->queued_items, afl->saved_crashes);
3530*08b48e0bSAndroid Build Coastguard Worker fflush(stdout);
3531*08b48e0bSAndroid Build Coastguard Worker
3532*08b48e0bSAndroid Build Coastguard Worker }
3533*08b48e0bSAndroid Build Coastguard Worker
3534*08b48e0bSAndroid Build Coastguard Worker /* Map the test case into memory. */
3535*08b48e0bSAndroid Build Coastguard Worker orig_in = in_buf = queue_testcase_get(afl, afl->queue_cur);
3536*08b48e0bSAndroid Build Coastguard Worker len = afl->queue_cur->len;
3537*08b48e0bSAndroid Build Coastguard Worker
3538*08b48e0bSAndroid Build Coastguard Worker out_buf = afl_realloc(AFL_BUF_PARAM(out), len);
3539*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!out_buf)) { PFATAL("alloc"); }
3540*08b48e0bSAndroid Build Coastguard Worker
3541*08b48e0bSAndroid Build Coastguard Worker afl->subseq_tmouts = 0;
3542*08b48e0bSAndroid Build Coastguard Worker
3543*08b48e0bSAndroid Build Coastguard Worker afl->cur_depth = afl->queue_cur->depth;
3544*08b48e0bSAndroid Build Coastguard Worker
3545*08b48e0bSAndroid Build Coastguard Worker /*******************************************
3546*08b48e0bSAndroid Build Coastguard Worker * CALIBRATION (only if failed earlier on) *
3547*08b48e0bSAndroid Build Coastguard Worker *******************************************/
3548*08b48e0bSAndroid Build Coastguard Worker
3549*08b48e0bSAndroid Build Coastguard Worker if (unlikely(afl->queue_cur->cal_failed)) {
3550*08b48e0bSAndroid Build Coastguard Worker
3551*08b48e0bSAndroid Build Coastguard Worker u8 res = FSRV_RUN_TMOUT;
3552*08b48e0bSAndroid Build Coastguard Worker
3553*08b48e0bSAndroid Build Coastguard Worker if (afl->queue_cur->cal_failed < CAL_CHANCES) {
3554*08b48e0bSAndroid Build Coastguard Worker
3555*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->exec_cksum = 0;
3556*08b48e0bSAndroid Build Coastguard Worker
3557*08b48e0bSAndroid Build Coastguard Worker res =
3558*08b48e0bSAndroid Build Coastguard Worker calibrate_case(afl, afl->queue_cur, in_buf, afl->queue_cycle - 1, 0);
3559*08b48e0bSAndroid Build Coastguard Worker
3560*08b48e0bSAndroid Build Coastguard Worker if (res == FSRV_RUN_ERROR) {
3561*08b48e0bSAndroid Build Coastguard Worker
3562*08b48e0bSAndroid Build Coastguard Worker FATAL("Unable to execute target application");
3563*08b48e0bSAndroid Build Coastguard Worker
3564*08b48e0bSAndroid Build Coastguard Worker }
3565*08b48e0bSAndroid Build Coastguard Worker
3566*08b48e0bSAndroid Build Coastguard Worker }
3567*08b48e0bSAndroid Build Coastguard Worker
3568*08b48e0bSAndroid Build Coastguard Worker if (afl->stop_soon || res != afl->crash_mode) {
3569*08b48e0bSAndroid Build Coastguard Worker
3570*08b48e0bSAndroid Build Coastguard Worker ++afl->cur_skipped_items;
3571*08b48e0bSAndroid Build Coastguard Worker goto abandon_entry;
3572*08b48e0bSAndroid Build Coastguard Worker
3573*08b48e0bSAndroid Build Coastguard Worker }
3574*08b48e0bSAndroid Build Coastguard Worker
3575*08b48e0bSAndroid Build Coastguard Worker }
3576*08b48e0bSAndroid Build Coastguard Worker
3577*08b48e0bSAndroid Build Coastguard Worker /************
3578*08b48e0bSAndroid Build Coastguard Worker * TRIMMING *
3579*08b48e0bSAndroid Build Coastguard Worker ************/
3580*08b48e0bSAndroid Build Coastguard Worker
3581*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!afl->non_instrumented_mode && !afl->queue_cur->trim_done &&
3582*08b48e0bSAndroid Build Coastguard Worker !afl->disable_trim)) {
3583*08b48e0bSAndroid Build Coastguard Worker
3584*08b48e0bSAndroid Build Coastguard Worker u32 old_len = afl->queue_cur->len;
3585*08b48e0bSAndroid Build Coastguard Worker
3586*08b48e0bSAndroid Build Coastguard Worker u8 res = trim_case(afl, afl->queue_cur, in_buf);
3587*08b48e0bSAndroid Build Coastguard Worker orig_in = in_buf = queue_testcase_get(afl, afl->queue_cur);
3588*08b48e0bSAndroid Build Coastguard Worker
3589*08b48e0bSAndroid Build Coastguard Worker if (unlikely(res == FSRV_RUN_ERROR)) {
3590*08b48e0bSAndroid Build Coastguard Worker
3591*08b48e0bSAndroid Build Coastguard Worker FATAL("Unable to execute target application");
3592*08b48e0bSAndroid Build Coastguard Worker
3593*08b48e0bSAndroid Build Coastguard Worker }
3594*08b48e0bSAndroid Build Coastguard Worker
3595*08b48e0bSAndroid Build Coastguard Worker if (unlikely(afl->stop_soon)) {
3596*08b48e0bSAndroid Build Coastguard Worker
3597*08b48e0bSAndroid Build Coastguard Worker ++afl->cur_skipped_items;
3598*08b48e0bSAndroid Build Coastguard Worker goto abandon_entry;
3599*08b48e0bSAndroid Build Coastguard Worker
3600*08b48e0bSAndroid Build Coastguard Worker }
3601*08b48e0bSAndroid Build Coastguard Worker
3602*08b48e0bSAndroid Build Coastguard Worker /* Don't retry trimming, even if it failed. */
3603*08b48e0bSAndroid Build Coastguard Worker
3604*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->trim_done = 1;
3605*08b48e0bSAndroid Build Coastguard Worker
3606*08b48e0bSAndroid Build Coastguard Worker len = afl->queue_cur->len;
3607*08b48e0bSAndroid Build Coastguard Worker
3608*08b48e0bSAndroid Build Coastguard Worker /* maybe current entry is not ready for splicing anymore */
3609*08b48e0bSAndroid Build Coastguard Worker if (unlikely(len <= 4 && old_len > 4)) --afl->ready_for_splicing_count;
3610*08b48e0bSAndroid Build Coastguard Worker
3611*08b48e0bSAndroid Build Coastguard Worker }
3612*08b48e0bSAndroid Build Coastguard Worker
3613*08b48e0bSAndroid Build Coastguard Worker memcpy(out_buf, in_buf, len);
3614*08b48e0bSAndroid Build Coastguard Worker
3615*08b48e0bSAndroid Build Coastguard Worker /*********************
3616*08b48e0bSAndroid Build Coastguard Worker * PERFORMANCE SCORE *
3617*08b48e0bSAndroid Build Coastguard Worker *********************/
3618*08b48e0bSAndroid Build Coastguard Worker
3619*08b48e0bSAndroid Build Coastguard Worker if (likely(!afl->old_seed_selection))
3620*08b48e0bSAndroid Build Coastguard Worker orig_perf = perf_score = afl->queue_cur->perf_score;
3621*08b48e0bSAndroid Build Coastguard Worker else
3622*08b48e0bSAndroid Build Coastguard Worker orig_perf = perf_score = calculate_score(afl, afl->queue_cur);
3623*08b48e0bSAndroid Build Coastguard Worker
3624*08b48e0bSAndroid Build Coastguard Worker if (unlikely(perf_score <= 0 && afl->active_items > 1)) {
3625*08b48e0bSAndroid Build Coastguard Worker
3626*08b48e0bSAndroid Build Coastguard Worker goto abandon_entry;
3627*08b48e0bSAndroid Build Coastguard Worker
3628*08b48e0bSAndroid Build Coastguard Worker }
3629*08b48e0bSAndroid Build Coastguard Worker
3630*08b48e0bSAndroid Build Coastguard Worker if (unlikely(afl->shm.cmplog_mode &&
3631*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->colorized < afl->cmplog_lvl &&
3632*08b48e0bSAndroid Build Coastguard Worker (u32)len <= afl->cmplog_max_filesize)) {
3633*08b48e0bSAndroid Build Coastguard Worker
3634*08b48e0bSAndroid Build Coastguard Worker if (unlikely(len < 4)) {
3635*08b48e0bSAndroid Build Coastguard Worker
3636*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->colorized = CMPLOG_LVL_MAX;
3637*08b48e0bSAndroid Build Coastguard Worker
3638*08b48e0bSAndroid Build Coastguard Worker } else {
3639*08b48e0bSAndroid Build Coastguard Worker
3640*08b48e0bSAndroid Build Coastguard Worker if (afl->cmplog_lvl == 3 ||
3641*08b48e0bSAndroid Build Coastguard Worker (afl->cmplog_lvl == 2 && afl->queue_cur->tc_ref) ||
3642*08b48e0bSAndroid Build Coastguard Worker !(afl->fsrv.total_execs % afl->queued_items) ||
3643*08b48e0bSAndroid Build Coastguard Worker get_cur_time() - afl->last_find_time > 300000) { // 300 seconds
3644*08b48e0bSAndroid Build Coastguard Worker
3645*08b48e0bSAndroid Build Coastguard Worker if (input_to_state_stage(afl, in_buf, out_buf, len)) {
3646*08b48e0bSAndroid Build Coastguard Worker
3647*08b48e0bSAndroid Build Coastguard Worker goto abandon_entry;
3648*08b48e0bSAndroid Build Coastguard Worker
3649*08b48e0bSAndroid Build Coastguard Worker }
3650*08b48e0bSAndroid Build Coastguard Worker
3651*08b48e0bSAndroid Build Coastguard Worker }
3652*08b48e0bSAndroid Build Coastguard Worker
3653*08b48e0bSAndroid Build Coastguard Worker }
3654*08b48e0bSAndroid Build Coastguard Worker
3655*08b48e0bSAndroid Build Coastguard Worker }
3656*08b48e0bSAndroid Build Coastguard Worker
3657*08b48e0bSAndroid Build Coastguard Worker /* Go to pacemker fuzzing if MOpt is doing well */
3658*08b48e0bSAndroid Build Coastguard Worker
3659*08b48e0bSAndroid Build Coastguard Worker cur_ms_lv = get_cur_time();
3660*08b48e0bSAndroid Build Coastguard Worker if (!(afl->key_puppet == 0 &&
3661*08b48e0bSAndroid Build Coastguard Worker ((cur_ms_lv - afl->last_find_time < (u32)afl->limit_time_puppet) ||
3662*08b48e0bSAndroid Build Coastguard Worker (afl->last_crash_time != 0 &&
3663*08b48e0bSAndroid Build Coastguard Worker cur_ms_lv - afl->last_crash_time < (u32)afl->limit_time_puppet) ||
3664*08b48e0bSAndroid Build Coastguard Worker afl->last_find_time == 0))) {
3665*08b48e0bSAndroid Build Coastguard Worker
3666*08b48e0bSAndroid Build Coastguard Worker afl->key_puppet = 1;
3667*08b48e0bSAndroid Build Coastguard Worker goto pacemaker_fuzzing;
3668*08b48e0bSAndroid Build Coastguard Worker
3669*08b48e0bSAndroid Build Coastguard Worker }
3670*08b48e0bSAndroid Build Coastguard Worker
3671*08b48e0bSAndroid Build Coastguard Worker /* Skip right away if -d is given, if we have done deterministic fuzzing on
3672*08b48e0bSAndroid Build Coastguard Worker this entry ourselves (was_fuzzed), or if it has gone through deterministic
3673*08b48e0bSAndroid Build Coastguard Worker testing in earlier, resumed runs (passed_det). */
3674*08b48e0bSAndroid Build Coastguard Worker
3675*08b48e0bSAndroid Build Coastguard Worker if (likely(afl->skip_deterministic || afl->queue_cur->was_fuzzed ||
3676*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->passed_det)) {
3677*08b48e0bSAndroid Build Coastguard Worker
3678*08b48e0bSAndroid Build Coastguard Worker goto havoc_stage;
3679*08b48e0bSAndroid Build Coastguard Worker
3680*08b48e0bSAndroid Build Coastguard Worker }
3681*08b48e0bSAndroid Build Coastguard Worker
3682*08b48e0bSAndroid Build Coastguard Worker /* Skip deterministic fuzzing if exec path checksum puts this out of scope
3683*08b48e0bSAndroid Build Coastguard Worker for this main instance. */
3684*08b48e0bSAndroid Build Coastguard Worker
3685*08b48e0bSAndroid Build Coastguard Worker if (unlikely(afl->main_node_max &&
3686*08b48e0bSAndroid Build Coastguard Worker (afl->queue_cur->exec_cksum % afl->main_node_max) !=
3687*08b48e0bSAndroid Build Coastguard Worker afl->main_node_id - 1)) {
3688*08b48e0bSAndroid Build Coastguard Worker
3689*08b48e0bSAndroid Build Coastguard Worker goto havoc_stage;
3690*08b48e0bSAndroid Build Coastguard Worker
3691*08b48e0bSAndroid Build Coastguard Worker }
3692*08b48e0bSAndroid Build Coastguard Worker
3693*08b48e0bSAndroid Build Coastguard Worker doing_det = 1;
3694*08b48e0bSAndroid Build Coastguard Worker
3695*08b48e0bSAndroid Build Coastguard Worker /*********************************************
3696*08b48e0bSAndroid Build Coastguard Worker * SIMPLE BITFLIP (+dictionary construction) *
3697*08b48e0bSAndroid Build Coastguard Worker *********************************************/
3698*08b48e0bSAndroid Build Coastguard Worker
3699*08b48e0bSAndroid Build Coastguard Worker #define FLIP_BIT(_ar, _b) \
3700*08b48e0bSAndroid Build Coastguard Worker do { \
3701*08b48e0bSAndroid Build Coastguard Worker \
3702*08b48e0bSAndroid Build Coastguard Worker u8 *_arf = (u8 *)(_ar); \
3703*08b48e0bSAndroid Build Coastguard Worker u32 _bf = (_b); \
3704*08b48e0bSAndroid Build Coastguard Worker _arf[(_bf) >> 3] ^= (128 >> ((_bf) & 7)); \
3705*08b48e0bSAndroid Build Coastguard Worker \
3706*08b48e0bSAndroid Build Coastguard Worker } while (0)
3707*08b48e0bSAndroid Build Coastguard Worker
3708*08b48e0bSAndroid Build Coastguard Worker /* Single walking bit. */
3709*08b48e0bSAndroid Build Coastguard Worker
3710*08b48e0bSAndroid Build Coastguard Worker afl->stage_short = "flip1";
3711*08b48e0bSAndroid Build Coastguard Worker afl->stage_max = len << 3;
3712*08b48e0bSAndroid Build Coastguard Worker afl->stage_name = "bitflip 1/1";
3713*08b48e0bSAndroid Build Coastguard Worker
3714*08b48e0bSAndroid Build Coastguard Worker afl->stage_val_type = STAGE_VAL_NONE;
3715*08b48e0bSAndroid Build Coastguard Worker
3716*08b48e0bSAndroid Build Coastguard Worker orig_hit_cnt = afl->queued_items + afl->saved_crashes;
3717*08b48e0bSAndroid Build Coastguard Worker
3718*08b48e0bSAndroid Build Coastguard Worker /* Get a clean cksum. */
3719*08b48e0bSAndroid Build Coastguard Worker
3720*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, out_buf, len)) { goto abandon_entry; }
3721*08b48e0bSAndroid Build Coastguard Worker
3722*08b48e0bSAndroid Build Coastguard Worker prev_cksum = hash64(afl->fsrv.trace_bits, afl->fsrv.map_size, HASH_CONST);
3723*08b48e0bSAndroid Build Coastguard Worker _prev_cksum = prev_cksum;
3724*08b48e0bSAndroid Build Coastguard Worker
3725*08b48e0bSAndroid Build Coastguard Worker /* Now flip bits. */
3726*08b48e0bSAndroid Build Coastguard Worker
3727*08b48e0bSAndroid Build Coastguard Worker for (afl->stage_cur = 0; afl->stage_cur < afl->stage_max; ++afl->stage_cur) {
3728*08b48e0bSAndroid Build Coastguard Worker
3729*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_byte = afl->stage_cur >> 3;
3730*08b48e0bSAndroid Build Coastguard Worker
3731*08b48e0bSAndroid Build Coastguard Worker FLIP_BIT(out_buf, afl->stage_cur);
3732*08b48e0bSAndroid Build Coastguard Worker
3733*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
3734*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->mutation, sizeof(afl->mutation), "%s MOPT_FLIP_BIT1-%u",
3735*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->fname, afl->stage_cur);
3736*08b48e0bSAndroid Build Coastguard Worker #endif
3737*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, out_buf, len)) { goto abandon_entry; }
3738*08b48e0bSAndroid Build Coastguard Worker
3739*08b48e0bSAndroid Build Coastguard Worker FLIP_BIT(out_buf, afl->stage_cur);
3740*08b48e0bSAndroid Build Coastguard Worker
3741*08b48e0bSAndroid Build Coastguard Worker /* While flipping the least significant bit in every byte, pull of an extra
3742*08b48e0bSAndroid Build Coastguard Worker trick to detect possible syntax tokens. In essence, the idea is that if
3743*08b48e0bSAndroid Build Coastguard Worker you have a binary blob like this:
3744*08b48e0bSAndroid Build Coastguard Worker
3745*08b48e0bSAndroid Build Coastguard Worker xxxxxxxxIHDRxxxxxxxx
3746*08b48e0bSAndroid Build Coastguard Worker
3747*08b48e0bSAndroid Build Coastguard Worker ...and changing the leading and trailing bytes causes variable or no
3748*08b48e0bSAndroid Build Coastguard Worker changes in program flow, but touching any character in the "IHDR" string
3749*08b48e0bSAndroid Build Coastguard Worker always produces the same, distinctive path, it's highly likely that
3750*08b48e0bSAndroid Build Coastguard Worker "IHDR" is an atomically-checked magic value of special significance to
3751*08b48e0bSAndroid Build Coastguard Worker the fuzzed format.
3752*08b48e0bSAndroid Build Coastguard Worker
3753*08b48e0bSAndroid Build Coastguard Worker We do this here, rather than as a separate stage, because it's a nice
3754*08b48e0bSAndroid Build Coastguard Worker way to keep the operation approximately "free" (i.e., no extra execs).
3755*08b48e0bSAndroid Build Coastguard Worker
3756*08b48e0bSAndroid Build Coastguard Worker Empirically, performing the check when flipping the least significant bit
3757*08b48e0bSAndroid Build Coastguard Worker is advantageous, compared to doing it at the time of more disruptive
3758*08b48e0bSAndroid Build Coastguard Worker changes, where the program flow may be affected in more violent ways.
3759*08b48e0bSAndroid Build Coastguard Worker
3760*08b48e0bSAndroid Build Coastguard Worker The caveat is that we won't generate dictionaries in the -d mode or -S
3761*08b48e0bSAndroid Build Coastguard Worker mode - but that's probably a fair trade-off.
3762*08b48e0bSAndroid Build Coastguard Worker
3763*08b48e0bSAndroid Build Coastguard Worker This won't work particularly well with paths that exhibit variable
3764*08b48e0bSAndroid Build Coastguard Worker behavior, but fails gracefully, so we'll carry out the checks anyway.
3765*08b48e0bSAndroid Build Coastguard Worker
3766*08b48e0bSAndroid Build Coastguard Worker */
3767*08b48e0bSAndroid Build Coastguard Worker
3768*08b48e0bSAndroid Build Coastguard Worker if (!afl->non_instrumented_mode && (afl->stage_cur & 7) == 7) {
3769*08b48e0bSAndroid Build Coastguard Worker
3770*08b48e0bSAndroid Build Coastguard Worker u64 cksum = hash64(afl->fsrv.trace_bits, afl->fsrv.map_size, HASH_CONST);
3771*08b48e0bSAndroid Build Coastguard Worker
3772*08b48e0bSAndroid Build Coastguard Worker if (afl->stage_cur == afl->stage_max - 1 && cksum == prev_cksum) {
3773*08b48e0bSAndroid Build Coastguard Worker
3774*08b48e0bSAndroid Build Coastguard Worker /* If at end of file and we are still collecting a string, grab the
3775*08b48e0bSAndroid Build Coastguard Worker final character and force output. */
3776*08b48e0bSAndroid Build Coastguard Worker
3777*08b48e0bSAndroid Build Coastguard Worker if (a_len < MAX_AUTO_EXTRA) {
3778*08b48e0bSAndroid Build Coastguard Worker
3779*08b48e0bSAndroid Build Coastguard Worker a_collect[a_len] = out_buf[afl->stage_cur >> 3];
3780*08b48e0bSAndroid Build Coastguard Worker
3781*08b48e0bSAndroid Build Coastguard Worker }
3782*08b48e0bSAndroid Build Coastguard Worker
3783*08b48e0bSAndroid Build Coastguard Worker ++a_len;
3784*08b48e0bSAndroid Build Coastguard Worker
3785*08b48e0bSAndroid Build Coastguard Worker if (a_len >= MIN_AUTO_EXTRA && a_len <= MAX_AUTO_EXTRA) {
3786*08b48e0bSAndroid Build Coastguard Worker
3787*08b48e0bSAndroid Build Coastguard Worker maybe_add_auto(afl, a_collect, a_len);
3788*08b48e0bSAndroid Build Coastguard Worker
3789*08b48e0bSAndroid Build Coastguard Worker }
3790*08b48e0bSAndroid Build Coastguard Worker
3791*08b48e0bSAndroid Build Coastguard Worker } else if (cksum != prev_cksum) {
3792*08b48e0bSAndroid Build Coastguard Worker
3793*08b48e0bSAndroid Build Coastguard Worker /* Otherwise, if the checksum has changed, see if we have something
3794*08b48e0bSAndroid Build Coastguard Worker worthwhile queued up, and collect that if the answer is yes. */
3795*08b48e0bSAndroid Build Coastguard Worker
3796*08b48e0bSAndroid Build Coastguard Worker if (a_len >= MIN_AUTO_EXTRA && a_len <= MAX_AUTO_EXTRA) {
3797*08b48e0bSAndroid Build Coastguard Worker
3798*08b48e0bSAndroid Build Coastguard Worker maybe_add_auto(afl, a_collect, a_len);
3799*08b48e0bSAndroid Build Coastguard Worker
3800*08b48e0bSAndroid Build Coastguard Worker }
3801*08b48e0bSAndroid Build Coastguard Worker
3802*08b48e0bSAndroid Build Coastguard Worker a_len = 0;
3803*08b48e0bSAndroid Build Coastguard Worker prev_cksum = cksum;
3804*08b48e0bSAndroid Build Coastguard Worker
3805*08b48e0bSAndroid Build Coastguard Worker }
3806*08b48e0bSAndroid Build Coastguard Worker
3807*08b48e0bSAndroid Build Coastguard Worker /* Continue collecting string, but only if the bit flip actually made
3808*08b48e0bSAndroid Build Coastguard Worker any difference - we don't want no-op tokens. */
3809*08b48e0bSAndroid Build Coastguard Worker
3810*08b48e0bSAndroid Build Coastguard Worker if (cksum != _prev_cksum) {
3811*08b48e0bSAndroid Build Coastguard Worker
3812*08b48e0bSAndroid Build Coastguard Worker if (a_len < MAX_AUTO_EXTRA) {
3813*08b48e0bSAndroid Build Coastguard Worker
3814*08b48e0bSAndroid Build Coastguard Worker a_collect[a_len] = out_buf[afl->stage_cur >> 3];
3815*08b48e0bSAndroid Build Coastguard Worker
3816*08b48e0bSAndroid Build Coastguard Worker }
3817*08b48e0bSAndroid Build Coastguard Worker
3818*08b48e0bSAndroid Build Coastguard Worker ++a_len;
3819*08b48e0bSAndroid Build Coastguard Worker
3820*08b48e0bSAndroid Build Coastguard Worker }
3821*08b48e0bSAndroid Build Coastguard Worker
3822*08b48e0bSAndroid Build Coastguard Worker } /* if (afl->stage_cur & 7) == 7 */
3823*08b48e0bSAndroid Build Coastguard Worker
3824*08b48e0bSAndroid Build Coastguard Worker } /* for afl->stage_cur */
3825*08b48e0bSAndroid Build Coastguard Worker
3826*08b48e0bSAndroid Build Coastguard Worker new_hit_cnt = afl->queued_items + afl->saved_crashes;
3827*08b48e0bSAndroid Build Coastguard Worker
3828*08b48e0bSAndroid Build Coastguard Worker afl->stage_finds[STAGE_FLIP1] += new_hit_cnt - orig_hit_cnt;
3829*08b48e0bSAndroid Build Coastguard Worker afl->stage_cycles[STAGE_FLIP1] += afl->stage_max;
3830*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
3831*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->stats_mutated += afl->stage_max;
3832*08b48e0bSAndroid Build Coastguard Worker #endif
3833*08b48e0bSAndroid Build Coastguard Worker
3834*08b48e0bSAndroid Build Coastguard Worker /* Two walking bits. */
3835*08b48e0bSAndroid Build Coastguard Worker
3836*08b48e0bSAndroid Build Coastguard Worker afl->stage_name = "bitflip 2/1";
3837*08b48e0bSAndroid Build Coastguard Worker afl->stage_short = "flip2";
3838*08b48e0bSAndroid Build Coastguard Worker afl->stage_max = (len << 3) - 1;
3839*08b48e0bSAndroid Build Coastguard Worker
3840*08b48e0bSAndroid Build Coastguard Worker orig_hit_cnt = new_hit_cnt;
3841*08b48e0bSAndroid Build Coastguard Worker
3842*08b48e0bSAndroid Build Coastguard Worker for (afl->stage_cur = 0; afl->stage_cur < afl->stage_max; ++afl->stage_cur) {
3843*08b48e0bSAndroid Build Coastguard Worker
3844*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_byte = afl->stage_cur >> 3;
3845*08b48e0bSAndroid Build Coastguard Worker
3846*08b48e0bSAndroid Build Coastguard Worker FLIP_BIT(out_buf, afl->stage_cur);
3847*08b48e0bSAndroid Build Coastguard Worker FLIP_BIT(out_buf, afl->stage_cur + 1);
3848*08b48e0bSAndroid Build Coastguard Worker
3849*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
3850*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->mutation, sizeof(afl->mutation), "%s MOPT_FLIP_BIT2-%u",
3851*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->fname, afl->stage_cur);
3852*08b48e0bSAndroid Build Coastguard Worker #endif
3853*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, out_buf, len)) { goto abandon_entry; }
3854*08b48e0bSAndroid Build Coastguard Worker
3855*08b48e0bSAndroid Build Coastguard Worker FLIP_BIT(out_buf, afl->stage_cur);
3856*08b48e0bSAndroid Build Coastguard Worker FLIP_BIT(out_buf, afl->stage_cur + 1);
3857*08b48e0bSAndroid Build Coastguard Worker
3858*08b48e0bSAndroid Build Coastguard Worker } /* for afl->stage_cur */
3859*08b48e0bSAndroid Build Coastguard Worker
3860*08b48e0bSAndroid Build Coastguard Worker new_hit_cnt = afl->queued_items + afl->saved_crashes;
3861*08b48e0bSAndroid Build Coastguard Worker
3862*08b48e0bSAndroid Build Coastguard Worker afl->stage_finds[STAGE_FLIP2] += new_hit_cnt - orig_hit_cnt;
3863*08b48e0bSAndroid Build Coastguard Worker afl->stage_cycles[STAGE_FLIP2] += afl->stage_max;
3864*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
3865*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->stats_mutated += afl->stage_max;
3866*08b48e0bSAndroid Build Coastguard Worker #endif
3867*08b48e0bSAndroid Build Coastguard Worker
3868*08b48e0bSAndroid Build Coastguard Worker /* Four walking bits. */
3869*08b48e0bSAndroid Build Coastguard Worker
3870*08b48e0bSAndroid Build Coastguard Worker afl->stage_name = "bitflip 4/1";
3871*08b48e0bSAndroid Build Coastguard Worker afl->stage_short = "flip4";
3872*08b48e0bSAndroid Build Coastguard Worker afl->stage_max = (len << 3) - 3;
3873*08b48e0bSAndroid Build Coastguard Worker
3874*08b48e0bSAndroid Build Coastguard Worker orig_hit_cnt = new_hit_cnt;
3875*08b48e0bSAndroid Build Coastguard Worker
3876*08b48e0bSAndroid Build Coastguard Worker for (afl->stage_cur = 0; afl->stage_cur < afl->stage_max; ++afl->stage_cur) {
3877*08b48e0bSAndroid Build Coastguard Worker
3878*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_byte = afl->stage_cur >> 3;
3879*08b48e0bSAndroid Build Coastguard Worker
3880*08b48e0bSAndroid Build Coastguard Worker FLIP_BIT(out_buf, afl->stage_cur);
3881*08b48e0bSAndroid Build Coastguard Worker FLIP_BIT(out_buf, afl->stage_cur + 1);
3882*08b48e0bSAndroid Build Coastguard Worker FLIP_BIT(out_buf, afl->stage_cur + 2);
3883*08b48e0bSAndroid Build Coastguard Worker FLIP_BIT(out_buf, afl->stage_cur + 3);
3884*08b48e0bSAndroid Build Coastguard Worker
3885*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
3886*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->mutation, sizeof(afl->mutation), "%s MOPT_FLIP_BIT4-%u",
3887*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->fname, afl->stage_cur);
3888*08b48e0bSAndroid Build Coastguard Worker #endif
3889*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, out_buf, len)) { goto abandon_entry; }
3890*08b48e0bSAndroid Build Coastguard Worker
3891*08b48e0bSAndroid Build Coastguard Worker FLIP_BIT(out_buf, afl->stage_cur);
3892*08b48e0bSAndroid Build Coastguard Worker FLIP_BIT(out_buf, afl->stage_cur + 1);
3893*08b48e0bSAndroid Build Coastguard Worker FLIP_BIT(out_buf, afl->stage_cur + 2);
3894*08b48e0bSAndroid Build Coastguard Worker FLIP_BIT(out_buf, afl->stage_cur + 3);
3895*08b48e0bSAndroid Build Coastguard Worker
3896*08b48e0bSAndroid Build Coastguard Worker } /* for afl->stage_cur */
3897*08b48e0bSAndroid Build Coastguard Worker
3898*08b48e0bSAndroid Build Coastguard Worker new_hit_cnt = afl->queued_items + afl->saved_crashes;
3899*08b48e0bSAndroid Build Coastguard Worker
3900*08b48e0bSAndroid Build Coastguard Worker afl->stage_finds[STAGE_FLIP4] += new_hit_cnt - orig_hit_cnt;
3901*08b48e0bSAndroid Build Coastguard Worker afl->stage_cycles[STAGE_FLIP4] += afl->stage_max;
3902*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
3903*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->stats_mutated += afl->stage_max;
3904*08b48e0bSAndroid Build Coastguard Worker #endif
3905*08b48e0bSAndroid Build Coastguard Worker
3906*08b48e0bSAndroid Build Coastguard Worker /* Effector map setup. These macros calculate:
3907*08b48e0bSAndroid Build Coastguard Worker
3908*08b48e0bSAndroid Build Coastguard Worker EFF_APOS - position of a particular file offset in the map.
3909*08b48e0bSAndroid Build Coastguard Worker EFF_ALEN - length of a map with a particular number of bytes.
3910*08b48e0bSAndroid Build Coastguard Worker EFF_SPAN_ALEN - map span for a sequence of bytes.
3911*08b48e0bSAndroid Build Coastguard Worker
3912*08b48e0bSAndroid Build Coastguard Worker */
3913*08b48e0bSAndroid Build Coastguard Worker
3914*08b48e0bSAndroid Build Coastguard Worker #define EFF_APOS(_p) ((_p) >> EFF_MAP_SCALE2)
3915*08b48e0bSAndroid Build Coastguard Worker #define EFF_REM(_x) ((_x) & ((1 << EFF_MAP_SCALE2) - 1))
3916*08b48e0bSAndroid Build Coastguard Worker #define EFF_ALEN(_l) (EFF_APOS(_l) + !!EFF_REM(_l))
3917*08b48e0bSAndroid Build Coastguard Worker #define EFF_SPAN_ALEN(_p, _l) (EFF_APOS((_p) + (_l)-1) - EFF_APOS(_p) + 1)
3918*08b48e0bSAndroid Build Coastguard Worker
3919*08b48e0bSAndroid Build Coastguard Worker /* Initialize effector map for the next step (see comments below). Always
3920*08b48e0bSAndroid Build Coastguard Worker flag first and last byte as doing something. */
3921*08b48e0bSAndroid Build Coastguard Worker
3922*08b48e0bSAndroid Build Coastguard Worker eff_map = afl_realloc(AFL_BUF_PARAM(eff), EFF_ALEN(len));
3923*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!eff_map)) { PFATAL("alloc"); }
3924*08b48e0bSAndroid Build Coastguard Worker memset(eff_map, 0, EFF_ALEN(len));
3925*08b48e0bSAndroid Build Coastguard Worker eff_map[0] = 1;
3926*08b48e0bSAndroid Build Coastguard Worker
3927*08b48e0bSAndroid Build Coastguard Worker if (EFF_APOS(len - 1) != 0) {
3928*08b48e0bSAndroid Build Coastguard Worker
3929*08b48e0bSAndroid Build Coastguard Worker eff_map[EFF_APOS(len - 1)] = 1;
3930*08b48e0bSAndroid Build Coastguard Worker ++eff_cnt;
3931*08b48e0bSAndroid Build Coastguard Worker
3932*08b48e0bSAndroid Build Coastguard Worker }
3933*08b48e0bSAndroid Build Coastguard Worker
3934*08b48e0bSAndroid Build Coastguard Worker /* Walking byte. */
3935*08b48e0bSAndroid Build Coastguard Worker
3936*08b48e0bSAndroid Build Coastguard Worker afl->stage_name = "bitflip 8/8";
3937*08b48e0bSAndroid Build Coastguard Worker afl->stage_short = "flip8";
3938*08b48e0bSAndroid Build Coastguard Worker afl->stage_max = len;
3939*08b48e0bSAndroid Build Coastguard Worker
3940*08b48e0bSAndroid Build Coastguard Worker orig_hit_cnt = new_hit_cnt;
3941*08b48e0bSAndroid Build Coastguard Worker prev_cksum = _prev_cksum;
3942*08b48e0bSAndroid Build Coastguard Worker
3943*08b48e0bSAndroid Build Coastguard Worker for (afl->stage_cur = 0; afl->stage_cur < afl->stage_max; ++afl->stage_cur) {
3944*08b48e0bSAndroid Build Coastguard Worker
3945*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_byte = afl->stage_cur;
3946*08b48e0bSAndroid Build Coastguard Worker
3947*08b48e0bSAndroid Build Coastguard Worker out_buf[afl->stage_cur] ^= 0xFF;
3948*08b48e0bSAndroid Build Coastguard Worker
3949*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
3950*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->mutation, sizeof(afl->mutation), "%s MOPT_FLIP_BIT8-%u",
3951*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->fname, afl->stage_cur);
3952*08b48e0bSAndroid Build Coastguard Worker #endif
3953*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, out_buf, len)) { goto abandon_entry; }
3954*08b48e0bSAndroid Build Coastguard Worker
3955*08b48e0bSAndroid Build Coastguard Worker /* We also use this stage to pull off a simple trick: we identify
3956*08b48e0bSAndroid Build Coastguard Worker bytes that seem to have no effect on the current execution path
3957*08b48e0bSAndroid Build Coastguard Worker even when fully flipped - and we skip them during more expensive
3958*08b48e0bSAndroid Build Coastguard Worker deterministic stages, such as arithmetics or known ints. */
3959*08b48e0bSAndroid Build Coastguard Worker
3960*08b48e0bSAndroid Build Coastguard Worker if (!eff_map[EFF_APOS(afl->stage_cur)]) {
3961*08b48e0bSAndroid Build Coastguard Worker
3962*08b48e0bSAndroid Build Coastguard Worker u64 cksum;
3963*08b48e0bSAndroid Build Coastguard Worker
3964*08b48e0bSAndroid Build Coastguard Worker /* If in non-instrumented mode or if the file is very short, just flag
3965*08b48e0bSAndroid Build Coastguard Worker everything without wasting time on checksums. */
3966*08b48e0bSAndroid Build Coastguard Worker
3967*08b48e0bSAndroid Build Coastguard Worker if (!afl->non_instrumented_mode && len >= EFF_MIN_LEN) {
3968*08b48e0bSAndroid Build Coastguard Worker
3969*08b48e0bSAndroid Build Coastguard Worker cksum = hash64(afl->fsrv.trace_bits, afl->fsrv.map_size, HASH_CONST);
3970*08b48e0bSAndroid Build Coastguard Worker
3971*08b48e0bSAndroid Build Coastguard Worker } else {
3972*08b48e0bSAndroid Build Coastguard Worker
3973*08b48e0bSAndroid Build Coastguard Worker cksum = ~prev_cksum;
3974*08b48e0bSAndroid Build Coastguard Worker
3975*08b48e0bSAndroid Build Coastguard Worker }
3976*08b48e0bSAndroid Build Coastguard Worker
3977*08b48e0bSAndroid Build Coastguard Worker if (cksum != prev_cksum) {
3978*08b48e0bSAndroid Build Coastguard Worker
3979*08b48e0bSAndroid Build Coastguard Worker eff_map[EFF_APOS(afl->stage_cur)] = 1;
3980*08b48e0bSAndroid Build Coastguard Worker ++eff_cnt;
3981*08b48e0bSAndroid Build Coastguard Worker
3982*08b48e0bSAndroid Build Coastguard Worker }
3983*08b48e0bSAndroid Build Coastguard Worker
3984*08b48e0bSAndroid Build Coastguard Worker }
3985*08b48e0bSAndroid Build Coastguard Worker
3986*08b48e0bSAndroid Build Coastguard Worker out_buf[afl->stage_cur] ^= 0xFF;
3987*08b48e0bSAndroid Build Coastguard Worker
3988*08b48e0bSAndroid Build Coastguard Worker } /* for afl->stage_cur */
3989*08b48e0bSAndroid Build Coastguard Worker
3990*08b48e0bSAndroid Build Coastguard Worker /* If the effector map is more than EFF_MAX_PERC dense, just flag the
3991*08b48e0bSAndroid Build Coastguard Worker whole thing as worth fuzzing, since we wouldn't be saving much time
3992*08b48e0bSAndroid Build Coastguard Worker anyway. */
3993*08b48e0bSAndroid Build Coastguard Worker
3994*08b48e0bSAndroid Build Coastguard Worker if (eff_cnt != (u32)EFF_ALEN(len) &&
3995*08b48e0bSAndroid Build Coastguard Worker eff_cnt * 100 / EFF_ALEN(len) > EFF_MAX_PERC) {
3996*08b48e0bSAndroid Build Coastguard Worker
3997*08b48e0bSAndroid Build Coastguard Worker memset(eff_map, 1, EFF_ALEN(len));
3998*08b48e0bSAndroid Build Coastguard Worker
3999*08b48e0bSAndroid Build Coastguard Worker afl->blocks_eff_select += EFF_ALEN(len);
4000*08b48e0bSAndroid Build Coastguard Worker
4001*08b48e0bSAndroid Build Coastguard Worker } else {
4002*08b48e0bSAndroid Build Coastguard Worker
4003*08b48e0bSAndroid Build Coastguard Worker afl->blocks_eff_select += eff_cnt;
4004*08b48e0bSAndroid Build Coastguard Worker
4005*08b48e0bSAndroid Build Coastguard Worker }
4006*08b48e0bSAndroid Build Coastguard Worker
4007*08b48e0bSAndroid Build Coastguard Worker afl->blocks_eff_total += EFF_ALEN(len);
4008*08b48e0bSAndroid Build Coastguard Worker
4009*08b48e0bSAndroid Build Coastguard Worker new_hit_cnt = afl->queued_items + afl->saved_crashes;
4010*08b48e0bSAndroid Build Coastguard Worker
4011*08b48e0bSAndroid Build Coastguard Worker afl->stage_finds[STAGE_FLIP8] += new_hit_cnt - orig_hit_cnt;
4012*08b48e0bSAndroid Build Coastguard Worker afl->stage_cycles[STAGE_FLIP8] += afl->stage_max;
4013*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
4014*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->stats_mutated += afl->stage_max;
4015*08b48e0bSAndroid Build Coastguard Worker #endif
4016*08b48e0bSAndroid Build Coastguard Worker
4017*08b48e0bSAndroid Build Coastguard Worker /* Two walking bytes. */
4018*08b48e0bSAndroid Build Coastguard Worker
4019*08b48e0bSAndroid Build Coastguard Worker if (len < 2) { goto skip_bitflip; }
4020*08b48e0bSAndroid Build Coastguard Worker
4021*08b48e0bSAndroid Build Coastguard Worker afl->stage_name = "bitflip 16/8";
4022*08b48e0bSAndroid Build Coastguard Worker afl->stage_short = "flip16";
4023*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur = 0;
4024*08b48e0bSAndroid Build Coastguard Worker afl->stage_max = len - 1;
4025*08b48e0bSAndroid Build Coastguard Worker
4026*08b48e0bSAndroid Build Coastguard Worker orig_hit_cnt = new_hit_cnt;
4027*08b48e0bSAndroid Build Coastguard Worker
4028*08b48e0bSAndroid Build Coastguard Worker for (i = 0; i < len - 1; ++i) {
4029*08b48e0bSAndroid Build Coastguard Worker
4030*08b48e0bSAndroid Build Coastguard Worker /* Let's consult the effector map... */
4031*08b48e0bSAndroid Build Coastguard Worker
4032*08b48e0bSAndroid Build Coastguard Worker if (!eff_map[EFF_APOS(i)] && !eff_map[EFF_APOS(i + 1)]) {
4033*08b48e0bSAndroid Build Coastguard Worker
4034*08b48e0bSAndroid Build Coastguard Worker --afl->stage_max;
4035*08b48e0bSAndroid Build Coastguard Worker continue;
4036*08b48e0bSAndroid Build Coastguard Worker
4037*08b48e0bSAndroid Build Coastguard Worker }
4038*08b48e0bSAndroid Build Coastguard Worker
4039*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_byte = i;
4040*08b48e0bSAndroid Build Coastguard Worker
4041*08b48e0bSAndroid Build Coastguard Worker *(u16 *)(out_buf + i) ^= 0xFFFF;
4042*08b48e0bSAndroid Build Coastguard Worker
4043*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
4044*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->mutation, sizeof(afl->mutation), "%s MOPT_FLIP_BIT16-%u",
4045*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->fname, afl->stage_cur);
4046*08b48e0bSAndroid Build Coastguard Worker #endif
4047*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, out_buf, len)) { goto abandon_entry; }
4048*08b48e0bSAndroid Build Coastguard Worker ++afl->stage_cur;
4049*08b48e0bSAndroid Build Coastguard Worker
4050*08b48e0bSAndroid Build Coastguard Worker *(u16 *)(out_buf + i) ^= 0xFFFF;
4051*08b48e0bSAndroid Build Coastguard Worker
4052*08b48e0bSAndroid Build Coastguard Worker } /* for i = 0; i < len */
4053*08b48e0bSAndroid Build Coastguard Worker
4054*08b48e0bSAndroid Build Coastguard Worker new_hit_cnt = afl->queued_items + afl->saved_crashes;
4055*08b48e0bSAndroid Build Coastguard Worker
4056*08b48e0bSAndroid Build Coastguard Worker afl->stage_finds[STAGE_FLIP16] += new_hit_cnt - orig_hit_cnt;
4057*08b48e0bSAndroid Build Coastguard Worker afl->stage_cycles[STAGE_FLIP16] += afl->stage_max;
4058*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
4059*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->stats_mutated += afl->stage_max;
4060*08b48e0bSAndroid Build Coastguard Worker #endif
4061*08b48e0bSAndroid Build Coastguard Worker
4062*08b48e0bSAndroid Build Coastguard Worker if (len < 4) { goto skip_bitflip; }
4063*08b48e0bSAndroid Build Coastguard Worker
4064*08b48e0bSAndroid Build Coastguard Worker /* Four walking bytes. */
4065*08b48e0bSAndroid Build Coastguard Worker
4066*08b48e0bSAndroid Build Coastguard Worker afl->stage_name = "bitflip 32/8";
4067*08b48e0bSAndroid Build Coastguard Worker afl->stage_short = "flip32";
4068*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur = 0;
4069*08b48e0bSAndroid Build Coastguard Worker afl->stage_max = len - 3;
4070*08b48e0bSAndroid Build Coastguard Worker
4071*08b48e0bSAndroid Build Coastguard Worker orig_hit_cnt = new_hit_cnt;
4072*08b48e0bSAndroid Build Coastguard Worker
4073*08b48e0bSAndroid Build Coastguard Worker for (i = 0; i < len - 3; ++i) {
4074*08b48e0bSAndroid Build Coastguard Worker
4075*08b48e0bSAndroid Build Coastguard Worker /* Let's consult the effector map... */
4076*08b48e0bSAndroid Build Coastguard Worker if (!eff_map[EFF_APOS(i)] && !eff_map[EFF_APOS(i + 1)] &&
4077*08b48e0bSAndroid Build Coastguard Worker !eff_map[EFF_APOS(i + 2)] && !eff_map[EFF_APOS(i + 3)]) {
4078*08b48e0bSAndroid Build Coastguard Worker
4079*08b48e0bSAndroid Build Coastguard Worker --afl->stage_max;
4080*08b48e0bSAndroid Build Coastguard Worker continue;
4081*08b48e0bSAndroid Build Coastguard Worker
4082*08b48e0bSAndroid Build Coastguard Worker }
4083*08b48e0bSAndroid Build Coastguard Worker
4084*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_byte = i;
4085*08b48e0bSAndroid Build Coastguard Worker
4086*08b48e0bSAndroid Build Coastguard Worker *(u32 *)(out_buf + i) ^= 0xFFFFFFFF;
4087*08b48e0bSAndroid Build Coastguard Worker
4088*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
4089*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->mutation, sizeof(afl->mutation), "%s MOPT_FLIP_BIT32-%u",
4090*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->fname, afl->stage_cur);
4091*08b48e0bSAndroid Build Coastguard Worker #endif
4092*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, out_buf, len)) { goto abandon_entry; }
4093*08b48e0bSAndroid Build Coastguard Worker ++afl->stage_cur;
4094*08b48e0bSAndroid Build Coastguard Worker
4095*08b48e0bSAndroid Build Coastguard Worker *(u32 *)(out_buf + i) ^= 0xFFFFFFFF;
4096*08b48e0bSAndroid Build Coastguard Worker
4097*08b48e0bSAndroid Build Coastguard Worker } /* for i = 0; i < len - 3 */
4098*08b48e0bSAndroid Build Coastguard Worker
4099*08b48e0bSAndroid Build Coastguard Worker new_hit_cnt = afl->queued_items + afl->saved_crashes;
4100*08b48e0bSAndroid Build Coastguard Worker
4101*08b48e0bSAndroid Build Coastguard Worker afl->stage_finds[STAGE_FLIP32] += new_hit_cnt - orig_hit_cnt;
4102*08b48e0bSAndroid Build Coastguard Worker afl->stage_cycles[STAGE_FLIP32] += afl->stage_max;
4103*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
4104*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->stats_mutated += afl->stage_max;
4105*08b48e0bSAndroid Build Coastguard Worker #endif
4106*08b48e0bSAndroid Build Coastguard Worker
4107*08b48e0bSAndroid Build Coastguard Worker skip_bitflip:
4108*08b48e0bSAndroid Build Coastguard Worker
4109*08b48e0bSAndroid Build Coastguard Worker if (afl->no_arith) { goto skip_arith; }
4110*08b48e0bSAndroid Build Coastguard Worker
4111*08b48e0bSAndroid Build Coastguard Worker /**********************
4112*08b48e0bSAndroid Build Coastguard Worker * ARITHMETIC INC/DEC *
4113*08b48e0bSAndroid Build Coastguard Worker **********************/
4114*08b48e0bSAndroid Build Coastguard Worker
4115*08b48e0bSAndroid Build Coastguard Worker /* 8-bit arithmetics. */
4116*08b48e0bSAndroid Build Coastguard Worker
4117*08b48e0bSAndroid Build Coastguard Worker afl->stage_name = "arith 8/8";
4118*08b48e0bSAndroid Build Coastguard Worker afl->stage_short = "arith8";
4119*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur = 0;
4120*08b48e0bSAndroid Build Coastguard Worker afl->stage_max = 2 * len * ARITH_MAX;
4121*08b48e0bSAndroid Build Coastguard Worker
4122*08b48e0bSAndroid Build Coastguard Worker afl->stage_val_type = STAGE_VAL_LE;
4123*08b48e0bSAndroid Build Coastguard Worker
4124*08b48e0bSAndroid Build Coastguard Worker orig_hit_cnt = new_hit_cnt;
4125*08b48e0bSAndroid Build Coastguard Worker
4126*08b48e0bSAndroid Build Coastguard Worker for (i = 0; i < (u32)len; ++i) {
4127*08b48e0bSAndroid Build Coastguard Worker
4128*08b48e0bSAndroid Build Coastguard Worker u8 orig = out_buf[i];
4129*08b48e0bSAndroid Build Coastguard Worker
4130*08b48e0bSAndroid Build Coastguard Worker /* Let's consult the effector map... */
4131*08b48e0bSAndroid Build Coastguard Worker
4132*08b48e0bSAndroid Build Coastguard Worker if (!eff_map[EFF_APOS(i)]) {
4133*08b48e0bSAndroid Build Coastguard Worker
4134*08b48e0bSAndroid Build Coastguard Worker afl->stage_max -= 2 * ARITH_MAX;
4135*08b48e0bSAndroid Build Coastguard Worker continue;
4136*08b48e0bSAndroid Build Coastguard Worker
4137*08b48e0bSAndroid Build Coastguard Worker }
4138*08b48e0bSAndroid Build Coastguard Worker
4139*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_byte = i;
4140*08b48e0bSAndroid Build Coastguard Worker
4141*08b48e0bSAndroid Build Coastguard Worker for (j = 1; j <= ARITH_MAX; ++j) {
4142*08b48e0bSAndroid Build Coastguard Worker
4143*08b48e0bSAndroid Build Coastguard Worker u8 r = orig ^ (orig + j);
4144*08b48e0bSAndroid Build Coastguard Worker
4145*08b48e0bSAndroid Build Coastguard Worker /* Do arithmetic operations only if the result couldn't be a product
4146*08b48e0bSAndroid Build Coastguard Worker of a bitflip. */
4147*08b48e0bSAndroid Build Coastguard Worker
4148*08b48e0bSAndroid Build Coastguard Worker if (!could_be_bitflip(r)) {
4149*08b48e0bSAndroid Build Coastguard Worker
4150*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_val = j;
4151*08b48e0bSAndroid Build Coastguard Worker out_buf[i] = orig + j;
4152*08b48e0bSAndroid Build Coastguard Worker
4153*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
4154*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->mutation, sizeof(afl->mutation), "%s MOPT_ARITH8+-%u-%u",
4155*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->fname, i, j);
4156*08b48e0bSAndroid Build Coastguard Worker #endif
4157*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, out_buf, len)) { goto abandon_entry; }
4158*08b48e0bSAndroid Build Coastguard Worker ++afl->stage_cur;
4159*08b48e0bSAndroid Build Coastguard Worker
4160*08b48e0bSAndroid Build Coastguard Worker } else {
4161*08b48e0bSAndroid Build Coastguard Worker
4162*08b48e0bSAndroid Build Coastguard Worker --afl->stage_max;
4163*08b48e0bSAndroid Build Coastguard Worker
4164*08b48e0bSAndroid Build Coastguard Worker }
4165*08b48e0bSAndroid Build Coastguard Worker
4166*08b48e0bSAndroid Build Coastguard Worker r = orig ^ (orig - j);
4167*08b48e0bSAndroid Build Coastguard Worker
4168*08b48e0bSAndroid Build Coastguard Worker if (!could_be_bitflip(r)) {
4169*08b48e0bSAndroid Build Coastguard Worker
4170*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_val = -j;
4171*08b48e0bSAndroid Build Coastguard Worker out_buf[i] = orig - j;
4172*08b48e0bSAndroid Build Coastguard Worker
4173*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
4174*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->mutation, sizeof(afl->mutation), "%s MOPT_ARITH8_-%u-%u",
4175*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->fname, i, j);
4176*08b48e0bSAndroid Build Coastguard Worker #endif
4177*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, out_buf, len)) { goto abandon_entry; }
4178*08b48e0bSAndroid Build Coastguard Worker ++afl->stage_cur;
4179*08b48e0bSAndroid Build Coastguard Worker
4180*08b48e0bSAndroid Build Coastguard Worker } else {
4181*08b48e0bSAndroid Build Coastguard Worker
4182*08b48e0bSAndroid Build Coastguard Worker --afl->stage_max;
4183*08b48e0bSAndroid Build Coastguard Worker
4184*08b48e0bSAndroid Build Coastguard Worker }
4185*08b48e0bSAndroid Build Coastguard Worker
4186*08b48e0bSAndroid Build Coastguard Worker out_buf[i] = orig;
4187*08b48e0bSAndroid Build Coastguard Worker
4188*08b48e0bSAndroid Build Coastguard Worker }
4189*08b48e0bSAndroid Build Coastguard Worker
4190*08b48e0bSAndroid Build Coastguard Worker } /* for i = 0; i < len */
4191*08b48e0bSAndroid Build Coastguard Worker
4192*08b48e0bSAndroid Build Coastguard Worker new_hit_cnt = afl->queued_items + afl->saved_crashes;
4193*08b48e0bSAndroid Build Coastguard Worker
4194*08b48e0bSAndroid Build Coastguard Worker afl->stage_finds[STAGE_ARITH8] += new_hit_cnt - orig_hit_cnt;
4195*08b48e0bSAndroid Build Coastguard Worker afl->stage_cycles[STAGE_ARITH8] += afl->stage_max;
4196*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
4197*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->stats_mutated += afl->stage_max;
4198*08b48e0bSAndroid Build Coastguard Worker #endif
4199*08b48e0bSAndroid Build Coastguard Worker
4200*08b48e0bSAndroid Build Coastguard Worker /* 16-bit arithmetics, both endians. */
4201*08b48e0bSAndroid Build Coastguard Worker
4202*08b48e0bSAndroid Build Coastguard Worker if (len < 2) { goto skip_arith; }
4203*08b48e0bSAndroid Build Coastguard Worker
4204*08b48e0bSAndroid Build Coastguard Worker afl->stage_name = "arith 16/8";
4205*08b48e0bSAndroid Build Coastguard Worker afl->stage_short = "arith16";
4206*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur = 0;
4207*08b48e0bSAndroid Build Coastguard Worker afl->stage_max = 4 * (len - 1) * ARITH_MAX;
4208*08b48e0bSAndroid Build Coastguard Worker
4209*08b48e0bSAndroid Build Coastguard Worker orig_hit_cnt = new_hit_cnt;
4210*08b48e0bSAndroid Build Coastguard Worker
4211*08b48e0bSAndroid Build Coastguard Worker for (i = 0; i < len - 1; ++i) {
4212*08b48e0bSAndroid Build Coastguard Worker
4213*08b48e0bSAndroid Build Coastguard Worker u16 orig = *(u16 *)(out_buf + i);
4214*08b48e0bSAndroid Build Coastguard Worker
4215*08b48e0bSAndroid Build Coastguard Worker /* Let's consult the effector map... */
4216*08b48e0bSAndroid Build Coastguard Worker
4217*08b48e0bSAndroid Build Coastguard Worker if (!eff_map[EFF_APOS(i)] && !eff_map[EFF_APOS(i + 1)]) {
4218*08b48e0bSAndroid Build Coastguard Worker
4219*08b48e0bSAndroid Build Coastguard Worker afl->stage_max -= 4 * ARITH_MAX;
4220*08b48e0bSAndroid Build Coastguard Worker continue;
4221*08b48e0bSAndroid Build Coastguard Worker
4222*08b48e0bSAndroid Build Coastguard Worker }
4223*08b48e0bSAndroid Build Coastguard Worker
4224*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_byte = i;
4225*08b48e0bSAndroid Build Coastguard Worker
4226*08b48e0bSAndroid Build Coastguard Worker for (j = 1; j <= ARITH_MAX; ++j) {
4227*08b48e0bSAndroid Build Coastguard Worker
4228*08b48e0bSAndroid Build Coastguard Worker u16 r1 = orig ^ (orig + j), r2 = orig ^ (orig - j),
4229*08b48e0bSAndroid Build Coastguard Worker r3 = orig ^ SWAP16(SWAP16(orig) + j),
4230*08b48e0bSAndroid Build Coastguard Worker r4 = orig ^ SWAP16(SWAP16(orig) - j);
4231*08b48e0bSAndroid Build Coastguard Worker
4232*08b48e0bSAndroid Build Coastguard Worker /* Try little endian addition and subtraction first. Do it only
4233*08b48e0bSAndroid Build Coastguard Worker if the operation would affect more than one byte (hence the
4234*08b48e0bSAndroid Build Coastguard Worker & 0xff overflow checks) and if it couldn't be a product of
4235*08b48e0bSAndroid Build Coastguard Worker a bitflip. */
4236*08b48e0bSAndroid Build Coastguard Worker
4237*08b48e0bSAndroid Build Coastguard Worker afl->stage_val_type = STAGE_VAL_LE;
4238*08b48e0bSAndroid Build Coastguard Worker
4239*08b48e0bSAndroid Build Coastguard Worker if ((orig & 0xff) + j > 0xff && !could_be_bitflip(r1)) {
4240*08b48e0bSAndroid Build Coastguard Worker
4241*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_val = j;
4242*08b48e0bSAndroid Build Coastguard Worker *(u16 *)(out_buf + i) = orig + j;
4243*08b48e0bSAndroid Build Coastguard Worker
4244*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
4245*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->mutation, sizeof(afl->mutation), "%s MOPT_ARITH16+-%u-%u",
4246*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->fname, i, j);
4247*08b48e0bSAndroid Build Coastguard Worker #endif
4248*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, out_buf, len)) { goto abandon_entry; }
4249*08b48e0bSAndroid Build Coastguard Worker ++afl->stage_cur;
4250*08b48e0bSAndroid Build Coastguard Worker
4251*08b48e0bSAndroid Build Coastguard Worker } else {
4252*08b48e0bSAndroid Build Coastguard Worker
4253*08b48e0bSAndroid Build Coastguard Worker --afl->stage_max;
4254*08b48e0bSAndroid Build Coastguard Worker
4255*08b48e0bSAndroid Build Coastguard Worker }
4256*08b48e0bSAndroid Build Coastguard Worker
4257*08b48e0bSAndroid Build Coastguard Worker if ((orig & 0xff) < j && !could_be_bitflip(r2)) {
4258*08b48e0bSAndroid Build Coastguard Worker
4259*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_val = -j;
4260*08b48e0bSAndroid Build Coastguard Worker *(u16 *)(out_buf + i) = orig - j;
4261*08b48e0bSAndroid Build Coastguard Worker
4262*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
4263*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->mutation, sizeof(afl->mutation), "%s MOPT_ARITH16_-%u-%u",
4264*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->fname, i, j);
4265*08b48e0bSAndroid Build Coastguard Worker #endif
4266*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, out_buf, len)) { goto abandon_entry; }
4267*08b48e0bSAndroid Build Coastguard Worker ++afl->stage_cur;
4268*08b48e0bSAndroid Build Coastguard Worker
4269*08b48e0bSAndroid Build Coastguard Worker } else {
4270*08b48e0bSAndroid Build Coastguard Worker
4271*08b48e0bSAndroid Build Coastguard Worker --afl->stage_max;
4272*08b48e0bSAndroid Build Coastguard Worker
4273*08b48e0bSAndroid Build Coastguard Worker }
4274*08b48e0bSAndroid Build Coastguard Worker
4275*08b48e0bSAndroid Build Coastguard Worker /* Big endian comes next. Same deal. */
4276*08b48e0bSAndroid Build Coastguard Worker
4277*08b48e0bSAndroid Build Coastguard Worker afl->stage_val_type = STAGE_VAL_BE;
4278*08b48e0bSAndroid Build Coastguard Worker
4279*08b48e0bSAndroid Build Coastguard Worker if ((orig >> 8) + j > 0xff && !could_be_bitflip(r3)) {
4280*08b48e0bSAndroid Build Coastguard Worker
4281*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_val = j;
4282*08b48e0bSAndroid Build Coastguard Worker *(u16 *)(out_buf + i) = SWAP16(SWAP16(orig) + j);
4283*08b48e0bSAndroid Build Coastguard Worker
4284*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
4285*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->mutation, sizeof(afl->mutation),
4286*08b48e0bSAndroid Build Coastguard Worker "%s MOPT_ARITH16+BE-%u-%u", afl->queue_cur->fname, i, j);
4287*08b48e0bSAndroid Build Coastguard Worker #endif
4288*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, out_buf, len)) { goto abandon_entry; }
4289*08b48e0bSAndroid Build Coastguard Worker ++afl->stage_cur;
4290*08b48e0bSAndroid Build Coastguard Worker
4291*08b48e0bSAndroid Build Coastguard Worker } else {
4292*08b48e0bSAndroid Build Coastguard Worker
4293*08b48e0bSAndroid Build Coastguard Worker --afl->stage_max;
4294*08b48e0bSAndroid Build Coastguard Worker
4295*08b48e0bSAndroid Build Coastguard Worker }
4296*08b48e0bSAndroid Build Coastguard Worker
4297*08b48e0bSAndroid Build Coastguard Worker if ((orig >> 8) < j && !could_be_bitflip(r4)) {
4298*08b48e0bSAndroid Build Coastguard Worker
4299*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_val = -j;
4300*08b48e0bSAndroid Build Coastguard Worker *(u16 *)(out_buf + i) = SWAP16(SWAP16(orig) - j);
4301*08b48e0bSAndroid Build Coastguard Worker
4302*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
4303*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->mutation, sizeof(afl->mutation),
4304*08b48e0bSAndroid Build Coastguard Worker "%s MOPT_ARITH16_BE+%u+%u", afl->queue_cur->fname, i, j);
4305*08b48e0bSAndroid Build Coastguard Worker #endif
4306*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, out_buf, len)) { goto abandon_entry; }
4307*08b48e0bSAndroid Build Coastguard Worker ++afl->stage_cur;
4308*08b48e0bSAndroid Build Coastguard Worker
4309*08b48e0bSAndroid Build Coastguard Worker } else {
4310*08b48e0bSAndroid Build Coastguard Worker
4311*08b48e0bSAndroid Build Coastguard Worker --afl->stage_max;
4312*08b48e0bSAndroid Build Coastguard Worker
4313*08b48e0bSAndroid Build Coastguard Worker }
4314*08b48e0bSAndroid Build Coastguard Worker
4315*08b48e0bSAndroid Build Coastguard Worker *(u16 *)(out_buf + i) = orig;
4316*08b48e0bSAndroid Build Coastguard Worker
4317*08b48e0bSAndroid Build Coastguard Worker }
4318*08b48e0bSAndroid Build Coastguard Worker
4319*08b48e0bSAndroid Build Coastguard Worker } /* for i = 0; i < len - 1 */
4320*08b48e0bSAndroid Build Coastguard Worker
4321*08b48e0bSAndroid Build Coastguard Worker new_hit_cnt = afl->queued_items + afl->saved_crashes;
4322*08b48e0bSAndroid Build Coastguard Worker
4323*08b48e0bSAndroid Build Coastguard Worker afl->stage_finds[STAGE_ARITH16] += new_hit_cnt - orig_hit_cnt;
4324*08b48e0bSAndroid Build Coastguard Worker afl->stage_cycles[STAGE_ARITH16] += afl->stage_max;
4325*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
4326*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->stats_mutated += afl->stage_max;
4327*08b48e0bSAndroid Build Coastguard Worker #endif
4328*08b48e0bSAndroid Build Coastguard Worker
4329*08b48e0bSAndroid Build Coastguard Worker /* 32-bit arithmetics, both endians. */
4330*08b48e0bSAndroid Build Coastguard Worker
4331*08b48e0bSAndroid Build Coastguard Worker if (len < 4) { goto skip_arith; }
4332*08b48e0bSAndroid Build Coastguard Worker
4333*08b48e0bSAndroid Build Coastguard Worker afl->stage_name = "arith 32/8";
4334*08b48e0bSAndroid Build Coastguard Worker afl->stage_short = "arith32";
4335*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur = 0;
4336*08b48e0bSAndroid Build Coastguard Worker afl->stage_max = 4 * (len - 3) * ARITH_MAX;
4337*08b48e0bSAndroid Build Coastguard Worker
4338*08b48e0bSAndroid Build Coastguard Worker orig_hit_cnt = new_hit_cnt;
4339*08b48e0bSAndroid Build Coastguard Worker
4340*08b48e0bSAndroid Build Coastguard Worker for (i = 0; i < len - 3; ++i) {
4341*08b48e0bSAndroid Build Coastguard Worker
4342*08b48e0bSAndroid Build Coastguard Worker u32 orig = *(u32 *)(out_buf + i);
4343*08b48e0bSAndroid Build Coastguard Worker
4344*08b48e0bSAndroid Build Coastguard Worker /* Let's consult the effector map... */
4345*08b48e0bSAndroid Build Coastguard Worker
4346*08b48e0bSAndroid Build Coastguard Worker if (!eff_map[EFF_APOS(i)] && !eff_map[EFF_APOS(i + 1)] &&
4347*08b48e0bSAndroid Build Coastguard Worker !eff_map[EFF_APOS(i + 2)] && !eff_map[EFF_APOS(i + 3)]) {
4348*08b48e0bSAndroid Build Coastguard Worker
4349*08b48e0bSAndroid Build Coastguard Worker afl->stage_max -= 4 * ARITH_MAX;
4350*08b48e0bSAndroid Build Coastguard Worker continue;
4351*08b48e0bSAndroid Build Coastguard Worker
4352*08b48e0bSAndroid Build Coastguard Worker }
4353*08b48e0bSAndroid Build Coastguard Worker
4354*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_byte = i;
4355*08b48e0bSAndroid Build Coastguard Worker
4356*08b48e0bSAndroid Build Coastguard Worker for (j = 1; j <= ARITH_MAX; ++j) {
4357*08b48e0bSAndroid Build Coastguard Worker
4358*08b48e0bSAndroid Build Coastguard Worker u32 r1 = orig ^ (orig + j), r2 = orig ^ (orig - j),
4359*08b48e0bSAndroid Build Coastguard Worker r3 = orig ^ SWAP32(SWAP32(orig) + j),
4360*08b48e0bSAndroid Build Coastguard Worker r4 = orig ^ SWAP32(SWAP32(orig) - j);
4361*08b48e0bSAndroid Build Coastguard Worker
4362*08b48e0bSAndroid Build Coastguard Worker /* Little endian first. Same deal as with 16-bit: we only want to
4363*08b48e0bSAndroid Build Coastguard Worker try if the operation would have effect on more than two bytes. */
4364*08b48e0bSAndroid Build Coastguard Worker
4365*08b48e0bSAndroid Build Coastguard Worker afl->stage_val_type = STAGE_VAL_LE;
4366*08b48e0bSAndroid Build Coastguard Worker
4367*08b48e0bSAndroid Build Coastguard Worker if ((orig & 0xffff) + j > 0xffff && !could_be_bitflip(r1)) {
4368*08b48e0bSAndroid Build Coastguard Worker
4369*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_val = j;
4370*08b48e0bSAndroid Build Coastguard Worker *(u32 *)(out_buf + i) = orig + j;
4371*08b48e0bSAndroid Build Coastguard Worker
4372*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
4373*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->mutation, sizeof(afl->mutation), "%s MOPT_ARITH32+-%u-%u",
4374*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->fname, i, j);
4375*08b48e0bSAndroid Build Coastguard Worker #endif
4376*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, out_buf, len)) { goto abandon_entry; }
4377*08b48e0bSAndroid Build Coastguard Worker ++afl->stage_cur;
4378*08b48e0bSAndroid Build Coastguard Worker
4379*08b48e0bSAndroid Build Coastguard Worker } else {
4380*08b48e0bSAndroid Build Coastguard Worker
4381*08b48e0bSAndroid Build Coastguard Worker --afl->stage_max;
4382*08b48e0bSAndroid Build Coastguard Worker
4383*08b48e0bSAndroid Build Coastguard Worker }
4384*08b48e0bSAndroid Build Coastguard Worker
4385*08b48e0bSAndroid Build Coastguard Worker if ((orig & 0xffff) < j && !could_be_bitflip(r2)) {
4386*08b48e0bSAndroid Build Coastguard Worker
4387*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_val = -j;
4388*08b48e0bSAndroid Build Coastguard Worker *(u32 *)(out_buf + i) = orig - j;
4389*08b48e0bSAndroid Build Coastguard Worker
4390*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
4391*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->mutation, sizeof(afl->mutation), "%s MOPT_ARITH32_-%u-%u",
4392*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->fname, i, j);
4393*08b48e0bSAndroid Build Coastguard Worker #endif
4394*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, out_buf, len)) { goto abandon_entry; }
4395*08b48e0bSAndroid Build Coastguard Worker ++afl->stage_cur;
4396*08b48e0bSAndroid Build Coastguard Worker
4397*08b48e0bSAndroid Build Coastguard Worker } else {
4398*08b48e0bSAndroid Build Coastguard Worker
4399*08b48e0bSAndroid Build Coastguard Worker --afl->stage_max;
4400*08b48e0bSAndroid Build Coastguard Worker
4401*08b48e0bSAndroid Build Coastguard Worker }
4402*08b48e0bSAndroid Build Coastguard Worker
4403*08b48e0bSAndroid Build Coastguard Worker /* Big endian next. */
4404*08b48e0bSAndroid Build Coastguard Worker
4405*08b48e0bSAndroid Build Coastguard Worker afl->stage_val_type = STAGE_VAL_BE;
4406*08b48e0bSAndroid Build Coastguard Worker
4407*08b48e0bSAndroid Build Coastguard Worker if ((SWAP32(orig) & 0xffff) + j > 0xffff && !could_be_bitflip(r3)) {
4408*08b48e0bSAndroid Build Coastguard Worker
4409*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_val = j;
4410*08b48e0bSAndroid Build Coastguard Worker *(u32 *)(out_buf + i) = SWAP32(SWAP32(orig) + j);
4411*08b48e0bSAndroid Build Coastguard Worker
4412*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
4413*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->mutation, sizeof(afl->mutation),
4414*08b48e0bSAndroid Build Coastguard Worker "%s MOPT_ARITH32+BE-%u-%u", afl->queue_cur->fname, i, j);
4415*08b48e0bSAndroid Build Coastguard Worker #endif
4416*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, out_buf, len)) { goto abandon_entry; }
4417*08b48e0bSAndroid Build Coastguard Worker ++afl->stage_cur;
4418*08b48e0bSAndroid Build Coastguard Worker
4419*08b48e0bSAndroid Build Coastguard Worker } else {
4420*08b48e0bSAndroid Build Coastguard Worker
4421*08b48e0bSAndroid Build Coastguard Worker --afl->stage_max;
4422*08b48e0bSAndroid Build Coastguard Worker
4423*08b48e0bSAndroid Build Coastguard Worker }
4424*08b48e0bSAndroid Build Coastguard Worker
4425*08b48e0bSAndroid Build Coastguard Worker if ((SWAP32(orig) & 0xffff) < j && !could_be_bitflip(r4)) {
4426*08b48e0bSAndroid Build Coastguard Worker
4427*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_val = -j;
4428*08b48e0bSAndroid Build Coastguard Worker *(u32 *)(out_buf + i) = SWAP32(SWAP32(orig) - j);
4429*08b48e0bSAndroid Build Coastguard Worker
4430*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
4431*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->mutation, sizeof(afl->mutation),
4432*08b48e0bSAndroid Build Coastguard Worker "%s MOPT_ARITH32_BE-%u-%u", afl->queue_cur->fname, i, j);
4433*08b48e0bSAndroid Build Coastguard Worker #endif
4434*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, out_buf, len)) { goto abandon_entry; }
4435*08b48e0bSAndroid Build Coastguard Worker ++afl->stage_cur;
4436*08b48e0bSAndroid Build Coastguard Worker
4437*08b48e0bSAndroid Build Coastguard Worker } else {
4438*08b48e0bSAndroid Build Coastguard Worker
4439*08b48e0bSAndroid Build Coastguard Worker --afl->stage_max;
4440*08b48e0bSAndroid Build Coastguard Worker
4441*08b48e0bSAndroid Build Coastguard Worker }
4442*08b48e0bSAndroid Build Coastguard Worker
4443*08b48e0bSAndroid Build Coastguard Worker *(u32 *)(out_buf + i) = orig;
4444*08b48e0bSAndroid Build Coastguard Worker
4445*08b48e0bSAndroid Build Coastguard Worker }
4446*08b48e0bSAndroid Build Coastguard Worker
4447*08b48e0bSAndroid Build Coastguard Worker } /* for i = 0; i < len - 3 */
4448*08b48e0bSAndroid Build Coastguard Worker
4449*08b48e0bSAndroid Build Coastguard Worker new_hit_cnt = afl->queued_items + afl->saved_crashes;
4450*08b48e0bSAndroid Build Coastguard Worker
4451*08b48e0bSAndroid Build Coastguard Worker afl->stage_finds[STAGE_ARITH32] += new_hit_cnt - orig_hit_cnt;
4452*08b48e0bSAndroid Build Coastguard Worker afl->stage_cycles[STAGE_ARITH32] += afl->stage_max;
4453*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
4454*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->stats_mutated += afl->stage_max;
4455*08b48e0bSAndroid Build Coastguard Worker #endif
4456*08b48e0bSAndroid Build Coastguard Worker
4457*08b48e0bSAndroid Build Coastguard Worker skip_arith:
4458*08b48e0bSAndroid Build Coastguard Worker
4459*08b48e0bSAndroid Build Coastguard Worker /**********************
4460*08b48e0bSAndroid Build Coastguard Worker * INTERESTING VALUES *
4461*08b48e0bSAndroid Build Coastguard Worker **********************/
4462*08b48e0bSAndroid Build Coastguard Worker
4463*08b48e0bSAndroid Build Coastguard Worker afl->stage_name = "interest 8/8";
4464*08b48e0bSAndroid Build Coastguard Worker afl->stage_short = "int8";
4465*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur = 0;
4466*08b48e0bSAndroid Build Coastguard Worker afl->stage_max = len * sizeof(interesting_8);
4467*08b48e0bSAndroid Build Coastguard Worker
4468*08b48e0bSAndroid Build Coastguard Worker afl->stage_val_type = STAGE_VAL_LE;
4469*08b48e0bSAndroid Build Coastguard Worker
4470*08b48e0bSAndroid Build Coastguard Worker orig_hit_cnt = new_hit_cnt;
4471*08b48e0bSAndroid Build Coastguard Worker
4472*08b48e0bSAndroid Build Coastguard Worker /* Setting 8-bit integers. */
4473*08b48e0bSAndroid Build Coastguard Worker
4474*08b48e0bSAndroid Build Coastguard Worker for (i = 0; i < (u32)len; ++i) {
4475*08b48e0bSAndroid Build Coastguard Worker
4476*08b48e0bSAndroid Build Coastguard Worker u8 orig = out_buf[i];
4477*08b48e0bSAndroid Build Coastguard Worker
4478*08b48e0bSAndroid Build Coastguard Worker /* Let's consult the effector map... */
4479*08b48e0bSAndroid Build Coastguard Worker
4480*08b48e0bSAndroid Build Coastguard Worker if (!eff_map[EFF_APOS(i)]) {
4481*08b48e0bSAndroid Build Coastguard Worker
4482*08b48e0bSAndroid Build Coastguard Worker afl->stage_max -= sizeof(interesting_8);
4483*08b48e0bSAndroid Build Coastguard Worker continue;
4484*08b48e0bSAndroid Build Coastguard Worker
4485*08b48e0bSAndroid Build Coastguard Worker }
4486*08b48e0bSAndroid Build Coastguard Worker
4487*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_byte = i;
4488*08b48e0bSAndroid Build Coastguard Worker
4489*08b48e0bSAndroid Build Coastguard Worker for (j = 0; j < sizeof(interesting_8); ++j) {
4490*08b48e0bSAndroid Build Coastguard Worker
4491*08b48e0bSAndroid Build Coastguard Worker /* Skip if the value could be a product of bitflips or arithmetics. */
4492*08b48e0bSAndroid Build Coastguard Worker
4493*08b48e0bSAndroid Build Coastguard Worker if (could_be_bitflip(orig ^ (u8)interesting_8[j]) ||
4494*08b48e0bSAndroid Build Coastguard Worker could_be_arith(orig, (u8)interesting_8[j], 1)) {
4495*08b48e0bSAndroid Build Coastguard Worker
4496*08b48e0bSAndroid Build Coastguard Worker --afl->stage_max;
4497*08b48e0bSAndroid Build Coastguard Worker continue;
4498*08b48e0bSAndroid Build Coastguard Worker
4499*08b48e0bSAndroid Build Coastguard Worker }
4500*08b48e0bSAndroid Build Coastguard Worker
4501*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_val = interesting_8[j];
4502*08b48e0bSAndroid Build Coastguard Worker out_buf[i] = interesting_8[j];
4503*08b48e0bSAndroid Build Coastguard Worker
4504*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
4505*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->mutation, sizeof(afl->mutation),
4506*08b48e0bSAndroid Build Coastguard Worker "%s MOPT_INTERESTING8-%u-%u", afl->queue_cur->fname, i, j);
4507*08b48e0bSAndroid Build Coastguard Worker #endif
4508*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, out_buf, len)) { goto abandon_entry; }
4509*08b48e0bSAndroid Build Coastguard Worker
4510*08b48e0bSAndroid Build Coastguard Worker out_buf[i] = orig;
4511*08b48e0bSAndroid Build Coastguard Worker ++afl->stage_cur;
4512*08b48e0bSAndroid Build Coastguard Worker
4513*08b48e0bSAndroid Build Coastguard Worker }
4514*08b48e0bSAndroid Build Coastguard Worker
4515*08b48e0bSAndroid Build Coastguard Worker } /* for i = 0; i < len */
4516*08b48e0bSAndroid Build Coastguard Worker
4517*08b48e0bSAndroid Build Coastguard Worker new_hit_cnt = afl->queued_items + afl->saved_crashes;
4518*08b48e0bSAndroid Build Coastguard Worker
4519*08b48e0bSAndroid Build Coastguard Worker afl->stage_finds[STAGE_INTEREST8] += new_hit_cnt - orig_hit_cnt;
4520*08b48e0bSAndroid Build Coastguard Worker afl->stage_cycles[STAGE_INTEREST8] += afl->stage_max;
4521*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
4522*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->stats_mutated += afl->stage_max;
4523*08b48e0bSAndroid Build Coastguard Worker #endif
4524*08b48e0bSAndroid Build Coastguard Worker
4525*08b48e0bSAndroid Build Coastguard Worker /* Setting 16-bit integers, both endians. */
4526*08b48e0bSAndroid Build Coastguard Worker
4527*08b48e0bSAndroid Build Coastguard Worker if (afl->no_arith || len < 2) { goto skip_interest; }
4528*08b48e0bSAndroid Build Coastguard Worker
4529*08b48e0bSAndroid Build Coastguard Worker afl->stage_name = "interest 16/8";
4530*08b48e0bSAndroid Build Coastguard Worker afl->stage_short = "int16";
4531*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur = 0;
4532*08b48e0bSAndroid Build Coastguard Worker afl->stage_max = 2 * (len - 1) * (sizeof(interesting_16) >> 1);
4533*08b48e0bSAndroid Build Coastguard Worker
4534*08b48e0bSAndroid Build Coastguard Worker orig_hit_cnt = new_hit_cnt;
4535*08b48e0bSAndroid Build Coastguard Worker
4536*08b48e0bSAndroid Build Coastguard Worker for (i = 0; i < len - 1; ++i) {
4537*08b48e0bSAndroid Build Coastguard Worker
4538*08b48e0bSAndroid Build Coastguard Worker u16 orig = *(u16 *)(out_buf + i);
4539*08b48e0bSAndroid Build Coastguard Worker
4540*08b48e0bSAndroid Build Coastguard Worker /* Let's consult the effector map... */
4541*08b48e0bSAndroid Build Coastguard Worker
4542*08b48e0bSAndroid Build Coastguard Worker if (!eff_map[EFF_APOS(i)] && !eff_map[EFF_APOS(i + 1)]) {
4543*08b48e0bSAndroid Build Coastguard Worker
4544*08b48e0bSAndroid Build Coastguard Worker afl->stage_max -= sizeof(interesting_16);
4545*08b48e0bSAndroid Build Coastguard Worker continue;
4546*08b48e0bSAndroid Build Coastguard Worker
4547*08b48e0bSAndroid Build Coastguard Worker }
4548*08b48e0bSAndroid Build Coastguard Worker
4549*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_byte = i;
4550*08b48e0bSAndroid Build Coastguard Worker
4551*08b48e0bSAndroid Build Coastguard Worker for (j = 0; j < sizeof(interesting_16) / 2; ++j) {
4552*08b48e0bSAndroid Build Coastguard Worker
4553*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_val = interesting_16[j];
4554*08b48e0bSAndroid Build Coastguard Worker
4555*08b48e0bSAndroid Build Coastguard Worker /* Skip if this could be a product of a bitflip, arithmetics,
4556*08b48e0bSAndroid Build Coastguard Worker or single-byte interesting value insertion. */
4557*08b48e0bSAndroid Build Coastguard Worker
4558*08b48e0bSAndroid Build Coastguard Worker if (!could_be_bitflip(orig ^ (u16)interesting_16[j]) &&
4559*08b48e0bSAndroid Build Coastguard Worker !could_be_arith(orig, (u16)interesting_16[j], 2) &&
4560*08b48e0bSAndroid Build Coastguard Worker !could_be_interest(orig, (u16)interesting_16[j], 2, 0)) {
4561*08b48e0bSAndroid Build Coastguard Worker
4562*08b48e0bSAndroid Build Coastguard Worker afl->stage_val_type = STAGE_VAL_LE;
4563*08b48e0bSAndroid Build Coastguard Worker
4564*08b48e0bSAndroid Build Coastguard Worker *(u16 *)(out_buf + i) = interesting_16[j];
4565*08b48e0bSAndroid Build Coastguard Worker
4566*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
4567*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->mutation, sizeof(afl->mutation),
4568*08b48e0bSAndroid Build Coastguard Worker "%s MOPT_INTERESTING16-%u-%u", afl->queue_cur->fname, i, j);
4569*08b48e0bSAndroid Build Coastguard Worker #endif
4570*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, out_buf, len)) { goto abandon_entry; }
4571*08b48e0bSAndroid Build Coastguard Worker ++afl->stage_cur;
4572*08b48e0bSAndroid Build Coastguard Worker
4573*08b48e0bSAndroid Build Coastguard Worker } else {
4574*08b48e0bSAndroid Build Coastguard Worker
4575*08b48e0bSAndroid Build Coastguard Worker --afl->stage_max;
4576*08b48e0bSAndroid Build Coastguard Worker
4577*08b48e0bSAndroid Build Coastguard Worker }
4578*08b48e0bSAndroid Build Coastguard Worker
4579*08b48e0bSAndroid Build Coastguard Worker if ((u16)interesting_16[j] != SWAP16(interesting_16[j]) &&
4580*08b48e0bSAndroid Build Coastguard Worker !could_be_bitflip(orig ^ SWAP16(interesting_16[j])) &&
4581*08b48e0bSAndroid Build Coastguard Worker !could_be_arith(orig, SWAP16(interesting_16[j]), 2) &&
4582*08b48e0bSAndroid Build Coastguard Worker !could_be_interest(orig, SWAP16(interesting_16[j]), 2, 1)) {
4583*08b48e0bSAndroid Build Coastguard Worker
4584*08b48e0bSAndroid Build Coastguard Worker afl->stage_val_type = STAGE_VAL_BE;
4585*08b48e0bSAndroid Build Coastguard Worker
4586*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
4587*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->mutation, sizeof(afl->mutation),
4588*08b48e0bSAndroid Build Coastguard Worker "%s MOPT_INTERESTING16BE-%u-%u", afl->queue_cur->fname, i, j);
4589*08b48e0bSAndroid Build Coastguard Worker #endif
4590*08b48e0bSAndroid Build Coastguard Worker *(u16 *)(out_buf + i) = SWAP16(interesting_16[j]);
4591*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, out_buf, len)) { goto abandon_entry; }
4592*08b48e0bSAndroid Build Coastguard Worker ++afl->stage_cur;
4593*08b48e0bSAndroid Build Coastguard Worker
4594*08b48e0bSAndroid Build Coastguard Worker } else {
4595*08b48e0bSAndroid Build Coastguard Worker
4596*08b48e0bSAndroid Build Coastguard Worker --afl->stage_max;
4597*08b48e0bSAndroid Build Coastguard Worker
4598*08b48e0bSAndroid Build Coastguard Worker }
4599*08b48e0bSAndroid Build Coastguard Worker
4600*08b48e0bSAndroid Build Coastguard Worker }
4601*08b48e0bSAndroid Build Coastguard Worker
4602*08b48e0bSAndroid Build Coastguard Worker *(u16 *)(out_buf + i) = orig;
4603*08b48e0bSAndroid Build Coastguard Worker
4604*08b48e0bSAndroid Build Coastguard Worker } /* for i = 0; i < len - 1 */
4605*08b48e0bSAndroid Build Coastguard Worker
4606*08b48e0bSAndroid Build Coastguard Worker new_hit_cnt = afl->queued_items + afl->saved_crashes;
4607*08b48e0bSAndroid Build Coastguard Worker
4608*08b48e0bSAndroid Build Coastguard Worker afl->stage_finds[STAGE_INTEREST16] += new_hit_cnt - orig_hit_cnt;
4609*08b48e0bSAndroid Build Coastguard Worker afl->stage_cycles[STAGE_INTEREST16] += afl->stage_max;
4610*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
4611*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->stats_mutated += afl->stage_max;
4612*08b48e0bSAndroid Build Coastguard Worker #endif
4613*08b48e0bSAndroid Build Coastguard Worker
4614*08b48e0bSAndroid Build Coastguard Worker if (len < 4) { goto skip_interest; }
4615*08b48e0bSAndroid Build Coastguard Worker
4616*08b48e0bSAndroid Build Coastguard Worker /* Setting 32-bit integers, both endians. */
4617*08b48e0bSAndroid Build Coastguard Worker
4618*08b48e0bSAndroid Build Coastguard Worker afl->stage_name = "interest 32/8";
4619*08b48e0bSAndroid Build Coastguard Worker afl->stage_short = "int32";
4620*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur = 0;
4621*08b48e0bSAndroid Build Coastguard Worker afl->stage_max = 2 * (len - 3) * (sizeof(interesting_32) >> 2);
4622*08b48e0bSAndroid Build Coastguard Worker
4623*08b48e0bSAndroid Build Coastguard Worker orig_hit_cnt = new_hit_cnt;
4624*08b48e0bSAndroid Build Coastguard Worker
4625*08b48e0bSAndroid Build Coastguard Worker for (i = 0; i < len - 3; ++i) {
4626*08b48e0bSAndroid Build Coastguard Worker
4627*08b48e0bSAndroid Build Coastguard Worker u32 orig = *(u32 *)(out_buf + i);
4628*08b48e0bSAndroid Build Coastguard Worker
4629*08b48e0bSAndroid Build Coastguard Worker /* Let's consult the effector map... */
4630*08b48e0bSAndroid Build Coastguard Worker
4631*08b48e0bSAndroid Build Coastguard Worker if (!eff_map[EFF_APOS(i)] && !eff_map[EFF_APOS(i + 1)] &&
4632*08b48e0bSAndroid Build Coastguard Worker !eff_map[EFF_APOS(i + 2)] && !eff_map[EFF_APOS(i + 3)]) {
4633*08b48e0bSAndroid Build Coastguard Worker
4634*08b48e0bSAndroid Build Coastguard Worker afl->stage_max -= sizeof(interesting_32) >> 1;
4635*08b48e0bSAndroid Build Coastguard Worker continue;
4636*08b48e0bSAndroid Build Coastguard Worker
4637*08b48e0bSAndroid Build Coastguard Worker }
4638*08b48e0bSAndroid Build Coastguard Worker
4639*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_byte = i;
4640*08b48e0bSAndroid Build Coastguard Worker
4641*08b48e0bSAndroid Build Coastguard Worker for (j = 0; j < sizeof(interesting_32) / 4; ++j) {
4642*08b48e0bSAndroid Build Coastguard Worker
4643*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_val = interesting_32[j];
4644*08b48e0bSAndroid Build Coastguard Worker
4645*08b48e0bSAndroid Build Coastguard Worker /* Skip if this could be a product of a bitflip, arithmetics,
4646*08b48e0bSAndroid Build Coastguard Worker or word interesting value insertion. */
4647*08b48e0bSAndroid Build Coastguard Worker
4648*08b48e0bSAndroid Build Coastguard Worker if (!could_be_bitflip(orig ^ (u32)interesting_32[j]) &&
4649*08b48e0bSAndroid Build Coastguard Worker !could_be_arith(orig, interesting_32[j], 4) &&
4650*08b48e0bSAndroid Build Coastguard Worker !could_be_interest(orig, interesting_32[j], 4, 0)) {
4651*08b48e0bSAndroid Build Coastguard Worker
4652*08b48e0bSAndroid Build Coastguard Worker afl->stage_val_type = STAGE_VAL_LE;
4653*08b48e0bSAndroid Build Coastguard Worker
4654*08b48e0bSAndroid Build Coastguard Worker *(u32 *)(out_buf + i) = interesting_32[j];
4655*08b48e0bSAndroid Build Coastguard Worker
4656*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
4657*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->mutation, sizeof(afl->mutation),
4658*08b48e0bSAndroid Build Coastguard Worker "%s MOPT_INTERESTING32-%u-%u", afl->queue_cur->fname, i, j);
4659*08b48e0bSAndroid Build Coastguard Worker #endif
4660*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, out_buf, len)) { goto abandon_entry; }
4661*08b48e0bSAndroid Build Coastguard Worker ++afl->stage_cur;
4662*08b48e0bSAndroid Build Coastguard Worker
4663*08b48e0bSAndroid Build Coastguard Worker } else {
4664*08b48e0bSAndroid Build Coastguard Worker
4665*08b48e0bSAndroid Build Coastguard Worker --afl->stage_max;
4666*08b48e0bSAndroid Build Coastguard Worker
4667*08b48e0bSAndroid Build Coastguard Worker }
4668*08b48e0bSAndroid Build Coastguard Worker
4669*08b48e0bSAndroid Build Coastguard Worker if ((u32)interesting_32[j] != SWAP32(interesting_32[j]) &&
4670*08b48e0bSAndroid Build Coastguard Worker !could_be_bitflip(orig ^ SWAP32(interesting_32[j])) &&
4671*08b48e0bSAndroid Build Coastguard Worker !could_be_arith(orig, SWAP32(interesting_32[j]), 4) &&
4672*08b48e0bSAndroid Build Coastguard Worker !could_be_interest(orig, SWAP32(interesting_32[j]), 4, 1)) {
4673*08b48e0bSAndroid Build Coastguard Worker
4674*08b48e0bSAndroid Build Coastguard Worker afl->stage_val_type = STAGE_VAL_BE;
4675*08b48e0bSAndroid Build Coastguard Worker
4676*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
4677*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->mutation, sizeof(afl->mutation),
4678*08b48e0bSAndroid Build Coastguard Worker "%s MOPT_INTERESTING32BE-%u-%u", afl->queue_cur->fname, i, j);
4679*08b48e0bSAndroid Build Coastguard Worker #endif
4680*08b48e0bSAndroid Build Coastguard Worker *(u32 *)(out_buf + i) = SWAP32(interesting_32[j]);
4681*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, out_buf, len)) { goto abandon_entry; }
4682*08b48e0bSAndroid Build Coastguard Worker ++afl->stage_cur;
4683*08b48e0bSAndroid Build Coastguard Worker
4684*08b48e0bSAndroid Build Coastguard Worker } else {
4685*08b48e0bSAndroid Build Coastguard Worker
4686*08b48e0bSAndroid Build Coastguard Worker --afl->stage_max;
4687*08b48e0bSAndroid Build Coastguard Worker
4688*08b48e0bSAndroid Build Coastguard Worker }
4689*08b48e0bSAndroid Build Coastguard Worker
4690*08b48e0bSAndroid Build Coastguard Worker }
4691*08b48e0bSAndroid Build Coastguard Worker
4692*08b48e0bSAndroid Build Coastguard Worker *(u32 *)(out_buf + i) = orig;
4693*08b48e0bSAndroid Build Coastguard Worker
4694*08b48e0bSAndroid Build Coastguard Worker } /* for i = 0; i < len - 3 */
4695*08b48e0bSAndroid Build Coastguard Worker
4696*08b48e0bSAndroid Build Coastguard Worker new_hit_cnt = afl->queued_items + afl->saved_crashes;
4697*08b48e0bSAndroid Build Coastguard Worker
4698*08b48e0bSAndroid Build Coastguard Worker afl->stage_finds[STAGE_INTEREST32] += new_hit_cnt - orig_hit_cnt;
4699*08b48e0bSAndroid Build Coastguard Worker afl->stage_cycles[STAGE_INTEREST32] += afl->stage_max;
4700*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
4701*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->stats_mutated += afl->stage_max;
4702*08b48e0bSAndroid Build Coastguard Worker #endif
4703*08b48e0bSAndroid Build Coastguard Worker
4704*08b48e0bSAndroid Build Coastguard Worker skip_interest:
4705*08b48e0bSAndroid Build Coastguard Worker
4706*08b48e0bSAndroid Build Coastguard Worker /********************
4707*08b48e0bSAndroid Build Coastguard Worker * DICTIONARY STUFF *
4708*08b48e0bSAndroid Build Coastguard Worker ********************/
4709*08b48e0bSAndroid Build Coastguard Worker
4710*08b48e0bSAndroid Build Coastguard Worker if (!afl->extras_cnt) { goto skip_user_extras; }
4711*08b48e0bSAndroid Build Coastguard Worker
4712*08b48e0bSAndroid Build Coastguard Worker /* Overwrite with user-supplied extras. */
4713*08b48e0bSAndroid Build Coastguard Worker
4714*08b48e0bSAndroid Build Coastguard Worker afl->stage_name = "user extras (over)";
4715*08b48e0bSAndroid Build Coastguard Worker afl->stage_short = "ext_UO";
4716*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur = 0;
4717*08b48e0bSAndroid Build Coastguard Worker afl->stage_max = afl->extras_cnt * len;
4718*08b48e0bSAndroid Build Coastguard Worker
4719*08b48e0bSAndroid Build Coastguard Worker afl->stage_val_type = STAGE_VAL_NONE;
4720*08b48e0bSAndroid Build Coastguard Worker
4721*08b48e0bSAndroid Build Coastguard Worker orig_hit_cnt = new_hit_cnt;
4722*08b48e0bSAndroid Build Coastguard Worker
4723*08b48e0bSAndroid Build Coastguard Worker for (i = 0; i < (u32)len; ++i) {
4724*08b48e0bSAndroid Build Coastguard Worker
4725*08b48e0bSAndroid Build Coastguard Worker u32 last_len = 0;
4726*08b48e0bSAndroid Build Coastguard Worker
4727*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_byte = i;
4728*08b48e0bSAndroid Build Coastguard Worker
4729*08b48e0bSAndroid Build Coastguard Worker /* Extras are sorted by size, from smallest to largest. This means
4730*08b48e0bSAndroid Build Coastguard Worker that we don't have to worry about restoring the buffer in
4731*08b48e0bSAndroid Build Coastguard Worker between writes at a particular offset determined by the outer
4732*08b48e0bSAndroid Build Coastguard Worker loop. */
4733*08b48e0bSAndroid Build Coastguard Worker
4734*08b48e0bSAndroid Build Coastguard Worker for (j = 0; j < afl->extras_cnt; ++j) {
4735*08b48e0bSAndroid Build Coastguard Worker
4736*08b48e0bSAndroid Build Coastguard Worker /* Skip extras probabilistically if afl->extras_cnt > AFL_MAX_DET_EXTRAS.
4737*08b48e0bSAndroid Build Coastguard Worker Also skip them if there's no room to insert the payload, if the token
4738*08b48e0bSAndroid Build Coastguard Worker is redundant, or if its entire span has no bytes set in the effector
4739*08b48e0bSAndroid Build Coastguard Worker map. */
4740*08b48e0bSAndroid Build Coastguard Worker
4741*08b48e0bSAndroid Build Coastguard Worker if ((afl->extras_cnt > afl->max_det_extras &&
4742*08b48e0bSAndroid Build Coastguard Worker rand_below(afl, afl->extras_cnt) >= afl->max_det_extras) ||
4743*08b48e0bSAndroid Build Coastguard Worker afl->extras[j].len > len - i ||
4744*08b48e0bSAndroid Build Coastguard Worker !memcmp(afl->extras[j].data, out_buf + i, afl->extras[j].len) ||
4745*08b48e0bSAndroid Build Coastguard Worker !memchr(eff_map + EFF_APOS(i), 1,
4746*08b48e0bSAndroid Build Coastguard Worker EFF_SPAN_ALEN(i, afl->extras[j].len))) {
4747*08b48e0bSAndroid Build Coastguard Worker
4748*08b48e0bSAndroid Build Coastguard Worker --afl->stage_max;
4749*08b48e0bSAndroid Build Coastguard Worker continue;
4750*08b48e0bSAndroid Build Coastguard Worker
4751*08b48e0bSAndroid Build Coastguard Worker }
4752*08b48e0bSAndroid Build Coastguard Worker
4753*08b48e0bSAndroid Build Coastguard Worker last_len = afl->extras[j].len;
4754*08b48e0bSAndroid Build Coastguard Worker memcpy(out_buf + i, afl->extras[j].data, last_len);
4755*08b48e0bSAndroid Build Coastguard Worker
4756*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
4757*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->mutation, sizeof(afl->mutation),
4758*08b48e0bSAndroid Build Coastguard Worker "%s MOPT_EXTRAS_overwrite-%u-%u", afl->queue_cur->fname, i, j);
4759*08b48e0bSAndroid Build Coastguard Worker #endif
4760*08b48e0bSAndroid Build Coastguard Worker
4761*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, out_buf, len)) { goto abandon_entry; }
4762*08b48e0bSAndroid Build Coastguard Worker
4763*08b48e0bSAndroid Build Coastguard Worker ++afl->stage_cur;
4764*08b48e0bSAndroid Build Coastguard Worker
4765*08b48e0bSAndroid Build Coastguard Worker }
4766*08b48e0bSAndroid Build Coastguard Worker
4767*08b48e0bSAndroid Build Coastguard Worker /* Restore all the clobbered memory. */
4768*08b48e0bSAndroid Build Coastguard Worker memcpy(out_buf + i, in_buf + i, last_len);
4769*08b48e0bSAndroid Build Coastguard Worker
4770*08b48e0bSAndroid Build Coastguard Worker } /* for i = 0; i < len */
4771*08b48e0bSAndroid Build Coastguard Worker
4772*08b48e0bSAndroid Build Coastguard Worker new_hit_cnt = afl->queued_items + afl->saved_crashes;
4773*08b48e0bSAndroid Build Coastguard Worker
4774*08b48e0bSAndroid Build Coastguard Worker afl->stage_finds[STAGE_EXTRAS_UO] += new_hit_cnt - orig_hit_cnt;
4775*08b48e0bSAndroid Build Coastguard Worker afl->stage_cycles[STAGE_EXTRAS_UO] += afl->stage_max;
4776*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
4777*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->stats_mutated += afl->stage_max;
4778*08b48e0bSAndroid Build Coastguard Worker #endif
4779*08b48e0bSAndroid Build Coastguard Worker
4780*08b48e0bSAndroid Build Coastguard Worker /* Insertion of user-supplied extras. */
4781*08b48e0bSAndroid Build Coastguard Worker
4782*08b48e0bSAndroid Build Coastguard Worker afl->stage_name = "user extras (insert)";
4783*08b48e0bSAndroid Build Coastguard Worker afl->stage_short = "ext_UI";
4784*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur = 0;
4785*08b48e0bSAndroid Build Coastguard Worker afl->stage_max = afl->extras_cnt * (len + 1);
4786*08b48e0bSAndroid Build Coastguard Worker
4787*08b48e0bSAndroid Build Coastguard Worker orig_hit_cnt = new_hit_cnt;
4788*08b48e0bSAndroid Build Coastguard Worker
4789*08b48e0bSAndroid Build Coastguard Worker ex_tmp = afl_realloc(AFL_BUF_PARAM(ex), len + MAX_DICT_FILE);
4790*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!ex_tmp)) { PFATAL("alloc"); }
4791*08b48e0bSAndroid Build Coastguard Worker
4792*08b48e0bSAndroid Build Coastguard Worker for (i = 0; i <= (u32)len; ++i) {
4793*08b48e0bSAndroid Build Coastguard Worker
4794*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_byte = i;
4795*08b48e0bSAndroid Build Coastguard Worker
4796*08b48e0bSAndroid Build Coastguard Worker for (j = 0; j < afl->extras_cnt; ++j) {
4797*08b48e0bSAndroid Build Coastguard Worker
4798*08b48e0bSAndroid Build Coastguard Worker if (len + afl->extras[j].len > MAX_FILE) {
4799*08b48e0bSAndroid Build Coastguard Worker
4800*08b48e0bSAndroid Build Coastguard Worker --afl->stage_max;
4801*08b48e0bSAndroid Build Coastguard Worker continue;
4802*08b48e0bSAndroid Build Coastguard Worker
4803*08b48e0bSAndroid Build Coastguard Worker }
4804*08b48e0bSAndroid Build Coastguard Worker
4805*08b48e0bSAndroid Build Coastguard Worker /* Insert token */
4806*08b48e0bSAndroid Build Coastguard Worker memcpy(ex_tmp + i, afl->extras[j].data, afl->extras[j].len);
4807*08b48e0bSAndroid Build Coastguard Worker
4808*08b48e0bSAndroid Build Coastguard Worker /* Copy tail */
4809*08b48e0bSAndroid Build Coastguard Worker memcpy(ex_tmp + i + afl->extras[j].len, out_buf + i, len - i);
4810*08b48e0bSAndroid Build Coastguard Worker
4811*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
4812*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->mutation, sizeof(afl->mutation),
4813*08b48e0bSAndroid Build Coastguard Worker "%s MOPT_EXTRAS_insert-%u-%u", afl->queue_cur->fname, i, j);
4814*08b48e0bSAndroid Build Coastguard Worker #endif
4815*08b48e0bSAndroid Build Coastguard Worker
4816*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, ex_tmp, len + afl->extras[j].len)) {
4817*08b48e0bSAndroid Build Coastguard Worker
4818*08b48e0bSAndroid Build Coastguard Worker goto abandon_entry;
4819*08b48e0bSAndroid Build Coastguard Worker
4820*08b48e0bSAndroid Build Coastguard Worker }
4821*08b48e0bSAndroid Build Coastguard Worker
4822*08b48e0bSAndroid Build Coastguard Worker ++afl->stage_cur;
4823*08b48e0bSAndroid Build Coastguard Worker
4824*08b48e0bSAndroid Build Coastguard Worker }
4825*08b48e0bSAndroid Build Coastguard Worker
4826*08b48e0bSAndroid Build Coastguard Worker /* Copy head */
4827*08b48e0bSAndroid Build Coastguard Worker ex_tmp[i] = out_buf[i];
4828*08b48e0bSAndroid Build Coastguard Worker
4829*08b48e0bSAndroid Build Coastguard Worker } /* for i = 0; i <= len */
4830*08b48e0bSAndroid Build Coastguard Worker
4831*08b48e0bSAndroid Build Coastguard Worker new_hit_cnt = afl->queued_items + afl->saved_crashes;
4832*08b48e0bSAndroid Build Coastguard Worker
4833*08b48e0bSAndroid Build Coastguard Worker afl->stage_finds[STAGE_EXTRAS_UI] += new_hit_cnt - orig_hit_cnt;
4834*08b48e0bSAndroid Build Coastguard Worker afl->stage_cycles[STAGE_EXTRAS_UI] += afl->stage_max;
4835*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
4836*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->stats_mutated += afl->stage_max;
4837*08b48e0bSAndroid Build Coastguard Worker #endif
4838*08b48e0bSAndroid Build Coastguard Worker
4839*08b48e0bSAndroid Build Coastguard Worker skip_user_extras:
4840*08b48e0bSAndroid Build Coastguard Worker
4841*08b48e0bSAndroid Build Coastguard Worker if (!afl->a_extras_cnt) { goto skip_extras; }
4842*08b48e0bSAndroid Build Coastguard Worker
4843*08b48e0bSAndroid Build Coastguard Worker afl->stage_name = "auto extras (over)";
4844*08b48e0bSAndroid Build Coastguard Worker afl->stage_short = "ext_AO";
4845*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur = 0;
4846*08b48e0bSAndroid Build Coastguard Worker afl->stage_max = MIN(afl->a_extras_cnt, (u32)USE_AUTO_EXTRAS) * len;
4847*08b48e0bSAndroid Build Coastguard Worker
4848*08b48e0bSAndroid Build Coastguard Worker afl->stage_val_type = STAGE_VAL_NONE;
4849*08b48e0bSAndroid Build Coastguard Worker
4850*08b48e0bSAndroid Build Coastguard Worker orig_hit_cnt = new_hit_cnt;
4851*08b48e0bSAndroid Build Coastguard Worker
4852*08b48e0bSAndroid Build Coastguard Worker for (i = 0; i < (u32)len; ++i) {
4853*08b48e0bSAndroid Build Coastguard Worker
4854*08b48e0bSAndroid Build Coastguard Worker u32 last_len = 0;
4855*08b48e0bSAndroid Build Coastguard Worker
4856*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_byte = i;
4857*08b48e0bSAndroid Build Coastguard Worker
4858*08b48e0bSAndroid Build Coastguard Worker u32 min_extra_len = MIN(afl->a_extras_cnt, (u32)USE_AUTO_EXTRAS);
4859*08b48e0bSAndroid Build Coastguard Worker for (j = 0; j < min_extra_len; ++j) {
4860*08b48e0bSAndroid Build Coastguard Worker
4861*08b48e0bSAndroid Build Coastguard Worker /* See the comment in the earlier code; extras are sorted by size. */
4862*08b48e0bSAndroid Build Coastguard Worker
4863*08b48e0bSAndroid Build Coastguard Worker if ((afl->a_extras[j].len) > (len - i) ||
4864*08b48e0bSAndroid Build Coastguard Worker !memcmp(afl->a_extras[j].data, out_buf + i, afl->a_extras[j].len) ||
4865*08b48e0bSAndroid Build Coastguard Worker !memchr(eff_map + EFF_APOS(i), 1,
4866*08b48e0bSAndroid Build Coastguard Worker EFF_SPAN_ALEN(i, afl->a_extras[j].len))) {
4867*08b48e0bSAndroid Build Coastguard Worker
4868*08b48e0bSAndroid Build Coastguard Worker --afl->stage_max;
4869*08b48e0bSAndroid Build Coastguard Worker continue;
4870*08b48e0bSAndroid Build Coastguard Worker
4871*08b48e0bSAndroid Build Coastguard Worker }
4872*08b48e0bSAndroid Build Coastguard Worker
4873*08b48e0bSAndroid Build Coastguard Worker last_len = afl->a_extras[j].len;
4874*08b48e0bSAndroid Build Coastguard Worker memcpy(out_buf + i, afl->a_extras[j].data, last_len);
4875*08b48e0bSAndroid Build Coastguard Worker
4876*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
4877*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->mutation, sizeof(afl->mutation),
4878*08b48e0bSAndroid Build Coastguard Worker "%s MOPT_AUTO_EXTRAS_overwrite-%u-%u", afl->queue_cur->fname, i,
4879*08b48e0bSAndroid Build Coastguard Worker j);
4880*08b48e0bSAndroid Build Coastguard Worker #endif
4881*08b48e0bSAndroid Build Coastguard Worker
4882*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, out_buf, len)) { goto abandon_entry; }
4883*08b48e0bSAndroid Build Coastguard Worker
4884*08b48e0bSAndroid Build Coastguard Worker ++afl->stage_cur;
4885*08b48e0bSAndroid Build Coastguard Worker
4886*08b48e0bSAndroid Build Coastguard Worker }
4887*08b48e0bSAndroid Build Coastguard Worker
4888*08b48e0bSAndroid Build Coastguard Worker /* Restore all the clobbered memory. */
4889*08b48e0bSAndroid Build Coastguard Worker memcpy(out_buf + i, in_buf + i, last_len);
4890*08b48e0bSAndroid Build Coastguard Worker
4891*08b48e0bSAndroid Build Coastguard Worker } /* for i = 0; i < len */
4892*08b48e0bSAndroid Build Coastguard Worker
4893*08b48e0bSAndroid Build Coastguard Worker new_hit_cnt = afl->queued_items + afl->saved_crashes;
4894*08b48e0bSAndroid Build Coastguard Worker
4895*08b48e0bSAndroid Build Coastguard Worker afl->stage_finds[STAGE_EXTRAS_AO] += new_hit_cnt - orig_hit_cnt;
4896*08b48e0bSAndroid Build Coastguard Worker afl->stage_cycles[STAGE_EXTRAS_AO] += afl->stage_max;
4897*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
4898*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->stats_mutated += afl->stage_max;
4899*08b48e0bSAndroid Build Coastguard Worker #endif
4900*08b48e0bSAndroid Build Coastguard Worker
4901*08b48e0bSAndroid Build Coastguard Worker /* Insertion of auto extras. */
4902*08b48e0bSAndroid Build Coastguard Worker
4903*08b48e0bSAndroid Build Coastguard Worker afl->stage_name = "auto extras (insert)";
4904*08b48e0bSAndroid Build Coastguard Worker afl->stage_short = "ext_AI";
4905*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur = 0;
4906*08b48e0bSAndroid Build Coastguard Worker afl->stage_max = afl->a_extras_cnt * (len + 1);
4907*08b48e0bSAndroid Build Coastguard Worker
4908*08b48e0bSAndroid Build Coastguard Worker orig_hit_cnt = new_hit_cnt;
4909*08b48e0bSAndroid Build Coastguard Worker
4910*08b48e0bSAndroid Build Coastguard Worker ex_tmp = afl_realloc(AFL_BUF_PARAM(ex), len + MAX_DICT_FILE);
4911*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!ex_tmp)) { PFATAL("alloc"); }
4912*08b48e0bSAndroid Build Coastguard Worker
4913*08b48e0bSAndroid Build Coastguard Worker for (i = 0; i <= (u32)len; ++i) {
4914*08b48e0bSAndroid Build Coastguard Worker
4915*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_byte = i;
4916*08b48e0bSAndroid Build Coastguard Worker
4917*08b48e0bSAndroid Build Coastguard Worker for (j = 0; j < afl->a_extras_cnt; ++j) {
4918*08b48e0bSAndroid Build Coastguard Worker
4919*08b48e0bSAndroid Build Coastguard Worker if (len + afl->a_extras[j].len > MAX_FILE) {
4920*08b48e0bSAndroid Build Coastguard Worker
4921*08b48e0bSAndroid Build Coastguard Worker --afl->stage_max;
4922*08b48e0bSAndroid Build Coastguard Worker continue;
4923*08b48e0bSAndroid Build Coastguard Worker
4924*08b48e0bSAndroid Build Coastguard Worker }
4925*08b48e0bSAndroid Build Coastguard Worker
4926*08b48e0bSAndroid Build Coastguard Worker /* Insert token */
4927*08b48e0bSAndroid Build Coastguard Worker memcpy(ex_tmp + i, afl->a_extras[j].data, afl->a_extras[j].len);
4928*08b48e0bSAndroid Build Coastguard Worker
4929*08b48e0bSAndroid Build Coastguard Worker /* Copy tail */
4930*08b48e0bSAndroid Build Coastguard Worker memcpy(ex_tmp + i + afl->a_extras[j].len, out_buf + i, len - i);
4931*08b48e0bSAndroid Build Coastguard Worker
4932*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
4933*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->mutation, sizeof(afl->mutation),
4934*08b48e0bSAndroid Build Coastguard Worker "%s MOPT_AUTO_EXTRAS_insert-%u-%u", afl->queue_cur->fname, i, j);
4935*08b48e0bSAndroid Build Coastguard Worker #endif
4936*08b48e0bSAndroid Build Coastguard Worker
4937*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, ex_tmp, len + afl->a_extras[j].len)) {
4938*08b48e0bSAndroid Build Coastguard Worker
4939*08b48e0bSAndroid Build Coastguard Worker goto abandon_entry;
4940*08b48e0bSAndroid Build Coastguard Worker
4941*08b48e0bSAndroid Build Coastguard Worker }
4942*08b48e0bSAndroid Build Coastguard Worker
4943*08b48e0bSAndroid Build Coastguard Worker ++afl->stage_cur;
4944*08b48e0bSAndroid Build Coastguard Worker
4945*08b48e0bSAndroid Build Coastguard Worker }
4946*08b48e0bSAndroid Build Coastguard Worker
4947*08b48e0bSAndroid Build Coastguard Worker /* Copy head */
4948*08b48e0bSAndroid Build Coastguard Worker ex_tmp[i] = out_buf[i];
4949*08b48e0bSAndroid Build Coastguard Worker
4950*08b48e0bSAndroid Build Coastguard Worker } /* for i = 0; i <= len */
4951*08b48e0bSAndroid Build Coastguard Worker
4952*08b48e0bSAndroid Build Coastguard Worker new_hit_cnt = afl->queued_items + afl->saved_crashes;
4953*08b48e0bSAndroid Build Coastguard Worker
4954*08b48e0bSAndroid Build Coastguard Worker afl->stage_finds[STAGE_EXTRAS_AI] += new_hit_cnt - orig_hit_cnt;
4955*08b48e0bSAndroid Build Coastguard Worker afl->stage_cycles[STAGE_EXTRAS_AI] += afl->stage_max;
4956*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
4957*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->stats_mutated += afl->stage_max;
4958*08b48e0bSAndroid Build Coastguard Worker #endif
4959*08b48e0bSAndroid Build Coastguard Worker
4960*08b48e0bSAndroid Build Coastguard Worker skip_extras:
4961*08b48e0bSAndroid Build Coastguard Worker
4962*08b48e0bSAndroid Build Coastguard Worker /* If we made this to here without jumping to havoc_stage or abandon_entry,
4963*08b48e0bSAndroid Build Coastguard Worker we're properly done with deterministic steps and can mark it as such
4964*08b48e0bSAndroid Build Coastguard Worker in the .state/ directory. */
4965*08b48e0bSAndroid Build Coastguard Worker
4966*08b48e0bSAndroid Build Coastguard Worker if (!afl->queue_cur->passed_det) { mark_as_det_done(afl, afl->queue_cur); }
4967*08b48e0bSAndroid Build Coastguard Worker
4968*08b48e0bSAndroid Build Coastguard Worker /****************
4969*08b48e0bSAndroid Build Coastguard Worker * RANDOM HAVOC *
4970*08b48e0bSAndroid Build Coastguard Worker ****************/
4971*08b48e0bSAndroid Build Coastguard Worker
4972*08b48e0bSAndroid Build Coastguard Worker havoc_stage:
4973*08b48e0bSAndroid Build Coastguard Worker pacemaker_fuzzing:
4974*08b48e0bSAndroid Build Coastguard Worker
4975*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_byte = -1;
4976*08b48e0bSAndroid Build Coastguard Worker
4977*08b48e0bSAndroid Build Coastguard Worker /* The havoc stage mutation code is also invoked when splicing files; if the
4978*08b48e0bSAndroid Build Coastguard Worker splice_cycle variable is set, generate different descriptions and such. */
4979*08b48e0bSAndroid Build Coastguard Worker
4980*08b48e0bSAndroid Build Coastguard Worker if (!splice_cycle) {
4981*08b48e0bSAndroid Build Coastguard Worker
4982*08b48e0bSAndroid Build Coastguard Worker afl->stage_name = MOpt_globals.havoc_stagename;
4983*08b48e0bSAndroid Build Coastguard Worker afl->stage_short = MOpt_globals.havoc_stagenameshort;
4984*08b48e0bSAndroid Build Coastguard Worker afl->stage_max = ((doing_det ? HAVOC_CYCLES_INIT : HAVOC_CYCLES) *
4985*08b48e0bSAndroid Build Coastguard Worker perf_score / afl->havoc_div) >>
4986*08b48e0bSAndroid Build Coastguard Worker 7;
4987*08b48e0bSAndroid Build Coastguard Worker
4988*08b48e0bSAndroid Build Coastguard Worker } else {
4989*08b48e0bSAndroid Build Coastguard Worker
4990*08b48e0bSAndroid Build Coastguard Worker perf_score = orig_perf;
4991*08b48e0bSAndroid Build Coastguard Worker
4992*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->stage_name_buf, STAGE_BUF_SIZE,
4993*08b48e0bSAndroid Build Coastguard Worker MOpt_globals.splice_stageformat, splice_cycle);
4994*08b48e0bSAndroid Build Coastguard Worker afl->stage_name = afl->stage_name_buf;
4995*08b48e0bSAndroid Build Coastguard Worker afl->stage_short = MOpt_globals.splice_stagenameshort;
4996*08b48e0bSAndroid Build Coastguard Worker afl->stage_max = (SPLICE_HAVOC * perf_score / afl->havoc_div) >> 8;
4997*08b48e0bSAndroid Build Coastguard Worker
4998*08b48e0bSAndroid Build Coastguard Worker }
4999*08b48e0bSAndroid Build Coastguard Worker
5000*08b48e0bSAndroid Build Coastguard Worker s32 temp_len_puppet;
5001*08b48e0bSAndroid Build Coastguard Worker
5002*08b48e0bSAndroid Build Coastguard Worker // for (; afl->swarm_now < swarm_num; ++afl->swarm_now)
5003*08b48e0bSAndroid Build Coastguard Worker {
5004*08b48e0bSAndroid Build Coastguard Worker
5005*08b48e0bSAndroid Build Coastguard Worker if (afl->key_puppet == 1) {
5006*08b48e0bSAndroid Build Coastguard Worker
5007*08b48e0bSAndroid Build Coastguard Worker if (unlikely(afl->orig_hit_cnt_puppet == 0)) {
5008*08b48e0bSAndroid Build Coastguard Worker
5009*08b48e0bSAndroid Build Coastguard Worker afl->orig_hit_cnt_puppet = afl->queued_items + afl->saved_crashes;
5010*08b48e0bSAndroid Build Coastguard Worker afl->last_limit_time_start = get_cur_time();
5011*08b48e0bSAndroid Build Coastguard Worker afl->SPLICE_CYCLES_puppet =
5012*08b48e0bSAndroid Build Coastguard Worker (rand_below(
5013*08b48e0bSAndroid Build Coastguard Worker afl, SPLICE_CYCLES_puppet_up - SPLICE_CYCLES_puppet_low + 1) +
5014*08b48e0bSAndroid Build Coastguard Worker SPLICE_CYCLES_puppet_low);
5015*08b48e0bSAndroid Build Coastguard Worker
5016*08b48e0bSAndroid Build Coastguard Worker }
5017*08b48e0bSAndroid Build Coastguard Worker
5018*08b48e0bSAndroid Build Coastguard Worker } /* if afl->key_puppet == 1 */
5019*08b48e0bSAndroid Build Coastguard Worker
5020*08b48e0bSAndroid Build Coastguard Worker {
5021*08b48e0bSAndroid Build Coastguard Worker
5022*08b48e0bSAndroid Build Coastguard Worker #ifndef IGNORE_FINDS
5023*08b48e0bSAndroid Build Coastguard Worker havoc_stage_puppet:
5024*08b48e0bSAndroid Build Coastguard Worker #endif
5025*08b48e0bSAndroid Build Coastguard Worker
5026*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_byte = -1;
5027*08b48e0bSAndroid Build Coastguard Worker
5028*08b48e0bSAndroid Build Coastguard Worker /* The havoc stage mutation code is also invoked when splicing files; if
5029*08b48e0bSAndroid Build Coastguard Worker the splice_cycle variable is set, generate different descriptions and
5030*08b48e0bSAndroid Build Coastguard Worker such. */
5031*08b48e0bSAndroid Build Coastguard Worker
5032*08b48e0bSAndroid Build Coastguard Worker if (!splice_cycle) {
5033*08b48e0bSAndroid Build Coastguard Worker
5034*08b48e0bSAndroid Build Coastguard Worker afl->stage_name = MOpt_globals.havoc_stagename;
5035*08b48e0bSAndroid Build Coastguard Worker afl->stage_short = MOpt_globals.havoc_stagenameshort;
5036*08b48e0bSAndroid Build Coastguard Worker afl->stage_max = (doing_det ? HAVOC_CYCLES_INIT : HAVOC_CYCLES) *
5037*08b48e0bSAndroid Build Coastguard Worker perf_score / afl->havoc_div / 100;
5038*08b48e0bSAndroid Build Coastguard Worker
5039*08b48e0bSAndroid Build Coastguard Worker } else {
5040*08b48e0bSAndroid Build Coastguard Worker
5041*08b48e0bSAndroid Build Coastguard Worker perf_score = orig_perf;
5042*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->stage_name_buf, STAGE_BUF_SIZE,
5043*08b48e0bSAndroid Build Coastguard Worker MOpt_globals.splice_stageformat, splice_cycle);
5044*08b48e0bSAndroid Build Coastguard Worker afl->stage_name = afl->stage_name_buf;
5045*08b48e0bSAndroid Build Coastguard Worker afl->stage_short = MOpt_globals.splice_stagenameshort;
5046*08b48e0bSAndroid Build Coastguard Worker afl->stage_max = SPLICE_HAVOC * perf_score / afl->havoc_div / 100;
5047*08b48e0bSAndroid Build Coastguard Worker
5048*08b48e0bSAndroid Build Coastguard Worker }
5049*08b48e0bSAndroid Build Coastguard Worker
5050*08b48e0bSAndroid Build Coastguard Worker if (afl->stage_max < HAVOC_MIN) { afl->stage_max = HAVOC_MIN; }
5051*08b48e0bSAndroid Build Coastguard Worker
5052*08b48e0bSAndroid Build Coastguard Worker temp_len = len;
5053*08b48e0bSAndroid Build Coastguard Worker
5054*08b48e0bSAndroid Build Coastguard Worker orig_hit_cnt = afl->queued_items + afl->saved_crashes;
5055*08b48e0bSAndroid Build Coastguard Worker
5056*08b48e0bSAndroid Build Coastguard Worker havoc_queued = afl->queued_items;
5057*08b48e0bSAndroid Build Coastguard Worker
5058*08b48e0bSAndroid Build Coastguard Worker u32 r_max, r;
5059*08b48e0bSAndroid Build Coastguard Worker
5060*08b48e0bSAndroid Build Coastguard Worker r_max = 16 + ((afl->extras_cnt + afl->a_extras_cnt) ? 2 : 0);
5061*08b48e0bSAndroid Build Coastguard Worker
5062*08b48e0bSAndroid Build Coastguard Worker if (unlikely(afl->expand_havoc && afl->ready_for_splicing_count > 1)) {
5063*08b48e0bSAndroid Build Coastguard Worker
5064*08b48e0bSAndroid Build Coastguard Worker /* add expensive havoc cases here, they are activated after a full
5065*08b48e0bSAndroid Build Coastguard Worker cycle without any finds happened */
5066*08b48e0bSAndroid Build Coastguard Worker
5067*08b48e0bSAndroid Build Coastguard Worker ++r_max;
5068*08b48e0bSAndroid Build Coastguard Worker
5069*08b48e0bSAndroid Build Coastguard Worker }
5070*08b48e0bSAndroid Build Coastguard Worker
5071*08b48e0bSAndroid Build Coastguard Worker for (afl->stage_cur = 0; afl->stage_cur < afl->stage_max;
5072*08b48e0bSAndroid Build Coastguard Worker ++afl->stage_cur) {
5073*08b48e0bSAndroid Build Coastguard Worker
5074*08b48e0bSAndroid Build Coastguard Worker u32 use_stacking = 1 << (1 + rand_below(afl, afl->havoc_stack_pow2));
5075*08b48e0bSAndroid Build Coastguard Worker
5076*08b48e0bSAndroid Build Coastguard Worker afl->stage_cur_val = use_stacking;
5077*08b48e0bSAndroid Build Coastguard Worker
5078*08b48e0bSAndroid Build Coastguard Worker for (i = 0; i < operator_num; ++i) {
5079*08b48e0bSAndroid Build Coastguard Worker
5080*08b48e0bSAndroid Build Coastguard Worker MOpt_globals.cycles_v3[i] = MOpt_globals.cycles_v2[i];
5081*08b48e0bSAndroid Build Coastguard Worker
5082*08b48e0bSAndroid Build Coastguard Worker }
5083*08b48e0bSAndroid Build Coastguard Worker
5084*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
5085*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->mutation, sizeof(afl->mutation), "%s MOPT_HAVOC-%u",
5086*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->fname, use_stacking);
5087*08b48e0bSAndroid Build Coastguard Worker #endif
5088*08b48e0bSAndroid Build Coastguard Worker
5089*08b48e0bSAndroid Build Coastguard Worker for (i = 0; i < use_stacking; ++i) {
5090*08b48e0bSAndroid Build Coastguard Worker
5091*08b48e0bSAndroid Build Coastguard Worker switch (r = (select_algorithm(afl, r_max))) {
5092*08b48e0bSAndroid Build Coastguard Worker
5093*08b48e0bSAndroid Build Coastguard Worker case 0:
5094*08b48e0bSAndroid Build Coastguard Worker /* Flip a single bit somewhere. Spooky! */
5095*08b48e0bSAndroid Build Coastguard Worker FLIP_BIT(out_buf, rand_below(afl, temp_len << 3));
5096*08b48e0bSAndroid Build Coastguard Worker MOpt_globals.cycles_v2[STAGE_FLIP1]++;
5097*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
5098*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " FLIP_BIT1");
5099*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
5100*08b48e0bSAndroid Build Coastguard Worker #endif
5101*08b48e0bSAndroid Build Coastguard Worker break;
5102*08b48e0bSAndroid Build Coastguard Worker
5103*08b48e0bSAndroid Build Coastguard Worker case 1:
5104*08b48e0bSAndroid Build Coastguard Worker if (temp_len < 2) { break; }
5105*08b48e0bSAndroid Build Coastguard Worker temp_len_puppet = rand_below(afl, (temp_len << 3) - 1);
5106*08b48e0bSAndroid Build Coastguard Worker FLIP_BIT(out_buf, temp_len_puppet);
5107*08b48e0bSAndroid Build Coastguard Worker FLIP_BIT(out_buf, temp_len_puppet + 1);
5108*08b48e0bSAndroid Build Coastguard Worker MOpt_globals.cycles_v2[STAGE_FLIP2]++;
5109*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
5110*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " FLIP_BIT2");
5111*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
5112*08b48e0bSAndroid Build Coastguard Worker #endif
5113*08b48e0bSAndroid Build Coastguard Worker break;
5114*08b48e0bSAndroid Build Coastguard Worker
5115*08b48e0bSAndroid Build Coastguard Worker case 2:
5116*08b48e0bSAndroid Build Coastguard Worker if (temp_len < 2) { break; }
5117*08b48e0bSAndroid Build Coastguard Worker temp_len_puppet = rand_below(afl, (temp_len << 3) - 3);
5118*08b48e0bSAndroid Build Coastguard Worker FLIP_BIT(out_buf, temp_len_puppet);
5119*08b48e0bSAndroid Build Coastguard Worker FLIP_BIT(out_buf, temp_len_puppet + 1);
5120*08b48e0bSAndroid Build Coastguard Worker FLIP_BIT(out_buf, temp_len_puppet + 2);
5121*08b48e0bSAndroid Build Coastguard Worker FLIP_BIT(out_buf, temp_len_puppet + 3);
5122*08b48e0bSAndroid Build Coastguard Worker MOpt_globals.cycles_v2[STAGE_FLIP4]++;
5123*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
5124*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " FLIP_BIT4");
5125*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
5126*08b48e0bSAndroid Build Coastguard Worker #endif
5127*08b48e0bSAndroid Build Coastguard Worker break;
5128*08b48e0bSAndroid Build Coastguard Worker
5129*08b48e0bSAndroid Build Coastguard Worker case 3:
5130*08b48e0bSAndroid Build Coastguard Worker if (temp_len < 4) { break; }
5131*08b48e0bSAndroid Build Coastguard Worker out_buf[rand_below(afl, temp_len)] ^= 0xFF;
5132*08b48e0bSAndroid Build Coastguard Worker MOpt_globals.cycles_v2[STAGE_FLIP8]++;
5133*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
5134*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " FLIP_BIT8");
5135*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
5136*08b48e0bSAndroid Build Coastguard Worker #endif
5137*08b48e0bSAndroid Build Coastguard Worker break;
5138*08b48e0bSAndroid Build Coastguard Worker
5139*08b48e0bSAndroid Build Coastguard Worker case 4:
5140*08b48e0bSAndroid Build Coastguard Worker if (temp_len < 8) { break; }
5141*08b48e0bSAndroid Build Coastguard Worker *(u16 *)(out_buf + rand_below(afl, temp_len - 1)) ^= 0xFFFF;
5142*08b48e0bSAndroid Build Coastguard Worker MOpt_globals.cycles_v2[STAGE_FLIP16]++;
5143*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
5144*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " FLIP_BIT16");
5145*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
5146*08b48e0bSAndroid Build Coastguard Worker #endif
5147*08b48e0bSAndroid Build Coastguard Worker break;
5148*08b48e0bSAndroid Build Coastguard Worker
5149*08b48e0bSAndroid Build Coastguard Worker case 5:
5150*08b48e0bSAndroid Build Coastguard Worker if (temp_len < 8) { break; }
5151*08b48e0bSAndroid Build Coastguard Worker *(u32 *)(out_buf + rand_below(afl, temp_len - 3)) ^= 0xFFFFFFFF;
5152*08b48e0bSAndroid Build Coastguard Worker MOpt_globals.cycles_v2[STAGE_FLIP32]++;
5153*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
5154*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " FLIP_BIT32");
5155*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
5156*08b48e0bSAndroid Build Coastguard Worker #endif
5157*08b48e0bSAndroid Build Coastguard Worker break;
5158*08b48e0bSAndroid Build Coastguard Worker
5159*08b48e0bSAndroid Build Coastguard Worker case 6:
5160*08b48e0bSAndroid Build Coastguard Worker out_buf[rand_below(afl, temp_len)] -=
5161*08b48e0bSAndroid Build Coastguard Worker 1 + rand_below(afl, ARITH_MAX);
5162*08b48e0bSAndroid Build Coastguard Worker out_buf[rand_below(afl, temp_len)] +=
5163*08b48e0bSAndroid Build Coastguard Worker 1 + rand_below(afl, ARITH_MAX);
5164*08b48e0bSAndroid Build Coastguard Worker MOpt_globals.cycles_v2[STAGE_ARITH8]++;
5165*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
5166*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " ARITH8");
5167*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
5168*08b48e0bSAndroid Build Coastguard Worker #endif
5169*08b48e0bSAndroid Build Coastguard Worker break;
5170*08b48e0bSAndroid Build Coastguard Worker
5171*08b48e0bSAndroid Build Coastguard Worker case 7:
5172*08b48e0bSAndroid Build Coastguard Worker /* Randomly subtract from word, random endian. */
5173*08b48e0bSAndroid Build Coastguard Worker if (temp_len < 8) { break; }
5174*08b48e0bSAndroid Build Coastguard Worker if (rand_below(afl, 2)) {
5175*08b48e0bSAndroid Build Coastguard Worker
5176*08b48e0bSAndroid Build Coastguard Worker u32 pos = rand_below(afl, temp_len - 1);
5177*08b48e0bSAndroid Build Coastguard Worker *(u16 *)(out_buf + pos) -= 1 + rand_below(afl, ARITH_MAX);
5178*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
5179*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " ARITH16-%u", pos);
5180*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
5181*08b48e0bSAndroid Build Coastguard Worker #endif
5182*08b48e0bSAndroid Build Coastguard Worker
5183*08b48e0bSAndroid Build Coastguard Worker } else {
5184*08b48e0bSAndroid Build Coastguard Worker
5185*08b48e0bSAndroid Build Coastguard Worker u32 pos = rand_below(afl, temp_len - 1);
5186*08b48e0bSAndroid Build Coastguard Worker u16 num = 1 + rand_below(afl, ARITH_MAX);
5187*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
5188*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " ARITH16BE-%u-%u",
5189*08b48e0bSAndroid Build Coastguard Worker pos, num);
5190*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
5191*08b48e0bSAndroid Build Coastguard Worker #endif
5192*08b48e0bSAndroid Build Coastguard Worker *(u16 *)(out_buf + pos) =
5193*08b48e0bSAndroid Build Coastguard Worker SWAP16(SWAP16(*(u16 *)(out_buf + pos)) - num);
5194*08b48e0bSAndroid Build Coastguard Worker
5195*08b48e0bSAndroid Build Coastguard Worker }
5196*08b48e0bSAndroid Build Coastguard Worker
5197*08b48e0bSAndroid Build Coastguard Worker /* Randomly add to word, random endian. */
5198*08b48e0bSAndroid Build Coastguard Worker if (rand_below(afl, 2)) {
5199*08b48e0bSAndroid Build Coastguard Worker
5200*08b48e0bSAndroid Build Coastguard Worker u32 pos = rand_below(afl, temp_len - 1);
5201*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
5202*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " ARITH16+-%u", pos);
5203*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
5204*08b48e0bSAndroid Build Coastguard Worker #endif
5205*08b48e0bSAndroid Build Coastguard Worker *(u16 *)(out_buf + pos) += 1 + rand_below(afl, ARITH_MAX);
5206*08b48e0bSAndroid Build Coastguard Worker
5207*08b48e0bSAndroid Build Coastguard Worker } else {
5208*08b48e0bSAndroid Build Coastguard Worker
5209*08b48e0bSAndroid Build Coastguard Worker u32 pos = rand_below(afl, temp_len - 1);
5210*08b48e0bSAndroid Build Coastguard Worker u16 num = 1 + rand_below(afl, ARITH_MAX);
5211*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
5212*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " ARITH16BE+-%u-%u",
5213*08b48e0bSAndroid Build Coastguard Worker pos, num);
5214*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
5215*08b48e0bSAndroid Build Coastguard Worker #endif
5216*08b48e0bSAndroid Build Coastguard Worker *(u16 *)(out_buf + pos) =
5217*08b48e0bSAndroid Build Coastguard Worker SWAP16(SWAP16(*(u16 *)(out_buf + pos)) + num);
5218*08b48e0bSAndroid Build Coastguard Worker
5219*08b48e0bSAndroid Build Coastguard Worker }
5220*08b48e0bSAndroid Build Coastguard Worker
5221*08b48e0bSAndroid Build Coastguard Worker MOpt_globals.cycles_v2[STAGE_ARITH16]++;
5222*08b48e0bSAndroid Build Coastguard Worker break;
5223*08b48e0bSAndroid Build Coastguard Worker
5224*08b48e0bSAndroid Build Coastguard Worker case 8:
5225*08b48e0bSAndroid Build Coastguard Worker /* Randomly subtract from dword, random endian. */
5226*08b48e0bSAndroid Build Coastguard Worker if (temp_len < 8) { break; }
5227*08b48e0bSAndroid Build Coastguard Worker if (rand_below(afl, 2)) {
5228*08b48e0bSAndroid Build Coastguard Worker
5229*08b48e0bSAndroid Build Coastguard Worker u32 pos = rand_below(afl, temp_len - 3);
5230*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
5231*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " ARITH32_-%u", pos);
5232*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
5233*08b48e0bSAndroid Build Coastguard Worker #endif
5234*08b48e0bSAndroid Build Coastguard Worker *(u32 *)(out_buf + pos) -= 1 + rand_below(afl, ARITH_MAX);
5235*08b48e0bSAndroid Build Coastguard Worker
5236*08b48e0bSAndroid Build Coastguard Worker } else {
5237*08b48e0bSAndroid Build Coastguard Worker
5238*08b48e0bSAndroid Build Coastguard Worker u32 pos = rand_below(afl, temp_len - 3);
5239*08b48e0bSAndroid Build Coastguard Worker u32 num = 1 + rand_below(afl, ARITH_MAX);
5240*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
5241*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " ARITH32BE_-%u-%u",
5242*08b48e0bSAndroid Build Coastguard Worker pos, num);
5243*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
5244*08b48e0bSAndroid Build Coastguard Worker #endif
5245*08b48e0bSAndroid Build Coastguard Worker *(u32 *)(out_buf + pos) =
5246*08b48e0bSAndroid Build Coastguard Worker SWAP32(SWAP32(*(u32 *)(out_buf + pos)) - num);
5247*08b48e0bSAndroid Build Coastguard Worker
5248*08b48e0bSAndroid Build Coastguard Worker }
5249*08b48e0bSAndroid Build Coastguard Worker
5250*08b48e0bSAndroid Build Coastguard Worker /* Randomly add to dword, random endian. */
5251*08b48e0bSAndroid Build Coastguard Worker // if (temp_len < 4) break;
5252*08b48e0bSAndroid Build Coastguard Worker if (rand_below(afl, 2)) {
5253*08b48e0bSAndroid Build Coastguard Worker
5254*08b48e0bSAndroid Build Coastguard Worker u32 pos = rand_below(afl, temp_len - 3);
5255*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
5256*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " ARITH32+-%u", pos);
5257*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
5258*08b48e0bSAndroid Build Coastguard Worker #endif
5259*08b48e0bSAndroid Build Coastguard Worker *(u32 *)(out_buf + pos) += 1 + rand_below(afl, ARITH_MAX);
5260*08b48e0bSAndroid Build Coastguard Worker
5261*08b48e0bSAndroid Build Coastguard Worker } else {
5262*08b48e0bSAndroid Build Coastguard Worker
5263*08b48e0bSAndroid Build Coastguard Worker u32 pos = rand_below(afl, temp_len - 3);
5264*08b48e0bSAndroid Build Coastguard Worker u32 num = 1 + rand_below(afl, ARITH_MAX);
5265*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
5266*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " ARITH32BE+-%u-%u",
5267*08b48e0bSAndroid Build Coastguard Worker pos, num);
5268*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
5269*08b48e0bSAndroid Build Coastguard Worker #endif
5270*08b48e0bSAndroid Build Coastguard Worker *(u32 *)(out_buf + pos) =
5271*08b48e0bSAndroid Build Coastguard Worker SWAP32(SWAP32(*(u32 *)(out_buf + pos)) + num);
5272*08b48e0bSAndroid Build Coastguard Worker
5273*08b48e0bSAndroid Build Coastguard Worker }
5274*08b48e0bSAndroid Build Coastguard Worker
5275*08b48e0bSAndroid Build Coastguard Worker MOpt_globals.cycles_v2[STAGE_ARITH32]++;
5276*08b48e0bSAndroid Build Coastguard Worker break;
5277*08b48e0bSAndroid Build Coastguard Worker
5278*08b48e0bSAndroid Build Coastguard Worker case 9:
5279*08b48e0bSAndroid Build Coastguard Worker /* Set byte to interesting value. */
5280*08b48e0bSAndroid Build Coastguard Worker if (temp_len < 4) { break; }
5281*08b48e0bSAndroid Build Coastguard Worker out_buf[rand_below(afl, temp_len)] =
5282*08b48e0bSAndroid Build Coastguard Worker interesting_8[rand_below(afl, sizeof(interesting_8))];
5283*08b48e0bSAndroid Build Coastguard Worker MOpt_globals.cycles_v2[STAGE_INTEREST8]++;
5284*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
5285*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " INTERESTING8");
5286*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
5287*08b48e0bSAndroid Build Coastguard Worker #endif
5288*08b48e0bSAndroid Build Coastguard Worker break;
5289*08b48e0bSAndroid Build Coastguard Worker
5290*08b48e0bSAndroid Build Coastguard Worker case 10:
5291*08b48e0bSAndroid Build Coastguard Worker /* Set word to interesting value, randomly choosing endian. */
5292*08b48e0bSAndroid Build Coastguard Worker if (temp_len < 8) { break; }
5293*08b48e0bSAndroid Build Coastguard Worker if (rand_below(afl, 2)) {
5294*08b48e0bSAndroid Build Coastguard Worker
5295*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
5296*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " INTERESTING16");
5297*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
5298*08b48e0bSAndroid Build Coastguard Worker #endif
5299*08b48e0bSAndroid Build Coastguard Worker *(u16 *)(out_buf + rand_below(afl, temp_len - 1)) =
5300*08b48e0bSAndroid Build Coastguard Worker interesting_16[rand_below(afl,
5301*08b48e0bSAndroid Build Coastguard Worker sizeof(interesting_16) >> 1)];
5302*08b48e0bSAndroid Build Coastguard Worker
5303*08b48e0bSAndroid Build Coastguard Worker } else {
5304*08b48e0bSAndroid Build Coastguard Worker
5305*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
5306*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " INTERESTING16BE");
5307*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
5308*08b48e0bSAndroid Build Coastguard Worker #endif
5309*08b48e0bSAndroid Build Coastguard Worker *(u16 *)(out_buf + rand_below(afl, temp_len - 1)) =
5310*08b48e0bSAndroid Build Coastguard Worker SWAP16(interesting_16[rand_below(
5311*08b48e0bSAndroid Build Coastguard Worker afl, sizeof(interesting_16) >> 1)]);
5312*08b48e0bSAndroid Build Coastguard Worker
5313*08b48e0bSAndroid Build Coastguard Worker }
5314*08b48e0bSAndroid Build Coastguard Worker
5315*08b48e0bSAndroid Build Coastguard Worker MOpt_globals.cycles_v2[STAGE_INTEREST16]++;
5316*08b48e0bSAndroid Build Coastguard Worker break;
5317*08b48e0bSAndroid Build Coastguard Worker
5318*08b48e0bSAndroid Build Coastguard Worker case 11:
5319*08b48e0bSAndroid Build Coastguard Worker /* Set dword to interesting value, randomly choosing endian. */
5320*08b48e0bSAndroid Build Coastguard Worker
5321*08b48e0bSAndroid Build Coastguard Worker if (temp_len < 8) { break; }
5322*08b48e0bSAndroid Build Coastguard Worker
5323*08b48e0bSAndroid Build Coastguard Worker if (rand_below(afl, 2)) {
5324*08b48e0bSAndroid Build Coastguard Worker
5325*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
5326*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " INTERESTING32");
5327*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
5328*08b48e0bSAndroid Build Coastguard Worker #endif
5329*08b48e0bSAndroid Build Coastguard Worker *(u32 *)(out_buf + rand_below(afl, temp_len - 3)) =
5330*08b48e0bSAndroid Build Coastguard Worker interesting_32[rand_below(afl,
5331*08b48e0bSAndroid Build Coastguard Worker sizeof(interesting_32) >> 2)];
5332*08b48e0bSAndroid Build Coastguard Worker
5333*08b48e0bSAndroid Build Coastguard Worker } else {
5334*08b48e0bSAndroid Build Coastguard Worker
5335*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
5336*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " INTERESTING32BE");
5337*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
5338*08b48e0bSAndroid Build Coastguard Worker #endif
5339*08b48e0bSAndroid Build Coastguard Worker *(u32 *)(out_buf + rand_below(afl, temp_len - 3)) =
5340*08b48e0bSAndroid Build Coastguard Worker SWAP32(interesting_32[rand_below(
5341*08b48e0bSAndroid Build Coastguard Worker afl, sizeof(interesting_32) >> 2)]);
5342*08b48e0bSAndroid Build Coastguard Worker
5343*08b48e0bSAndroid Build Coastguard Worker }
5344*08b48e0bSAndroid Build Coastguard Worker
5345*08b48e0bSAndroid Build Coastguard Worker MOpt_globals.cycles_v2[STAGE_INTEREST32]++;
5346*08b48e0bSAndroid Build Coastguard Worker break;
5347*08b48e0bSAndroid Build Coastguard Worker
5348*08b48e0bSAndroid Build Coastguard Worker case 12:
5349*08b48e0bSAndroid Build Coastguard Worker
5350*08b48e0bSAndroid Build Coastguard Worker /* Just set a random byte to a random value. Because,
5351*08b48e0bSAndroid Build Coastguard Worker why not. We use XOR with 1-255 to eliminate the
5352*08b48e0bSAndroid Build Coastguard Worker possibility of a no-op. */
5353*08b48e0bSAndroid Build Coastguard Worker
5354*08b48e0bSAndroid Build Coastguard Worker out_buf[rand_below(afl, temp_len)] ^= 1 + rand_below(afl, 255);
5355*08b48e0bSAndroid Build Coastguard Worker MOpt_globals.cycles_v2[STAGE_RANDOMBYTE]++;
5356*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
5357*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " RAND8");
5358*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
5359*08b48e0bSAndroid Build Coastguard Worker #endif
5360*08b48e0bSAndroid Build Coastguard Worker break;
5361*08b48e0bSAndroid Build Coastguard Worker
5362*08b48e0bSAndroid Build Coastguard Worker case 13: {
5363*08b48e0bSAndroid Build Coastguard Worker
5364*08b48e0bSAndroid Build Coastguard Worker /* Delete bytes. We're making this a bit more likely
5365*08b48e0bSAndroid Build Coastguard Worker than insertion (the next option) in hopes of keeping
5366*08b48e0bSAndroid Build Coastguard Worker files reasonably small. */
5367*08b48e0bSAndroid Build Coastguard Worker
5368*08b48e0bSAndroid Build Coastguard Worker u32 del_from, del_len;
5369*08b48e0bSAndroid Build Coastguard Worker
5370*08b48e0bSAndroid Build Coastguard Worker if (temp_len < 2) { break; }
5371*08b48e0bSAndroid Build Coastguard Worker
5372*08b48e0bSAndroid Build Coastguard Worker /* Don't delete too much. */
5373*08b48e0bSAndroid Build Coastguard Worker
5374*08b48e0bSAndroid Build Coastguard Worker del_len = choose_block_len(afl, temp_len - 1);
5375*08b48e0bSAndroid Build Coastguard Worker
5376*08b48e0bSAndroid Build Coastguard Worker del_from = rand_below(afl, temp_len - del_len + 1);
5377*08b48e0bSAndroid Build Coastguard Worker
5378*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
5379*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " DEL-%u%u", del_from,
5380*08b48e0bSAndroid Build Coastguard Worker del_len);
5381*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
5382*08b48e0bSAndroid Build Coastguard Worker #endif
5383*08b48e0bSAndroid Build Coastguard Worker memmove(out_buf + del_from, out_buf + del_from + del_len,
5384*08b48e0bSAndroid Build Coastguard Worker temp_len - del_from - del_len);
5385*08b48e0bSAndroid Build Coastguard Worker
5386*08b48e0bSAndroid Build Coastguard Worker temp_len -= del_len;
5387*08b48e0bSAndroid Build Coastguard Worker MOpt_globals.cycles_v2[STAGE_DELETEBYTE]++;
5388*08b48e0bSAndroid Build Coastguard Worker break;
5389*08b48e0bSAndroid Build Coastguard Worker
5390*08b48e0bSAndroid Build Coastguard Worker }
5391*08b48e0bSAndroid Build Coastguard Worker
5392*08b48e0bSAndroid Build Coastguard Worker case 14:
5393*08b48e0bSAndroid Build Coastguard Worker
5394*08b48e0bSAndroid Build Coastguard Worker if (temp_len + HAVOC_BLK_XL < MAX_FILE) {
5395*08b48e0bSAndroid Build Coastguard Worker
5396*08b48e0bSAndroid Build Coastguard Worker /* Clone bytes (75%) or insert a block of constant bytes (25%).
5397*08b48e0bSAndroid Build Coastguard Worker */
5398*08b48e0bSAndroid Build Coastguard Worker
5399*08b48e0bSAndroid Build Coastguard Worker u8 actually_clone = rand_below(afl, 4);
5400*08b48e0bSAndroid Build Coastguard Worker u32 clone_from, clone_to, clone_len;
5401*08b48e0bSAndroid Build Coastguard Worker u8 *new_buf;
5402*08b48e0bSAndroid Build Coastguard Worker
5403*08b48e0bSAndroid Build Coastguard Worker if (likely(actually_clone)) {
5404*08b48e0bSAndroid Build Coastguard Worker
5405*08b48e0bSAndroid Build Coastguard Worker clone_len = choose_block_len(afl, temp_len);
5406*08b48e0bSAndroid Build Coastguard Worker clone_from = rand_below(afl, temp_len - clone_len + 1);
5407*08b48e0bSAndroid Build Coastguard Worker
5408*08b48e0bSAndroid Build Coastguard Worker } else {
5409*08b48e0bSAndroid Build Coastguard Worker
5410*08b48e0bSAndroid Build Coastguard Worker clone_len = choose_block_len(afl, HAVOC_BLK_XL);
5411*08b48e0bSAndroid Build Coastguard Worker clone_from = 0;
5412*08b48e0bSAndroid Build Coastguard Worker
5413*08b48e0bSAndroid Build Coastguard Worker }
5414*08b48e0bSAndroid Build Coastguard Worker
5415*08b48e0bSAndroid Build Coastguard Worker clone_to = rand_below(afl, temp_len);
5416*08b48e0bSAndroid Build Coastguard Worker
5417*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
5418*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp), " CLONE_%s-%u-%u-%u",
5419*08b48e0bSAndroid Build Coastguard Worker actually_clone ? "clone" : "insert", clone_from,
5420*08b48e0bSAndroid Build Coastguard Worker clone_to, clone_len);
5421*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
5422*08b48e0bSAndroid Build Coastguard Worker #endif
5423*08b48e0bSAndroid Build Coastguard Worker new_buf = afl_realloc(AFL_BUF_PARAM(out_scratch),
5424*08b48e0bSAndroid Build Coastguard Worker temp_len + clone_len);
5425*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!new_buf)) { PFATAL("alloc"); }
5426*08b48e0bSAndroid Build Coastguard Worker
5427*08b48e0bSAndroid Build Coastguard Worker /* Head */
5428*08b48e0bSAndroid Build Coastguard Worker
5429*08b48e0bSAndroid Build Coastguard Worker memcpy(new_buf, out_buf, clone_to);
5430*08b48e0bSAndroid Build Coastguard Worker
5431*08b48e0bSAndroid Build Coastguard Worker /* Inserted part */
5432*08b48e0bSAndroid Build Coastguard Worker
5433*08b48e0bSAndroid Build Coastguard Worker if (actually_clone) {
5434*08b48e0bSAndroid Build Coastguard Worker
5435*08b48e0bSAndroid Build Coastguard Worker memcpy(new_buf + clone_to, out_buf + clone_from, clone_len);
5436*08b48e0bSAndroid Build Coastguard Worker
5437*08b48e0bSAndroid Build Coastguard Worker } else {
5438*08b48e0bSAndroid Build Coastguard Worker
5439*08b48e0bSAndroid Build Coastguard Worker memset(new_buf + clone_to,
5440*08b48e0bSAndroid Build Coastguard Worker rand_below(afl, 2)
5441*08b48e0bSAndroid Build Coastguard Worker ? rand_below(afl, 256)
5442*08b48e0bSAndroid Build Coastguard Worker : out_buf[rand_below(afl, temp_len)],
5443*08b48e0bSAndroid Build Coastguard Worker clone_len);
5444*08b48e0bSAndroid Build Coastguard Worker
5445*08b48e0bSAndroid Build Coastguard Worker }
5446*08b48e0bSAndroid Build Coastguard Worker
5447*08b48e0bSAndroid Build Coastguard Worker /* Tail */
5448*08b48e0bSAndroid Build Coastguard Worker memcpy(new_buf + clone_to + clone_len, out_buf + clone_to,
5449*08b48e0bSAndroid Build Coastguard Worker temp_len - clone_to);
5450*08b48e0bSAndroid Build Coastguard Worker
5451*08b48e0bSAndroid Build Coastguard Worker out_buf = new_buf;
5452*08b48e0bSAndroid Build Coastguard Worker afl_swap_bufs(AFL_BUF_PARAM(out), AFL_BUF_PARAM(out_scratch));
5453*08b48e0bSAndroid Build Coastguard Worker temp_len += clone_len;
5454*08b48e0bSAndroid Build Coastguard Worker MOpt_globals.cycles_v2[STAGE_Clone75]++;
5455*08b48e0bSAndroid Build Coastguard Worker
5456*08b48e0bSAndroid Build Coastguard Worker }
5457*08b48e0bSAndroid Build Coastguard Worker
5458*08b48e0bSAndroid Build Coastguard Worker break;
5459*08b48e0bSAndroid Build Coastguard Worker
5460*08b48e0bSAndroid Build Coastguard Worker case 15: {
5461*08b48e0bSAndroid Build Coastguard Worker
5462*08b48e0bSAndroid Build Coastguard Worker /* Overwrite bytes with a randomly selected chunk (75%) or fixed
5463*08b48e0bSAndroid Build Coastguard Worker bytes (25%). */
5464*08b48e0bSAndroid Build Coastguard Worker
5465*08b48e0bSAndroid Build Coastguard Worker u32 copy_from, copy_to, copy_len;
5466*08b48e0bSAndroid Build Coastguard Worker
5467*08b48e0bSAndroid Build Coastguard Worker if (temp_len < 2) { break; }
5468*08b48e0bSAndroid Build Coastguard Worker
5469*08b48e0bSAndroid Build Coastguard Worker copy_len = choose_block_len(afl, temp_len - 1);
5470*08b48e0bSAndroid Build Coastguard Worker
5471*08b48e0bSAndroid Build Coastguard Worker copy_from = rand_below(afl, temp_len - copy_len + 1);
5472*08b48e0bSAndroid Build Coastguard Worker copy_to = rand_below(afl, temp_len - copy_len + 1);
5473*08b48e0bSAndroid Build Coastguard Worker
5474*08b48e0bSAndroid Build Coastguard Worker if (likely(rand_below(afl, 4))) {
5475*08b48e0bSAndroid Build Coastguard Worker
5476*08b48e0bSAndroid Build Coastguard Worker if (likely(copy_from != copy_to)) {
5477*08b48e0bSAndroid Build Coastguard Worker
5478*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
5479*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp),
5480*08b48e0bSAndroid Build Coastguard Worker " OVERWRITE_COPY-%u-%u-%u", copy_from, copy_to,
5481*08b48e0bSAndroid Build Coastguard Worker copy_len);
5482*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
5483*08b48e0bSAndroid Build Coastguard Worker #endif
5484*08b48e0bSAndroid Build Coastguard Worker memmove(out_buf + copy_to, out_buf + copy_from, copy_len);
5485*08b48e0bSAndroid Build Coastguard Worker
5486*08b48e0bSAndroid Build Coastguard Worker }
5487*08b48e0bSAndroid Build Coastguard Worker
5488*08b48e0bSAndroid Build Coastguard Worker } else {
5489*08b48e0bSAndroid Build Coastguard Worker
5490*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
5491*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp),
5492*08b48e0bSAndroid Build Coastguard Worker " OVERWRITE_FIXED-%u-%u-%u", copy_from, copy_to,
5493*08b48e0bSAndroid Build Coastguard Worker copy_len);
5494*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
5495*08b48e0bSAndroid Build Coastguard Worker #endif
5496*08b48e0bSAndroid Build Coastguard Worker memset(out_buf + copy_to,
5497*08b48e0bSAndroid Build Coastguard Worker rand_below(afl, 2) ? rand_below(afl, 256)
5498*08b48e0bSAndroid Build Coastguard Worker : out_buf[rand_below(afl, temp_len)],
5499*08b48e0bSAndroid Build Coastguard Worker copy_len);
5500*08b48e0bSAndroid Build Coastguard Worker
5501*08b48e0bSAndroid Build Coastguard Worker }
5502*08b48e0bSAndroid Build Coastguard Worker
5503*08b48e0bSAndroid Build Coastguard Worker MOpt_globals.cycles_v2[STAGE_OverWrite75]++;
5504*08b48e0bSAndroid Build Coastguard Worker break;
5505*08b48e0bSAndroid Build Coastguard Worker
5506*08b48e0bSAndroid Build Coastguard Worker } /* case 15 */
5507*08b48e0bSAndroid Build Coastguard Worker
5508*08b48e0bSAndroid Build Coastguard Worker default: {
5509*08b48e0bSAndroid Build Coastguard Worker
5510*08b48e0bSAndroid Build Coastguard Worker /* Values 16 and 17 can be selected only if there are any extras
5511*08b48e0bSAndroid Build Coastguard Worker present in the dictionaries. */
5512*08b48e0bSAndroid Build Coastguard Worker
5513*08b48e0bSAndroid Build Coastguard Worker r -= 16;
5514*08b48e0bSAndroid Build Coastguard Worker
5515*08b48e0bSAndroid Build Coastguard Worker if (r == 0 && (afl->extras_cnt || afl->a_extras_cnt)) {
5516*08b48e0bSAndroid Build Coastguard Worker
5517*08b48e0bSAndroid Build Coastguard Worker /* Overwrite bytes with an extra. */
5518*08b48e0bSAndroid Build Coastguard Worker
5519*08b48e0bSAndroid Build Coastguard Worker if (!afl->extras_cnt ||
5520*08b48e0bSAndroid Build Coastguard Worker (afl->a_extras_cnt && rand_below(afl, 2))) {
5521*08b48e0bSAndroid Build Coastguard Worker
5522*08b48e0bSAndroid Build Coastguard Worker /* No user-specified extras or odds in our favor. Let's use an
5523*08b48e0bSAndroid Build Coastguard Worker auto-detected one. */
5524*08b48e0bSAndroid Build Coastguard Worker
5525*08b48e0bSAndroid Build Coastguard Worker u32 use_extra = rand_below(afl, afl->a_extras_cnt);
5526*08b48e0bSAndroid Build Coastguard Worker u32 extra_len = afl->a_extras[use_extra].len;
5527*08b48e0bSAndroid Build Coastguard Worker
5528*08b48e0bSAndroid Build Coastguard Worker if (extra_len > (u32)temp_len) break;
5529*08b48e0bSAndroid Build Coastguard Worker
5530*08b48e0bSAndroid Build Coastguard Worker u32 insert_at = rand_below(afl, temp_len - extra_len + 1);
5531*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
5532*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp),
5533*08b48e0bSAndroid Build Coastguard Worker " AUTO_EXTRA_OVERWRITE-%u-%u", insert_at, extra_len);
5534*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
5535*08b48e0bSAndroid Build Coastguard Worker #endif
5536*08b48e0bSAndroid Build Coastguard Worker memcpy(out_buf + insert_at, afl->a_extras[use_extra].data,
5537*08b48e0bSAndroid Build Coastguard Worker extra_len);
5538*08b48e0bSAndroid Build Coastguard Worker
5539*08b48e0bSAndroid Build Coastguard Worker } else {
5540*08b48e0bSAndroid Build Coastguard Worker
5541*08b48e0bSAndroid Build Coastguard Worker /* No auto extras or odds in our favor. Use the dictionary. */
5542*08b48e0bSAndroid Build Coastguard Worker
5543*08b48e0bSAndroid Build Coastguard Worker u32 use_extra = rand_below(afl, afl->extras_cnt);
5544*08b48e0bSAndroid Build Coastguard Worker u32 extra_len = afl->extras[use_extra].len;
5545*08b48e0bSAndroid Build Coastguard Worker
5546*08b48e0bSAndroid Build Coastguard Worker if (extra_len > (u32)temp_len) break;
5547*08b48e0bSAndroid Build Coastguard Worker
5548*08b48e0bSAndroid Build Coastguard Worker u32 insert_at = rand_below(afl, temp_len - extra_len + 1);
5549*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
5550*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp),
5551*08b48e0bSAndroid Build Coastguard Worker " EXTRA_OVERWRITE-%u-%u", insert_at, extra_len);
5552*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
5553*08b48e0bSAndroid Build Coastguard Worker #endif
5554*08b48e0bSAndroid Build Coastguard Worker memcpy(out_buf + insert_at, afl->extras[use_extra].data,
5555*08b48e0bSAndroid Build Coastguard Worker extra_len);
5556*08b48e0bSAndroid Build Coastguard Worker
5557*08b48e0bSAndroid Build Coastguard Worker }
5558*08b48e0bSAndroid Build Coastguard Worker
5559*08b48e0bSAndroid Build Coastguard Worker MOpt_globals.cycles_v2[STAGE_OverWriteExtra]++;
5560*08b48e0bSAndroid Build Coastguard Worker
5561*08b48e0bSAndroid Build Coastguard Worker break;
5562*08b48e0bSAndroid Build Coastguard Worker
5563*08b48e0bSAndroid Build Coastguard Worker }
5564*08b48e0bSAndroid Build Coastguard Worker
5565*08b48e0bSAndroid Build Coastguard Worker /* Insert an extra. */
5566*08b48e0bSAndroid Build Coastguard Worker
5567*08b48e0bSAndroid Build Coastguard Worker else if (r == 1 && (afl->extras_cnt || afl->a_extras_cnt)) {
5568*08b48e0bSAndroid Build Coastguard Worker
5569*08b48e0bSAndroid Build Coastguard Worker u32 use_extra, extra_len,
5570*08b48e0bSAndroid Build Coastguard Worker insert_at = rand_below(afl, temp_len + 1);
5571*08b48e0bSAndroid Build Coastguard Worker u8 *ptr;
5572*08b48e0bSAndroid Build Coastguard Worker
5573*08b48e0bSAndroid Build Coastguard Worker /* Insert an extra. Do the same dice-rolling stuff as for the
5574*08b48e0bSAndroid Build Coastguard Worker previous case. */
5575*08b48e0bSAndroid Build Coastguard Worker
5576*08b48e0bSAndroid Build Coastguard Worker if (!afl->extras_cnt ||
5577*08b48e0bSAndroid Build Coastguard Worker (afl->a_extras_cnt && rand_below(afl, 2))) {
5578*08b48e0bSAndroid Build Coastguard Worker
5579*08b48e0bSAndroid Build Coastguard Worker use_extra = rand_below(afl, afl->a_extras_cnt);
5580*08b48e0bSAndroid Build Coastguard Worker extra_len = afl->a_extras[use_extra].len;
5581*08b48e0bSAndroid Build Coastguard Worker ptr = afl->a_extras[use_extra].data;
5582*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
5583*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp),
5584*08b48e0bSAndroid Build Coastguard Worker " AUTO_EXTRA_INSERT-%u-%u", insert_at, extra_len);
5585*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
5586*08b48e0bSAndroid Build Coastguard Worker #endif
5587*08b48e0bSAndroid Build Coastguard Worker
5588*08b48e0bSAndroid Build Coastguard Worker } else {
5589*08b48e0bSAndroid Build Coastguard Worker
5590*08b48e0bSAndroid Build Coastguard Worker use_extra = rand_below(afl, afl->extras_cnt);
5591*08b48e0bSAndroid Build Coastguard Worker extra_len = afl->extras[use_extra].len;
5592*08b48e0bSAndroid Build Coastguard Worker ptr = afl->extras[use_extra].data;
5593*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
5594*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp),
5595*08b48e0bSAndroid Build Coastguard Worker " EXTRA_INSERT-%u-%u", insert_at, extra_len);
5596*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
5597*08b48e0bSAndroid Build Coastguard Worker #endif
5598*08b48e0bSAndroid Build Coastguard Worker
5599*08b48e0bSAndroid Build Coastguard Worker }
5600*08b48e0bSAndroid Build Coastguard Worker
5601*08b48e0bSAndroid Build Coastguard Worker if (temp_len + extra_len >= MAX_FILE) break;
5602*08b48e0bSAndroid Build Coastguard Worker
5603*08b48e0bSAndroid Build Coastguard Worker out_buf = afl_realloc(AFL_BUF_PARAM(out), temp_len + extra_len);
5604*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!out_buf)) { PFATAL("alloc"); }
5605*08b48e0bSAndroid Build Coastguard Worker
5606*08b48e0bSAndroid Build Coastguard Worker /* Tail */
5607*08b48e0bSAndroid Build Coastguard Worker memmove(out_buf + insert_at + extra_len, out_buf + insert_at,
5608*08b48e0bSAndroid Build Coastguard Worker temp_len - insert_at);
5609*08b48e0bSAndroid Build Coastguard Worker
5610*08b48e0bSAndroid Build Coastguard Worker /* Inserted part */
5611*08b48e0bSAndroid Build Coastguard Worker memcpy(out_buf + insert_at, ptr, extra_len);
5612*08b48e0bSAndroid Build Coastguard Worker
5613*08b48e0bSAndroid Build Coastguard Worker temp_len += extra_len;
5614*08b48e0bSAndroid Build Coastguard Worker MOpt_globals.cycles_v2[STAGE_InsertExtra]++;
5615*08b48e0bSAndroid Build Coastguard Worker break;
5616*08b48e0bSAndroid Build Coastguard Worker
5617*08b48e0bSAndroid Build Coastguard Worker } else {
5618*08b48e0bSAndroid Build Coastguard Worker
5619*08b48e0bSAndroid Build Coastguard Worker if (unlikely(afl->ready_for_splicing_count < 2)) break;
5620*08b48e0bSAndroid Build Coastguard Worker
5621*08b48e0bSAndroid Build Coastguard Worker u32 tid;
5622*08b48e0bSAndroid Build Coastguard Worker do {
5623*08b48e0bSAndroid Build Coastguard Worker
5624*08b48e0bSAndroid Build Coastguard Worker tid = rand_below(afl, afl->queued_items);
5625*08b48e0bSAndroid Build Coastguard Worker
5626*08b48e0bSAndroid Build Coastguard Worker } while (tid == afl->current_entry ||
5627*08b48e0bSAndroid Build Coastguard Worker
5628*08b48e0bSAndroid Build Coastguard Worker afl->queue_buf[tid]->len < 4);
5629*08b48e0bSAndroid Build Coastguard Worker
5630*08b48e0bSAndroid Build Coastguard Worker /* Get the testcase for splicing. */
5631*08b48e0bSAndroid Build Coastguard Worker struct queue_entry *target = afl->queue_buf[tid];
5632*08b48e0bSAndroid Build Coastguard Worker u32 new_len = target->len;
5633*08b48e0bSAndroid Build Coastguard Worker u8 *new_buf = queue_testcase_get(afl, target);
5634*08b48e0bSAndroid Build Coastguard Worker
5635*08b48e0bSAndroid Build Coastguard Worker if ((temp_len >= 2 && rand_below(afl, 2)) ||
5636*08b48e0bSAndroid Build Coastguard Worker temp_len + HAVOC_BLK_XL >= MAX_FILE) {
5637*08b48e0bSAndroid Build Coastguard Worker
5638*08b48e0bSAndroid Build Coastguard Worker /* overwrite mode */
5639*08b48e0bSAndroid Build Coastguard Worker
5640*08b48e0bSAndroid Build Coastguard Worker u32 copy_from, copy_to, copy_len;
5641*08b48e0bSAndroid Build Coastguard Worker
5642*08b48e0bSAndroid Build Coastguard Worker copy_len = choose_block_len(afl, new_len - 1);
5643*08b48e0bSAndroid Build Coastguard Worker if (copy_len > temp_len) copy_len = temp_len;
5644*08b48e0bSAndroid Build Coastguard Worker
5645*08b48e0bSAndroid Build Coastguard Worker copy_from = rand_below(afl, new_len - copy_len + 1);
5646*08b48e0bSAndroid Build Coastguard Worker copy_to = rand_below(afl, temp_len - copy_len + 1);
5647*08b48e0bSAndroid Build Coastguard Worker
5648*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
5649*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp),
5650*08b48e0bSAndroid Build Coastguard Worker " SPLICE_OVERWRITE-%u-%u-%u-%s", copy_from, copy_to,
5651*08b48e0bSAndroid Build Coastguard Worker copy_len, target->fname);
5652*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
5653*08b48e0bSAndroid Build Coastguard Worker #endif
5654*08b48e0bSAndroid Build Coastguard Worker memmove(out_buf + copy_to, new_buf + copy_from, copy_len);
5655*08b48e0bSAndroid Build Coastguard Worker
5656*08b48e0bSAndroid Build Coastguard Worker } else {
5657*08b48e0bSAndroid Build Coastguard Worker
5658*08b48e0bSAndroid Build Coastguard Worker /* insert mode */
5659*08b48e0bSAndroid Build Coastguard Worker
5660*08b48e0bSAndroid Build Coastguard Worker u32 clone_from, clone_to, clone_len;
5661*08b48e0bSAndroid Build Coastguard Worker
5662*08b48e0bSAndroid Build Coastguard Worker clone_len = choose_block_len(afl, new_len);
5663*08b48e0bSAndroid Build Coastguard Worker clone_from = rand_below(afl, new_len - clone_len + 1);
5664*08b48e0bSAndroid Build Coastguard Worker clone_to = rand_below(afl, temp_len + 1);
5665*08b48e0bSAndroid Build Coastguard Worker
5666*08b48e0bSAndroid Build Coastguard Worker u8 *temp_buf = afl_realloc(AFL_BUF_PARAM(out_scratch),
5667*08b48e0bSAndroid Build Coastguard Worker temp_len + clone_len + 1);
5668*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!temp_buf)) { PFATAL("alloc"); }
5669*08b48e0bSAndroid Build Coastguard Worker
5670*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
5671*08b48e0bSAndroid Build Coastguard Worker snprintf(afl->m_tmp, sizeof(afl->m_tmp),
5672*08b48e0bSAndroid Build Coastguard Worker " SPLICE_INSERT-%u-%u-%u-%s", clone_from, clone_to,
5673*08b48e0bSAndroid Build Coastguard Worker clone_len, target->fname);
5674*08b48e0bSAndroid Build Coastguard Worker strcat(afl->mutation, afl->m_tmp);
5675*08b48e0bSAndroid Build Coastguard Worker #endif
5676*08b48e0bSAndroid Build Coastguard Worker /* Head */
5677*08b48e0bSAndroid Build Coastguard Worker
5678*08b48e0bSAndroid Build Coastguard Worker memcpy(temp_buf, out_buf, clone_to);
5679*08b48e0bSAndroid Build Coastguard Worker
5680*08b48e0bSAndroid Build Coastguard Worker /* Inserted part */
5681*08b48e0bSAndroid Build Coastguard Worker
5682*08b48e0bSAndroid Build Coastguard Worker memcpy(temp_buf + clone_to, new_buf + clone_from, clone_len);
5683*08b48e0bSAndroid Build Coastguard Worker
5684*08b48e0bSAndroid Build Coastguard Worker /* Tail */
5685*08b48e0bSAndroid Build Coastguard Worker memcpy(temp_buf + clone_to + clone_len, out_buf + clone_to,
5686*08b48e0bSAndroid Build Coastguard Worker temp_len - clone_to);
5687*08b48e0bSAndroid Build Coastguard Worker
5688*08b48e0bSAndroid Build Coastguard Worker out_buf = temp_buf;
5689*08b48e0bSAndroid Build Coastguard Worker afl_swap_bufs(AFL_BUF_PARAM(out), AFL_BUF_PARAM(out_scratch));
5690*08b48e0bSAndroid Build Coastguard Worker temp_len += clone_len;
5691*08b48e0bSAndroid Build Coastguard Worker
5692*08b48e0bSAndroid Build Coastguard Worker }
5693*08b48e0bSAndroid Build Coastguard Worker
5694*08b48e0bSAndroid Build Coastguard Worker MOpt_globals.cycles_v2[STAGE_Splice]++;
5695*08b48e0bSAndroid Build Coastguard Worker break;
5696*08b48e0bSAndroid Build Coastguard Worker
5697*08b48e0bSAndroid Build Coastguard Worker }
5698*08b48e0bSAndroid Build Coastguard Worker
5699*08b48e0bSAndroid Build Coastguard Worker } // end of default:
5700*08b48e0bSAndroid Build Coastguard Worker
5701*08b48e0bSAndroid Build Coastguard Worker } /* switch select_algorithm() */
5702*08b48e0bSAndroid Build Coastguard Worker
5703*08b48e0bSAndroid Build Coastguard Worker } /* for i=0; i < use_stacking */
5704*08b48e0bSAndroid Build Coastguard Worker
5705*08b48e0bSAndroid Build Coastguard Worker ++*MOpt_globals.pTime;
5706*08b48e0bSAndroid Build Coastguard Worker
5707*08b48e0bSAndroid Build Coastguard Worker u64 temp_total_found = afl->queued_items + afl->saved_crashes;
5708*08b48e0bSAndroid Build Coastguard Worker
5709*08b48e0bSAndroid Build Coastguard Worker if (common_fuzz_stuff(afl, out_buf, temp_len)) {
5710*08b48e0bSAndroid Build Coastguard Worker
5711*08b48e0bSAndroid Build Coastguard Worker goto abandon_entry_puppet;
5712*08b48e0bSAndroid Build Coastguard Worker
5713*08b48e0bSAndroid Build Coastguard Worker }
5714*08b48e0bSAndroid Build Coastguard Worker
5715*08b48e0bSAndroid Build Coastguard Worker /* out_buf might have been mangled a bit, so let's restore it to its
5716*08b48e0bSAndroid Build Coastguard Worker original size and shape. */
5717*08b48e0bSAndroid Build Coastguard Worker
5718*08b48e0bSAndroid Build Coastguard Worker out_buf = afl_realloc(AFL_BUF_PARAM(out), len);
5719*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!out_buf)) { PFATAL("alloc"); }
5720*08b48e0bSAndroid Build Coastguard Worker temp_len = len;
5721*08b48e0bSAndroid Build Coastguard Worker memcpy(out_buf, in_buf, len);
5722*08b48e0bSAndroid Build Coastguard Worker
5723*08b48e0bSAndroid Build Coastguard Worker /* If we're finding new stuff, let's run for a bit longer, limits
5724*08b48e0bSAndroid Build Coastguard Worker permitting. */
5725*08b48e0bSAndroid Build Coastguard Worker
5726*08b48e0bSAndroid Build Coastguard Worker if (afl->queued_items != havoc_queued) {
5727*08b48e0bSAndroid Build Coastguard Worker
5728*08b48e0bSAndroid Build Coastguard Worker if (perf_score <= afl->havoc_max_mult * 100) {
5729*08b48e0bSAndroid Build Coastguard Worker
5730*08b48e0bSAndroid Build Coastguard Worker afl->stage_max *= 2;
5731*08b48e0bSAndroid Build Coastguard Worker perf_score *= 2;
5732*08b48e0bSAndroid Build Coastguard Worker
5733*08b48e0bSAndroid Build Coastguard Worker }
5734*08b48e0bSAndroid Build Coastguard Worker
5735*08b48e0bSAndroid Build Coastguard Worker havoc_queued = afl->queued_items;
5736*08b48e0bSAndroid Build Coastguard Worker
5737*08b48e0bSAndroid Build Coastguard Worker }
5738*08b48e0bSAndroid Build Coastguard Worker
5739*08b48e0bSAndroid Build Coastguard Worker if (unlikely(afl->queued_items + afl->saved_crashes >
5740*08b48e0bSAndroid Build Coastguard Worker temp_total_found)) {
5741*08b48e0bSAndroid Build Coastguard Worker
5742*08b48e0bSAndroid Build Coastguard Worker u64 temp_temp_puppet =
5743*08b48e0bSAndroid Build Coastguard Worker afl->queued_items + afl->saved_crashes - temp_total_found;
5744*08b48e0bSAndroid Build Coastguard Worker afl->total_puppet_find = afl->total_puppet_find + temp_temp_puppet;
5745*08b48e0bSAndroid Build Coastguard Worker
5746*08b48e0bSAndroid Build Coastguard Worker if (MOpt_globals.is_pilot_mode) {
5747*08b48e0bSAndroid Build Coastguard Worker
5748*08b48e0bSAndroid Build Coastguard Worker for (i = 0; i < operator_num; ++i) {
5749*08b48e0bSAndroid Build Coastguard Worker
5750*08b48e0bSAndroid Build Coastguard Worker if (MOpt_globals.cycles_v2[i] > MOpt_globals.cycles_v3[i]) {
5751*08b48e0bSAndroid Build Coastguard Worker
5752*08b48e0bSAndroid Build Coastguard Worker MOpt_globals.finds_v2[i] += temp_temp_puppet;
5753*08b48e0bSAndroid Build Coastguard Worker
5754*08b48e0bSAndroid Build Coastguard Worker }
5755*08b48e0bSAndroid Build Coastguard Worker
5756*08b48e0bSAndroid Build Coastguard Worker }
5757*08b48e0bSAndroid Build Coastguard Worker
5758*08b48e0bSAndroid Build Coastguard Worker } else {
5759*08b48e0bSAndroid Build Coastguard Worker
5760*08b48e0bSAndroid Build Coastguard Worker for (i = 0; i < operator_num; i++) {
5761*08b48e0bSAndroid Build Coastguard Worker
5762*08b48e0bSAndroid Build Coastguard Worker if (afl->core_operator_cycles_puppet_v2[i] >
5763*08b48e0bSAndroid Build Coastguard Worker afl->core_operator_cycles_puppet_v3[i])
5764*08b48e0bSAndroid Build Coastguard Worker
5765*08b48e0bSAndroid Build Coastguard Worker afl->core_operator_finds_puppet_v2[i] += temp_temp_puppet;
5766*08b48e0bSAndroid Build Coastguard Worker
5767*08b48e0bSAndroid Build Coastguard Worker }
5768*08b48e0bSAndroid Build Coastguard Worker
5769*08b48e0bSAndroid Build Coastguard Worker }
5770*08b48e0bSAndroid Build Coastguard Worker
5771*08b48e0bSAndroid Build Coastguard Worker } /* if */
5772*08b48e0bSAndroid Build Coastguard Worker
5773*08b48e0bSAndroid Build Coastguard Worker } /* for (afl->stage_cur = 0; afl->stage_cur < afl->stage_max;
5774*08b48e0bSAndroid Build Coastguard Worker
5775*08b48e0bSAndroid Build Coastguard Worker ++afl->stage_cur) { */
5776*08b48e0bSAndroid Build Coastguard Worker
5777*08b48e0bSAndroid Build Coastguard Worker new_hit_cnt = afl->queued_items + afl->saved_crashes;
5778*08b48e0bSAndroid Build Coastguard Worker
5779*08b48e0bSAndroid Build Coastguard Worker if (MOpt_globals.is_pilot_mode) {
5780*08b48e0bSAndroid Build Coastguard Worker
5781*08b48e0bSAndroid Build Coastguard Worker if (!splice_cycle) {
5782*08b48e0bSAndroid Build Coastguard Worker
5783*08b48e0bSAndroid Build Coastguard Worker afl->stage_finds[STAGE_HAVOC] += new_hit_cnt - orig_hit_cnt;
5784*08b48e0bSAndroid Build Coastguard Worker afl->stage_cycles[STAGE_HAVOC] += afl->stage_max;
5785*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
5786*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->stats_mutated += afl->stage_max;
5787*08b48e0bSAndroid Build Coastguard Worker #endif
5788*08b48e0bSAndroid Build Coastguard Worker
5789*08b48e0bSAndroid Build Coastguard Worker } else {
5790*08b48e0bSAndroid Build Coastguard Worker
5791*08b48e0bSAndroid Build Coastguard Worker afl->stage_finds[STAGE_SPLICE] += new_hit_cnt - orig_hit_cnt;
5792*08b48e0bSAndroid Build Coastguard Worker afl->stage_cycles[STAGE_SPLICE] += afl->stage_max;
5793*08b48e0bSAndroid Build Coastguard Worker #ifdef INTROSPECTION
5794*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->stats_mutated += afl->stage_max;
5795*08b48e0bSAndroid Build Coastguard Worker #endif
5796*08b48e0bSAndroid Build Coastguard Worker
5797*08b48e0bSAndroid Build Coastguard Worker }
5798*08b48e0bSAndroid Build Coastguard Worker
5799*08b48e0bSAndroid Build Coastguard Worker }
5800*08b48e0bSAndroid Build Coastguard Worker
5801*08b48e0bSAndroid Build Coastguard Worker #ifndef IGNORE_FINDS
5802*08b48e0bSAndroid Build Coastguard Worker
5803*08b48e0bSAndroid Build Coastguard Worker /************
5804*08b48e0bSAndroid Build Coastguard Worker * SPLICING *
5805*08b48e0bSAndroid Build Coastguard Worker ************/
5806*08b48e0bSAndroid Build Coastguard Worker
5807*08b48e0bSAndroid Build Coastguard Worker retry_splicing_puppet:
5808*08b48e0bSAndroid Build Coastguard Worker
5809*08b48e0bSAndroid Build Coastguard Worker if (afl->use_splicing &&
5810*08b48e0bSAndroid Build Coastguard Worker splice_cycle++ < (u32)afl->SPLICE_CYCLES_puppet &&
5811*08b48e0bSAndroid Build Coastguard Worker afl->ready_for_splicing_count > 1 && afl->queue_cur->len >= 4) {
5812*08b48e0bSAndroid Build Coastguard Worker
5813*08b48e0bSAndroid Build Coastguard Worker struct queue_entry *target;
5814*08b48e0bSAndroid Build Coastguard Worker u32 tid, split_at;
5815*08b48e0bSAndroid Build Coastguard Worker u8 *new_buf;
5816*08b48e0bSAndroid Build Coastguard Worker s32 f_diff, l_diff;
5817*08b48e0bSAndroid Build Coastguard Worker
5818*08b48e0bSAndroid Build Coastguard Worker /* First of all, if we've modified in_buf for havoc, let's clean that
5819*08b48e0bSAndroid Build Coastguard Worker up... */
5820*08b48e0bSAndroid Build Coastguard Worker
5821*08b48e0bSAndroid Build Coastguard Worker if (in_buf != orig_in) {
5822*08b48e0bSAndroid Build Coastguard Worker
5823*08b48e0bSAndroid Build Coastguard Worker in_buf = orig_in;
5824*08b48e0bSAndroid Build Coastguard Worker len = afl->queue_cur->len;
5825*08b48e0bSAndroid Build Coastguard Worker
5826*08b48e0bSAndroid Build Coastguard Worker }
5827*08b48e0bSAndroid Build Coastguard Worker
5828*08b48e0bSAndroid Build Coastguard Worker /* Pick a random queue entry and seek to it. Don't splice with yourself.
5829*08b48e0bSAndroid Build Coastguard Worker */
5830*08b48e0bSAndroid Build Coastguard Worker
5831*08b48e0bSAndroid Build Coastguard Worker do {
5832*08b48e0bSAndroid Build Coastguard Worker
5833*08b48e0bSAndroid Build Coastguard Worker tid = rand_below(afl, afl->queued_items);
5834*08b48e0bSAndroid Build Coastguard Worker
5835*08b48e0bSAndroid Build Coastguard Worker } while (tid == afl->current_entry || afl->queue_buf[tid]->len < 4);
5836*08b48e0bSAndroid Build Coastguard Worker
5837*08b48e0bSAndroid Build Coastguard Worker afl->splicing_with = tid;
5838*08b48e0bSAndroid Build Coastguard Worker target = afl->queue_buf[tid];
5839*08b48e0bSAndroid Build Coastguard Worker
5840*08b48e0bSAndroid Build Coastguard Worker /* Read the testcase into a new buffer. */
5841*08b48e0bSAndroid Build Coastguard Worker new_buf = queue_testcase_get(afl, target);
5842*08b48e0bSAndroid Build Coastguard Worker
5843*08b48e0bSAndroid Build Coastguard Worker /* Find a suitable splicin g location, somewhere between the first and
5844*08b48e0bSAndroid Build Coastguard Worker the last differing byte. Bail out if the difference is just a single
5845*08b48e0bSAndroid Build Coastguard Worker byte or so. */
5846*08b48e0bSAndroid Build Coastguard Worker
5847*08b48e0bSAndroid Build Coastguard Worker locate_diffs(in_buf, new_buf, MIN(len, target->len), &f_diff, &l_diff);
5848*08b48e0bSAndroid Build Coastguard Worker
5849*08b48e0bSAndroid Build Coastguard Worker if (f_diff < 0 || l_diff < 2 || f_diff == l_diff) {
5850*08b48e0bSAndroid Build Coastguard Worker
5851*08b48e0bSAndroid Build Coastguard Worker goto retry_splicing_puppet;
5852*08b48e0bSAndroid Build Coastguard Worker
5853*08b48e0bSAndroid Build Coastguard Worker }
5854*08b48e0bSAndroid Build Coastguard Worker
5855*08b48e0bSAndroid Build Coastguard Worker /* Split somewhere between the first and last differing byte. */
5856*08b48e0bSAndroid Build Coastguard Worker
5857*08b48e0bSAndroid Build Coastguard Worker split_at = f_diff + rand_below(afl, l_diff - f_diff);
5858*08b48e0bSAndroid Build Coastguard Worker
5859*08b48e0bSAndroid Build Coastguard Worker /* Do the thing. */
5860*08b48e0bSAndroid Build Coastguard Worker
5861*08b48e0bSAndroid Build Coastguard Worker len = target->len;
5862*08b48e0bSAndroid Build Coastguard Worker afl->in_scratch_buf = afl_realloc(AFL_BUF_PARAM(in_scratch), len);
5863*08b48e0bSAndroid Build Coastguard Worker memcpy(afl->in_scratch_buf, in_buf, split_at);
5864*08b48e0bSAndroid Build Coastguard Worker memcpy(afl->in_scratch_buf + split_at, new_buf, len - split_at);
5865*08b48e0bSAndroid Build Coastguard Worker in_buf = afl->in_scratch_buf;
5866*08b48e0bSAndroid Build Coastguard Worker afl_swap_bufs(AFL_BUF_PARAM(in), AFL_BUF_PARAM(in_scratch));
5867*08b48e0bSAndroid Build Coastguard Worker
5868*08b48e0bSAndroid Build Coastguard Worker out_buf = afl_realloc(AFL_BUF_PARAM(out), len);
5869*08b48e0bSAndroid Build Coastguard Worker if (unlikely(!out_buf)) { PFATAL("alloc"); }
5870*08b48e0bSAndroid Build Coastguard Worker memcpy(out_buf, in_buf, len);
5871*08b48e0bSAndroid Build Coastguard Worker
5872*08b48e0bSAndroid Build Coastguard Worker goto havoc_stage_puppet;
5873*08b48e0bSAndroid Build Coastguard Worker
5874*08b48e0bSAndroid Build Coastguard Worker } /* if splice_cycle */
5875*08b48e0bSAndroid Build Coastguard Worker
5876*08b48e0bSAndroid Build Coastguard Worker #endif /* !IGNORE_FINDS */
5877*08b48e0bSAndroid Build Coastguard Worker
5878*08b48e0bSAndroid Build Coastguard Worker ret_val = 0;
5879*08b48e0bSAndroid Build Coastguard Worker
5880*08b48e0bSAndroid Build Coastguard Worker abandon_entry:
5881*08b48e0bSAndroid Build Coastguard Worker abandon_entry_puppet:
5882*08b48e0bSAndroid Build Coastguard Worker
5883*08b48e0bSAndroid Build Coastguard Worker if ((s64)splice_cycle >= afl->SPLICE_CYCLES_puppet) {
5884*08b48e0bSAndroid Build Coastguard Worker
5885*08b48e0bSAndroid Build Coastguard Worker afl->SPLICE_CYCLES_puppet =
5886*08b48e0bSAndroid Build Coastguard Worker (rand_below(
5887*08b48e0bSAndroid Build Coastguard Worker afl, SPLICE_CYCLES_puppet_up - SPLICE_CYCLES_puppet_low + 1) +
5888*08b48e0bSAndroid Build Coastguard Worker SPLICE_CYCLES_puppet_low);
5889*08b48e0bSAndroid Build Coastguard Worker
5890*08b48e0bSAndroid Build Coastguard Worker }
5891*08b48e0bSAndroid Build Coastguard Worker
5892*08b48e0bSAndroid Build Coastguard Worker afl->splicing_with = -1;
5893*08b48e0bSAndroid Build Coastguard Worker
5894*08b48e0bSAndroid Build Coastguard Worker /* Update afl->pending_not_fuzzed count if we made it through the
5895*08b48e0bSAndroid Build Coastguard Worker calibration cycle and have not seen this entry before. */
5896*08b48e0bSAndroid Build Coastguard Worker /*
5897*08b48e0bSAndroid Build Coastguard Worker // TODO FIXME: I think we need this plus need an -L -1 check
5898*08b48e0bSAndroid Build Coastguard Worker if (!afl->stop_soon && !afl->queue_cur->cal_failed &&
5899*08b48e0bSAndroid Build Coastguard Worker (afl->queue_cur->was_fuzzed == 0 || afl->queue_cur->fuzz_level == 0)
5900*08b48e0bSAndroid Build Coastguard Worker && !afl->queue_cur->disabled) {
5901*08b48e0bSAndroid Build Coastguard Worker
5902*08b48e0bSAndroid Build Coastguard Worker if (!afl->queue_cur->was_fuzzed) {
5903*08b48e0bSAndroid Build Coastguard Worker
5904*08b48e0bSAndroid Build Coastguard Worker --afl->pending_not_fuzzed;
5905*08b48e0bSAndroid Build Coastguard Worker afl->queue_cur->was_fuzzed = 1;
5906*08b48e0bSAndroid Build Coastguard Worker afl->reinit_table = 1
5907*08b48e0bSAndroid Build Coastguard Worker if (afl->queue_cur->favored) {
5908*08b48e0bSAndroid Build Coastguard Worker
5909*08b48e0bSAndroid Build Coastguard Worker --afl->pending_favored;
5910*08b48e0bSAndroid Build Coastguard Worker afl->smallest_favored = -1;
5911*08b48e0bSAndroid Build Coastguard Worker
5912*08b48e0bSAndroid Build Coastguard Worker }
5913*08b48e0bSAndroid Build Coastguard Worker
5914*08b48e0bSAndroid Build Coastguard Worker }
5915*08b48e0bSAndroid Build Coastguard Worker
5916*08b48e0bSAndroid Build Coastguard Worker }
5917*08b48e0bSAndroid Build Coastguard Worker
5918*08b48e0bSAndroid Build Coastguard Worker */
5919*08b48e0bSAndroid Build Coastguard Worker
5920*08b48e0bSAndroid Build Coastguard Worker orig_in = NULL;
5921*08b48e0bSAndroid Build Coastguard Worker
5922*08b48e0bSAndroid Build Coastguard Worker if (afl->key_puppet == 1) {
5923*08b48e0bSAndroid Build Coastguard Worker
5924*08b48e0bSAndroid Build Coastguard Worker if (unlikely(
5925*08b48e0bSAndroid Build Coastguard Worker afl->queued_items + afl->saved_crashes >
5926*08b48e0bSAndroid Build Coastguard Worker ((afl->queued_items + afl->saved_crashes) * limit_time_bound +
5927*08b48e0bSAndroid Build Coastguard Worker afl->orig_hit_cnt_puppet))) {
5928*08b48e0bSAndroid Build Coastguard Worker
5929*08b48e0bSAndroid Build Coastguard Worker afl->key_puppet = 0;
5930*08b48e0bSAndroid Build Coastguard Worker afl->orig_hit_cnt_puppet = 0;
5931*08b48e0bSAndroid Build Coastguard Worker afl->last_limit_time_start = 0;
5932*08b48e0bSAndroid Build Coastguard Worker
5933*08b48e0bSAndroid Build Coastguard Worker }
5934*08b48e0bSAndroid Build Coastguard Worker
5935*08b48e0bSAndroid Build Coastguard Worker }
5936*08b48e0bSAndroid Build Coastguard Worker
5937*08b48e0bSAndroid Build Coastguard Worker if (unlikely(*MOpt_globals.pTime > MOpt_globals.period)) {
5938*08b48e0bSAndroid Build Coastguard Worker
5939*08b48e0bSAndroid Build Coastguard Worker afl->total_pacemaker_time += *MOpt_globals.pTime;
5940*08b48e0bSAndroid Build Coastguard Worker *MOpt_globals.pTime = 0;
5941*08b48e0bSAndroid Build Coastguard Worker new_hit_cnt = afl->queued_items + afl->saved_crashes;
5942*08b48e0bSAndroid Build Coastguard Worker
5943*08b48e0bSAndroid Build Coastguard Worker if (MOpt_globals.is_pilot_mode) {
5944*08b48e0bSAndroid Build Coastguard Worker
5945*08b48e0bSAndroid Build Coastguard Worker afl->swarm_fitness[afl->swarm_now] =
5946*08b48e0bSAndroid Build Coastguard Worker (double)(afl->total_puppet_find - afl->temp_puppet_find) /
5947*08b48e0bSAndroid Build Coastguard Worker ((double)(afl->tmp_pilot_time) / afl->period_pilot_tmp);
5948*08b48e0bSAndroid Build Coastguard Worker
5949*08b48e0bSAndroid Build Coastguard Worker }
5950*08b48e0bSAndroid Build Coastguard Worker
5951*08b48e0bSAndroid Build Coastguard Worker afl->temp_puppet_find = afl->total_puppet_find;
5952*08b48e0bSAndroid Build Coastguard Worker for (i = 0; i < operator_num; ++i) {
5953*08b48e0bSAndroid Build Coastguard Worker
5954*08b48e0bSAndroid Build Coastguard Worker if (MOpt_globals.is_pilot_mode) {
5955*08b48e0bSAndroid Build Coastguard Worker
5956*08b48e0bSAndroid Build Coastguard Worker double temp_eff = 0.0;
5957*08b48e0bSAndroid Build Coastguard Worker
5958*08b48e0bSAndroid Build Coastguard Worker if (MOpt_globals.cycles_v2[i] > MOpt_globals.cycles[i]) {
5959*08b48e0bSAndroid Build Coastguard Worker
5960*08b48e0bSAndroid Build Coastguard Worker temp_eff =
5961*08b48e0bSAndroid Build Coastguard Worker (double)(MOpt_globals.finds_v2[i] - MOpt_globals.finds[i]) /
5962*08b48e0bSAndroid Build Coastguard Worker (double)(MOpt_globals.cycles_v2[i] - MOpt_globals.cycles[i]);
5963*08b48e0bSAndroid Build Coastguard Worker
5964*08b48e0bSAndroid Build Coastguard Worker }
5965*08b48e0bSAndroid Build Coastguard Worker
5966*08b48e0bSAndroid Build Coastguard Worker if (afl->eff_best[afl->swarm_now][i] < temp_eff) {
5967*08b48e0bSAndroid Build Coastguard Worker
5968*08b48e0bSAndroid Build Coastguard Worker afl->eff_best[afl->swarm_now][i] = temp_eff;
5969*08b48e0bSAndroid Build Coastguard Worker afl->L_best[afl->swarm_now][i] = afl->x_now[afl->swarm_now][i];
5970*08b48e0bSAndroid Build Coastguard Worker
5971*08b48e0bSAndroid Build Coastguard Worker }
5972*08b48e0bSAndroid Build Coastguard Worker
5973*08b48e0bSAndroid Build Coastguard Worker }
5974*08b48e0bSAndroid Build Coastguard Worker
5975*08b48e0bSAndroid Build Coastguard Worker MOpt_globals.finds[i] = MOpt_globals.finds_v2[i];
5976*08b48e0bSAndroid Build Coastguard Worker MOpt_globals.cycles[i] = MOpt_globals.cycles_v2[i];
5977*08b48e0bSAndroid Build Coastguard Worker
5978*08b48e0bSAndroid Build Coastguard Worker } /* for i = 0; i < operator_num */
5979*08b48e0bSAndroid Build Coastguard Worker
5980*08b48e0bSAndroid Build Coastguard Worker if (MOpt_globals.is_pilot_mode) {
5981*08b48e0bSAndroid Build Coastguard Worker
5982*08b48e0bSAndroid Build Coastguard Worker afl->swarm_now = afl->swarm_now + 1;
5983*08b48e0bSAndroid Build Coastguard Worker if (afl->swarm_now == swarm_num) {
5984*08b48e0bSAndroid Build Coastguard Worker
5985*08b48e0bSAndroid Build Coastguard Worker afl->key_module = 1;
5986*08b48e0bSAndroid Build Coastguard Worker for (i = 0; i < operator_num; ++i) {
5987*08b48e0bSAndroid Build Coastguard Worker
5988*08b48e0bSAndroid Build Coastguard Worker afl->core_operator_cycles_puppet_v2[i] =
5989*08b48e0bSAndroid Build Coastguard Worker afl->core_operator_cycles_puppet[i];
5990*08b48e0bSAndroid Build Coastguard Worker afl->core_operator_cycles_puppet_v3[i] =
5991*08b48e0bSAndroid Build Coastguard Worker afl->core_operator_cycles_puppet[i];
5992*08b48e0bSAndroid Build Coastguard Worker afl->core_operator_finds_puppet_v2[i] =
5993*08b48e0bSAndroid Build Coastguard Worker afl->core_operator_finds_puppet[i];
5994*08b48e0bSAndroid Build Coastguard Worker
5995*08b48e0bSAndroid Build Coastguard Worker }
5996*08b48e0bSAndroid Build Coastguard Worker
5997*08b48e0bSAndroid Build Coastguard Worker double swarm_eff = 0.0;
5998*08b48e0bSAndroid Build Coastguard Worker afl->swarm_now = 0;
5999*08b48e0bSAndroid Build Coastguard Worker for (i = 0; i < swarm_num; ++i) {
6000*08b48e0bSAndroid Build Coastguard Worker
6001*08b48e0bSAndroid Build Coastguard Worker if (afl->swarm_fitness[i] > swarm_eff) {
6002*08b48e0bSAndroid Build Coastguard Worker
6003*08b48e0bSAndroid Build Coastguard Worker swarm_eff = afl->swarm_fitness[i];
6004*08b48e0bSAndroid Build Coastguard Worker afl->swarm_now = i;
6005*08b48e0bSAndroid Build Coastguard Worker
6006*08b48e0bSAndroid Build Coastguard Worker }
6007*08b48e0bSAndroid Build Coastguard Worker
6008*08b48e0bSAndroid Build Coastguard Worker }
6009*08b48e0bSAndroid Build Coastguard Worker
6010*08b48e0bSAndroid Build Coastguard Worker if (afl->swarm_now < 0 || afl->swarm_now > swarm_num - 1) {
6011*08b48e0bSAndroid Build Coastguard Worker
6012*08b48e0bSAndroid Build Coastguard Worker PFATAL("swarm_now error number %d", afl->swarm_now);
6013*08b48e0bSAndroid Build Coastguard Worker
6014*08b48e0bSAndroid Build Coastguard Worker }
6015*08b48e0bSAndroid Build Coastguard Worker
6016*08b48e0bSAndroid Build Coastguard Worker } /* if afl->swarm_now == swarm_num */
6017*08b48e0bSAndroid Build Coastguard Worker
6018*08b48e0bSAndroid Build Coastguard Worker /* adjust pointers dependent on 'afl->swarm_now' */
6019*08b48e0bSAndroid Build Coastguard Worker afl->mopt_globals_pilot.finds =
6020*08b48e0bSAndroid Build Coastguard Worker afl->stage_finds_puppet[afl->swarm_now];
6021*08b48e0bSAndroid Build Coastguard Worker afl->mopt_globals_pilot.finds_v2 =
6022*08b48e0bSAndroid Build Coastguard Worker afl->stage_finds_puppet_v2[afl->swarm_now];
6023*08b48e0bSAndroid Build Coastguard Worker afl->mopt_globals_pilot.cycles =
6024*08b48e0bSAndroid Build Coastguard Worker afl->stage_cycles_puppet[afl->swarm_now];
6025*08b48e0bSAndroid Build Coastguard Worker afl->mopt_globals_pilot.cycles_v2 =
6026*08b48e0bSAndroid Build Coastguard Worker afl->stage_cycles_puppet_v2[afl->swarm_now];
6027*08b48e0bSAndroid Build Coastguard Worker afl->mopt_globals_pilot.cycles_v3 =
6028*08b48e0bSAndroid Build Coastguard Worker afl->stage_cycles_puppet_v3[afl->swarm_now];
6029*08b48e0bSAndroid Build Coastguard Worker
6030*08b48e0bSAndroid Build Coastguard Worker } else {
6031*08b48e0bSAndroid Build Coastguard Worker
6032*08b48e0bSAndroid Build Coastguard Worker for (i = 0; i < operator_num; i++) {
6033*08b48e0bSAndroid Build Coastguard Worker
6034*08b48e0bSAndroid Build Coastguard Worker afl->core_operator_finds_puppet[i] =
6035*08b48e0bSAndroid Build Coastguard Worker afl->core_operator_finds_puppet_v2[i];
6036*08b48e0bSAndroid Build Coastguard Worker afl->core_operator_cycles_puppet[i] =
6037*08b48e0bSAndroid Build Coastguard Worker afl->core_operator_cycles_puppet_v2[i];
6038*08b48e0bSAndroid Build Coastguard Worker
6039*08b48e0bSAndroid Build Coastguard Worker }
6040*08b48e0bSAndroid Build Coastguard Worker
6041*08b48e0bSAndroid Build Coastguard Worker afl->key_module = 2;
6042*08b48e0bSAndroid Build Coastguard Worker
6043*08b48e0bSAndroid Build Coastguard Worker afl->old_hit_count = new_hit_cnt;
6044*08b48e0bSAndroid Build Coastguard Worker
6045*08b48e0bSAndroid Build Coastguard Worker } /* if pilot_mode */
6046*08b48e0bSAndroid Build Coastguard Worker
6047*08b48e0bSAndroid Build Coastguard Worker } /* if (unlikely(*MOpt_globals.pTime > MOpt_globals.period)) */
6048*08b48e0bSAndroid Build Coastguard Worker
6049*08b48e0bSAndroid Build Coastguard Worker } /* block */
6050*08b48e0bSAndroid Build Coastguard Worker
6051*08b48e0bSAndroid Build Coastguard Worker } /* block */
6052*08b48e0bSAndroid Build Coastguard Worker
6053*08b48e0bSAndroid Build Coastguard Worker ++afl->queue_cur->fuzz_level;
6054*08b48e0bSAndroid Build Coastguard Worker return ret_val;
6055*08b48e0bSAndroid Build Coastguard Worker
6056*08b48e0bSAndroid Build Coastguard Worker }
6057*08b48e0bSAndroid Build Coastguard Worker
6058*08b48e0bSAndroid Build Coastguard Worker #undef FLIP_BIT
6059*08b48e0bSAndroid Build Coastguard Worker
core_fuzzing(afl_state_t * afl)6060*08b48e0bSAndroid Build Coastguard Worker u8 core_fuzzing(afl_state_t *afl) {
6061*08b48e0bSAndroid Build Coastguard Worker
6062*08b48e0bSAndroid Build Coastguard Worker return mopt_common_fuzzing(afl, afl->mopt_globals_core);
6063*08b48e0bSAndroid Build Coastguard Worker
6064*08b48e0bSAndroid Build Coastguard Worker }
6065*08b48e0bSAndroid Build Coastguard Worker
pilot_fuzzing(afl_state_t * afl)6066*08b48e0bSAndroid Build Coastguard Worker u8 pilot_fuzzing(afl_state_t *afl) {
6067*08b48e0bSAndroid Build Coastguard Worker
6068*08b48e0bSAndroid Build Coastguard Worker return mopt_common_fuzzing(afl, afl->mopt_globals_pilot);
6069*08b48e0bSAndroid Build Coastguard Worker
6070*08b48e0bSAndroid Build Coastguard Worker }
6071*08b48e0bSAndroid Build Coastguard Worker
pso_updating(afl_state_t * afl)6072*08b48e0bSAndroid Build Coastguard Worker void pso_updating(afl_state_t *afl) {
6073*08b48e0bSAndroid Build Coastguard Worker
6074*08b48e0bSAndroid Build Coastguard Worker afl->g_now++;
6075*08b48e0bSAndroid Build Coastguard Worker if (afl->g_now > afl->g_max) { afl->g_now = 0; }
6076*08b48e0bSAndroid Build Coastguard Worker afl->w_now =
6077*08b48e0bSAndroid Build Coastguard Worker (afl->w_init - afl->w_end) * (afl->g_max - afl->g_now) / (afl->g_max) +
6078*08b48e0bSAndroid Build Coastguard Worker afl->w_end;
6079*08b48e0bSAndroid Build Coastguard Worker int tmp_swarm, i, j;
6080*08b48e0bSAndroid Build Coastguard Worker u64 temp_operator_finds_puppet = 0;
6081*08b48e0bSAndroid Build Coastguard Worker for (i = 0; i < operator_num; ++i) {
6082*08b48e0bSAndroid Build Coastguard Worker
6083*08b48e0bSAndroid Build Coastguard Worker afl->operator_finds_puppet[i] = afl->core_operator_finds_puppet[i];
6084*08b48e0bSAndroid Build Coastguard Worker
6085*08b48e0bSAndroid Build Coastguard Worker for (j = 0; j < swarm_num; ++j) {
6086*08b48e0bSAndroid Build Coastguard Worker
6087*08b48e0bSAndroid Build Coastguard Worker afl->operator_finds_puppet[i] =
6088*08b48e0bSAndroid Build Coastguard Worker afl->operator_finds_puppet[i] + afl->stage_finds_puppet[j][i];
6089*08b48e0bSAndroid Build Coastguard Worker
6090*08b48e0bSAndroid Build Coastguard Worker }
6091*08b48e0bSAndroid Build Coastguard Worker
6092*08b48e0bSAndroid Build Coastguard Worker temp_operator_finds_puppet =
6093*08b48e0bSAndroid Build Coastguard Worker temp_operator_finds_puppet + afl->operator_finds_puppet[i];
6094*08b48e0bSAndroid Build Coastguard Worker
6095*08b48e0bSAndroid Build Coastguard Worker }
6096*08b48e0bSAndroid Build Coastguard Worker
6097*08b48e0bSAndroid Build Coastguard Worker for (i = 0; i < operator_num; ++i) {
6098*08b48e0bSAndroid Build Coastguard Worker
6099*08b48e0bSAndroid Build Coastguard Worker if (afl->operator_finds_puppet[i]) {
6100*08b48e0bSAndroid Build Coastguard Worker
6101*08b48e0bSAndroid Build Coastguard Worker afl->G_best[i] = (double)((double)(afl->operator_finds_puppet[i]) /
6102*08b48e0bSAndroid Build Coastguard Worker (double)(temp_operator_finds_puppet));
6103*08b48e0bSAndroid Build Coastguard Worker
6104*08b48e0bSAndroid Build Coastguard Worker }
6105*08b48e0bSAndroid Build Coastguard Worker
6106*08b48e0bSAndroid Build Coastguard Worker }
6107*08b48e0bSAndroid Build Coastguard Worker
6108*08b48e0bSAndroid Build Coastguard Worker for (tmp_swarm = 0; tmp_swarm < swarm_num; ++tmp_swarm) {
6109*08b48e0bSAndroid Build Coastguard Worker
6110*08b48e0bSAndroid Build Coastguard Worker double x_temp = 0.0;
6111*08b48e0bSAndroid Build Coastguard Worker for (i = 0; i < operator_num; ++i) {
6112*08b48e0bSAndroid Build Coastguard Worker
6113*08b48e0bSAndroid Build Coastguard Worker afl->probability_now[tmp_swarm][i] = 0.0;
6114*08b48e0bSAndroid Build Coastguard Worker afl->v_now[tmp_swarm][i] =
6115*08b48e0bSAndroid Build Coastguard Worker afl->w_now * afl->v_now[tmp_swarm][i] +
6116*08b48e0bSAndroid Build Coastguard Worker RAND_C * (afl->L_best[tmp_swarm][i] - afl->x_now[tmp_swarm][i]) +
6117*08b48e0bSAndroid Build Coastguard Worker RAND_C * (afl->G_best[i] - afl->x_now[tmp_swarm][i]);
6118*08b48e0bSAndroid Build Coastguard Worker afl->x_now[tmp_swarm][i] += afl->v_now[tmp_swarm][i];
6119*08b48e0bSAndroid Build Coastguard Worker if (afl->x_now[tmp_swarm][i] > v_max) {
6120*08b48e0bSAndroid Build Coastguard Worker
6121*08b48e0bSAndroid Build Coastguard Worker afl->x_now[tmp_swarm][i] = v_max;
6122*08b48e0bSAndroid Build Coastguard Worker
6123*08b48e0bSAndroid Build Coastguard Worker } else if (afl->x_now[tmp_swarm][i] < v_min) {
6124*08b48e0bSAndroid Build Coastguard Worker
6125*08b48e0bSAndroid Build Coastguard Worker afl->x_now[tmp_swarm][i] = v_min;
6126*08b48e0bSAndroid Build Coastguard Worker
6127*08b48e0bSAndroid Build Coastguard Worker }
6128*08b48e0bSAndroid Build Coastguard Worker
6129*08b48e0bSAndroid Build Coastguard Worker x_temp += afl->x_now[tmp_swarm][i];
6130*08b48e0bSAndroid Build Coastguard Worker
6131*08b48e0bSAndroid Build Coastguard Worker }
6132*08b48e0bSAndroid Build Coastguard Worker
6133*08b48e0bSAndroid Build Coastguard Worker for (i = 0; i < operator_num; ++i) {
6134*08b48e0bSAndroid Build Coastguard Worker
6135*08b48e0bSAndroid Build Coastguard Worker afl->x_now[tmp_swarm][i] = afl->x_now[tmp_swarm][i] / x_temp;
6136*08b48e0bSAndroid Build Coastguard Worker if (likely(i != 0)) {
6137*08b48e0bSAndroid Build Coastguard Worker
6138*08b48e0bSAndroid Build Coastguard Worker afl->probability_now[tmp_swarm][i] =
6139*08b48e0bSAndroid Build Coastguard Worker afl->probability_now[tmp_swarm][i - 1] + afl->x_now[tmp_swarm][i];
6140*08b48e0bSAndroid Build Coastguard Worker
6141*08b48e0bSAndroid Build Coastguard Worker } else {
6142*08b48e0bSAndroid Build Coastguard Worker
6143*08b48e0bSAndroid Build Coastguard Worker afl->probability_now[tmp_swarm][i] = afl->x_now[tmp_swarm][i];
6144*08b48e0bSAndroid Build Coastguard Worker
6145*08b48e0bSAndroid Build Coastguard Worker }
6146*08b48e0bSAndroid Build Coastguard Worker
6147*08b48e0bSAndroid Build Coastguard Worker }
6148*08b48e0bSAndroid Build Coastguard Worker
6149*08b48e0bSAndroid Build Coastguard Worker if (afl->probability_now[tmp_swarm][operator_num - 1] < 0.99 ||
6150*08b48e0bSAndroid Build Coastguard Worker afl->probability_now[tmp_swarm][operator_num - 1] > 1.01) {
6151*08b48e0bSAndroid Build Coastguard Worker
6152*08b48e0bSAndroid Build Coastguard Worker FATAL("ERROR probability");
6153*08b48e0bSAndroid Build Coastguard Worker
6154*08b48e0bSAndroid Build Coastguard Worker }
6155*08b48e0bSAndroid Build Coastguard Worker
6156*08b48e0bSAndroid Build Coastguard Worker }
6157*08b48e0bSAndroid Build Coastguard Worker
6158*08b48e0bSAndroid Build Coastguard Worker afl->swarm_now = 0;
6159*08b48e0bSAndroid Build Coastguard Worker afl->key_module = 0;
6160*08b48e0bSAndroid Build Coastguard Worker
6161*08b48e0bSAndroid Build Coastguard Worker }
6162*08b48e0bSAndroid Build Coastguard Worker
6163*08b48e0bSAndroid Build Coastguard Worker /* The entry point for the mutator, choosing the default mutator, and/or MOpt
6164*08b48e0bSAndroid Build Coastguard Worker depending on the configuration. */
fuzz_one(afl_state_t * afl)6165*08b48e0bSAndroid Build Coastguard Worker u8 fuzz_one(afl_state_t *afl) {
6166*08b48e0bSAndroid Build Coastguard Worker
6167*08b48e0bSAndroid Build Coastguard Worker int key_val_lv_1 = -1, key_val_lv_2 = -1;
6168*08b48e0bSAndroid Build Coastguard Worker
6169*08b48e0bSAndroid Build Coastguard Worker #ifdef _AFL_DOCUMENT_MUTATIONS
6170*08b48e0bSAndroid Build Coastguard Worker
6171*08b48e0bSAndroid Build Coastguard Worker u8 path_buf[PATH_MAX];
6172*08b48e0bSAndroid Build Coastguard Worker if (afl->do_document == 0) {
6173*08b48e0bSAndroid Build Coastguard Worker
6174*08b48e0bSAndroid Build Coastguard Worker snprintf(path_buf, PATH_MAX, "%s/mutations", afl->out_dir);
6175*08b48e0bSAndroid Build Coastguard Worker afl->do_document = mkdir(path_buf, 0700); // if it exists we do not care
6176*08b48e0bSAndroid Build Coastguard Worker afl->do_document = 1;
6177*08b48e0bSAndroid Build Coastguard Worker
6178*08b48e0bSAndroid Build Coastguard Worker } else {
6179*08b48e0bSAndroid Build Coastguard Worker
6180*08b48e0bSAndroid Build Coastguard Worker afl->do_document = 2;
6181*08b48e0bSAndroid Build Coastguard Worker afl->stop_soon = 2;
6182*08b48e0bSAndroid Build Coastguard Worker
6183*08b48e0bSAndroid Build Coastguard Worker }
6184*08b48e0bSAndroid Build Coastguard Worker
6185*08b48e0bSAndroid Build Coastguard Worker #endif
6186*08b48e0bSAndroid Build Coastguard Worker
6187*08b48e0bSAndroid Build Coastguard Worker /*
6188*08b48e0bSAndroid Build Coastguard Worker -L command line paramter => limit_time_sig value
6189*08b48e0bSAndroid Build Coastguard Worker limit_time_sig == 0 then run the default mutator
6190*08b48e0bSAndroid Build Coastguard Worker limit_time_sig > 0 then run MOpt
6191*08b48e0bSAndroid Build Coastguard Worker limit_time_sig < 0 both are run
6192*08b48e0bSAndroid Build Coastguard Worker */
6193*08b48e0bSAndroid Build Coastguard Worker
6194*08b48e0bSAndroid Build Coastguard Worker if (afl->limit_time_sig <= 0) { key_val_lv_1 = fuzz_one_original(afl); }
6195*08b48e0bSAndroid Build Coastguard Worker
6196*08b48e0bSAndroid Build Coastguard Worker if (afl->limit_time_sig != 0) {
6197*08b48e0bSAndroid Build Coastguard Worker
6198*08b48e0bSAndroid Build Coastguard Worker if (afl->key_module == 0) {
6199*08b48e0bSAndroid Build Coastguard Worker
6200*08b48e0bSAndroid Build Coastguard Worker key_val_lv_2 = pilot_fuzzing(afl);
6201*08b48e0bSAndroid Build Coastguard Worker
6202*08b48e0bSAndroid Build Coastguard Worker } else if (afl->key_module == 1) {
6203*08b48e0bSAndroid Build Coastguard Worker
6204*08b48e0bSAndroid Build Coastguard Worker key_val_lv_2 = core_fuzzing(afl);
6205*08b48e0bSAndroid Build Coastguard Worker
6206*08b48e0bSAndroid Build Coastguard Worker } else if (afl->key_module == 2) {
6207*08b48e0bSAndroid Build Coastguard Worker
6208*08b48e0bSAndroid Build Coastguard Worker pso_updating(afl);
6209*08b48e0bSAndroid Build Coastguard Worker
6210*08b48e0bSAndroid Build Coastguard Worker }
6211*08b48e0bSAndroid Build Coastguard Worker
6212*08b48e0bSAndroid Build Coastguard Worker }
6213*08b48e0bSAndroid Build Coastguard Worker
6214*08b48e0bSAndroid Build Coastguard Worker if (unlikely(key_val_lv_1 == -1)) { key_val_lv_1 = 0; }
6215*08b48e0bSAndroid Build Coastguard Worker if (likely(key_val_lv_2 == -1)) { key_val_lv_2 = 0; }
6216*08b48e0bSAndroid Build Coastguard Worker
6217*08b48e0bSAndroid Build Coastguard Worker return (key_val_lv_1 | key_val_lv_2);
6218*08b48e0bSAndroid Build Coastguard Worker
6219*08b48e0bSAndroid Build Coastguard Worker }
6220*08b48e0bSAndroid Build Coastguard Worker
6221