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