blob: 4808a9b894626788189dda8688cecf8f554f1754 [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 *
9 * Copyright 2010-2015 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
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 Swiecki78633d12017-11-13 23:24:55 +010073 if (run->dynamicFileSz >= run->global->maxFileSz) {
Robert Swiecki40d13412017-01-29 02:45:37 +010074 return;
75 }
Robert Swiecki78633d12017-11-13 23:24:55 +010076 if (len > (run->global->maxFileSz - run->dynamicFileSz)) {
77 len = run->global->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
Robert Swieckid50ed422017-11-13 23:32:26 +010084static void mangle_MemMove(run_t* run) {
Robert Swieckie7294ca2017-11-11 02:46:32 +010085 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);
Robert Swiecki8e9ed422017-01-26 16:46:55 +010088
Robert Swieckie7294ca2017-11-11 02:46:32 +010089 mangle_Move(run, off_from, off_to, len);
Robert Swiecki8e9ed422017-01-26 16:46:55 +010090}
91
Robert Swieckid50ed422017-11-13 23:32:26 +010092static void mangle_Byte(run_t* run) {
Robert Swieckie7294ca2017-11-11 02:46:32 +010093 size_t off = util_rndGet(0, run->dynamicFileSz - 1);
94 run->dynamicFile[off] = (uint8_t)util_rnd64();
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +000095}
96
Robert Swieckid50ed422017-11-13 23:32:26 +010097static void mangle_Bytes(run_t* run) {
Robert Swieckie7294ca2017-11-11 02:46:32 +010098 size_t off = util_rndGet(0, run->dynamicFileSz - 1);
Robert Swiecki4e595fb2017-10-11 17:26:51 +020099 uint32_t val = (uint32_t)util_rnd64();
robert.swiecki@gmail.com457ca142015-02-22 14:59:34 +0000100
robert.swiecki@gmail.com12e75062015-02-22 15:01:21 +0000101 /* Overwrite with random 2,3,4-byte values */
102 size_t toCopy = util_rndGet(2, 4);
Robert Swieckie7294ca2017-11-11 02:46:32 +0100103 mangle_Overwrite(run, (uint8_t*)&val, off, toCopy);
robert.swiecki@gmail.com457ca142015-02-22 14:59:34 +0000104}
105
Robert Swieckid50ed422017-11-13 23:32:26 +0100106static void mangle_Bit(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)(1U << util_rndGet(0, 7));
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000109}
110
Robert Swieckid50ed422017-11-13 23:32:26 +0100111static void mangle_DictionaryInsert(run_t* run) {
Robert Swiecki78633d12017-11-13 23:24:55 +0100112 if (run->global->dictionaryCnt == 0) {
113 mangle_Bit(run);
Robert Swiecki40d13412017-01-29 02:45:37 +0100114 return;
115 }
116
Robert Swiecki78633d12017-11-13 23:24:55 +0100117 uint64_t choice = util_rndGet(0, run->global->dictionaryCnt - 1);
118 struct strings_t* str = TAILQ_FIRST(&run->global->dictq);
Robert Swiecki40d13412017-01-29 02:45:37 +0100119 for (uint64_t i = 0; i < choice; i++) {
Robert Swieckiafb16102017-03-13 22:14:31 +0100120 str = TAILQ_NEXT(str, pointers);
Robert Swiecki40d13412017-01-29 02:45:37 +0100121 }
122
Robert Swieckie7294ca2017-11-11 02:46:32 +0100123 size_t off = util_rndGet(0, run->dynamicFileSz - 1);
Robert Swiecki78633d12017-11-13 23:24:55 +0100124 mangle_Inflate(run, off, str->len);
Robert Swieckie7294ca2017-11-11 02:46:32 +0100125 mangle_Move(run, off, off + str->len, str->len);
126 mangle_Overwrite(run, (uint8_t*)str->s, off, str->len);
Robert Swiecki40d13412017-01-29 02:45:37 +0100127}
128
Robert Swieckid50ed422017-11-13 23:32:26 +0100129static void mangle_Dictionary(run_t* run) {
Robert Swiecki78633d12017-11-13 23:24:55 +0100130 if (run->global->dictionaryCnt == 0) {
131 mangle_Bit(run);
tlogic@gmail.com7b6d7ee2015-04-23 21:30:12 +0000132 return;
robert.swiecki@gmail.com4f1124f2015-04-21 17:12:22 +0000133 }
134
Robert Swieckie7294ca2017-11-11 02:46:32 +0100135 size_t off = util_rndGet(0, run->dynamicFileSz - 1);
Robert Swiecki531438a2016-09-13 19:05:11 +0200136
Robert Swiecki78633d12017-11-13 23:24:55 +0100137 uint64_t choice = util_rndGet(0, run->global->dictionaryCnt - 1);
138 struct strings_t* str = TAILQ_FIRST(&run->global->dictq);
Robert Swiecki8e9ed422017-01-26 16:46:55 +0100139 for (uint64_t i = 0; i < choice; i++) {
Robert Swieckiafb16102017-03-13 22:14:31 +0100140 str = TAILQ_NEXT(str, pointers);
Robert Swiecki8e9ed422017-01-26 16:46:55 +0100141 }
142
Robert Swieckie7294ca2017-11-11 02:46:32 +0100143 mangle_Overwrite(run, (uint8_t*)str->s, off, str->len);
Robert Swiecki8e9ed422017-01-26 16:46:55 +0100144}
145
Robert Swieckid50ed422017-11-13 23:32:26 +0100146static void mangle_Magic(run_t* run) {
robert.swiecki@gmail.com3d928f12015-04-15 14:43:21 +0000147 static const struct {
Anestis Bechtsoudis4799a9d2015-12-20 15:44:26 +0200148 const uint8_t val[8];
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000149 const size_t size;
Anestis Bechtsoudis4799a9d2015-12-20 15:44:26 +0200150 } mangleMagicVals[] = {
Anestis Bechtsoudis51c9bb12015-08-26 14:46:21 +0300151 /* 1B - No endianness */
Robert Swieckid50ed422017-11-13 23:32:26 +0100152 {"\x00\x00\x00\x00\x00\x00\x00\x00", 1},
153 {"\x01\x00\x00\x00\x00\x00\x00\x00", 1},
154 {"\x02\x00\x00\x00\x00\x00\x00\x00", 1},
155 {"\x03\x00\x00\x00\x00\x00\x00\x00", 1},
156 {"\x04\x00\x00\x00\x00\x00\x00\x00", 1},
157 {"\x05\x00\x00\x00\x00\x00\x00\x00", 1},
158 {"\x06\x00\x00\x00\x00\x00\x00\x00", 1},
159 {"\x07\x00\x00\x00\x00\x00\x00\x00", 1},
160 {"\x08\x00\x00\x00\x00\x00\x00\x00", 1},
161 {"\x09\x00\x00\x00\x00\x00\x00\x00", 1},
162 {"\x0A\x00\x00\x00\x00\x00\x00\x00", 1},
163 {"\x0B\x00\x00\x00\x00\x00\x00\x00", 1},
164 {"\x0C\x00\x00\x00\x00\x00\x00\x00", 1},
165 {"\x0D\x00\x00\x00\x00\x00\x00\x00", 1},
166 {"\x0E\x00\x00\x00\x00\x00\x00\x00", 1},
167 {"\x0F\x00\x00\x00\x00\x00\x00\x00", 1},
168 {"\x10\x00\x00\x00\x00\x00\x00\x00", 1},
169 {"\x20\x00\x00\x00\x00\x00\x00\x00", 1},
170 {"\x40\x00\x00\x00\x00\x00\x00\x00", 1},
171 {"\x7E\x00\x00\x00\x00\x00\x00\x00", 1},
172 {"\x7F\x00\x00\x00\x00\x00\x00\x00", 1},
173 {"\x80\x00\x00\x00\x00\x00\x00\x00", 1},
174 {"\x81\x00\x00\x00\x00\x00\x00\x00", 1},
175 {"\xC0\x00\x00\x00\x00\x00\x00\x00", 1},
176 {"\xFE\x00\x00\x00\x00\x00\x00\x00", 1},
177 {"\xFF\x00\x00\x00\x00\x00\x00\x00", 1},
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000178 /* 2B - NE */
Robert Swieckid50ed422017-11-13 23:32:26 +0100179 {"\x00\x00\x00\x00\x00\x00\x00\x00", 2},
180 {"\x01\x01\x00\x00\x00\x00\x00\x00", 2},
181 {"\x80\x80\x00\x00\x00\x00\x00\x00", 2},
182 {"\xFF\xFF\x00\x00\x00\x00\x00\x00", 2},
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000183 /* 2B - BE */
Robert Swieckid50ed422017-11-13 23:32:26 +0100184 {"\x00\x01\x00\x00\x00\x00\x00\x00", 2},
185 {"\x00\x02\x00\x00\x00\x00\x00\x00", 2},
186 {"\x00\x03\x00\x00\x00\x00\x00\x00", 2},
187 {"\x00\x04\x00\x00\x00\x00\x00\x00", 2},
188 {"\x00\x05\x00\x00\x00\x00\x00\x00", 2},
189 {"\x00\x06\x00\x00\x00\x00\x00\x00", 2},
190 {"\x00\x07\x00\x00\x00\x00\x00\x00", 2},
191 {"\x00\x08\x00\x00\x00\x00\x00\x00", 2},
192 {"\x00\x09\x00\x00\x00\x00\x00\x00", 2},
193 {"\x00\x0A\x00\x00\x00\x00\x00\x00", 2},
194 {"\x00\x0B\x00\x00\x00\x00\x00\x00", 2},
195 {"\x00\x0C\x00\x00\x00\x00\x00\x00", 2},
196 {"\x00\x0D\x00\x00\x00\x00\x00\x00", 2},
197 {"\x00\x0E\x00\x00\x00\x00\x00\x00", 2},
198 {"\x00\x0F\x00\x00\x00\x00\x00\x00", 2},
199 {"\x00\x10\x00\x00\x00\x00\x00\x00", 2},
200 {"\x00\x20\x00\x00\x00\x00\x00\x00", 2},
201 {"\x00\x40\x00\x00\x00\x00\x00\x00", 2},
202 {"\x00\x7E\x00\x00\x00\x00\x00\x00", 2},
203 {"\x00\x7F\x00\x00\x00\x00\x00\x00", 2},
204 {"\x00\x80\x00\x00\x00\x00\x00\x00", 2},
205 {"\x00\x81\x00\x00\x00\x00\x00\x00", 2},
206 {"\x00\xC0\x00\x00\x00\x00\x00\x00", 2},
207 {"\x00\xFE\x00\x00\x00\x00\x00\x00", 2},
208 {"\x00\xFF\x00\x00\x00\x00\x00\x00", 2},
209 {"\x7E\xFF\x00\x00\x00\x00\x00\x00", 2},
210 {"\x7F\xFF\x00\x00\x00\x00\x00\x00", 2},
211 {"\x80\x00\x00\x00\x00\x00\x00\x00", 2},
212 {"\x80\x01\x00\x00\x00\x00\x00\x00", 2},
213 {"\xFF\xFE\x00\x00\x00\x00\x00\x00", 2},
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000214 /* 2B - LE */
Robert Swieckid50ed422017-11-13 23:32:26 +0100215 {"\x00\x00\x00\x00\x00\x00\x00\x00", 2},
216 {"\x01\x00\x00\x00\x00\x00\x00\x00", 2},
217 {"\x02\x00\x00\x00\x00\x00\x00\x00", 2},
218 {"\x03\x00\x00\x00\x00\x00\x00\x00", 2},
219 {"\x04\x00\x00\x00\x00\x00\x00\x00", 2},
220 {"\x05\x00\x00\x00\x00\x00\x00\x00", 2},
221 {"\x06\x00\x00\x00\x00\x00\x00\x00", 2},
222 {"\x07\x00\x00\x00\x00\x00\x00\x00", 2},
223 {"\x08\x00\x00\x00\x00\x00\x00\x00", 2},
224 {"\x09\x00\x00\x00\x00\x00\x00\x00", 2},
225 {"\x0A\x00\x00\x00\x00\x00\x00\x00", 2},
226 {"\x0B\x00\x00\x00\x00\x00\x00\x00", 2},
227 {"\x0C\x00\x00\x00\x00\x00\x00\x00", 2},
228 {"\x0D\x00\x00\x00\x00\x00\x00\x00", 2},
229 {"\x0E\x00\x00\x00\x00\x00\x00\x00", 2},
230 {"\x0F\x00\x00\x00\x00\x00\x00\x00", 2},
231 {"\x10\x00\x00\x00\x00\x00\x00\x00", 2},
232 {"\x20\x00\x00\x00\x00\x00\x00\x00", 2},
233 {"\x40\x00\x00\x00\x00\x00\x00\x00", 2},
234 {"\x7E\x00\x00\x00\x00\x00\x00\x00", 2},
235 {"\x7F\x00\x00\x00\x00\x00\x00\x00", 2},
236 {"\x80\x00\x00\x00\x00\x00\x00\x00", 2},
237 {"\x81\x00\x00\x00\x00\x00\x00\x00", 2},
238 {"\xC0\x00\x00\x00\x00\x00\x00\x00", 2},
239 {"\xFE\x00\x00\x00\x00\x00\x00\x00", 2},
240 {"\xFF\x00\x00\x00\x00\x00\x00\x00", 2},
241 {"\xFF\x7E\x00\x00\x00\x00\x00\x00", 2},
242 {"\xFF\x7F\x00\x00\x00\x00\x00\x00", 2},
243 {"\x00\x80\x00\x00\x00\x00\x00\x00", 2},
244 {"\x01\x80\x00\x00\x00\x00\x00\x00", 2},
245 {"\xFE\xFF\x00\x00\x00\x00\x00\x00", 2},
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000246 /* 4B - NE */
Robert Swieckid50ed422017-11-13 23:32:26 +0100247 {"\x00\x00\x00\x00\x00\x00\x00\x00", 4},
248 {"\x01\x01\x01\x01\x00\x00\x00\x00", 4},
249 {"\x80\x80\x80\x80\x00\x00\x00\x00", 4},
250 {"\xFF\xFF\xFF\xFF\x00\x00\x00\x00", 4},
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000251 /* 4B - BE */
Robert Swieckid50ed422017-11-13 23:32:26 +0100252 {"\x00\x00\x00\x01\x00\x00\x00\x00", 4},
253 {"\x00\x00\x00\x02\x00\x00\x00\x00", 4},
254 {"\x00\x00\x00\x03\x00\x00\x00\x00", 4},
255 {"\x00\x00\x00\x04\x00\x00\x00\x00", 4},
256 {"\x00\x00\x00\x05\x00\x00\x00\x00", 4},
257 {"\x00\x00\x00\x06\x00\x00\x00\x00", 4},
258 {"\x00\x00\x00\x07\x00\x00\x00\x00", 4},
259 {"\x00\x00\x00\x08\x00\x00\x00\x00", 4},
260 {"\x00\x00\x00\x09\x00\x00\x00\x00", 4},
261 {"\x00\x00\x00\x0A\x00\x00\x00\x00", 4},
262 {"\x00\x00\x00\x0B\x00\x00\x00\x00", 4},
263 {"\x00\x00\x00\x0C\x00\x00\x00\x00", 4},
264 {"\x00\x00\x00\x0D\x00\x00\x00\x00", 4},
265 {"\x00\x00\x00\x0E\x00\x00\x00\x00", 4},
266 {"\x00\x00\x00\x0F\x00\x00\x00\x00", 4},
267 {"\x00\x00\x00\x10\x00\x00\x00\x00", 4},
268 {"\x00\x00\x00\x20\x00\x00\x00\x00", 4},
269 {"\x00\x00\x00\x40\x00\x00\x00\x00", 4},
270 {"\x00\x00\x00\x7E\x00\x00\x00\x00", 4},
271 {"\x00\x00\x00\x7F\x00\x00\x00\x00", 4},
272 {"\x00\x00\x00\x80\x00\x00\x00\x00", 4},
273 {"\x00\x00\x00\x81\x00\x00\x00\x00", 4},
274 {"\x00\x00\x00\xC0\x00\x00\x00\x00", 4},
275 {"\x00\x00\x00\xFE\x00\x00\x00\x00", 4},
276 {"\x00\x00\x00\xFF\x00\x00\x00\x00", 4},
277 {"\x7E\xFF\xFF\xFF\x00\x00\x00\x00", 4},
278 {"\x7F\xFF\xFF\xFF\x00\x00\x00\x00", 4},
279 {"\x80\x00\x00\x00\x00\x00\x00\x00", 4},
280 {"\x80\x00\x00\x01\x00\x00\x00\x00", 4},
281 {"\xFF\xFF\xFF\xFE\x00\x00\x00\x00", 4},
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000282 /* 4B - LE */
Robert Swieckid50ed422017-11-13 23:32:26 +0100283 {"\x00\x00\x00\x00\x00\x00\x00\x00", 4},
284 {"\x01\x00\x00\x00\x00\x00\x00\x00", 4},
285 {"\x02\x00\x00\x00\x00\x00\x00\x00", 4},
286 {"\x03\x00\x00\x00\x00\x00\x00\x00", 4},
287 {"\x04\x00\x00\x00\x00\x00\x00\x00", 4},
288 {"\x05\x00\x00\x00\x00\x00\x00\x00", 4},
289 {"\x06\x00\x00\x00\x00\x00\x00\x00", 4},
290 {"\x07\x00\x00\x00\x00\x00\x00\x00", 4},
291 {"\x08\x00\x00\x00\x00\x00\x00\x00", 4},
292 {"\x09\x00\x00\x00\x00\x00\x00\x00", 4},
293 {"\x0A\x00\x00\x00\x00\x00\x00\x00", 4},
294 {"\x0B\x00\x00\x00\x00\x00\x00\x00", 4},
295 {"\x0C\x00\x00\x00\x00\x00\x00\x00", 4},
296 {"\x0D\x00\x00\x00\x00\x00\x00\x00", 4},
297 {"\x0E\x00\x00\x00\x00\x00\x00\x00", 4},
298 {"\x0F\x00\x00\x00\x00\x00\x00\x00", 4},
299 {"\x10\x00\x00\x00\x00\x00\x00\x00", 4},
300 {"\x20\x00\x00\x00\x00\x00\x00\x00", 4},
301 {"\x40\x00\x00\x00\x00\x00\x00\x00", 4},
302 {"\x7E\x00\x00\x00\x00\x00\x00\x00", 4},
303 {"\x7F\x00\x00\x00\x00\x00\x00\x00", 4},
304 {"\x80\x00\x00\x00\x00\x00\x00\x00", 4},
305 {"\x81\x00\x00\x00\x00\x00\x00\x00", 4},
306 {"\xC0\x00\x00\x00\x00\x00\x00\x00", 4},
307 {"\xFE\x00\x00\x00\x00\x00\x00\x00", 4},
308 {"\xFF\x00\x00\x00\x00\x00\x00\x00", 4},
309 {"\xFF\xFF\xFF\x7E\x00\x00\x00\x00", 4},
310 {"\xFF\xFF\xFF\x7F\x00\x00\x00\x00", 4},
311 {"\x00\x00\x00\x80\x00\x00\x00\x00", 4},
312 {"\x01\x00\x00\x80\x00\x00\x00\x00", 4},
313 {"\xFE\xFF\xFF\xFF\x00\x00\x00\x00", 4},
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000314 /* 8B - NE */
Robert Swieckid50ed422017-11-13 23:32:26 +0100315 {"\x00\x00\x00\x00\x00\x00\x00\x00", 8},
316 {"\x01\x01\x01\x01\x01\x01\x01\x01", 8},
317 {"\x80\x80\x80\x80\x80\x80\x80\x80", 8},
318 {"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 8},
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000319 /* 8B - BE */
Robert Swieckid50ed422017-11-13 23:32:26 +0100320 {"\x00\x00\x00\x00\x00\x00\x00\x01", 8},
321 {"\x00\x00\x00\x00\x00\x00\x00\x02", 8},
322 {"\x00\x00\x00\x00\x00\x00\x00\x03", 8},
323 {"\x00\x00\x00\x00\x00\x00\x00\x04", 8},
324 {"\x00\x00\x00\x00\x00\x00\x00\x05", 8},
325 {"\x00\x00\x00\x00\x00\x00\x00\x06", 8},
326 {"\x00\x00\x00\x00\x00\x00\x00\x07", 8},
327 {"\x00\x00\x00\x00\x00\x00\x00\x08", 8},
328 {"\x00\x00\x00\x00\x00\x00\x00\x09", 8},
329 {"\x00\x00\x00\x00\x00\x00\x00\x0A", 8},
330 {"\x00\x00\x00\x00\x00\x00\x00\x0B", 8},
331 {"\x00\x00\x00\x00\x00\x00\x00\x0C", 8},
332 {"\x00\x00\x00\x00\x00\x00\x00\x0D", 8},
333 {"\x00\x00\x00\x00\x00\x00\x00\x0E", 8},
334 {"\x00\x00\x00\x00\x00\x00\x00\x0F", 8},
335 {"\x00\x00\x00\x00\x00\x00\x00\x10", 8},
336 {"\x00\x00\x00\x00\x00\x00\x00\x20", 8},
337 {"\x00\x00\x00\x00\x00\x00\x00\x40", 8},
338 {"\x00\x00\x00\x00\x00\x00\x00\x7E", 8},
339 {"\x00\x00\x00\x00\x00\x00\x00\x7F", 8},
340 {"\x00\x00\x00\x00\x00\x00\x00\x80", 8},
341 {"\x00\x00\x00\x00\x00\x00\x00\x81", 8},
342 {"\x00\x00\x00\x00\x00\x00\x00\xC0", 8},
343 {"\x00\x00\x00\x00\x00\x00\x00\xFE", 8},
344 {"\x00\x00\x00\x00\x00\x00\x00\xFF", 8},
345 {"\x7E\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 8},
346 {"\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 8},
347 {"\x80\x00\x00\x00\x00\x00\x00\x00", 8},
348 {"\x80\x00\x00\x00\x00\x00\x00\x01", 8},
349 {"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFE", 8},
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000350 /* 8B - LE */
Robert Swieckid50ed422017-11-13 23:32:26 +0100351 {"\x00\x00\x00\x00\x00\x00\x00\x00", 8},
352 {"\x01\x00\x00\x00\x00\x00\x00\x00", 8},
353 {"\x02\x00\x00\x00\x00\x00\x00\x00", 8},
354 {"\x03\x00\x00\x00\x00\x00\x00\x00", 8},
355 {"\x04\x00\x00\x00\x00\x00\x00\x00", 8},
356 {"\x05\x00\x00\x00\x00\x00\x00\x00", 8},
357 {"\x06\x00\x00\x00\x00\x00\x00\x00", 8},
358 {"\x07\x00\x00\x00\x00\x00\x00\x00", 8},
359 {"\x08\x00\x00\x00\x00\x00\x00\x00", 8},
360 {"\x09\x00\x00\x00\x00\x00\x00\x00", 8},
361 {"\x0A\x00\x00\x00\x00\x00\x00\x00", 8},
362 {"\x0B\x00\x00\x00\x00\x00\x00\x00", 8},
363 {"\x0C\x00\x00\x00\x00\x00\x00\x00", 8},
364 {"\x0D\x00\x00\x00\x00\x00\x00\x00", 8},
365 {"\x0E\x00\x00\x00\x00\x00\x00\x00", 8},
366 {"\x0F\x00\x00\x00\x00\x00\x00\x00", 8},
367 {"\x10\x00\x00\x00\x00\x00\x00\x00", 8},
368 {"\x20\x00\x00\x00\x00\x00\x00\x00", 8},
369 {"\x40\x00\x00\x00\x00\x00\x00\x00", 8},
370 {"\x7E\x00\x00\x00\x00\x00\x00\x00", 8},
371 {"\x7F\x00\x00\x00\x00\x00\x00\x00", 8},
372 {"\x80\x00\x00\x00\x00\x00\x00\x00", 8},
373 {"\x81\x00\x00\x00\x00\x00\x00\x00", 8},
374 {"\xC0\x00\x00\x00\x00\x00\x00\x00", 8},
375 {"\xFE\x00\x00\x00\x00\x00\x00\x00", 8},
376 {"\xFF\x00\x00\x00\x00\x00\x00\x00", 8},
377 {"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7E", 8},
378 {"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7F", 8},
379 {"\x00\x00\x00\x00\x00\x00\x00\x80", 8},
380 {"\x01\x00\x00\x00\x00\x00\x00\x80", 8},
381 {"\xFE\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 8},
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000382 };
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000383
Robert Swieckie7294ca2017-11-11 02:46:32 +0100384 size_t off = util_rndGet(0, run->dynamicFileSz - 1);
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000385 uint64_t choice = util_rndGet(0, ARRAYSIZE(mangleMagicVals) - 1);
Robert Swieckie7294ca2017-11-11 02:46:32 +0100386 mangle_Overwrite(run, mangleMagicVals[choice].val, off, mangleMagicVals[choice].size);
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000387}
388
Robert Swieckid50ed422017-11-13 23:32:26 +0100389static void mangle_MemSet(run_t* run) {
Robert Swieckie7294ca2017-11-11 02:46:32 +0100390 size_t off = util_rndGet(0, run->dynamicFileSz - 1);
391 size_t sz = util_rndGet(1, run->dynamicFileSz - off);
robert.swiecki@gmail.com89cc38c2015-02-23 02:52:08 +0000392 int val = (int)util_rndGet(0, UINT8_MAX);
393
Robert Swieckie7294ca2017-11-11 02:46:32 +0100394 memset(&run->dynamicFile[off], val, sz);
robert.swiecki@gmail.com89cc38c2015-02-23 02:52:08 +0000395}
396
Robert Swieckid50ed422017-11-13 23:32:26 +0100397static void mangle_Random(run_t* run) {
Robert Swieckie7294ca2017-11-11 02:46:32 +0100398 size_t off = util_rndGet(0, run->dynamicFileSz - 1);
399 size_t len = util_rndGet(1, run->dynamicFileSz - off);
400 util_rndBuf(&run->dynamicFile[off], len);
robert.swiecki@gmail.com89cc38c2015-02-23 02:52:08 +0000401}
402
Robert Swieckid50ed422017-11-13 23:32:26 +0100403static void mangle_AddSub(run_t* run) {
Robert Swieckie7294ca2017-11-11 02:46:32 +0100404 size_t off = util_rndGet(0, run->dynamicFileSz - 1);
Robert Swiecki017f5212017-01-26 16:03:29 +0100405
Robert Swieckid6aaca72017-11-14 00:54:39 +0100406 /* 1,2,4,8 */
407 uint64_t varLen = 1U << util_rndGet(0, 3);
Robert Swieckie7294ca2017-11-11 02:46:32 +0100408 if ((run->dynamicFileSz - off) < varLen) {
robert.swiecki@gmail.com57197642015-03-01 15:39:30 +0000409 varLen = 1;
robert.swiecki@gmail.com549ff182015-02-28 22:38:00 +0000410 }
411
Robert Swiecki40d13412017-01-29 02:45:37 +0100412 int delta = (int)util_rndGet(0, 8192);
413 delta -= 4096;
robert.swiecki@gmail.com549ff182015-02-28 22:38:00 +0000414
415 switch (varLen) {
Robert Swieckid50ed422017-11-13 23:32:26 +0100416 case 1: {
417 run->dynamicFile[off] += delta;
418 return;
419 break;
robert.swiecki@gmail.com62e34ae2015-03-05 03:39:32 +0000420 }
Robert Swieckid50ed422017-11-13 23:32:26 +0100421 case 2: {
Robert Swieckid6aaca72017-11-14 00:54:39 +0100422 int16_t val;
423 memcpy(&val, &run->dynamicFile[off], sizeof(val));
424 if (util_rnd64() & 0x1) {
Robert Swieckid50ed422017-11-13 23:32:26 +0100425 val += delta;
426 } else {
427 /* Foreign endianess */
428 val = __builtin_bswap16(val);
429 val += delta;
430 val = __builtin_bswap16(val);
431 }
432 mangle_Overwrite(run, (uint8_t*)&val, off, varLen);
433 return;
434 break;
robert.swiecki@gmail.com549ff182015-02-28 22:38:00 +0000435 }
Robert Swieckid50ed422017-11-13 23:32:26 +0100436 case 4: {
Robert Swieckid6aaca72017-11-14 00:54:39 +0100437 int32_t val;
438 memcpy(&val, &run->dynamicFile[off], sizeof(val));
439 if (util_rnd64() & 0x1) {
Robert Swieckid50ed422017-11-13 23:32:26 +0100440 val += delta;
441 } else {
442 /* Foreign endianess */
443 val = __builtin_bswap32(val);
444 val += delta;
445 val = __builtin_bswap32(val);
446 }
447 mangle_Overwrite(run, (uint8_t*)&val, off, varLen);
448 return;
449 break;
450 }
Robert Swieckid6aaca72017-11-14 00:54:39 +0100451 case 8: {
452 int64_t val;
453 memcpy(&val, &run->dynamicFile[off], sizeof(val));
454 if (util_rnd64() & 0x1) {
455 val += delta;
456 } else {
457 /* Foreign endianess */
458 val = __builtin_bswap64(val);
459 val += delta;
460 val = __builtin_bswap64(val);
461 }
462 mangle_Overwrite(run, (uint8_t*)&val, off, varLen);
463 return;
464 break;
465 }
Robert Swieckid50ed422017-11-13 23:32:26 +0100466 default: {
467 LOG_F("Unknown variable length size: %" PRIu64, varLen);
468 break;
469 }
robert.swiecki@gmail.com549ff182015-02-28 22:38:00 +0000470 }
471}
472
Robert Swieckid50ed422017-11-13 23:32:26 +0100473static void mangle_IncByte(run_t* run) {
Robert Swieckie7294ca2017-11-11 02:46:32 +0100474 size_t off = util_rndGet(0, run->dynamicFileSz - 1);
475 run->dynamicFile[off] += (uint8_t)1UL;
robert.swiecki@gmail.com78973ed2015-03-01 03:57:18 +0000476}
477
Robert Swieckid50ed422017-11-13 23:32:26 +0100478static void mangle_DecByte(run_t* run) {
Robert Swieckie7294ca2017-11-11 02:46:32 +0100479 size_t off = util_rndGet(0, run->dynamicFileSz - 1);
480 run->dynamicFile[off] -= (uint8_t)1UL;
robert.swiecki@gmail.com78973ed2015-03-01 03:57:18 +0000481}
482
Robert Swieckid50ed422017-11-13 23:32:26 +0100483static void mangle_NegByte(run_t* run) {
Robert Swieckie7294ca2017-11-11 02:46:32 +0100484 size_t off = util_rndGet(0, run->dynamicFileSz - 1);
485 run->dynamicFile[off] = ~(run->dynamicFile[off]);
Robert Swieckie3bcadf2017-03-02 04:38:12 +0100486}
487
Robert Swieckid50ed422017-11-13 23:32:26 +0100488static void mangle_CloneByte(run_t* run) {
Robert Swieckie7294ca2017-11-11 02:46:32 +0100489 size_t off1 = util_rndGet(0, run->dynamicFileSz - 1);
490 size_t off2 = util_rndGet(0, run->dynamicFileSz - 1);
Robert Swiecki017f5212017-01-26 16:03:29 +0100491
Robert Swieckie7294ca2017-11-11 02:46:32 +0100492 uint8_t tmp = run->dynamicFile[off1];
493 run->dynamicFile[off1] = run->dynamicFile[off2];
494 run->dynamicFile[off2] = tmp;
Robert Swiecki017f5212017-01-26 16:03:29 +0100495}
496
Robert Swieckid50ed422017-11-13 23:32:26 +0100497static void mangle_Resize(run_t* run) {
Robert Swiecki04f4b4b2018-01-14 20:59:01 +0100498 size_t sz = util_rndGet(1, run->global->maxFileSz);
Robert Swiecki0f2c30a2018-01-13 14:03:39 +0100499 input_setSize(run, sz);
Robert Swiecki017f5212017-01-26 16:03:29 +0100500}
501
Robert Swieckid50ed422017-11-13 23:32:26 +0100502static void mangle_Expand(run_t* run) {
Robert Swieckie7294ca2017-11-11 02:46:32 +0100503 size_t off = util_rndGet(0, run->dynamicFileSz - 1);
504 size_t len = util_rndGet(1, run->dynamicFileSz - off);
Robert Swiecki01fa6062017-01-26 17:04:36 +0100505
Robert Swiecki78633d12017-11-13 23:24:55 +0100506 mangle_Inflate(run, off, len);
Robert Swieckie7294ca2017-11-11 02:46:32 +0100507 mangle_Move(run, off, off + len, run->dynamicFileSz);
Robert Swiecki8e9ed422017-01-26 16:46:55 +0100508}
509
Robert Swieckid50ed422017-11-13 23:32:26 +0100510static void mangle_Shrink(run_t* run) {
Robert Swieckie7294ca2017-11-11 02:46:32 +0100511 if (run->dynamicFileSz <= 1U) {
Robert Swiecki8e9ed422017-01-26 16:46:55 +0100512 return;
513 }
514
Robert Swieckie7294ca2017-11-11 02:46:32 +0100515 size_t len = util_rndGet(1, run->dynamicFileSz - 1);
Robert Swieckice15c8c2017-01-28 14:56:34 +0100516 size_t off = util_rndGet(0, len);
Robert Swiecki8e9ed422017-01-26 16:46:55 +0100517
Robert Swiecki0f2c30a2018-01-13 14:03:39 +0100518 input_setSize(run, run->dynamicFileSz - len);
Robert Swieckie7294ca2017-11-11 02:46:32 +0100519 mangle_Move(run, off + len, off, run->dynamicFileSz);
Jagger28a59772016-09-26 01:50:09 +0200520}
521
Robert Swieckid50ed422017-11-13 23:32:26 +0100522static void mangle_InsertRnd(run_t* run) {
Robert Swieckie7294ca2017-11-11 02:46:32 +0100523 size_t off = util_rndGet(0, run->dynamicFileSz - 1);
524 size_t len = util_rndGet(1, run->dynamicFileSz - off);
Robert Swiecki40d13412017-01-29 02:45:37 +0100525
Robert Swiecki78633d12017-11-13 23:24:55 +0100526 mangle_Inflate(run, off, len);
Robert Swieckie7294ca2017-11-11 02:46:32 +0100527 mangle_Move(run, off, off + len, run->dynamicFileSz);
528 util_rndBuf(&run->dynamicFile[off], len);
Robert Swiecki40d13412017-01-29 02:45:37 +0100529}
530
Robert Swiecki03de4082017-12-06 17:56:50 +0100531static void mangle_ASCIIVal(run_t* run) {
532 char buf[32];
533 snprintf(buf, sizeof(buf), "%" PRId64, (int64_t)util_rnd64());
534 size_t off = util_rndGet(0, run->dynamicFileSz - 1);
535
536 mangle_Overwrite(run, (uint8_t*)buf, off, strlen(buf));
537}
538
Robert Swiecki0f2c30a2018-01-13 14:03:39 +0100539void mangle_mangleContent(run_t* run) {
Robert Swieckie7294ca2017-11-11 02:46:32 +0100540 if (run->mutationsPerRun == 0U) {
Robert Swieckia438a522017-03-02 14:37:54 +0100541 return;
Robert Swiecki9f25daf2017-01-30 01:29:52 +0100542 }
Robert Swieckia438a522017-03-02 14:37:54 +0100543
Robert Swiecki04f4b4b2018-01-14 20:59:01 +0100544 /* No point in modifying it, if its size is 0 */
Robert Swiecki3f8e9fd2017-12-21 04:07:11 +0100545 if (run->dynamicFileSz == 0UL) {
Robert Swiecki04f4b4b2018-01-14 20:59:01 +0100546 input_setSize(run, 1UL);
Robert Swiecki3f8e9fd2017-12-21 04:07:11 +0100547 }
548
Robert Swiecki78633d12017-11-13 23:24:55 +0100549 static void (*const mangleFuncs[])(run_t * run) = {
Robert Swiecki04f4b4b2018-01-14 20:59:01 +0100550 mangle_Resize,
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000551 mangle_Byte,
Jagger68d4c362016-09-07 03:16:37 +0200552 mangle_Bit,
robert.swiecki@gmail.com17ee6762015-02-22 15:19:31 +0000553 mangle_Bytes,
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000554 mangle_Magic,
robert.swiecki@gmail.com87e72752015-03-03 16:15:59 +0000555 mangle_IncByte,
robert.swiecki@gmail.com87e72752015-03-03 16:15:59 +0000556 mangle_DecByte,
Robert Swieckie3bcadf2017-03-02 04:38:12 +0100557 mangle_NegByte,
robert.swiecki@gmail.com87e72752015-03-03 16:15:59 +0000558 mangle_AddSub,
robert.swiecki@gmail.com4f1124f2015-04-21 17:12:22 +0000559 mangle_Dictionary,
Robert Swiecki8e9ed422017-01-26 16:46:55 +0100560 mangle_DictionaryInsert,
robert.swiecki@gmail.com89cc38c2015-02-23 02:52:08 +0000561 mangle_MemMove,
562 mangle_MemSet,
robert.swiecki@gmail.com50e1f3b2015-02-23 17:32:11 +0000563 mangle_Random,
Robert Swiecki017f5212017-01-26 16:03:29 +0100564 mangle_CloneByte,
Robert Swiecki017f5212017-01-26 16:03:29 +0100565 mangle_Expand,
Robert Swiecki8e9ed422017-01-26 16:46:55 +0100566 mangle_Shrink,
Robert Swiecki40d13412017-01-29 02:45:37 +0100567 mangle_InsertRnd,
Robert Swiecki03de4082017-12-06 17:56:50 +0100568 mangle_ASCIIVal,
Robert Swieckif5f19842017-02-03 01:51:56 +0100569 };
Robert Swieckide8eaa92017-02-02 04:01:09 +0100570
Robert Swieckibcd7f302017-05-09 17:02:30 +0200571 /* Max number of stacked changes is 6 */
Robert Swiecki78633d12017-11-13 23:24:55 +0100572 uint64_t changesCnt = util_rndGet(1, run->global->mutationsPerRun);
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000573
574 for (uint64_t x = 0; x < changesCnt; x++) {
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000575 uint64_t choice = util_rndGet(0, ARRAYSIZE(mangleFuncs) - 1);
Robert Swiecki78633d12017-11-13 23:24:55 +0100576 mangleFuncs[choice](run);
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000577 }
578}