blob: 8993a690449e5a16676e6c3b3a95ebda9c6489c5 [file] [log] [blame]
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +00001/*
2 *
Robert Swieckie7294ca2017-11-11 02:46:32 +01003 * honggfuzz - run->dynamicFilefer mangling routines
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +00004 * -----------------------------------------
5 *
6 * Author:
7 * Robert Swiecki <swiecki@google.com>
8 *
Robert Swiecki46288f72018-02-27 17:28:47 +01009 * Copyright 2010-2018 by Google Inc. All Rights Reserved.
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +000010 *
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
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +000025#include "mangle.h"
26
27#include <inttypes.h>
robert.swiecki@gmail.com173f5192015-02-23 00:06:47 +000028#include <math.h>
Robert Swiecki03de4082017-12-06 17:56:50 +010029#include <stdio.h>
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +000030#include <stdlib.h>
31#include <string.h>
robert.swiecki@gmail.come7680522015-02-22 22:22:37 +000032#include <sys/mman.h>
Robert Swiecki3ab16642018-01-12 18:08:37 +010033#include <sys/stat.h>
34#include <sys/types.h>
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +000035#include <unistd.h>
36
Robert Swiecki3ab16642018-01-12 18:08:37 +010037#include "input.h"
Robert Swiecki246af3e2018-01-05 14:56:32 +010038#include "libhfcommon/common.h"
39#include "libhfcommon/log.h"
40#include "libhfcommon/util.h"
Robert Swiecki78346012018-01-12 13:30:38 +010041
Robert Swieckid50ed422017-11-13 23:32:26 +010042static inline void mangle_Overwrite(run_t* run, const uint8_t* src, size_t off, size_t sz) {
Robert Swieckie7294ca2017-11-11 02:46:32 +010043 size_t maxToCopy = run->dynamicFileSz - off;
robert.swiecki@gmail.com1c555c72015-02-22 16:25:54 +000044 if (sz > maxToCopy) {
45 sz = maxToCopy;
46 }
47
Robert Swieckife3429c2017-11-14 00:45:00 +010048 memmove(&run->dynamicFile[off], src, sz);
robert.swiecki@gmail.com1c555c72015-02-22 16:25:54 +000049}
50
Robert Swieckid50ed422017-11-13 23:32:26 +010051static inline void mangle_Move(run_t* run, size_t off_from, size_t off_to, size_t len) {
Robert Swieckie7294ca2017-11-11 02:46:32 +010052 if (off_from >= run->dynamicFileSz) {
Robert Swiecki8e9ed422017-01-26 16:46:55 +010053 return;
54 }
Robert Swieckie7294ca2017-11-11 02:46:32 +010055 if (off_to >= run->dynamicFileSz) {
Robert Swiecki8e9ed422017-01-26 16:46:55 +010056 return;
57 }
58
Robert Swieckie7294ca2017-11-11 02:46:32 +010059 ssize_t len_from = (ssize_t)run->dynamicFileSz - off_from - 1;
60 ssize_t len_to = (ssize_t)run->dynamicFileSz - off_to - 1;
Robert Swiecki8e9ed422017-01-26 16:46:55 +010061
Robert Swiecki4e595fb2017-10-11 17:26:51 +020062 if ((ssize_t)len > len_from) {
Robert Swiecki8e9ed422017-01-26 16:46:55 +010063 len = len_from;
64 }
Robert Swiecki4e595fb2017-10-11 17:26:51 +020065 if ((ssize_t)len > len_to) {
Robert Swiecki8e9ed422017-01-26 16:46:55 +010066 len = len_to;
67 }
68
Robert Swieckie7294ca2017-11-11 02:46:32 +010069 memmove(&run->dynamicFile[off_to], &run->dynamicFile[off_from], len);
Robert Swiecki8e9ed422017-01-26 16:46:55 +010070}
71
Robert Swieckid50ed422017-11-13 23:32:26 +010072static void mangle_Inflate(run_t* run, size_t off, size_t len) {
Robert Swieckie9231d62018-03-02 03:35:11 +010073 if (run->dynamicFileSz >= run->global->mutate.maxFileSz) {
Robert Swiecki40d13412017-01-29 02:45:37 +010074 return;
75 }
Robert Swieckie9231d62018-03-02 03:35:11 +010076 if (len > (run->global->mutate.maxFileSz - run->dynamicFileSz)) {
77 len = run->global->mutate.maxFileSz - run->dynamicFileSz;
Robert Swiecki40d13412017-01-29 02:45:37 +010078 }
79
Robert Swiecki0f2c30a2018-01-13 14:03:39 +010080 input_setSize(run, run->dynamicFileSz + len);
Robert Swieckie7294ca2017-11-11 02:46:32 +010081 mangle_Move(run, off, off + len, run->dynamicFileSz);
Robert Swiecki40d13412017-01-29 02:45:37 +010082}
83
plusun4129bd92018-07-31 14:59:01 +000084static void mangle_InflatePrintable(run_t* run, size_t off, size_t len) {
85 if (run->dynamicFileSz >= run->global->mutate.maxFileSz) {
86 return;
87 }
88 if (len > (run->global->mutate.maxFileSz - run->dynamicFileSz)) {
89 len = run->global->mutate.maxFileSz - run->dynamicFileSz;
90 }
91
92 size_t old_sz = run->dynamicFileSz;
93 input_setSize(run, run->dynamicFileSz + len);
94 memset(&run->dynamicFile[old_sz], ' ', len);
95 mangle_Move(run, off, off + len, run->dynamicFileSz);
96}
97
Robert Swieckid50ed422017-11-13 23:32:26 +010098static void mangle_MemMove(run_t* run) {
Robert Swieckie7294ca2017-11-11 02:46:32 +010099 size_t off_from = util_rndGet(0, run->dynamicFileSz - 1);
100 size_t off_to = util_rndGet(0, run->dynamicFileSz - 1);
101 size_t len = util_rndGet(0, run->dynamicFileSz);
Robert Swiecki8e9ed422017-01-26 16:46:55 +0100102
Robert Swieckie7294ca2017-11-11 02:46:32 +0100103 mangle_Move(run, off_from, off_to, len);
Robert Swiecki8e9ed422017-01-26 16:46:55 +0100104}
105
Robert Swieckid50ed422017-11-13 23:32:26 +0100106static void mangle_Byte(run_t* run) {
Robert Swieckie7294ca2017-11-11 02:46:32 +0100107 size_t off = util_rndGet(0, run->dynamicFileSz - 1);
108 run->dynamicFile[off] = (uint8_t)util_rnd64();
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000109}
110
plusundc64d052018-07-31 13:55:50 +0000111static void mangle_PrintableByte(run_t* run) {
112 size_t off = util_rndGet(0, run->dynamicFileSz - 1);
113 run->dynamicFile[off] = util_rndPrintable();
114}
115
Robert Swieckid50ed422017-11-13 23:32:26 +0100116static void mangle_Bytes(run_t* run) {
Robert Swieckie7294ca2017-11-11 02:46:32 +0100117 size_t off = util_rndGet(0, run->dynamicFileSz - 1);
Robert Swiecki4e595fb2017-10-11 17:26:51 +0200118 uint32_t val = (uint32_t)util_rnd64();
robert.swiecki@gmail.com457ca142015-02-22 14:59:34 +0000119
robert.swiecki@gmail.com12e75062015-02-22 15:01:21 +0000120 /* Overwrite with random 2,3,4-byte values */
121 size_t toCopy = util_rndGet(2, 4);
Robert Swieckie7294ca2017-11-11 02:46:32 +0100122 mangle_Overwrite(run, (uint8_t*)&val, off, toCopy);
robert.swiecki@gmail.com457ca142015-02-22 14:59:34 +0000123}
124
plusundc64d052018-07-31 13:55:50 +0000125static void mangle_PrintableBytes(run_t* run) {
126 size_t off = util_rndGet(0, run->dynamicFileSz - 1);
127 uint32_t val = (uint32_t)util_rnd64();
128 util_turnToPrintable((uint8_t *)&val, sizeof(val));
129
130 /* Overwrite with random 2,3,4-byte values */
131 size_t toCopy = util_rndGet(2, 4);
132 mangle_Overwrite(run, (uint8_t*)&val, off, toCopy);
133}
134
Robert Swieckid50ed422017-11-13 23:32:26 +0100135static void mangle_Bit(run_t* run) {
Robert Swieckie7294ca2017-11-11 02:46:32 +0100136 size_t off = util_rndGet(0, run->dynamicFileSz - 1);
137 run->dynamicFile[off] ^= (uint8_t)(1U << util_rndGet(0, 7));
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000138}
139
plusundc64d052018-07-31 13:55:50 +0000140static void mangle_BitPrintable(run_t* run) {
141 size_t off = util_rndGet(0, run->dynamicFileSz - 1);
142 run->dynamicFile[off] ^= (uint8_t)(1U << util_rndGet(0, 7));
143 util_turnToPrintable(&(run->dynamicFile[off]), 1);
144}
145
Robert Swieckid50ed422017-11-13 23:32:26 +0100146static void mangle_DictionaryInsert(run_t* run) {
Robert Swiecki04dcac32018-03-02 03:05:26 +0100147 if (run->global->mutate.dictionaryCnt == 0) {
Robert Swiecki78633d12017-11-13 23:24:55 +0100148 mangle_Bit(run);
Robert Swiecki40d13412017-01-29 02:45:37 +0100149 return;
150 }
151
Robert Swiecki04dcac32018-03-02 03:05:26 +0100152 uint64_t choice = util_rndGet(0, run->global->mutate.dictionaryCnt - 1);
153 struct strings_t* str = TAILQ_FIRST(&run->global->mutate.dictq);
Robert Swiecki40d13412017-01-29 02:45:37 +0100154 for (uint64_t i = 0; i < choice; i++) {
Robert Swieckiafb16102017-03-13 22:14:31 +0100155 str = TAILQ_NEXT(str, pointers);
Robert Swiecki40d13412017-01-29 02:45:37 +0100156 }
157
Robert Swieckie7294ca2017-11-11 02:46:32 +0100158 size_t off = util_rndGet(0, run->dynamicFileSz - 1);
Robert Swiecki78633d12017-11-13 23:24:55 +0100159 mangle_Inflate(run, off, str->len);
Robert Swieckie7294ca2017-11-11 02:46:32 +0100160 mangle_Move(run, off, off + str->len, str->len);
161 mangle_Overwrite(run, (uint8_t*)str->s, off, str->len);
Robert Swiecki40d13412017-01-29 02:45:37 +0100162}
163
plusundc64d052018-07-31 13:55:50 +0000164static void mangle_DictionaryInsertPrintable(run_t* run) {
165 if (run->global->mutate.dictionaryCnt == 0) {
166 mangle_BitPrintable(run);
167 return;
168 }
169
170 uint64_t choice = util_rndGet(0, run->global->mutate.dictionaryCnt - 1);
171 struct strings_t* str = TAILQ_FIRST(&run->global->mutate.dictq);
172 for (uint64_t i = 0; i < choice; i++) {
173 str = TAILQ_NEXT(str, pointers);
174 }
175
176 size_t off = util_rndGet(0, run->dynamicFileSz - 1);
177 mangle_Inflate(run, off, str->len);
178 mangle_Move(run, off, off + str->len, str->len);
179 mangle_Overwrite(run, (uint8_t*)str->s, off, str->len);
180}
181
Robert Swieckid50ed422017-11-13 23:32:26 +0100182static void mangle_Dictionary(run_t* run) {
Robert Swiecki04dcac32018-03-02 03:05:26 +0100183 if (run->global->mutate.dictionaryCnt == 0) {
Robert Swiecki78633d12017-11-13 23:24:55 +0100184 mangle_Bit(run);
tlogic@gmail.com7b6d7ee2015-04-23 21:30:12 +0000185 return;
robert.swiecki@gmail.com4f1124f2015-04-21 17:12:22 +0000186 }
187
Robert Swieckie7294ca2017-11-11 02:46:32 +0100188 size_t off = util_rndGet(0, run->dynamicFileSz - 1);
Robert Swiecki531438a2016-09-13 19:05:11 +0200189
Robert Swiecki04dcac32018-03-02 03:05:26 +0100190 uint64_t choice = util_rndGet(0, run->global->mutate.dictionaryCnt - 1);
191 struct strings_t* str = TAILQ_FIRST(&run->global->mutate.dictq);
Robert Swiecki8e9ed422017-01-26 16:46:55 +0100192 for (uint64_t i = 0; i < choice; i++) {
Robert Swieckiafb16102017-03-13 22:14:31 +0100193 str = TAILQ_NEXT(str, pointers);
Robert Swiecki8e9ed422017-01-26 16:46:55 +0100194 }
195
Robert Swieckie7294ca2017-11-11 02:46:32 +0100196 mangle_Overwrite(run, (uint8_t*)str->s, off, str->len);
plusundc64d052018-07-31 13:55:50 +0000197 /* FIXME */
198}
199
200static void mangle_DictionaryPrintable(run_t* run) {
201 if (run->global->mutate.dictionaryCnt == 0) {
202 mangle_BitPrintable(run);
203 return;
204 }
205
206 size_t off = util_rndGet(0, run->dynamicFileSz - 1);
207
208 uint64_t choice = util_rndGet(0, run->global->mutate.dictionaryCnt - 1);
209 struct strings_t* str = TAILQ_FIRST(&run->global->mutate.dictq);
210 for (uint64_t i = 0; i < choice; i++) {
211 str = TAILQ_NEXT(str, pointers);
212 }
213
214 mangle_Overwrite(run, (uint8_t*)str->s, off, str->len);
215 /* FIXME */
Robert Swiecki8e9ed422017-01-26 16:46:55 +0100216}
217
Robert Swieckid50ed422017-11-13 23:32:26 +0100218static void mangle_Magic(run_t* run) {
robert.swiecki@gmail.com3d928f12015-04-15 14:43:21 +0000219 static const struct {
Anestis Bechtsoudis4799a9d2015-12-20 15:44:26 +0200220 const uint8_t val[8];
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000221 const size_t size;
Anestis Bechtsoudis4799a9d2015-12-20 15:44:26 +0200222 } mangleMagicVals[] = {
Anestis Bechtsoudis51c9bb12015-08-26 14:46:21 +0300223 /* 1B - No endianness */
Robert Swieckid50ed422017-11-13 23:32:26 +0100224 {"\x00\x00\x00\x00\x00\x00\x00\x00", 1},
225 {"\x01\x00\x00\x00\x00\x00\x00\x00", 1},
226 {"\x02\x00\x00\x00\x00\x00\x00\x00", 1},
227 {"\x03\x00\x00\x00\x00\x00\x00\x00", 1},
228 {"\x04\x00\x00\x00\x00\x00\x00\x00", 1},
229 {"\x05\x00\x00\x00\x00\x00\x00\x00", 1},
230 {"\x06\x00\x00\x00\x00\x00\x00\x00", 1},
231 {"\x07\x00\x00\x00\x00\x00\x00\x00", 1},
232 {"\x08\x00\x00\x00\x00\x00\x00\x00", 1},
233 {"\x09\x00\x00\x00\x00\x00\x00\x00", 1},
234 {"\x0A\x00\x00\x00\x00\x00\x00\x00", 1},
235 {"\x0B\x00\x00\x00\x00\x00\x00\x00", 1},
236 {"\x0C\x00\x00\x00\x00\x00\x00\x00", 1},
237 {"\x0D\x00\x00\x00\x00\x00\x00\x00", 1},
238 {"\x0E\x00\x00\x00\x00\x00\x00\x00", 1},
239 {"\x0F\x00\x00\x00\x00\x00\x00\x00", 1},
240 {"\x10\x00\x00\x00\x00\x00\x00\x00", 1},
241 {"\x20\x00\x00\x00\x00\x00\x00\x00", 1},
242 {"\x40\x00\x00\x00\x00\x00\x00\x00", 1},
243 {"\x7E\x00\x00\x00\x00\x00\x00\x00", 1},
244 {"\x7F\x00\x00\x00\x00\x00\x00\x00", 1},
245 {"\x80\x00\x00\x00\x00\x00\x00\x00", 1},
246 {"\x81\x00\x00\x00\x00\x00\x00\x00", 1},
247 {"\xC0\x00\x00\x00\x00\x00\x00\x00", 1},
248 {"\xFE\x00\x00\x00\x00\x00\x00\x00", 1},
249 {"\xFF\x00\x00\x00\x00\x00\x00\x00", 1},
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000250 /* 2B - NE */
Robert Swieckid50ed422017-11-13 23:32:26 +0100251 {"\x00\x00\x00\x00\x00\x00\x00\x00", 2},
252 {"\x01\x01\x00\x00\x00\x00\x00\x00", 2},
253 {"\x80\x80\x00\x00\x00\x00\x00\x00", 2},
254 {"\xFF\xFF\x00\x00\x00\x00\x00\x00", 2},
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000255 /* 2B - BE */
Robert Swieckid50ed422017-11-13 23:32:26 +0100256 {"\x00\x01\x00\x00\x00\x00\x00\x00", 2},
257 {"\x00\x02\x00\x00\x00\x00\x00\x00", 2},
258 {"\x00\x03\x00\x00\x00\x00\x00\x00", 2},
259 {"\x00\x04\x00\x00\x00\x00\x00\x00", 2},
260 {"\x00\x05\x00\x00\x00\x00\x00\x00", 2},
261 {"\x00\x06\x00\x00\x00\x00\x00\x00", 2},
262 {"\x00\x07\x00\x00\x00\x00\x00\x00", 2},
263 {"\x00\x08\x00\x00\x00\x00\x00\x00", 2},
264 {"\x00\x09\x00\x00\x00\x00\x00\x00", 2},
265 {"\x00\x0A\x00\x00\x00\x00\x00\x00", 2},
266 {"\x00\x0B\x00\x00\x00\x00\x00\x00", 2},
267 {"\x00\x0C\x00\x00\x00\x00\x00\x00", 2},
268 {"\x00\x0D\x00\x00\x00\x00\x00\x00", 2},
269 {"\x00\x0E\x00\x00\x00\x00\x00\x00", 2},
270 {"\x00\x0F\x00\x00\x00\x00\x00\x00", 2},
271 {"\x00\x10\x00\x00\x00\x00\x00\x00", 2},
272 {"\x00\x20\x00\x00\x00\x00\x00\x00", 2},
273 {"\x00\x40\x00\x00\x00\x00\x00\x00", 2},
274 {"\x00\x7E\x00\x00\x00\x00\x00\x00", 2},
275 {"\x00\x7F\x00\x00\x00\x00\x00\x00", 2},
276 {"\x00\x80\x00\x00\x00\x00\x00\x00", 2},
277 {"\x00\x81\x00\x00\x00\x00\x00\x00", 2},
278 {"\x00\xC0\x00\x00\x00\x00\x00\x00", 2},
279 {"\x00\xFE\x00\x00\x00\x00\x00\x00", 2},
280 {"\x00\xFF\x00\x00\x00\x00\x00\x00", 2},
281 {"\x7E\xFF\x00\x00\x00\x00\x00\x00", 2},
282 {"\x7F\xFF\x00\x00\x00\x00\x00\x00", 2},
283 {"\x80\x00\x00\x00\x00\x00\x00\x00", 2},
284 {"\x80\x01\x00\x00\x00\x00\x00\x00", 2},
285 {"\xFF\xFE\x00\x00\x00\x00\x00\x00", 2},
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000286 /* 2B - LE */
Robert Swieckid50ed422017-11-13 23:32:26 +0100287 {"\x00\x00\x00\x00\x00\x00\x00\x00", 2},
288 {"\x01\x00\x00\x00\x00\x00\x00\x00", 2},
289 {"\x02\x00\x00\x00\x00\x00\x00\x00", 2},
290 {"\x03\x00\x00\x00\x00\x00\x00\x00", 2},
291 {"\x04\x00\x00\x00\x00\x00\x00\x00", 2},
292 {"\x05\x00\x00\x00\x00\x00\x00\x00", 2},
293 {"\x06\x00\x00\x00\x00\x00\x00\x00", 2},
294 {"\x07\x00\x00\x00\x00\x00\x00\x00", 2},
295 {"\x08\x00\x00\x00\x00\x00\x00\x00", 2},
296 {"\x09\x00\x00\x00\x00\x00\x00\x00", 2},
297 {"\x0A\x00\x00\x00\x00\x00\x00\x00", 2},
298 {"\x0B\x00\x00\x00\x00\x00\x00\x00", 2},
299 {"\x0C\x00\x00\x00\x00\x00\x00\x00", 2},
300 {"\x0D\x00\x00\x00\x00\x00\x00\x00", 2},
301 {"\x0E\x00\x00\x00\x00\x00\x00\x00", 2},
302 {"\x0F\x00\x00\x00\x00\x00\x00\x00", 2},
303 {"\x10\x00\x00\x00\x00\x00\x00\x00", 2},
304 {"\x20\x00\x00\x00\x00\x00\x00\x00", 2},
305 {"\x40\x00\x00\x00\x00\x00\x00\x00", 2},
306 {"\x7E\x00\x00\x00\x00\x00\x00\x00", 2},
307 {"\x7F\x00\x00\x00\x00\x00\x00\x00", 2},
308 {"\x80\x00\x00\x00\x00\x00\x00\x00", 2},
309 {"\x81\x00\x00\x00\x00\x00\x00\x00", 2},
310 {"\xC0\x00\x00\x00\x00\x00\x00\x00", 2},
311 {"\xFE\x00\x00\x00\x00\x00\x00\x00", 2},
312 {"\xFF\x00\x00\x00\x00\x00\x00\x00", 2},
313 {"\xFF\x7E\x00\x00\x00\x00\x00\x00", 2},
314 {"\xFF\x7F\x00\x00\x00\x00\x00\x00", 2},
315 {"\x00\x80\x00\x00\x00\x00\x00\x00", 2},
316 {"\x01\x80\x00\x00\x00\x00\x00\x00", 2},
317 {"\xFE\xFF\x00\x00\x00\x00\x00\x00", 2},
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000318 /* 4B - NE */
Robert Swieckid50ed422017-11-13 23:32:26 +0100319 {"\x00\x00\x00\x00\x00\x00\x00\x00", 4},
320 {"\x01\x01\x01\x01\x00\x00\x00\x00", 4},
321 {"\x80\x80\x80\x80\x00\x00\x00\x00", 4},
322 {"\xFF\xFF\xFF\xFF\x00\x00\x00\x00", 4},
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000323 /* 4B - BE */
Robert Swieckid50ed422017-11-13 23:32:26 +0100324 {"\x00\x00\x00\x01\x00\x00\x00\x00", 4},
325 {"\x00\x00\x00\x02\x00\x00\x00\x00", 4},
326 {"\x00\x00\x00\x03\x00\x00\x00\x00", 4},
327 {"\x00\x00\x00\x04\x00\x00\x00\x00", 4},
328 {"\x00\x00\x00\x05\x00\x00\x00\x00", 4},
329 {"\x00\x00\x00\x06\x00\x00\x00\x00", 4},
330 {"\x00\x00\x00\x07\x00\x00\x00\x00", 4},
331 {"\x00\x00\x00\x08\x00\x00\x00\x00", 4},
332 {"\x00\x00\x00\x09\x00\x00\x00\x00", 4},
333 {"\x00\x00\x00\x0A\x00\x00\x00\x00", 4},
334 {"\x00\x00\x00\x0B\x00\x00\x00\x00", 4},
335 {"\x00\x00\x00\x0C\x00\x00\x00\x00", 4},
336 {"\x00\x00\x00\x0D\x00\x00\x00\x00", 4},
337 {"\x00\x00\x00\x0E\x00\x00\x00\x00", 4},
338 {"\x00\x00\x00\x0F\x00\x00\x00\x00", 4},
339 {"\x00\x00\x00\x10\x00\x00\x00\x00", 4},
340 {"\x00\x00\x00\x20\x00\x00\x00\x00", 4},
341 {"\x00\x00\x00\x40\x00\x00\x00\x00", 4},
342 {"\x00\x00\x00\x7E\x00\x00\x00\x00", 4},
343 {"\x00\x00\x00\x7F\x00\x00\x00\x00", 4},
344 {"\x00\x00\x00\x80\x00\x00\x00\x00", 4},
345 {"\x00\x00\x00\x81\x00\x00\x00\x00", 4},
346 {"\x00\x00\x00\xC0\x00\x00\x00\x00", 4},
347 {"\x00\x00\x00\xFE\x00\x00\x00\x00", 4},
348 {"\x00\x00\x00\xFF\x00\x00\x00\x00", 4},
349 {"\x7E\xFF\xFF\xFF\x00\x00\x00\x00", 4},
350 {"\x7F\xFF\xFF\xFF\x00\x00\x00\x00", 4},
351 {"\x80\x00\x00\x00\x00\x00\x00\x00", 4},
352 {"\x80\x00\x00\x01\x00\x00\x00\x00", 4},
353 {"\xFF\xFF\xFF\xFE\x00\x00\x00\x00", 4},
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000354 /* 4B - LE */
Robert Swieckid50ed422017-11-13 23:32:26 +0100355 {"\x00\x00\x00\x00\x00\x00\x00\x00", 4},
356 {"\x01\x00\x00\x00\x00\x00\x00\x00", 4},
357 {"\x02\x00\x00\x00\x00\x00\x00\x00", 4},
358 {"\x03\x00\x00\x00\x00\x00\x00\x00", 4},
359 {"\x04\x00\x00\x00\x00\x00\x00\x00", 4},
360 {"\x05\x00\x00\x00\x00\x00\x00\x00", 4},
361 {"\x06\x00\x00\x00\x00\x00\x00\x00", 4},
362 {"\x07\x00\x00\x00\x00\x00\x00\x00", 4},
363 {"\x08\x00\x00\x00\x00\x00\x00\x00", 4},
364 {"\x09\x00\x00\x00\x00\x00\x00\x00", 4},
365 {"\x0A\x00\x00\x00\x00\x00\x00\x00", 4},
366 {"\x0B\x00\x00\x00\x00\x00\x00\x00", 4},
367 {"\x0C\x00\x00\x00\x00\x00\x00\x00", 4},
368 {"\x0D\x00\x00\x00\x00\x00\x00\x00", 4},
369 {"\x0E\x00\x00\x00\x00\x00\x00\x00", 4},
370 {"\x0F\x00\x00\x00\x00\x00\x00\x00", 4},
371 {"\x10\x00\x00\x00\x00\x00\x00\x00", 4},
372 {"\x20\x00\x00\x00\x00\x00\x00\x00", 4},
373 {"\x40\x00\x00\x00\x00\x00\x00\x00", 4},
374 {"\x7E\x00\x00\x00\x00\x00\x00\x00", 4},
375 {"\x7F\x00\x00\x00\x00\x00\x00\x00", 4},
376 {"\x80\x00\x00\x00\x00\x00\x00\x00", 4},
377 {"\x81\x00\x00\x00\x00\x00\x00\x00", 4},
378 {"\xC0\x00\x00\x00\x00\x00\x00\x00", 4},
379 {"\xFE\x00\x00\x00\x00\x00\x00\x00", 4},
380 {"\xFF\x00\x00\x00\x00\x00\x00\x00", 4},
381 {"\xFF\xFF\xFF\x7E\x00\x00\x00\x00", 4},
382 {"\xFF\xFF\xFF\x7F\x00\x00\x00\x00", 4},
383 {"\x00\x00\x00\x80\x00\x00\x00\x00", 4},
384 {"\x01\x00\x00\x80\x00\x00\x00\x00", 4},
385 {"\xFE\xFF\xFF\xFF\x00\x00\x00\x00", 4},
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000386 /* 8B - NE */
Robert Swieckid50ed422017-11-13 23:32:26 +0100387 {"\x00\x00\x00\x00\x00\x00\x00\x00", 8},
388 {"\x01\x01\x01\x01\x01\x01\x01\x01", 8},
389 {"\x80\x80\x80\x80\x80\x80\x80\x80", 8},
390 {"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 8},
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000391 /* 8B - BE */
Robert Swieckid50ed422017-11-13 23:32:26 +0100392 {"\x00\x00\x00\x00\x00\x00\x00\x01", 8},
393 {"\x00\x00\x00\x00\x00\x00\x00\x02", 8},
394 {"\x00\x00\x00\x00\x00\x00\x00\x03", 8},
395 {"\x00\x00\x00\x00\x00\x00\x00\x04", 8},
396 {"\x00\x00\x00\x00\x00\x00\x00\x05", 8},
397 {"\x00\x00\x00\x00\x00\x00\x00\x06", 8},
398 {"\x00\x00\x00\x00\x00\x00\x00\x07", 8},
399 {"\x00\x00\x00\x00\x00\x00\x00\x08", 8},
400 {"\x00\x00\x00\x00\x00\x00\x00\x09", 8},
401 {"\x00\x00\x00\x00\x00\x00\x00\x0A", 8},
402 {"\x00\x00\x00\x00\x00\x00\x00\x0B", 8},
403 {"\x00\x00\x00\x00\x00\x00\x00\x0C", 8},
404 {"\x00\x00\x00\x00\x00\x00\x00\x0D", 8},
405 {"\x00\x00\x00\x00\x00\x00\x00\x0E", 8},
406 {"\x00\x00\x00\x00\x00\x00\x00\x0F", 8},
407 {"\x00\x00\x00\x00\x00\x00\x00\x10", 8},
408 {"\x00\x00\x00\x00\x00\x00\x00\x20", 8},
409 {"\x00\x00\x00\x00\x00\x00\x00\x40", 8},
410 {"\x00\x00\x00\x00\x00\x00\x00\x7E", 8},
411 {"\x00\x00\x00\x00\x00\x00\x00\x7F", 8},
412 {"\x00\x00\x00\x00\x00\x00\x00\x80", 8},
413 {"\x00\x00\x00\x00\x00\x00\x00\x81", 8},
414 {"\x00\x00\x00\x00\x00\x00\x00\xC0", 8},
415 {"\x00\x00\x00\x00\x00\x00\x00\xFE", 8},
416 {"\x00\x00\x00\x00\x00\x00\x00\xFF", 8},
417 {"\x7E\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 8},
418 {"\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 8},
419 {"\x80\x00\x00\x00\x00\x00\x00\x00", 8},
420 {"\x80\x00\x00\x00\x00\x00\x00\x01", 8},
421 {"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFE", 8},
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000422 /* 8B - LE */
Robert Swieckid50ed422017-11-13 23:32:26 +0100423 {"\x00\x00\x00\x00\x00\x00\x00\x00", 8},
424 {"\x01\x00\x00\x00\x00\x00\x00\x00", 8},
425 {"\x02\x00\x00\x00\x00\x00\x00\x00", 8},
426 {"\x03\x00\x00\x00\x00\x00\x00\x00", 8},
427 {"\x04\x00\x00\x00\x00\x00\x00\x00", 8},
428 {"\x05\x00\x00\x00\x00\x00\x00\x00", 8},
429 {"\x06\x00\x00\x00\x00\x00\x00\x00", 8},
430 {"\x07\x00\x00\x00\x00\x00\x00\x00", 8},
431 {"\x08\x00\x00\x00\x00\x00\x00\x00", 8},
432 {"\x09\x00\x00\x00\x00\x00\x00\x00", 8},
433 {"\x0A\x00\x00\x00\x00\x00\x00\x00", 8},
434 {"\x0B\x00\x00\x00\x00\x00\x00\x00", 8},
435 {"\x0C\x00\x00\x00\x00\x00\x00\x00", 8},
436 {"\x0D\x00\x00\x00\x00\x00\x00\x00", 8},
437 {"\x0E\x00\x00\x00\x00\x00\x00\x00", 8},
438 {"\x0F\x00\x00\x00\x00\x00\x00\x00", 8},
439 {"\x10\x00\x00\x00\x00\x00\x00\x00", 8},
440 {"\x20\x00\x00\x00\x00\x00\x00\x00", 8},
441 {"\x40\x00\x00\x00\x00\x00\x00\x00", 8},
442 {"\x7E\x00\x00\x00\x00\x00\x00\x00", 8},
443 {"\x7F\x00\x00\x00\x00\x00\x00\x00", 8},
444 {"\x80\x00\x00\x00\x00\x00\x00\x00", 8},
445 {"\x81\x00\x00\x00\x00\x00\x00\x00", 8},
446 {"\xC0\x00\x00\x00\x00\x00\x00\x00", 8},
447 {"\xFE\x00\x00\x00\x00\x00\x00\x00", 8},
448 {"\xFF\x00\x00\x00\x00\x00\x00\x00", 8},
449 {"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7E", 8},
450 {"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7F", 8},
451 {"\x00\x00\x00\x00\x00\x00\x00\x80", 8},
452 {"\x01\x00\x00\x00\x00\x00\x00\x80", 8},
453 {"\xFE\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 8},
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000454 };
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000455
Robert Swieckie7294ca2017-11-11 02:46:32 +0100456 size_t off = util_rndGet(0, run->dynamicFileSz - 1);
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000457 uint64_t choice = util_rndGet(0, ARRAYSIZE(mangleMagicVals) - 1);
Robert Swieckie7294ca2017-11-11 02:46:32 +0100458 mangle_Overwrite(run, mangleMagicVals[choice].val, off, mangleMagicVals[choice].size);
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000459}
460
plusundc64d052018-07-31 13:55:50 +0000461static void mangle_MagicPrintable(run_t* run) {
462 static const struct {
463 const uint8_t val[8];
464 const size_t size;
465 } mangleMagicVals[] = {
466 /* 1B - No endianness */
467 {"\x00\x00\x00\x00\x00\x00\x00\x00", 1},
468 {"\x01\x00\x00\x00\x00\x00\x00\x00", 1},
469 {"\x02\x00\x00\x00\x00\x00\x00\x00", 1},
470 {"\x03\x00\x00\x00\x00\x00\x00\x00", 1},
471 {"\x04\x00\x00\x00\x00\x00\x00\x00", 1},
472 {"\x05\x00\x00\x00\x00\x00\x00\x00", 1},
473 {"\x06\x00\x00\x00\x00\x00\x00\x00", 1},
474 {"\x07\x00\x00\x00\x00\x00\x00\x00", 1},
475 {"\x08\x00\x00\x00\x00\x00\x00\x00", 1},
476 {"\x09\x00\x00\x00\x00\x00\x00\x00", 1},
477 {"\x0A\x00\x00\x00\x00\x00\x00\x00", 1},
478 {"\x0B\x00\x00\x00\x00\x00\x00\x00", 1},
479 {"\x0C\x00\x00\x00\x00\x00\x00\x00", 1},
480 {"\x0D\x00\x00\x00\x00\x00\x00\x00", 1},
481 {"\x0E\x00\x00\x00\x00\x00\x00\x00", 1},
482 {"\x0F\x00\x00\x00\x00\x00\x00\x00", 1},
483 {"\x10\x00\x00\x00\x00\x00\x00\x00", 1},
484 {"\x20\x00\x00\x00\x00\x00\x00\x00", 1},
485 {"\x40\x00\x00\x00\x00\x00\x00\x00", 1},
486 {"\x7E\x00\x00\x00\x00\x00\x00\x00", 1},
487 {"\x7F\x00\x00\x00\x00\x00\x00\x00", 1},
488 {"\x80\x00\x00\x00\x00\x00\x00\x00", 1},
489 {"\x81\x00\x00\x00\x00\x00\x00\x00", 1},
490 {"\xC0\x00\x00\x00\x00\x00\x00\x00", 1},
491 {"\xFE\x00\x00\x00\x00\x00\x00\x00", 1},
492 {"\xFF\x00\x00\x00\x00\x00\x00\x00", 1},
493 /* 2B - NE */
494 {"\x00\x00\x00\x00\x00\x00\x00\x00", 2},
495 {"\x01\x01\x00\x00\x00\x00\x00\x00", 2},
496 {"\x80\x80\x00\x00\x00\x00\x00\x00", 2},
497 {"\xFF\xFF\x00\x00\x00\x00\x00\x00", 2},
498 /* 2B - BE */
499 {"\x00\x01\x00\x00\x00\x00\x00\x00", 2},
500 {"\x00\x02\x00\x00\x00\x00\x00\x00", 2},
501 {"\x00\x03\x00\x00\x00\x00\x00\x00", 2},
502 {"\x00\x04\x00\x00\x00\x00\x00\x00", 2},
503 {"\x00\x05\x00\x00\x00\x00\x00\x00", 2},
504 {"\x00\x06\x00\x00\x00\x00\x00\x00", 2},
505 {"\x00\x07\x00\x00\x00\x00\x00\x00", 2},
506 {"\x00\x08\x00\x00\x00\x00\x00\x00", 2},
507 {"\x00\x09\x00\x00\x00\x00\x00\x00", 2},
508 {"\x00\x0A\x00\x00\x00\x00\x00\x00", 2},
509 {"\x00\x0B\x00\x00\x00\x00\x00\x00", 2},
510 {"\x00\x0C\x00\x00\x00\x00\x00\x00", 2},
511 {"\x00\x0D\x00\x00\x00\x00\x00\x00", 2},
512 {"\x00\x0E\x00\x00\x00\x00\x00\x00", 2},
513 {"\x00\x0F\x00\x00\x00\x00\x00\x00", 2},
514 {"\x00\x10\x00\x00\x00\x00\x00\x00", 2},
515 {"\x00\x20\x00\x00\x00\x00\x00\x00", 2},
516 {"\x00\x40\x00\x00\x00\x00\x00\x00", 2},
517 {"\x00\x7E\x00\x00\x00\x00\x00\x00", 2},
518 {"\x00\x7F\x00\x00\x00\x00\x00\x00", 2},
519 {"\x00\x80\x00\x00\x00\x00\x00\x00", 2},
520 {"\x00\x81\x00\x00\x00\x00\x00\x00", 2},
521 {"\x00\xC0\x00\x00\x00\x00\x00\x00", 2},
522 {"\x00\xFE\x00\x00\x00\x00\x00\x00", 2},
523 {"\x00\xFF\x00\x00\x00\x00\x00\x00", 2},
524 {"\x7E\xFF\x00\x00\x00\x00\x00\x00", 2},
525 {"\x7F\xFF\x00\x00\x00\x00\x00\x00", 2},
526 {"\x80\x00\x00\x00\x00\x00\x00\x00", 2},
527 {"\x80\x01\x00\x00\x00\x00\x00\x00", 2},
528 {"\xFF\xFE\x00\x00\x00\x00\x00\x00", 2},
529 /* 2B - LE */
530 {"\x00\x00\x00\x00\x00\x00\x00\x00", 2},
531 {"\x01\x00\x00\x00\x00\x00\x00\x00", 2},
532 {"\x02\x00\x00\x00\x00\x00\x00\x00", 2},
533 {"\x03\x00\x00\x00\x00\x00\x00\x00", 2},
534 {"\x04\x00\x00\x00\x00\x00\x00\x00", 2},
535 {"\x05\x00\x00\x00\x00\x00\x00\x00", 2},
536 {"\x06\x00\x00\x00\x00\x00\x00\x00", 2},
537 {"\x07\x00\x00\x00\x00\x00\x00\x00", 2},
538 {"\x08\x00\x00\x00\x00\x00\x00\x00", 2},
539 {"\x09\x00\x00\x00\x00\x00\x00\x00", 2},
540 {"\x0A\x00\x00\x00\x00\x00\x00\x00", 2},
541 {"\x0B\x00\x00\x00\x00\x00\x00\x00", 2},
542 {"\x0C\x00\x00\x00\x00\x00\x00\x00", 2},
543 {"\x0D\x00\x00\x00\x00\x00\x00\x00", 2},
544 {"\x0E\x00\x00\x00\x00\x00\x00\x00", 2},
545 {"\x0F\x00\x00\x00\x00\x00\x00\x00", 2},
546 {"\x10\x00\x00\x00\x00\x00\x00\x00", 2},
547 {"\x20\x00\x00\x00\x00\x00\x00\x00", 2},
548 {"\x40\x00\x00\x00\x00\x00\x00\x00", 2},
549 {"\x7E\x00\x00\x00\x00\x00\x00\x00", 2},
550 {"\x7F\x00\x00\x00\x00\x00\x00\x00", 2},
551 {"\x80\x00\x00\x00\x00\x00\x00\x00", 2},
552 {"\x81\x00\x00\x00\x00\x00\x00\x00", 2},
553 {"\xC0\x00\x00\x00\x00\x00\x00\x00", 2},
554 {"\xFE\x00\x00\x00\x00\x00\x00\x00", 2},
555 {"\xFF\x00\x00\x00\x00\x00\x00\x00", 2},
556 {"\xFF\x7E\x00\x00\x00\x00\x00\x00", 2},
557 {"\xFF\x7F\x00\x00\x00\x00\x00\x00", 2},
558 {"\x00\x80\x00\x00\x00\x00\x00\x00", 2},
559 {"\x01\x80\x00\x00\x00\x00\x00\x00", 2},
560 {"\xFE\xFF\x00\x00\x00\x00\x00\x00", 2},
561 /* 4B - NE */
562 {"\x00\x00\x00\x00\x00\x00\x00\x00", 4},
563 {"\x01\x01\x01\x01\x00\x00\x00\x00", 4},
564 {"\x80\x80\x80\x80\x00\x00\x00\x00", 4},
565 {"\xFF\xFF\xFF\xFF\x00\x00\x00\x00", 4},
566 /* 4B - BE */
567 {"\x00\x00\x00\x01\x00\x00\x00\x00", 4},
568 {"\x00\x00\x00\x02\x00\x00\x00\x00", 4},
569 {"\x00\x00\x00\x03\x00\x00\x00\x00", 4},
570 {"\x00\x00\x00\x04\x00\x00\x00\x00", 4},
571 {"\x00\x00\x00\x05\x00\x00\x00\x00", 4},
572 {"\x00\x00\x00\x06\x00\x00\x00\x00", 4},
573 {"\x00\x00\x00\x07\x00\x00\x00\x00", 4},
574 {"\x00\x00\x00\x08\x00\x00\x00\x00", 4},
575 {"\x00\x00\x00\x09\x00\x00\x00\x00", 4},
576 {"\x00\x00\x00\x0A\x00\x00\x00\x00", 4},
577 {"\x00\x00\x00\x0B\x00\x00\x00\x00", 4},
578 {"\x00\x00\x00\x0C\x00\x00\x00\x00", 4},
579 {"\x00\x00\x00\x0D\x00\x00\x00\x00", 4},
580 {"\x00\x00\x00\x0E\x00\x00\x00\x00", 4},
581 {"\x00\x00\x00\x0F\x00\x00\x00\x00", 4},
582 {"\x00\x00\x00\x10\x00\x00\x00\x00", 4},
583 {"\x00\x00\x00\x20\x00\x00\x00\x00", 4},
584 {"\x00\x00\x00\x40\x00\x00\x00\x00", 4},
585 {"\x00\x00\x00\x7E\x00\x00\x00\x00", 4},
586 {"\x00\x00\x00\x7F\x00\x00\x00\x00", 4},
587 {"\x00\x00\x00\x80\x00\x00\x00\x00", 4},
588 {"\x00\x00\x00\x81\x00\x00\x00\x00", 4},
589 {"\x00\x00\x00\xC0\x00\x00\x00\x00", 4},
590 {"\x00\x00\x00\xFE\x00\x00\x00\x00", 4},
591 {"\x00\x00\x00\xFF\x00\x00\x00\x00", 4},
592 {"\x7E\xFF\xFF\xFF\x00\x00\x00\x00", 4},
593 {"\x7F\xFF\xFF\xFF\x00\x00\x00\x00", 4},
594 {"\x80\x00\x00\x00\x00\x00\x00\x00", 4},
595 {"\x80\x00\x00\x01\x00\x00\x00\x00", 4},
596 {"\xFF\xFF\xFF\xFE\x00\x00\x00\x00", 4},
597 /* 4B - LE */
598 {"\x00\x00\x00\x00\x00\x00\x00\x00", 4},
599 {"\x01\x00\x00\x00\x00\x00\x00\x00", 4},
600 {"\x02\x00\x00\x00\x00\x00\x00\x00", 4},
601 {"\x03\x00\x00\x00\x00\x00\x00\x00", 4},
602 {"\x04\x00\x00\x00\x00\x00\x00\x00", 4},
603 {"\x05\x00\x00\x00\x00\x00\x00\x00", 4},
604 {"\x06\x00\x00\x00\x00\x00\x00\x00", 4},
605 {"\x07\x00\x00\x00\x00\x00\x00\x00", 4},
606 {"\x08\x00\x00\x00\x00\x00\x00\x00", 4},
607 {"\x09\x00\x00\x00\x00\x00\x00\x00", 4},
608 {"\x0A\x00\x00\x00\x00\x00\x00\x00", 4},
609 {"\x0B\x00\x00\x00\x00\x00\x00\x00", 4},
610 {"\x0C\x00\x00\x00\x00\x00\x00\x00", 4},
611 {"\x0D\x00\x00\x00\x00\x00\x00\x00", 4},
612 {"\x0E\x00\x00\x00\x00\x00\x00\x00", 4},
613 {"\x0F\x00\x00\x00\x00\x00\x00\x00", 4},
614 {"\x10\x00\x00\x00\x00\x00\x00\x00", 4},
615 {"\x20\x00\x00\x00\x00\x00\x00\x00", 4},
616 {"\x40\x00\x00\x00\x00\x00\x00\x00", 4},
617 {"\x7E\x00\x00\x00\x00\x00\x00\x00", 4},
618 {"\x7F\x00\x00\x00\x00\x00\x00\x00", 4},
619 {"\x80\x00\x00\x00\x00\x00\x00\x00", 4},
620 {"\x81\x00\x00\x00\x00\x00\x00\x00", 4},
621 {"\xC0\x00\x00\x00\x00\x00\x00\x00", 4},
622 {"\xFE\x00\x00\x00\x00\x00\x00\x00", 4},
623 {"\xFF\x00\x00\x00\x00\x00\x00\x00", 4},
624 {"\xFF\xFF\xFF\x7E\x00\x00\x00\x00", 4},
625 {"\xFF\xFF\xFF\x7F\x00\x00\x00\x00", 4},
626 {"\x00\x00\x00\x80\x00\x00\x00\x00", 4},
627 {"\x01\x00\x00\x80\x00\x00\x00\x00", 4},
628 {"\xFE\xFF\xFF\xFF\x00\x00\x00\x00", 4},
629 /* 8B - NE */
630 {"\x00\x00\x00\x00\x00\x00\x00\x00", 8},
631 {"\x01\x01\x01\x01\x01\x01\x01\x01", 8},
632 {"\x80\x80\x80\x80\x80\x80\x80\x80", 8},
633 {"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 8},
634 /* 8B - BE */
635 {"\x00\x00\x00\x00\x00\x00\x00\x01", 8},
636 {"\x00\x00\x00\x00\x00\x00\x00\x02", 8},
637 {"\x00\x00\x00\x00\x00\x00\x00\x03", 8},
638 {"\x00\x00\x00\x00\x00\x00\x00\x04", 8},
639 {"\x00\x00\x00\x00\x00\x00\x00\x05", 8},
640 {"\x00\x00\x00\x00\x00\x00\x00\x06", 8},
641 {"\x00\x00\x00\x00\x00\x00\x00\x07", 8},
642 {"\x00\x00\x00\x00\x00\x00\x00\x08", 8},
643 {"\x00\x00\x00\x00\x00\x00\x00\x09", 8},
644 {"\x00\x00\x00\x00\x00\x00\x00\x0A", 8},
645 {"\x00\x00\x00\x00\x00\x00\x00\x0B", 8},
646 {"\x00\x00\x00\x00\x00\x00\x00\x0C", 8},
647 {"\x00\x00\x00\x00\x00\x00\x00\x0D", 8},
648 {"\x00\x00\x00\x00\x00\x00\x00\x0E", 8},
649 {"\x00\x00\x00\x00\x00\x00\x00\x0F", 8},
650 {"\x00\x00\x00\x00\x00\x00\x00\x10", 8},
651 {"\x00\x00\x00\x00\x00\x00\x00\x20", 8},
652 {"\x00\x00\x00\x00\x00\x00\x00\x40", 8},
653 {"\x00\x00\x00\x00\x00\x00\x00\x7E", 8},
654 {"\x00\x00\x00\x00\x00\x00\x00\x7F", 8},
655 {"\x00\x00\x00\x00\x00\x00\x00\x80", 8},
656 {"\x00\x00\x00\x00\x00\x00\x00\x81", 8},
657 {"\x00\x00\x00\x00\x00\x00\x00\xC0", 8},
658 {"\x00\x00\x00\x00\x00\x00\x00\xFE", 8},
659 {"\x00\x00\x00\x00\x00\x00\x00\xFF", 8},
660 {"\x7E\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 8},
661 {"\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 8},
662 {"\x80\x00\x00\x00\x00\x00\x00\x00", 8},
663 {"\x80\x00\x00\x00\x00\x00\x00\x01", 8},
664 {"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFE", 8},
665 /* 8B - LE */
666 {"\x00\x00\x00\x00\x00\x00\x00\x00", 8},
667 {"\x01\x00\x00\x00\x00\x00\x00\x00", 8},
668 {"\x02\x00\x00\x00\x00\x00\x00\x00", 8},
669 {"\x03\x00\x00\x00\x00\x00\x00\x00", 8},
670 {"\x04\x00\x00\x00\x00\x00\x00\x00", 8},
671 {"\x05\x00\x00\x00\x00\x00\x00\x00", 8},
672 {"\x06\x00\x00\x00\x00\x00\x00\x00", 8},
673 {"\x07\x00\x00\x00\x00\x00\x00\x00", 8},
674 {"\x08\x00\x00\x00\x00\x00\x00\x00", 8},
675 {"\x09\x00\x00\x00\x00\x00\x00\x00", 8},
676 {"\x0A\x00\x00\x00\x00\x00\x00\x00", 8},
677 {"\x0B\x00\x00\x00\x00\x00\x00\x00", 8},
678 {"\x0C\x00\x00\x00\x00\x00\x00\x00", 8},
679 {"\x0D\x00\x00\x00\x00\x00\x00\x00", 8},
680 {"\x0E\x00\x00\x00\x00\x00\x00\x00", 8},
681 {"\x0F\x00\x00\x00\x00\x00\x00\x00", 8},
682 {"\x10\x00\x00\x00\x00\x00\x00\x00", 8},
683 {"\x20\x00\x00\x00\x00\x00\x00\x00", 8},
684 {"\x40\x00\x00\x00\x00\x00\x00\x00", 8},
685 {"\x7E\x00\x00\x00\x00\x00\x00\x00", 8},
686 {"\x7F\x00\x00\x00\x00\x00\x00\x00", 8},
687 {"\x80\x00\x00\x00\x00\x00\x00\x00", 8},
688 {"\x81\x00\x00\x00\x00\x00\x00\x00", 8},
689 {"\xC0\x00\x00\x00\x00\x00\x00\x00", 8},
690 {"\xFE\x00\x00\x00\x00\x00\x00\x00", 8},
691 {"\xFF\x00\x00\x00\x00\x00\x00\x00", 8},
692 {"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7E", 8},
693 {"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7F", 8},
694 {"\x00\x00\x00\x00\x00\x00\x00\x80", 8},
695 {"\x01\x00\x00\x00\x00\x00\x00\x80", 8},
696 {"\xFE\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 8},
697 };
698
699 size_t off = util_rndGet(0, run->dynamicFileSz - 1);
700 uint64_t choice = util_rndGet(0, ARRAYSIZE(mangleMagicVals) - 1);
701 mangle_Overwrite(run, mangleMagicVals[choice].val, off, mangleMagicVals[choice].size);
plusun4129bd92018-07-31 14:59:01 +0000702 util_turnToPrintable(&run->dynamicFile[off], mangleMagicVals[choice].size);
plusundc64d052018-07-31 13:55:50 +0000703}
704
Robert Swieckid50ed422017-11-13 23:32:26 +0100705static void mangle_MemSet(run_t* run) {
Robert Swieckie7294ca2017-11-11 02:46:32 +0100706 size_t off = util_rndGet(0, run->dynamicFileSz - 1);
707 size_t sz = util_rndGet(1, run->dynamicFileSz - off);
robert.swiecki@gmail.com89cc38c2015-02-23 02:52:08 +0000708 int val = (int)util_rndGet(0, UINT8_MAX);
709
Robert Swieckie7294ca2017-11-11 02:46:32 +0100710 memset(&run->dynamicFile[off], val, sz);
robert.swiecki@gmail.com89cc38c2015-02-23 02:52:08 +0000711}
712
plusundc64d052018-07-31 13:55:50 +0000713static void mangle_MemSetPrintable(run_t* run) {
714 size_t off = util_rndGet(0, run->dynamicFileSz - 1);
715 size_t sz = util_rndGet(1, run->dynamicFileSz - off);
716 int val = (int)util_rndPrintable();
717
718 memset(&run->dynamicFile[off], val, sz);
719}
720
Robert Swieckid50ed422017-11-13 23:32:26 +0100721static void mangle_Random(run_t* run) {
Robert Swieckie7294ca2017-11-11 02:46:32 +0100722 size_t off = util_rndGet(0, run->dynamicFileSz - 1);
723 size_t len = util_rndGet(1, run->dynamicFileSz - off);
724 util_rndBuf(&run->dynamicFile[off], len);
robert.swiecki@gmail.com89cc38c2015-02-23 02:52:08 +0000725}
726
plusundc64d052018-07-31 13:55:50 +0000727static void mangle_RandomPrintable(run_t* run) {
728 size_t off = util_rndGet(0, run->dynamicFileSz - 1);
729 size_t len = util_rndGet(1, run->dynamicFileSz - off);
730 util_rndBuf(&run->dynamicFile[off], len);
731 util_turnToPrintable(&run->dynamicFile[off], len);
732}
733
Robert Swieckid50ed422017-11-13 23:32:26 +0100734static void mangle_AddSub(run_t* run) {
Robert Swieckie7294ca2017-11-11 02:46:32 +0100735 size_t off = util_rndGet(0, run->dynamicFileSz - 1);
Robert Swiecki017f5212017-01-26 16:03:29 +0100736
Robert Swieckid6aaca72017-11-14 00:54:39 +0100737 /* 1,2,4,8 */
738 uint64_t varLen = 1U << util_rndGet(0, 3);
Robert Swieckie7294ca2017-11-11 02:46:32 +0100739 if ((run->dynamicFileSz - off) < varLen) {
robert.swiecki@gmail.com57197642015-03-01 15:39:30 +0000740 varLen = 1;
robert.swiecki@gmail.com549ff182015-02-28 22:38:00 +0000741 }
742
Robert Swiecki40d13412017-01-29 02:45:37 +0100743 int delta = (int)util_rndGet(0, 8192);
744 delta -= 4096;
robert.swiecki@gmail.com549ff182015-02-28 22:38:00 +0000745
746 switch (varLen) {
Robert Swieckid50ed422017-11-13 23:32:26 +0100747 case 1: {
748 run->dynamicFile[off] += delta;
749 return;
750 break;
robert.swiecki@gmail.com62e34ae2015-03-05 03:39:32 +0000751 }
Robert Swieckid50ed422017-11-13 23:32:26 +0100752 case 2: {
Robert Swieckid6aaca72017-11-14 00:54:39 +0100753 int16_t val;
754 memcpy(&val, &run->dynamicFile[off], sizeof(val));
755 if (util_rnd64() & 0x1) {
Robert Swieckid50ed422017-11-13 23:32:26 +0100756 val += delta;
757 } else {
758 /* Foreign endianess */
759 val = __builtin_bswap16(val);
760 val += delta;
761 val = __builtin_bswap16(val);
762 }
763 mangle_Overwrite(run, (uint8_t*)&val, off, varLen);
764 return;
765 break;
robert.swiecki@gmail.com549ff182015-02-28 22:38:00 +0000766 }
Robert Swieckid50ed422017-11-13 23:32:26 +0100767 case 4: {
Robert Swieckid6aaca72017-11-14 00:54:39 +0100768 int32_t val;
769 memcpy(&val, &run->dynamicFile[off], sizeof(val));
770 if (util_rnd64() & 0x1) {
Robert Swieckid50ed422017-11-13 23:32:26 +0100771 val += delta;
772 } else {
773 /* Foreign endianess */
774 val = __builtin_bswap32(val);
775 val += delta;
776 val = __builtin_bswap32(val);
777 }
778 mangle_Overwrite(run, (uint8_t*)&val, off, varLen);
779 return;
780 break;
781 }
Robert Swieckid6aaca72017-11-14 00:54:39 +0100782 case 8: {
783 int64_t val;
784 memcpy(&val, &run->dynamicFile[off], sizeof(val));
785 if (util_rnd64() & 0x1) {
786 val += delta;
787 } else {
788 /* Foreign endianess */
789 val = __builtin_bswap64(val);
790 val += delta;
791 val = __builtin_bswap64(val);
792 }
793 mangle_Overwrite(run, (uint8_t*)&val, off, varLen);
794 return;
795 break;
796 }
Robert Swieckid50ed422017-11-13 23:32:26 +0100797 default: {
798 LOG_F("Unknown variable length size: %" PRIu64, varLen);
799 break;
800 }
robert.swiecki@gmail.com549ff182015-02-28 22:38:00 +0000801 }
802}
803
plusundc64d052018-07-31 13:55:50 +0000804static void mangle_AddSubPrintable(run_t* run) {
805 size_t off = util_rndGet(0, run->dynamicFileSz - 1);
806
807 /* 1,2,4,8 */
808 uint64_t varLen = 1U << util_rndGet(0, 3);
809 if ((run->dynamicFileSz - off) < varLen) {
810 varLen = 1;
811 }
812
813 int delta = (int)util_rndGet(0, 8192);
814 delta -= 4096;
815
816 switch (varLen) {
817 case 1: {
818 run->dynamicFile[off] += delta;
819 break;
820 }
821 case 2: {
822 int16_t val;
823 memcpy(&val, &run->dynamicFile[off], sizeof(val));
824 if (util_rnd64() & 0x1) {
825 val += delta;
826 } else {
827 /* Foreign endianess */
828 val = __builtin_bswap16(val);
829 val += delta;
830 val = __builtin_bswap16(val);
831 }
832 mangle_Overwrite(run, (uint8_t*)&val, off, varLen);
833 break;
834 }
835 case 4: {
836 int32_t val;
837 memcpy(&val, &run->dynamicFile[off], sizeof(val));
838 if (util_rnd64() & 0x1) {
839 val += delta;
840 } else {
841 /* Foreign endianess */
842 val = __builtin_bswap32(val);
843 val += delta;
844 val = __builtin_bswap32(val);
845 }
846 mangle_Overwrite(run, (uint8_t*)&val, off, varLen);
847 break;
848 }
849 case 8: {
850 int64_t val;
851 memcpy(&val, &run->dynamicFile[off], sizeof(val));
852 if (util_rnd64() & 0x1) {
853 val += delta;
854 } else {
855 /* Foreign endianess */
856 val = __builtin_bswap64(val);
857 val += delta;
858 val = __builtin_bswap64(val);
859 }
860 mangle_Overwrite(run, (uint8_t*)&val, off, varLen);
861 break;
862 }
863 default: {
864 LOG_F("Unknown variable length size: %" PRIu64, varLen);
865 break;
866 }
867 }
868 util_turnToPrintable((uint8_t *)&run->dynamicFile[off], varLen);
869}
870
871static void addPrintable(uint8_t *byte) {
872 *byte = ((*byte) - 32 + 1) % 95 + 32;
873}
874
875static void decPrintable(uint8_t *byte) {
876 *byte = ((*byte) - 32 + 94) % 95 + 32;
877}
878
879static void negPrintable(uint8_t *byte) {
plusun4129bd92018-07-31 14:59:01 +0000880 *byte = 94 - ((*byte) - 32) + 32;
plusundc64d052018-07-31 13:55:50 +0000881}
882
Robert Swieckid50ed422017-11-13 23:32:26 +0100883static void mangle_IncByte(run_t* run) {
Robert Swieckie7294ca2017-11-11 02:46:32 +0100884 size_t off = util_rndGet(0, run->dynamicFileSz - 1);
885 run->dynamicFile[off] += (uint8_t)1UL;
robert.swiecki@gmail.com78973ed2015-03-01 03:57:18 +0000886}
887
plusundc64d052018-07-31 13:55:50 +0000888static void mangle_IncBytePrintable(run_t* run) {
889 size_t off = util_rndGet(0, run->dynamicFileSz - 1);
890 addPrintable(&run->dynamicFile[off]);
891}
892
Robert Swieckid50ed422017-11-13 23:32:26 +0100893static void mangle_DecByte(run_t* run) {
Robert Swieckie7294ca2017-11-11 02:46:32 +0100894 size_t off = util_rndGet(0, run->dynamicFileSz - 1);
895 run->dynamicFile[off] -= (uint8_t)1UL;
robert.swiecki@gmail.com78973ed2015-03-01 03:57:18 +0000896}
897
plusundc64d052018-07-31 13:55:50 +0000898static void mangle_DecBytePrintable(run_t* run) {
899 size_t off = util_rndGet(0, run->dynamicFileSz - 1);
900 decPrintable(&run->dynamicFile[off]);
901}
902
Robert Swieckid50ed422017-11-13 23:32:26 +0100903static void mangle_NegByte(run_t* run) {
Robert Swieckie7294ca2017-11-11 02:46:32 +0100904 size_t off = util_rndGet(0, run->dynamicFileSz - 1);
905 run->dynamicFile[off] = ~(run->dynamicFile[off]);
Robert Swieckie3bcadf2017-03-02 04:38:12 +0100906}
907
plusundc64d052018-07-31 13:55:50 +0000908static void mangle_NegBytePrintable(run_t* run) {
909 size_t off = util_rndGet(0, run->dynamicFileSz - 1);
910 negPrintable(&run->dynamicFile[off]);
911}
912
Robert Swieckid50ed422017-11-13 23:32:26 +0100913static void mangle_CloneByte(run_t* run) {
Robert Swieckie7294ca2017-11-11 02:46:32 +0100914 size_t off1 = util_rndGet(0, run->dynamicFileSz - 1);
915 size_t off2 = util_rndGet(0, run->dynamicFileSz - 1);
Robert Swiecki017f5212017-01-26 16:03:29 +0100916
Robert Swieckie7294ca2017-11-11 02:46:32 +0100917 uint8_t tmp = run->dynamicFile[off1];
918 run->dynamicFile[off1] = run->dynamicFile[off2];
919 run->dynamicFile[off2] = tmp;
Robert Swiecki017f5212017-01-26 16:03:29 +0100920}
921
Robert Swieckid50ed422017-11-13 23:32:26 +0100922static void mangle_Resize(run_t* run) {
Robert Swieckie9231d62018-03-02 03:35:11 +0100923 size_t sz = util_rndGet(1, run->global->mutate.maxFileSz);
Robert Swiecki0f2c30a2018-01-13 14:03:39 +0100924 input_setSize(run, sz);
Robert Swiecki017f5212017-01-26 16:03:29 +0100925}
926
plusun4129bd92018-07-31 14:59:01 +0000927static void mangle_ResizePrintable(run_t* run) {
928 size_t old_sz = run->dynamicFileSz;
929 size_t sz = util_rndGet(1, run->global->mutate.maxFileSz);
930 input_setSize(run, sz);
931 if (old_sz < sz) {
932 memset(&run->dynamicFile[old_sz], ' ', sz - old_sz);
933 }
934}
935
Robert Swieckid50ed422017-11-13 23:32:26 +0100936static void mangle_Expand(run_t* run) {
Robert Swieckie7294ca2017-11-11 02:46:32 +0100937 size_t off = util_rndGet(0, run->dynamicFileSz - 1);
938 size_t len = util_rndGet(1, run->dynamicFileSz - off);
Robert Swiecki01fa6062017-01-26 17:04:36 +0100939
Robert Swiecki78633d12017-11-13 23:24:55 +0100940 mangle_Inflate(run, off, len);
Robert Swieckie7294ca2017-11-11 02:46:32 +0100941 mangle_Move(run, off, off + len, run->dynamicFileSz);
Robert Swiecki8e9ed422017-01-26 16:46:55 +0100942}
943
plusun4129bd92018-07-31 14:59:01 +0000944static void mangle_ExpandPrintable(run_t* run) {
945 size_t off = util_rndGet(0, run->dynamicFileSz - 1);
946 size_t len = util_rndGet(1, run->dynamicFileSz - off);
947
948 mangle_InflatePrintable(run, off, len);
949 mangle_Move(run, off, off + len, run->dynamicFileSz);
950}
951
Robert Swieckid50ed422017-11-13 23:32:26 +0100952static void mangle_Shrink(run_t* run) {
Robert Swieckie7294ca2017-11-11 02:46:32 +0100953 if (run->dynamicFileSz <= 1U) {
Robert Swiecki8e9ed422017-01-26 16:46:55 +0100954 return;
955 }
956
Robert Swieckie7294ca2017-11-11 02:46:32 +0100957 size_t len = util_rndGet(1, run->dynamicFileSz - 1);
Robert Swieckice15c8c2017-01-28 14:56:34 +0100958 size_t off = util_rndGet(0, len);
Robert Swiecki8e9ed422017-01-26 16:46:55 +0100959
Robert Swiecki0f2c30a2018-01-13 14:03:39 +0100960 input_setSize(run, run->dynamicFileSz - len);
Robert Swieckie7294ca2017-11-11 02:46:32 +0100961 mangle_Move(run, off + len, off, run->dynamicFileSz);
Jagger28a59772016-09-26 01:50:09 +0200962}
963
Robert Swieckid50ed422017-11-13 23:32:26 +0100964static void mangle_InsertRnd(run_t* run) {
Robert Swieckie7294ca2017-11-11 02:46:32 +0100965 size_t off = util_rndGet(0, run->dynamicFileSz - 1);
966 size_t len = util_rndGet(1, run->dynamicFileSz - off);
Robert Swiecki40d13412017-01-29 02:45:37 +0100967
Robert Swiecki78633d12017-11-13 23:24:55 +0100968 mangle_Inflate(run, off, len);
Robert Swieckie7294ca2017-11-11 02:46:32 +0100969 mangle_Move(run, off, off + len, run->dynamicFileSz);
970 util_rndBuf(&run->dynamicFile[off], len);
Robert Swiecki40d13412017-01-29 02:45:37 +0100971}
972
plusundc64d052018-07-31 13:55:50 +0000973static void mangle_InsertRndPrintable(run_t* run) {
974 size_t off = util_rndGet(0, run->dynamicFileSz - 1);
975 size_t len = util_rndGet(1, run->dynamicFileSz - off);
976
plusun78953432018-07-31 15:04:45 +0000977 mangle_InflatePrintable(run, off, len);
plusundc64d052018-07-31 13:55:50 +0000978 mangle_Move(run, off, off + len, run->dynamicFileSz);
979 util_rndBuf(&run->dynamicFile[off], len);
980 util_turnToPrintable(&run->dynamicFile[off], len);
981}
982
Robert Swiecki03de4082017-12-06 17:56:50 +0100983static void mangle_ASCIIVal(run_t* run) {
984 char buf[32];
985 snprintf(buf, sizeof(buf), "%" PRId64, (int64_t)util_rnd64());
986 size_t off = util_rndGet(0, run->dynamicFileSz - 1);
987
988 mangle_Overwrite(run, (uint8_t*)buf, off, strlen(buf));
989}
990
plusundc64d052018-07-31 13:55:50 +0000991static void (*mangleFuncs[])(run_t * run) = {
992 mangle_Resize,
993 mangle_Byte,
994 mangle_Bit,
995 mangle_Bytes,
996 mangle_Magic,
997 mangle_IncByte,
998 mangle_DecByte,
999 mangle_NegByte,
1000 mangle_AddSub,
1001 mangle_Dictionary,
1002 mangle_DictionaryInsert,
1003 mangle_MemMove,
1004 mangle_MemSet,
1005 mangle_Random,
1006 mangle_CloneByte,
1007 mangle_Expand,
1008 mangle_Shrink,
1009 mangle_InsertRnd,
1010 mangle_ASCIIVal,
1011};
1012
1013void mangle_init(bool only_printable) {
1014 if (only_printable) {
1015 static void (*const manglePrintableFuncs[])(run_t * run) = {
plusun4129bd92018-07-31 14:59:01 +00001016 mangle_ResizePrintable,
plusundc64d052018-07-31 13:55:50 +00001017 mangle_PrintableByte,
1018 mangle_BitPrintable,
1019 mangle_PrintableBytes,
1020 mangle_MagicPrintable,
1021 mangle_IncBytePrintable,
1022 mangle_DecBytePrintable,
1023 mangle_NegBytePrintable,
1024 mangle_AddSubPrintable,
1025 mangle_DictionaryPrintable,
1026 mangle_DictionaryInsertPrintable,
1027 mangle_MemMove,
1028 mangle_MemSetPrintable,
1029 mangle_RandomPrintable,
1030 mangle_CloneByte,
plusun4129bd92018-07-31 14:59:01 +00001031 mangle_ExpandPrintable,
plusundc64d052018-07-31 13:55:50 +00001032 mangle_Shrink,
1033 mangle_InsertRndPrintable,
1034 mangle_ASCIIVal,
1035 };
plusun4129bd92018-07-31 14:59:01 +00001036
plusundc64d052018-07-31 13:55:50 +00001037 if (ARRAYSIZE(mangleFuncs) != ARRAYSIZE(manglePrintableFuncs)) {
1038 LOG_F("mangle function list sizes are different")
1039 }
1040 memcpy(mangleFuncs, manglePrintableFuncs, sizeof(mangleFuncs));
1041 }
1042}
1043
Robert Swiecki0f2c30a2018-01-13 14:03:39 +01001044void mangle_mangleContent(run_t* run) {
Robert Swieckie7294ca2017-11-11 02:46:32 +01001045 if (run->mutationsPerRun == 0U) {
Robert Swieckia438a522017-03-02 14:37:54 +01001046 return;
Robert Swiecki9f25daf2017-01-30 01:29:52 +01001047 }
Robert Swieckia438a522017-03-02 14:37:54 +01001048
Robert Swiecki04f4b4b2018-01-14 20:59:01 +01001049 /* No point in modifying it, if its size is 0 */
Robert Swiecki3f8e9fd2017-12-21 04:07:11 +01001050 if (run->dynamicFileSz == 0UL) {
Robert Swiecki04f4b4b2018-01-14 20:59:01 +01001051 input_setSize(run, 1UL);
Robert Swiecki3f8e9fd2017-12-21 04:07:11 +01001052 }
1053
Robert Swieckibcd7f302017-05-09 17:02:30 +02001054 /* Max number of stacked changes is 6 */
Robert Swiecki04dcac32018-03-02 03:05:26 +01001055 uint64_t changesCnt = util_rndGet(1, run->global->mutate.mutationsPerRun);
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +00001056
1057 for (uint64_t x = 0; x < changesCnt; x++) {
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +00001058 uint64_t choice = util_rndGet(0, ARRAYSIZE(mangleFuncs) - 1);
Robert Swiecki78633d12017-11-13 23:24:55 +01001059 mangleFuncs[choice](run);
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +00001060 }
1061}