1 /*
2  *
3  * honggfuzz - run->dynamicFilefer mangling routines
4  * -----------------------------------------
5  *
6  * Author:
7  * Robert Swiecki <swiecki@google.com>
8  *
9  * Copyright 2010-2018 by Google Inc. All Rights Reserved.
10  *
11  * Licensed under the Apache License, Version 2.0 (the "License"); you may
12  * not use this file except in compliance with the License. You may obtain
13  * a copy of the License at
14  *
15  * http://www.apache.org/licenses/LICENSE-2.0
16  *
17  * Unless required by applicable law or agreed to in writing, software
18  * distributed under the License is distributed on an "AS IS" BASIS,
19  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
20  * implied. See the License for the specific language governing
21  * permissions and limitations under the License.
22  *
23  */
24 
25 #include "mangle.h"
26 
27 #include <inttypes.h>
28 #include <math.h>
29 #include <stdio.h>
30 #include <stdlib.h>
31 #include <string.h>
32 #include <sys/mman.h>
33 #include <sys/stat.h>
34 #include <sys/types.h>
35 #include <unistd.h>
36 
37 #include "input.h"
38 #include "libhfcommon/common.h"
39 #include "libhfcommon/log.h"
40 #include "libhfcommon/util.h"
41 
mangle_Overwrite(run_t * run,const uint8_t * src,size_t off,size_t sz)42 static inline void mangle_Overwrite(run_t* run, const uint8_t* src, size_t off, size_t sz) {
43     size_t maxToCopy = run->dynamicFileSz - off;
44     if (sz > maxToCopy) {
45         sz = maxToCopy;
46     }
47 
48     memmove(&run->dynamicFile[off], src, sz);
49 }
50 
mangle_Move(run_t * run,size_t off_from,size_t off_to,size_t len)51 static inline void mangle_Move(run_t* run, size_t off_from, size_t off_to, size_t len) {
52     if (off_from >= run->dynamicFileSz) {
53         return;
54     }
55     if (off_to >= run->dynamicFileSz) {
56         return;
57     }
58 
59     ssize_t len_from = (ssize_t)run->dynamicFileSz - off_from - 1;
60     ssize_t len_to = (ssize_t)run->dynamicFileSz - off_to - 1;
61 
62     if ((ssize_t)len > len_from) {
63         len = len_from;
64     }
65     if ((ssize_t)len > len_to) {
66         len = len_to;
67     }
68 
69     memmove(&run->dynamicFile[off_to], &run->dynamicFile[off_from], len);
70 }
71 
mangle_Inflate(run_t * run,size_t off,size_t len)72 static void mangle_Inflate(run_t* run, size_t off, size_t len) {
73     if (run->dynamicFileSz >= run->global->mutate.maxFileSz) {
74         return;
75     }
76     if (len > (run->global->mutate.maxFileSz - run->dynamicFileSz)) {
77         len = run->global->mutate.maxFileSz - run->dynamicFileSz;
78     }
79 
80     input_setSize(run, run->dynamicFileSz + len);
81     mangle_Move(run, off, off + len, run->dynamicFileSz);
82 }
83 
mangle_MemMove(run_t * run)84 static void mangle_MemMove(run_t* run) {
85     size_t off_from = util_rndGet(0, run->dynamicFileSz - 1);
86     size_t off_to = util_rndGet(0, run->dynamicFileSz - 1);
87     size_t len = util_rndGet(0, run->dynamicFileSz);
88 
89     mangle_Move(run, off_from, off_to, len);
90 }
91 
mangle_Byte(run_t * run)92 static void mangle_Byte(run_t* run) {
93     size_t off = util_rndGet(0, run->dynamicFileSz - 1);
94     run->dynamicFile[off] = (uint8_t)util_rnd64();
95 }
96 
mangle_PrintableByte(run_t * run)97 static void mangle_PrintableByte(run_t* run) {
98     size_t off = util_rndGet(0, run->dynamicFileSz - 1);
99     run->dynamicFile[off] = util_rndPrintable();
100 }
101 
mangle_Bytes(run_t * run)102 static void mangle_Bytes(run_t* run) {
103     size_t off = util_rndGet(0, run->dynamicFileSz - 1);
104     uint32_t val = (uint32_t)util_rnd64();
105 
106     /* Overwrite with random 2,3,4-byte values */
107     size_t toCopy = util_rndGet(2, 4);
108     mangle_Overwrite(run, (uint8_t*)&val, off, toCopy);
109 }
110 
mangle_PrintableBytes(run_t * run)111 static void mangle_PrintableBytes(run_t* run) {
112     size_t off = util_rndGet(0, run->dynamicFileSz - 1);
113     uint32_t val;
114     util_rndBufPrintable((uint8_t*)&val, sizeof(val));
115 
116     /* Overwrite with random 2,3,4-byte values */
117     size_t toCopy = util_rndGet(2, 4);
118     mangle_Overwrite(run, (uint8_t*)&val, off, toCopy);
119 }
120 
mangle_Bit(run_t * run)121 static void mangle_Bit(run_t* run) {
122     size_t off = util_rndGet(0, run->dynamicFileSz - 1);
123     run->dynamicFile[off] ^= (uint8_t)(1U << util_rndGet(0, 7));
124 }
125 
mangle_BitPrintable(run_t * run)126 static void mangle_BitPrintable(run_t* run) {
127     size_t off = util_rndGet(0, run->dynamicFileSz - 1);
128     run->dynamicFile[off] ^= (uint8_t)(1U << util_rndGet(0, 7));
129     util_turnToPrintable(&(run->dynamicFile[off]), 1);
130 }
131 
mangle_DictionaryInsertNoCheck(run_t * run)132 static void mangle_DictionaryInsertNoCheck(run_t* run) {
133     uint64_t choice = util_rndGet(0, run->global->mutate.dictionaryCnt - 1);
134     struct strings_t* str = TAILQ_FIRST(&run->global->mutate.dictq);
135     for (uint64_t i = 0; i < choice; i++) {
136         str = TAILQ_NEXT(str, pointers);
137     }
138 
139     size_t off = util_rndGet(0, run->dynamicFileSz - 1);
140     mangle_Inflate(run, off, str->len);
141     mangle_Move(run, off, off + str->len, str->len);
142     mangle_Overwrite(run, (uint8_t*)str->s, off, str->len);
143 }
144 
mangle_DictionaryInsert(run_t * run)145 static void mangle_DictionaryInsert(run_t* run) {
146     if (run->global->mutate.dictionaryCnt == 0) {
147         mangle_Bit(run);
148         return;
149     }
150     mangle_DictionaryInsertNoCheck(run);
151 }
152 
mangle_DictionaryInsertPrintable(run_t * run)153 static void mangle_DictionaryInsertPrintable(run_t* run) {
154     if (run->global->mutate.dictionaryCnt == 0) {
155         mangle_BitPrintable(run);
156         return;
157     }
158     mangle_DictionaryInsertNoCheck(run);
159 }
160 
mangle_DictionaryNoCheck(run_t * run)161 static void mangle_DictionaryNoCheck(run_t* run) {
162     size_t off = util_rndGet(0, run->dynamicFileSz - 1);
163 
164     uint64_t choice = util_rndGet(0, run->global->mutate.dictionaryCnt - 1);
165     struct strings_t* str = TAILQ_FIRST(&run->global->mutate.dictq);
166     for (uint64_t i = 0; i < choice; i++) {
167         str = TAILQ_NEXT(str, pointers);
168     }
169 
170     mangle_Overwrite(run, (uint8_t*)str->s, off, str->len);
171 }
172 
mangle_Dictionary(run_t * run)173 static void mangle_Dictionary(run_t* run) {
174     if (run->global->mutate.dictionaryCnt == 0) {
175         mangle_Bit(run);
176         return;
177     }
178 
179     mangle_DictionaryNoCheck(run);
180 }
181 
mangle_DictionaryPrintable(run_t * run)182 static void mangle_DictionaryPrintable(run_t* run) {
183     if (run->global->mutate.dictionaryCnt == 0) {
184         mangle_BitPrintable(run);
185         return;
186     }
187 
188     mangle_DictionaryNoCheck(run);
189 }
190 
mangle_Magic(run_t * run)191 static void mangle_Magic(run_t* run) {
192     static const struct {
193         const uint8_t val[8];
194         const size_t size;
195     } mangleMagicVals[] = {
196         /* 1B - No endianness */
197         {"\x00\x00\x00\x00\x00\x00\x00\x00", 1},
198         {"\x01\x00\x00\x00\x00\x00\x00\x00", 1},
199         {"\x02\x00\x00\x00\x00\x00\x00\x00", 1},
200         {"\x03\x00\x00\x00\x00\x00\x00\x00", 1},
201         {"\x04\x00\x00\x00\x00\x00\x00\x00", 1},
202         {"\x05\x00\x00\x00\x00\x00\x00\x00", 1},
203         {"\x06\x00\x00\x00\x00\x00\x00\x00", 1},
204         {"\x07\x00\x00\x00\x00\x00\x00\x00", 1},
205         {"\x08\x00\x00\x00\x00\x00\x00\x00", 1},
206         {"\x09\x00\x00\x00\x00\x00\x00\x00", 1},
207         {"\x0A\x00\x00\x00\x00\x00\x00\x00", 1},
208         {"\x0B\x00\x00\x00\x00\x00\x00\x00", 1},
209         {"\x0C\x00\x00\x00\x00\x00\x00\x00", 1},
210         {"\x0D\x00\x00\x00\x00\x00\x00\x00", 1},
211         {"\x0E\x00\x00\x00\x00\x00\x00\x00", 1},
212         {"\x0F\x00\x00\x00\x00\x00\x00\x00", 1},
213         {"\x10\x00\x00\x00\x00\x00\x00\x00", 1},
214         {"\x20\x00\x00\x00\x00\x00\x00\x00", 1},
215         {"\x40\x00\x00\x00\x00\x00\x00\x00", 1},
216         {"\x7E\x00\x00\x00\x00\x00\x00\x00", 1},
217         {"\x7F\x00\x00\x00\x00\x00\x00\x00", 1},
218         {"\x80\x00\x00\x00\x00\x00\x00\x00", 1},
219         {"\x81\x00\x00\x00\x00\x00\x00\x00", 1},
220         {"\xC0\x00\x00\x00\x00\x00\x00\x00", 1},
221         {"\xFE\x00\x00\x00\x00\x00\x00\x00", 1},
222         {"\xFF\x00\x00\x00\x00\x00\x00\x00", 1},
223         /* 2B - NE */
224         {"\x00\x00\x00\x00\x00\x00\x00\x00", 2},
225         {"\x01\x01\x00\x00\x00\x00\x00\x00", 2},
226         {"\x80\x80\x00\x00\x00\x00\x00\x00", 2},
227         {"\xFF\xFF\x00\x00\x00\x00\x00\x00", 2},
228         /* 2B - BE */
229         {"\x00\x01\x00\x00\x00\x00\x00\x00", 2},
230         {"\x00\x02\x00\x00\x00\x00\x00\x00", 2},
231         {"\x00\x03\x00\x00\x00\x00\x00\x00", 2},
232         {"\x00\x04\x00\x00\x00\x00\x00\x00", 2},
233         {"\x00\x05\x00\x00\x00\x00\x00\x00", 2},
234         {"\x00\x06\x00\x00\x00\x00\x00\x00", 2},
235         {"\x00\x07\x00\x00\x00\x00\x00\x00", 2},
236         {"\x00\x08\x00\x00\x00\x00\x00\x00", 2},
237         {"\x00\x09\x00\x00\x00\x00\x00\x00", 2},
238         {"\x00\x0A\x00\x00\x00\x00\x00\x00", 2},
239         {"\x00\x0B\x00\x00\x00\x00\x00\x00", 2},
240         {"\x00\x0C\x00\x00\x00\x00\x00\x00", 2},
241         {"\x00\x0D\x00\x00\x00\x00\x00\x00", 2},
242         {"\x00\x0E\x00\x00\x00\x00\x00\x00", 2},
243         {"\x00\x0F\x00\x00\x00\x00\x00\x00", 2},
244         {"\x00\x10\x00\x00\x00\x00\x00\x00", 2},
245         {"\x00\x20\x00\x00\x00\x00\x00\x00", 2},
246         {"\x00\x40\x00\x00\x00\x00\x00\x00", 2},
247         {"\x00\x7E\x00\x00\x00\x00\x00\x00", 2},
248         {"\x00\x7F\x00\x00\x00\x00\x00\x00", 2},
249         {"\x00\x80\x00\x00\x00\x00\x00\x00", 2},
250         {"\x00\x81\x00\x00\x00\x00\x00\x00", 2},
251         {"\x00\xC0\x00\x00\x00\x00\x00\x00", 2},
252         {"\x00\xFE\x00\x00\x00\x00\x00\x00", 2},
253         {"\x00\xFF\x00\x00\x00\x00\x00\x00", 2},
254         {"\x7E\xFF\x00\x00\x00\x00\x00\x00", 2},
255         {"\x7F\xFF\x00\x00\x00\x00\x00\x00", 2},
256         {"\x80\x00\x00\x00\x00\x00\x00\x00", 2},
257         {"\x80\x01\x00\x00\x00\x00\x00\x00", 2},
258         {"\xFF\xFE\x00\x00\x00\x00\x00\x00", 2},
259         /* 2B - LE */
260         {"\x00\x00\x00\x00\x00\x00\x00\x00", 2},
261         {"\x01\x00\x00\x00\x00\x00\x00\x00", 2},
262         {"\x02\x00\x00\x00\x00\x00\x00\x00", 2},
263         {"\x03\x00\x00\x00\x00\x00\x00\x00", 2},
264         {"\x04\x00\x00\x00\x00\x00\x00\x00", 2},
265         {"\x05\x00\x00\x00\x00\x00\x00\x00", 2},
266         {"\x06\x00\x00\x00\x00\x00\x00\x00", 2},
267         {"\x07\x00\x00\x00\x00\x00\x00\x00", 2},
268         {"\x08\x00\x00\x00\x00\x00\x00\x00", 2},
269         {"\x09\x00\x00\x00\x00\x00\x00\x00", 2},
270         {"\x0A\x00\x00\x00\x00\x00\x00\x00", 2},
271         {"\x0B\x00\x00\x00\x00\x00\x00\x00", 2},
272         {"\x0C\x00\x00\x00\x00\x00\x00\x00", 2},
273         {"\x0D\x00\x00\x00\x00\x00\x00\x00", 2},
274         {"\x0E\x00\x00\x00\x00\x00\x00\x00", 2},
275         {"\x0F\x00\x00\x00\x00\x00\x00\x00", 2},
276         {"\x10\x00\x00\x00\x00\x00\x00\x00", 2},
277         {"\x20\x00\x00\x00\x00\x00\x00\x00", 2},
278         {"\x40\x00\x00\x00\x00\x00\x00\x00", 2},
279         {"\x7E\x00\x00\x00\x00\x00\x00\x00", 2},
280         {"\x7F\x00\x00\x00\x00\x00\x00\x00", 2},
281         {"\x80\x00\x00\x00\x00\x00\x00\x00", 2},
282         {"\x81\x00\x00\x00\x00\x00\x00\x00", 2},
283         {"\xC0\x00\x00\x00\x00\x00\x00\x00", 2},
284         {"\xFE\x00\x00\x00\x00\x00\x00\x00", 2},
285         {"\xFF\x00\x00\x00\x00\x00\x00\x00", 2},
286         {"\xFF\x7E\x00\x00\x00\x00\x00\x00", 2},
287         {"\xFF\x7F\x00\x00\x00\x00\x00\x00", 2},
288         {"\x00\x80\x00\x00\x00\x00\x00\x00", 2},
289         {"\x01\x80\x00\x00\x00\x00\x00\x00", 2},
290         {"\xFE\xFF\x00\x00\x00\x00\x00\x00", 2},
291         /* 4B - NE */
292         {"\x00\x00\x00\x00\x00\x00\x00\x00", 4},
293         {"\x01\x01\x01\x01\x00\x00\x00\x00", 4},
294         {"\x80\x80\x80\x80\x00\x00\x00\x00", 4},
295         {"\xFF\xFF\xFF\xFF\x00\x00\x00\x00", 4},
296         /* 4B - BE */
297         {"\x00\x00\x00\x01\x00\x00\x00\x00", 4},
298         {"\x00\x00\x00\x02\x00\x00\x00\x00", 4},
299         {"\x00\x00\x00\x03\x00\x00\x00\x00", 4},
300         {"\x00\x00\x00\x04\x00\x00\x00\x00", 4},
301         {"\x00\x00\x00\x05\x00\x00\x00\x00", 4},
302         {"\x00\x00\x00\x06\x00\x00\x00\x00", 4},
303         {"\x00\x00\x00\x07\x00\x00\x00\x00", 4},
304         {"\x00\x00\x00\x08\x00\x00\x00\x00", 4},
305         {"\x00\x00\x00\x09\x00\x00\x00\x00", 4},
306         {"\x00\x00\x00\x0A\x00\x00\x00\x00", 4},
307         {"\x00\x00\x00\x0B\x00\x00\x00\x00", 4},
308         {"\x00\x00\x00\x0C\x00\x00\x00\x00", 4},
309         {"\x00\x00\x00\x0D\x00\x00\x00\x00", 4},
310         {"\x00\x00\x00\x0E\x00\x00\x00\x00", 4},
311         {"\x00\x00\x00\x0F\x00\x00\x00\x00", 4},
312         {"\x00\x00\x00\x10\x00\x00\x00\x00", 4},
313         {"\x00\x00\x00\x20\x00\x00\x00\x00", 4},
314         {"\x00\x00\x00\x40\x00\x00\x00\x00", 4},
315         {"\x00\x00\x00\x7E\x00\x00\x00\x00", 4},
316         {"\x00\x00\x00\x7F\x00\x00\x00\x00", 4},
317         {"\x00\x00\x00\x80\x00\x00\x00\x00", 4},
318         {"\x00\x00\x00\x81\x00\x00\x00\x00", 4},
319         {"\x00\x00\x00\xC0\x00\x00\x00\x00", 4},
320         {"\x00\x00\x00\xFE\x00\x00\x00\x00", 4},
321         {"\x00\x00\x00\xFF\x00\x00\x00\x00", 4},
322         {"\x7E\xFF\xFF\xFF\x00\x00\x00\x00", 4},
323         {"\x7F\xFF\xFF\xFF\x00\x00\x00\x00", 4},
324         {"\x80\x00\x00\x00\x00\x00\x00\x00", 4},
325         {"\x80\x00\x00\x01\x00\x00\x00\x00", 4},
326         {"\xFF\xFF\xFF\xFE\x00\x00\x00\x00", 4},
327         /* 4B - LE */
328         {"\x00\x00\x00\x00\x00\x00\x00\x00", 4},
329         {"\x01\x00\x00\x00\x00\x00\x00\x00", 4},
330         {"\x02\x00\x00\x00\x00\x00\x00\x00", 4},
331         {"\x03\x00\x00\x00\x00\x00\x00\x00", 4},
332         {"\x04\x00\x00\x00\x00\x00\x00\x00", 4},
333         {"\x05\x00\x00\x00\x00\x00\x00\x00", 4},
334         {"\x06\x00\x00\x00\x00\x00\x00\x00", 4},
335         {"\x07\x00\x00\x00\x00\x00\x00\x00", 4},
336         {"\x08\x00\x00\x00\x00\x00\x00\x00", 4},
337         {"\x09\x00\x00\x00\x00\x00\x00\x00", 4},
338         {"\x0A\x00\x00\x00\x00\x00\x00\x00", 4},
339         {"\x0B\x00\x00\x00\x00\x00\x00\x00", 4},
340         {"\x0C\x00\x00\x00\x00\x00\x00\x00", 4},
341         {"\x0D\x00\x00\x00\x00\x00\x00\x00", 4},
342         {"\x0E\x00\x00\x00\x00\x00\x00\x00", 4},
343         {"\x0F\x00\x00\x00\x00\x00\x00\x00", 4},
344         {"\x10\x00\x00\x00\x00\x00\x00\x00", 4},
345         {"\x20\x00\x00\x00\x00\x00\x00\x00", 4},
346         {"\x40\x00\x00\x00\x00\x00\x00\x00", 4},
347         {"\x7E\x00\x00\x00\x00\x00\x00\x00", 4},
348         {"\x7F\x00\x00\x00\x00\x00\x00\x00", 4},
349         {"\x80\x00\x00\x00\x00\x00\x00\x00", 4},
350         {"\x81\x00\x00\x00\x00\x00\x00\x00", 4},
351         {"\xC0\x00\x00\x00\x00\x00\x00\x00", 4},
352         {"\xFE\x00\x00\x00\x00\x00\x00\x00", 4},
353         {"\xFF\x00\x00\x00\x00\x00\x00\x00", 4},
354         {"\xFF\xFF\xFF\x7E\x00\x00\x00\x00", 4},
355         {"\xFF\xFF\xFF\x7F\x00\x00\x00\x00", 4},
356         {"\x00\x00\x00\x80\x00\x00\x00\x00", 4},
357         {"\x01\x00\x00\x80\x00\x00\x00\x00", 4},
358         {"\xFE\xFF\xFF\xFF\x00\x00\x00\x00", 4},
359         /* 8B - NE */
360         {"\x00\x00\x00\x00\x00\x00\x00\x00", 8},
361         {"\x01\x01\x01\x01\x01\x01\x01\x01", 8},
362         {"\x80\x80\x80\x80\x80\x80\x80\x80", 8},
363         {"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 8},
364         /* 8B - BE */
365         {"\x00\x00\x00\x00\x00\x00\x00\x01", 8},
366         {"\x00\x00\x00\x00\x00\x00\x00\x02", 8},
367         {"\x00\x00\x00\x00\x00\x00\x00\x03", 8},
368         {"\x00\x00\x00\x00\x00\x00\x00\x04", 8},
369         {"\x00\x00\x00\x00\x00\x00\x00\x05", 8},
370         {"\x00\x00\x00\x00\x00\x00\x00\x06", 8},
371         {"\x00\x00\x00\x00\x00\x00\x00\x07", 8},
372         {"\x00\x00\x00\x00\x00\x00\x00\x08", 8},
373         {"\x00\x00\x00\x00\x00\x00\x00\x09", 8},
374         {"\x00\x00\x00\x00\x00\x00\x00\x0A", 8},
375         {"\x00\x00\x00\x00\x00\x00\x00\x0B", 8},
376         {"\x00\x00\x00\x00\x00\x00\x00\x0C", 8},
377         {"\x00\x00\x00\x00\x00\x00\x00\x0D", 8},
378         {"\x00\x00\x00\x00\x00\x00\x00\x0E", 8},
379         {"\x00\x00\x00\x00\x00\x00\x00\x0F", 8},
380         {"\x00\x00\x00\x00\x00\x00\x00\x10", 8},
381         {"\x00\x00\x00\x00\x00\x00\x00\x20", 8},
382         {"\x00\x00\x00\x00\x00\x00\x00\x40", 8},
383         {"\x00\x00\x00\x00\x00\x00\x00\x7E", 8},
384         {"\x00\x00\x00\x00\x00\x00\x00\x7F", 8},
385         {"\x00\x00\x00\x00\x00\x00\x00\x80", 8},
386         {"\x00\x00\x00\x00\x00\x00\x00\x81", 8},
387         {"\x00\x00\x00\x00\x00\x00\x00\xC0", 8},
388         {"\x00\x00\x00\x00\x00\x00\x00\xFE", 8},
389         {"\x00\x00\x00\x00\x00\x00\x00\xFF", 8},
390         {"\x7E\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 8},
391         {"\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 8},
392         {"\x80\x00\x00\x00\x00\x00\x00\x00", 8},
393         {"\x80\x00\x00\x00\x00\x00\x00\x01", 8},
394         {"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFE", 8},
395         /* 8B - LE */
396         {"\x00\x00\x00\x00\x00\x00\x00\x00", 8},
397         {"\x01\x00\x00\x00\x00\x00\x00\x00", 8},
398         {"\x02\x00\x00\x00\x00\x00\x00\x00", 8},
399         {"\x03\x00\x00\x00\x00\x00\x00\x00", 8},
400         {"\x04\x00\x00\x00\x00\x00\x00\x00", 8},
401         {"\x05\x00\x00\x00\x00\x00\x00\x00", 8},
402         {"\x06\x00\x00\x00\x00\x00\x00\x00", 8},
403         {"\x07\x00\x00\x00\x00\x00\x00\x00", 8},
404         {"\x08\x00\x00\x00\x00\x00\x00\x00", 8},
405         {"\x09\x00\x00\x00\x00\x00\x00\x00", 8},
406         {"\x0A\x00\x00\x00\x00\x00\x00\x00", 8},
407         {"\x0B\x00\x00\x00\x00\x00\x00\x00", 8},
408         {"\x0C\x00\x00\x00\x00\x00\x00\x00", 8},
409         {"\x0D\x00\x00\x00\x00\x00\x00\x00", 8},
410         {"\x0E\x00\x00\x00\x00\x00\x00\x00", 8},
411         {"\x0F\x00\x00\x00\x00\x00\x00\x00", 8},
412         {"\x10\x00\x00\x00\x00\x00\x00\x00", 8},
413         {"\x20\x00\x00\x00\x00\x00\x00\x00", 8},
414         {"\x40\x00\x00\x00\x00\x00\x00\x00", 8},
415         {"\x7E\x00\x00\x00\x00\x00\x00\x00", 8},
416         {"\x7F\x00\x00\x00\x00\x00\x00\x00", 8},
417         {"\x80\x00\x00\x00\x00\x00\x00\x00", 8},
418         {"\x81\x00\x00\x00\x00\x00\x00\x00", 8},
419         {"\xC0\x00\x00\x00\x00\x00\x00\x00", 8},
420         {"\xFE\x00\x00\x00\x00\x00\x00\x00", 8},
421         {"\xFF\x00\x00\x00\x00\x00\x00\x00", 8},
422         {"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7E", 8},
423         {"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7F", 8},
424         {"\x00\x00\x00\x00\x00\x00\x00\x80", 8},
425         {"\x01\x00\x00\x00\x00\x00\x00\x80", 8},
426         {"\xFE\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 8},
427     };
428 
429     size_t off = util_rndGet(0, run->dynamicFileSz - 1);
430     uint64_t choice = util_rndGet(0, ARRAYSIZE(mangleMagicVals) - 1);
431     mangle_Overwrite(run, mangleMagicVals[choice].val, off, mangleMagicVals[choice].size);
432 }
433 
mangle_MagicPrintable(run_t * run)434 static void mangle_MagicPrintable(run_t* run) {
435     static const struct {
436         const uint8_t val[8];
437         const size_t size;
438     } mangleMagicVals[] = {
439         /* 1B - No endianness */
440         {"\x00\x00\x00\x00\x00\x00\x00\x00", 1},
441         {"\x01\x00\x00\x00\x00\x00\x00\x00", 1},
442         {"\x02\x00\x00\x00\x00\x00\x00\x00", 1},
443         {"\x03\x00\x00\x00\x00\x00\x00\x00", 1},
444         {"\x04\x00\x00\x00\x00\x00\x00\x00", 1},
445         {"\x05\x00\x00\x00\x00\x00\x00\x00", 1},
446         {"\x06\x00\x00\x00\x00\x00\x00\x00", 1},
447         {"\x07\x00\x00\x00\x00\x00\x00\x00", 1},
448         {"\x08\x00\x00\x00\x00\x00\x00\x00", 1},
449         {"\x09\x00\x00\x00\x00\x00\x00\x00", 1},
450         {"\x0A\x00\x00\x00\x00\x00\x00\x00", 1},
451         {"\x0B\x00\x00\x00\x00\x00\x00\x00", 1},
452         {"\x0C\x00\x00\x00\x00\x00\x00\x00", 1},
453         {"\x0D\x00\x00\x00\x00\x00\x00\x00", 1},
454         {"\x0E\x00\x00\x00\x00\x00\x00\x00", 1},
455         {"\x0F\x00\x00\x00\x00\x00\x00\x00", 1},
456         {"\x10\x00\x00\x00\x00\x00\x00\x00", 1},
457         {"\x20\x00\x00\x00\x00\x00\x00\x00", 1},
458         {"\x40\x00\x00\x00\x00\x00\x00\x00", 1},
459         {"\x7E\x00\x00\x00\x00\x00\x00\x00", 1},
460         {"\x7F\x00\x00\x00\x00\x00\x00\x00", 1},
461         {"\x80\x00\x00\x00\x00\x00\x00\x00", 1},
462         {"\x81\x00\x00\x00\x00\x00\x00\x00", 1},
463         {"\xC0\x00\x00\x00\x00\x00\x00\x00", 1},
464         {"\xFE\x00\x00\x00\x00\x00\x00\x00", 1},
465         {"\xFF\x00\x00\x00\x00\x00\x00\x00", 1},
466         /* 2B - NE */
467         {"\x00\x00\x00\x00\x00\x00\x00\x00", 2},
468         {"\x01\x01\x00\x00\x00\x00\x00\x00", 2},
469         {"\x80\x80\x00\x00\x00\x00\x00\x00", 2},
470         {"\xFF\xFF\x00\x00\x00\x00\x00\x00", 2},
471         /* 2B - BE */
472         {"\x00\x01\x00\x00\x00\x00\x00\x00", 2},
473         {"\x00\x02\x00\x00\x00\x00\x00\x00", 2},
474         {"\x00\x03\x00\x00\x00\x00\x00\x00", 2},
475         {"\x00\x04\x00\x00\x00\x00\x00\x00", 2},
476         {"\x00\x05\x00\x00\x00\x00\x00\x00", 2},
477         {"\x00\x06\x00\x00\x00\x00\x00\x00", 2},
478         {"\x00\x07\x00\x00\x00\x00\x00\x00", 2},
479         {"\x00\x08\x00\x00\x00\x00\x00\x00", 2},
480         {"\x00\x09\x00\x00\x00\x00\x00\x00", 2},
481         {"\x00\x0A\x00\x00\x00\x00\x00\x00", 2},
482         {"\x00\x0B\x00\x00\x00\x00\x00\x00", 2},
483         {"\x00\x0C\x00\x00\x00\x00\x00\x00", 2},
484         {"\x00\x0D\x00\x00\x00\x00\x00\x00", 2},
485         {"\x00\x0E\x00\x00\x00\x00\x00\x00", 2},
486         {"\x00\x0F\x00\x00\x00\x00\x00\x00", 2},
487         {"\x00\x10\x00\x00\x00\x00\x00\x00", 2},
488         {"\x00\x20\x00\x00\x00\x00\x00\x00", 2},
489         {"\x00\x40\x00\x00\x00\x00\x00\x00", 2},
490         {"\x00\x7E\x00\x00\x00\x00\x00\x00", 2},
491         {"\x00\x7F\x00\x00\x00\x00\x00\x00", 2},
492         {"\x00\x80\x00\x00\x00\x00\x00\x00", 2},
493         {"\x00\x81\x00\x00\x00\x00\x00\x00", 2},
494         {"\x00\xC0\x00\x00\x00\x00\x00\x00", 2},
495         {"\x00\xFE\x00\x00\x00\x00\x00\x00", 2},
496         {"\x00\xFF\x00\x00\x00\x00\x00\x00", 2},
497         {"\x7E\xFF\x00\x00\x00\x00\x00\x00", 2},
498         {"\x7F\xFF\x00\x00\x00\x00\x00\x00", 2},
499         {"\x80\x00\x00\x00\x00\x00\x00\x00", 2},
500         {"\x80\x01\x00\x00\x00\x00\x00\x00", 2},
501         {"\xFF\xFE\x00\x00\x00\x00\x00\x00", 2},
502         /* 2B - LE */
503         {"\x00\x00\x00\x00\x00\x00\x00\x00", 2},
504         {"\x01\x00\x00\x00\x00\x00\x00\x00", 2},
505         {"\x02\x00\x00\x00\x00\x00\x00\x00", 2},
506         {"\x03\x00\x00\x00\x00\x00\x00\x00", 2},
507         {"\x04\x00\x00\x00\x00\x00\x00\x00", 2},
508         {"\x05\x00\x00\x00\x00\x00\x00\x00", 2},
509         {"\x06\x00\x00\x00\x00\x00\x00\x00", 2},
510         {"\x07\x00\x00\x00\x00\x00\x00\x00", 2},
511         {"\x08\x00\x00\x00\x00\x00\x00\x00", 2},
512         {"\x09\x00\x00\x00\x00\x00\x00\x00", 2},
513         {"\x0A\x00\x00\x00\x00\x00\x00\x00", 2},
514         {"\x0B\x00\x00\x00\x00\x00\x00\x00", 2},
515         {"\x0C\x00\x00\x00\x00\x00\x00\x00", 2},
516         {"\x0D\x00\x00\x00\x00\x00\x00\x00", 2},
517         {"\x0E\x00\x00\x00\x00\x00\x00\x00", 2},
518         {"\x0F\x00\x00\x00\x00\x00\x00\x00", 2},
519         {"\x10\x00\x00\x00\x00\x00\x00\x00", 2},
520         {"\x20\x00\x00\x00\x00\x00\x00\x00", 2},
521         {"\x40\x00\x00\x00\x00\x00\x00\x00", 2},
522         {"\x7E\x00\x00\x00\x00\x00\x00\x00", 2},
523         {"\x7F\x00\x00\x00\x00\x00\x00\x00", 2},
524         {"\x80\x00\x00\x00\x00\x00\x00\x00", 2},
525         {"\x81\x00\x00\x00\x00\x00\x00\x00", 2},
526         {"\xC0\x00\x00\x00\x00\x00\x00\x00", 2},
527         {"\xFE\x00\x00\x00\x00\x00\x00\x00", 2},
528         {"\xFF\x00\x00\x00\x00\x00\x00\x00", 2},
529         {"\xFF\x7E\x00\x00\x00\x00\x00\x00", 2},
530         {"\xFF\x7F\x00\x00\x00\x00\x00\x00", 2},
531         {"\x00\x80\x00\x00\x00\x00\x00\x00", 2},
532         {"\x01\x80\x00\x00\x00\x00\x00\x00", 2},
533         {"\xFE\xFF\x00\x00\x00\x00\x00\x00", 2},
534         /* 4B - NE */
535         {"\x00\x00\x00\x00\x00\x00\x00\x00", 4},
536         {"\x01\x01\x01\x01\x00\x00\x00\x00", 4},
537         {"\x80\x80\x80\x80\x00\x00\x00\x00", 4},
538         {"\xFF\xFF\xFF\xFF\x00\x00\x00\x00", 4},
539         /* 4B - BE */
540         {"\x00\x00\x00\x01\x00\x00\x00\x00", 4},
541         {"\x00\x00\x00\x02\x00\x00\x00\x00", 4},
542         {"\x00\x00\x00\x03\x00\x00\x00\x00", 4},
543         {"\x00\x00\x00\x04\x00\x00\x00\x00", 4},
544         {"\x00\x00\x00\x05\x00\x00\x00\x00", 4},
545         {"\x00\x00\x00\x06\x00\x00\x00\x00", 4},
546         {"\x00\x00\x00\x07\x00\x00\x00\x00", 4},
547         {"\x00\x00\x00\x08\x00\x00\x00\x00", 4},
548         {"\x00\x00\x00\x09\x00\x00\x00\x00", 4},
549         {"\x00\x00\x00\x0A\x00\x00\x00\x00", 4},
550         {"\x00\x00\x00\x0B\x00\x00\x00\x00", 4},
551         {"\x00\x00\x00\x0C\x00\x00\x00\x00", 4},
552         {"\x00\x00\x00\x0D\x00\x00\x00\x00", 4},
553         {"\x00\x00\x00\x0E\x00\x00\x00\x00", 4},
554         {"\x00\x00\x00\x0F\x00\x00\x00\x00", 4},
555         {"\x00\x00\x00\x10\x00\x00\x00\x00", 4},
556         {"\x00\x00\x00\x20\x00\x00\x00\x00", 4},
557         {"\x00\x00\x00\x40\x00\x00\x00\x00", 4},
558         {"\x00\x00\x00\x7E\x00\x00\x00\x00", 4},
559         {"\x00\x00\x00\x7F\x00\x00\x00\x00", 4},
560         {"\x00\x00\x00\x80\x00\x00\x00\x00", 4},
561         {"\x00\x00\x00\x81\x00\x00\x00\x00", 4},
562         {"\x00\x00\x00\xC0\x00\x00\x00\x00", 4},
563         {"\x00\x00\x00\xFE\x00\x00\x00\x00", 4},
564         {"\x00\x00\x00\xFF\x00\x00\x00\x00", 4},
565         {"\x7E\xFF\xFF\xFF\x00\x00\x00\x00", 4},
566         {"\x7F\xFF\xFF\xFF\x00\x00\x00\x00", 4},
567         {"\x80\x00\x00\x00\x00\x00\x00\x00", 4},
568         {"\x80\x00\x00\x01\x00\x00\x00\x00", 4},
569         {"\xFF\xFF\xFF\xFE\x00\x00\x00\x00", 4},
570         /* 4B - LE */
571         {"\x00\x00\x00\x00\x00\x00\x00\x00", 4},
572         {"\x01\x00\x00\x00\x00\x00\x00\x00", 4},
573         {"\x02\x00\x00\x00\x00\x00\x00\x00", 4},
574         {"\x03\x00\x00\x00\x00\x00\x00\x00", 4},
575         {"\x04\x00\x00\x00\x00\x00\x00\x00", 4},
576         {"\x05\x00\x00\x00\x00\x00\x00\x00", 4},
577         {"\x06\x00\x00\x00\x00\x00\x00\x00", 4},
578         {"\x07\x00\x00\x00\x00\x00\x00\x00", 4},
579         {"\x08\x00\x00\x00\x00\x00\x00\x00", 4},
580         {"\x09\x00\x00\x00\x00\x00\x00\x00", 4},
581         {"\x0A\x00\x00\x00\x00\x00\x00\x00", 4},
582         {"\x0B\x00\x00\x00\x00\x00\x00\x00", 4},
583         {"\x0C\x00\x00\x00\x00\x00\x00\x00", 4},
584         {"\x0D\x00\x00\x00\x00\x00\x00\x00", 4},
585         {"\x0E\x00\x00\x00\x00\x00\x00\x00", 4},
586         {"\x0F\x00\x00\x00\x00\x00\x00\x00", 4},
587         {"\x10\x00\x00\x00\x00\x00\x00\x00", 4},
588         {"\x20\x00\x00\x00\x00\x00\x00\x00", 4},
589         {"\x40\x00\x00\x00\x00\x00\x00\x00", 4},
590         {"\x7E\x00\x00\x00\x00\x00\x00\x00", 4},
591         {"\x7F\x00\x00\x00\x00\x00\x00\x00", 4},
592         {"\x80\x00\x00\x00\x00\x00\x00\x00", 4},
593         {"\x81\x00\x00\x00\x00\x00\x00\x00", 4},
594         {"\xC0\x00\x00\x00\x00\x00\x00\x00", 4},
595         {"\xFE\x00\x00\x00\x00\x00\x00\x00", 4},
596         {"\xFF\x00\x00\x00\x00\x00\x00\x00", 4},
597         {"\xFF\xFF\xFF\x7E\x00\x00\x00\x00", 4},
598         {"\xFF\xFF\xFF\x7F\x00\x00\x00\x00", 4},
599         {"\x00\x00\x00\x80\x00\x00\x00\x00", 4},
600         {"\x01\x00\x00\x80\x00\x00\x00\x00", 4},
601         {"\xFE\xFF\xFF\xFF\x00\x00\x00\x00", 4},
602         /* 8B - NE */
603         {"\x00\x00\x00\x00\x00\x00\x00\x00", 8},
604         {"\x01\x01\x01\x01\x01\x01\x01\x01", 8},
605         {"\x80\x80\x80\x80\x80\x80\x80\x80", 8},
606         {"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 8},
607         /* 8B - BE */
608         {"\x00\x00\x00\x00\x00\x00\x00\x01", 8},
609         {"\x00\x00\x00\x00\x00\x00\x00\x02", 8},
610         {"\x00\x00\x00\x00\x00\x00\x00\x03", 8},
611         {"\x00\x00\x00\x00\x00\x00\x00\x04", 8},
612         {"\x00\x00\x00\x00\x00\x00\x00\x05", 8},
613         {"\x00\x00\x00\x00\x00\x00\x00\x06", 8},
614         {"\x00\x00\x00\x00\x00\x00\x00\x07", 8},
615         {"\x00\x00\x00\x00\x00\x00\x00\x08", 8},
616         {"\x00\x00\x00\x00\x00\x00\x00\x09", 8},
617         {"\x00\x00\x00\x00\x00\x00\x00\x0A", 8},
618         {"\x00\x00\x00\x00\x00\x00\x00\x0B", 8},
619         {"\x00\x00\x00\x00\x00\x00\x00\x0C", 8},
620         {"\x00\x00\x00\x00\x00\x00\x00\x0D", 8},
621         {"\x00\x00\x00\x00\x00\x00\x00\x0E", 8},
622         {"\x00\x00\x00\x00\x00\x00\x00\x0F", 8},
623         {"\x00\x00\x00\x00\x00\x00\x00\x10", 8},
624         {"\x00\x00\x00\x00\x00\x00\x00\x20", 8},
625         {"\x00\x00\x00\x00\x00\x00\x00\x40", 8},
626         {"\x00\x00\x00\x00\x00\x00\x00\x7E", 8},
627         {"\x00\x00\x00\x00\x00\x00\x00\x7F", 8},
628         {"\x00\x00\x00\x00\x00\x00\x00\x80", 8},
629         {"\x00\x00\x00\x00\x00\x00\x00\x81", 8},
630         {"\x00\x00\x00\x00\x00\x00\x00\xC0", 8},
631         {"\x00\x00\x00\x00\x00\x00\x00\xFE", 8},
632         {"\x00\x00\x00\x00\x00\x00\x00\xFF", 8},
633         {"\x7E\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 8},
634         {"\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 8},
635         {"\x80\x00\x00\x00\x00\x00\x00\x00", 8},
636         {"\x80\x00\x00\x00\x00\x00\x00\x01", 8},
637         {"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFE", 8},
638         /* 8B - LE */
639         {"\x00\x00\x00\x00\x00\x00\x00\x00", 8},
640         {"\x01\x00\x00\x00\x00\x00\x00\x00", 8},
641         {"\x02\x00\x00\x00\x00\x00\x00\x00", 8},
642         {"\x03\x00\x00\x00\x00\x00\x00\x00", 8},
643         {"\x04\x00\x00\x00\x00\x00\x00\x00", 8},
644         {"\x05\x00\x00\x00\x00\x00\x00\x00", 8},
645         {"\x06\x00\x00\x00\x00\x00\x00\x00", 8},
646         {"\x07\x00\x00\x00\x00\x00\x00\x00", 8},
647         {"\x08\x00\x00\x00\x00\x00\x00\x00", 8},
648         {"\x09\x00\x00\x00\x00\x00\x00\x00", 8},
649         {"\x0A\x00\x00\x00\x00\x00\x00\x00", 8},
650         {"\x0B\x00\x00\x00\x00\x00\x00\x00", 8},
651         {"\x0C\x00\x00\x00\x00\x00\x00\x00", 8},
652         {"\x0D\x00\x00\x00\x00\x00\x00\x00", 8},
653         {"\x0E\x00\x00\x00\x00\x00\x00\x00", 8},
654         {"\x0F\x00\x00\x00\x00\x00\x00\x00", 8},
655         {"\x10\x00\x00\x00\x00\x00\x00\x00", 8},
656         {"\x20\x00\x00\x00\x00\x00\x00\x00", 8},
657         {"\x40\x00\x00\x00\x00\x00\x00\x00", 8},
658         {"\x7E\x00\x00\x00\x00\x00\x00\x00", 8},
659         {"\x7F\x00\x00\x00\x00\x00\x00\x00", 8},
660         {"\x80\x00\x00\x00\x00\x00\x00\x00", 8},
661         {"\x81\x00\x00\x00\x00\x00\x00\x00", 8},
662         {"\xC0\x00\x00\x00\x00\x00\x00\x00", 8},
663         {"\xFE\x00\x00\x00\x00\x00\x00\x00", 8},
664         {"\xFF\x00\x00\x00\x00\x00\x00\x00", 8},
665         {"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7E", 8},
666         {"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7F", 8},
667         {"\x00\x00\x00\x00\x00\x00\x00\x80", 8},
668         {"\x01\x00\x00\x00\x00\x00\x00\x80", 8},
669         {"\xFE\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 8},
670     };
671 
672     size_t off = util_rndGet(0, run->dynamicFileSz - 1);
673     uint64_t choice = util_rndGet(0, ARRAYSIZE(mangleMagicVals) - 1);
674     mangle_Overwrite(run, mangleMagicVals[choice].val, off, mangleMagicVals[choice].size);
675     util_turnToPrintable(&run->dynamicFile[off], mangleMagicVals[choice].size);
676 }
677 
mangle_MemSetWithVal(run_t * run,int val)678 static void mangle_MemSetWithVal(run_t* run, int val) {
679     size_t off = util_rndGet(0, run->dynamicFileSz - 1);
680     size_t sz = util_rndGet(1, run->dynamicFileSz - off);
681 
682     memset(&run->dynamicFile[off], val, sz);
683 }
684 
mangle_MemSet(run_t * run)685 static void mangle_MemSet(run_t* run) {
686     mangle_MemSetWithVal(run, (int)util_rndGet(0, UINT8_MAX));
687 }
688 
mangle_MemSetPrintable(run_t * run)689 static void mangle_MemSetPrintable(run_t* run) {
690     mangle_MemSetWithVal(run, (int)util_rndPrintable());
691 }
692 
mangle_Random(run_t * run)693 static void mangle_Random(run_t* run) {
694     size_t off = util_rndGet(0, run->dynamicFileSz - 1);
695     size_t len = util_rndGet(1, run->dynamicFileSz - off);
696     util_rndBuf(&run->dynamicFile[off], len);
697 }
698 
mangle_RandomPrintable(run_t * run)699 static void mangle_RandomPrintable(run_t* run) {
700     size_t off = util_rndGet(0, run->dynamicFileSz - 1);
701     size_t len = util_rndGet(1, run->dynamicFileSz - off);
702     util_rndBufPrintable(&run->dynamicFile[off], len);
703 }
704 
mangle_AddSubWithRange(run_t * run,size_t off,uint64_t varLen)705 static void mangle_AddSubWithRange(run_t* run, size_t off, uint64_t varLen) {
706     int delta = (int)util_rndGet(0, 8192);
707     delta -= 4096;
708 
709     switch (varLen) {
710         case 1: {
711             run->dynamicFile[off] += delta;
712             return;
713             break;
714         }
715         case 2: {
716             int16_t val;
717             memcpy(&val, &run->dynamicFile[off], sizeof(val));
718             if (util_rnd64() & 0x1) {
719                 val += delta;
720             } else {
721                 /* Foreign endianess */
722                 val = __builtin_bswap16(val);
723                 val += delta;
724                 val = __builtin_bswap16(val);
725             }
726             mangle_Overwrite(run, (uint8_t*)&val, off, varLen);
727             return;
728             break;
729         }
730         case 4: {
731             int32_t val;
732             memcpy(&val, &run->dynamicFile[off], sizeof(val));
733             if (util_rnd64() & 0x1) {
734                 val += delta;
735             } else {
736                 /* Foreign endianess */
737                 val = __builtin_bswap32(val);
738                 val += delta;
739                 val = __builtin_bswap32(val);
740             }
741             mangle_Overwrite(run, (uint8_t*)&val, off, varLen);
742             return;
743             break;
744         }
745         case 8: {
746             int64_t val;
747             memcpy(&val, &run->dynamicFile[off], sizeof(val));
748             if (util_rnd64() & 0x1) {
749                 val += delta;
750             } else {
751                 /* Foreign endianess */
752                 val = __builtin_bswap64(val);
753                 val += delta;
754                 val = __builtin_bswap64(val);
755             }
756             mangle_Overwrite(run, (uint8_t*)&val, off, varLen);
757             return;
758             break;
759         }
760         default: {
761             LOG_F("Unknown variable length size: %" PRIu64, varLen);
762             break;
763         }
764     }
765 }
766 
mangle_AddSub(run_t * run)767 static void mangle_AddSub(run_t* run) {
768     size_t off = util_rndGet(0, run->dynamicFileSz - 1);
769 
770     /* 1,2,4,8 */
771     uint64_t varLen = 1U << util_rndGet(0, 3);
772     if ((run->dynamicFileSz - off) < varLen) {
773         varLen = 1;
774     }
775 
776     mangle_AddSubWithRange(run, off, varLen);
777 }
778 
mangle_AddSubPrintable(run_t * run)779 static void mangle_AddSubPrintable(run_t* run) {
780     size_t off = util_rndGet(0, run->dynamicFileSz - 1);
781 
782     /* 1,2,4,8 */
783     uint64_t varLen = 1U << util_rndGet(0, 3);
784     if ((run->dynamicFileSz - off) < varLen) {
785         varLen = 1;
786     }
787 
788     mangle_AddSubWithRange(run, off, varLen);
789     util_turnToPrintable((uint8_t*)&run->dynamicFile[off], varLen);
790 }
791 
mangle_IncByte(run_t * run)792 static void mangle_IncByte(run_t* run) {
793     size_t off = util_rndGet(0, run->dynamicFileSz - 1);
794     run->dynamicFile[off] += (uint8_t)1UL;
795 }
796 
mangle_IncBytePrintable(run_t * run)797 static void mangle_IncBytePrintable(run_t* run) {
798     size_t off = util_rndGet(0, run->dynamicFileSz - 1);
799     run->dynamicFile[off] = (run->dynamicFile[off] - 32 + 1) % 95 + 32;
800 }
801 
mangle_DecByte(run_t * run)802 static void mangle_DecByte(run_t* run) {
803     size_t off = util_rndGet(0, run->dynamicFileSz - 1);
804     run->dynamicFile[off] -= (uint8_t)1UL;
805 }
806 
mangle_DecBytePrintable(run_t * run)807 static void mangle_DecBytePrintable(run_t* run) {
808     size_t off = util_rndGet(0, run->dynamicFileSz - 1);
809     run->dynamicFile[off] = (run->dynamicFile[off] - 32 + 94) % 95 + 32;
810 }
811 
mangle_NegByte(run_t * run)812 static void mangle_NegByte(run_t* run) {
813     size_t off = util_rndGet(0, run->dynamicFileSz - 1);
814     run->dynamicFile[off] = ~(run->dynamicFile[off]);
815 }
816 
mangle_NegBytePrintable(run_t * run)817 static void mangle_NegBytePrintable(run_t* run) {
818     size_t off = util_rndGet(0, run->dynamicFileSz - 1);
819     run->dynamicFile[off] = 94 - (run->dynamicFile[off] - 32) + 32;
820 }
821 
mangle_CloneByte(run_t * run)822 static void mangle_CloneByte(run_t* run) {
823     size_t off1 = util_rndGet(0, run->dynamicFileSz - 1);
824     size_t off2 = util_rndGet(0, run->dynamicFileSz - 1);
825 
826     uint8_t tmp = run->dynamicFile[off1];
827     run->dynamicFile[off1] = run->dynamicFile[off2];
828     run->dynamicFile[off2] = tmp;
829 }
830 
mangle_Resize(run_t * run)831 static void mangle_Resize(run_t* run) {
832     size_t sz = util_rndGet(1, run->global->mutate.maxFileSz);
833     input_setSize(run, sz);
834 }
835 
mangle_Expand(run_t * run)836 static void mangle_Expand(run_t* run) {
837     size_t off = util_rndGet(0, run->dynamicFileSz - 1);
838     size_t len = util_rndGet(1, run->dynamicFileSz - off);
839 
840     mangle_Inflate(run, off, len);
841     mangle_Move(run, off, off + len, run->dynamicFileSz);
842 }
843 
mangle_Shrink(run_t * run)844 static void mangle_Shrink(run_t* run) {
845     if (run->dynamicFileSz <= 1U) {
846         return;
847     }
848 
849     size_t len = util_rndGet(1, run->dynamicFileSz - 1);
850     size_t off = util_rndGet(0, len);
851 
852     input_setSize(run, run->dynamicFileSz - len);
853     mangle_Move(run, off + len, off, run->dynamicFileSz);
854 }
855 
mangle_InsertRnd(run_t * run)856 static void mangle_InsertRnd(run_t* run) {
857     size_t off = util_rndGet(0, run->dynamicFileSz - 1);
858     size_t len = util_rndGet(1, run->dynamicFileSz - off);
859 
860     mangle_Inflate(run, off, len);
861     mangle_Move(run, off, off + len, run->dynamicFileSz);
862     util_rndBuf(&run->dynamicFile[off], len);
863 }
864 
mangle_InsertRndPrintable(run_t * run)865 static void mangle_InsertRndPrintable(run_t* run) {
866     size_t off = util_rndGet(0, run->dynamicFileSz - 1);
867     size_t len = util_rndGet(1, run->dynamicFileSz - off);
868 
869     mangle_Inflate(run, off, len);
870     mangle_Move(run, off, off + len, run->dynamicFileSz);
871     util_rndBufPrintable(&run->dynamicFile[off], len);
872 }
873 
mangle_ASCIIVal(run_t * run)874 static void mangle_ASCIIVal(run_t* run) {
875     char buf[32];
876     snprintf(buf, sizeof(buf), "%" PRId64, (int64_t)util_rnd64());
877     size_t off = util_rndGet(0, run->dynamicFileSz - 1);
878 
879     mangle_Overwrite(run, (uint8_t*)buf, off, strlen(buf));
880 }
881 
mangle_mangleContent(run_t * run)882 void mangle_mangleContent(run_t* run) {
883     static void (*const mangleFuncs[])(run_t * run) = {
884         mangle_Resize,
885         mangle_Byte,
886         mangle_Bit,
887         mangle_Bytes,
888         mangle_Magic,
889         mangle_IncByte,
890         mangle_DecByte,
891         mangle_NegByte,
892         mangle_AddSub,
893         mangle_Dictionary,
894         mangle_DictionaryInsert,
895         mangle_MemMove,
896         mangle_MemSet,
897         mangle_Random,
898         mangle_CloneByte,
899         mangle_Expand,
900         mangle_Shrink,
901         mangle_InsertRnd,
902         mangle_ASCIIVal,
903     };
904 
905     static void (*const manglePrintableFuncs[])(run_t * run) = {
906         mangle_Resize,
907         mangle_PrintableByte,
908         mangle_BitPrintable,
909         mangle_PrintableBytes,
910         mangle_MagicPrintable,
911         mangle_IncBytePrintable,
912         mangle_DecBytePrintable,
913         mangle_NegBytePrintable,
914         mangle_AddSubPrintable,
915         mangle_DictionaryPrintable,
916         mangle_DictionaryInsertPrintable,
917         mangle_MemMove,
918         mangle_MemSetPrintable,
919         mangle_RandomPrintable,
920         mangle_CloneByte,
921         mangle_Expand,
922         mangle_Shrink,
923         mangle_InsertRndPrintable,
924         mangle_ASCIIVal,
925     };
926 
927     if (run->mutationsPerRun == 0U) {
928         return;
929     }
930 
931     /* No point in modifying it, if its size is 0 */
932     if (run->dynamicFileSz == 0UL) {
933         input_setSize(run, 1UL);
934     }
935 
936     /* Max number of stacked changes is, by default, 6 */
937     uint64_t changesCnt = util_rndGet(1, run->global->mutate.mutationsPerRun);
938 
939     if (run->global->cfg.only_printable) {
940         for (uint64_t x = 0; x < changesCnt; x++) {
941             uint64_t choice = util_rndGet(0, ARRAYSIZE(manglePrintableFuncs) - 1);
942             manglePrintableFuncs[choice](run);
943         }
944     } else {
945         for (uint64_t x = 0; x < changesCnt; x++) {
946             uint64_t choice = util_rndGet(0, ARRAYSIZE(mangleFuncs) - 1);
947             mangleFuncs[choice](run);
948         }
949     }
950 }
951