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