blob: 3b27e76e30bab5cad25134a70fbe50135bddf152 [file] [log] [blame]
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +00001/*
2 *
3 * honggfuzz - buffer mangling routines
4 * -----------------------------------------
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
25#include "common.h"
26#include "mangle.h"
27
28#include <inttypes.h>
robert.swiecki@gmail.com173f5192015-02-23 00:06:47 +000029#include <math.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.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +000033#include <unistd.h>
34
35#include "log.h"
36#include "util.h"
37
Robert Swieckie6389e22015-11-25 15:13:38 +010038static inline void mangle_Overwrite(uint8_t * dst, const uint8_t * src, size_t dstSz, size_t off,
39 size_t sz)
robert.swiecki@gmail.com1c555c72015-02-22 16:25:54 +000040{
41 size_t maxToCopy = dstSz - off;
42 if (sz > maxToCopy) {
43 sz = maxToCopy;
44 }
45
robert.swiecki@gmail.com50e1f3b2015-02-23 17:32:11 +000046 memcpy(&dst[off], src, sz);
robert.swiecki@gmail.com1c555c72015-02-22 16:25:54 +000047}
48
Anestis Bechtsoudis2ff92d12015-12-20 15:33:20 +020049static void mangle_Byte(honggfuzz_t * hfuzz UNUSED, uint8_t * buf, size_t bufSz UNUSED, size_t off)
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +000050{
51 buf[off] = (uint8_t) util_rndGet(0, UINT8_MAX);
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +000052}
53
Anestis Bechtsoudis2ff92d12015-12-20 15:33:20 +020054static void mangle_Bytes(honggfuzz_t * hfuzz UNUSED, uint8_t * buf, size_t bufSz, size_t off)
robert.swiecki@gmail.com457ca142015-02-22 14:59:34 +000055{
56 uint32_t val = (uint32_t) util_rndGet(0, UINT32_MAX);
57
robert.swiecki@gmail.com12e75062015-02-22 15:01:21 +000058 /* Overwrite with random 2,3,4-byte values */
59 size_t toCopy = util_rndGet(2, 4);
robert.swiecki@gmail.combcdeaea2015-02-23 17:36:54 +000060 mangle_Overwrite(buf, (uint8_t *) & val, bufSz, off, toCopy);
robert.swiecki@gmail.com457ca142015-02-22 14:59:34 +000061}
62
Anestis Bechtsoudis2ff92d12015-12-20 15:33:20 +020063static void mangle_Bit(honggfuzz_t * hfuzz UNUSED, uint8_t * buf, size_t bufSz UNUSED, size_t off)
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +000064{
Robert Swiecki61cbed82016-03-10 15:32:07 +010065 buf[off] ^= (uint8_t) (1U << util_rndGet(0, 7));
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +000066}
67
Anestis Bechtsoudis2ff92d12015-12-20 15:33:20 +020068static void mangle_Dictionary(honggfuzz_t * hfuzz UNUSED, uint8_t * buf, size_t bufSz, size_t off)
robert.swiecki@gmail.com4f1124f2015-04-21 17:12:22 +000069{
70 if (hfuzz->dictionaryCnt == 0) {
tlogic@gmail.com7b6d7ee2015-04-23 21:30:12 +000071 mangle_Bit(hfuzz, buf, bufSz, off);
72 return;
robert.swiecki@gmail.com4f1124f2015-04-21 17:12:22 +000073 }
74
75 uint64_t choice = util_rndGet(0, hfuzz->dictionaryCnt - 1);
76 mangle_Overwrite(buf, (uint8_t *) hfuzz->dictionary[choice], bufSz, off,
77 strlen(hfuzz->dictionary[choice]));
robert.swiecki@gmail.com4f1124f2015-04-21 17:12:22 +000078}
79
Anestis Bechtsoudis2ff92d12015-12-20 15:33:20 +020080static void mangle_Magic(honggfuzz_t * hfuzz UNUSED, uint8_t * buf, size_t bufSz, size_t off)
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +000081{
robert.swiecki@gmail.com4be26672015-03-05 03:36:50 +000082 /* *INDENT-OFF* */
robert.swiecki@gmail.com3d928f12015-04-15 14:43:21 +000083 static const struct {
Anestis Bechtsoudis4799a9d2015-12-20 15:44:26 +020084 const uint8_t val[8];
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +000085 const size_t size;
Anestis Bechtsoudis4799a9d2015-12-20 15:44:26 +020086 } mangleMagicVals[] = {
Anestis Bechtsoudis51c9bb12015-08-26 14:46:21 +030087 /* 1B - No endianness */
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +000088 { "\x00\x00\x00\x00\x00\x00\x00\x00", 1},
89 { "\x01\x00\x00\x00\x00\x00\x00\x00", 1},
robert.swiecki@gmail.combe554fb2015-02-23 00:31:53 +000090 { "\x02\x00\x00\x00\x00\x00\x00\x00", 1},
91 { "\x03\x00\x00\x00\x00\x00\x00\x00", 1},
92 { "\x04\x00\x00\x00\x00\x00\x00\x00", 1},
robert.swiecki@gmail.com03e70392015-03-01 03:53:11 +000093 { "\x7E\x00\x00\x00\x00\x00\x00\x00", 1},
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +000094 { "\x7F\x00\x00\x00\x00\x00\x00\x00", 1},
95 { "\x80\x00\x00\x00\x00\x00\x00\x00", 1},
robert.swiecki@gmail.com395278b2015-02-28 22:48:53 +000096 { "\x81\x00\x00\x00\x00\x00\x00\x00", 1},
Robert Swiecki61cbed82016-03-10 15:32:07 +010097 { "\xFE\x00\x00\x00\x00\x00\x00\x00", 1},
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +000098 { "\xFF\x00\x00\x00\x00\x00\x00\x00", 1},
99 /* 2B - NE */
100 { "\x00\x00\x00\x00\x00\x00\x00\x00", 2},
robert.swiecki@gmail.com1ba76192015-02-22 15:45:49 +0000101 { "\x01\x01\x00\x00\x00\x00\x00\x00", 2},
102 { "\x80\x80\x00\x00\x00\x00\x00\x00", 2},
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000103 { "\xFF\xFF\x00\x00\x00\x00\x00\x00", 2},
104 /* 2B - BE */
105 { "\x00\x01\x00\x00\x00\x00\x00\x00", 2},
robert.swiecki@gmail.combe554fb2015-02-23 00:31:53 +0000106 { "\x00\x02\x00\x00\x00\x00\x00\x00", 2},
107 { "\x00\x03\x00\x00\x00\x00\x00\x00", 2},
108 { "\x00\x04\x00\x00\x00\x00\x00\x00", 2},
robert.swiecki@gmail.com03e70392015-03-01 03:53:11 +0000109 { "\x7E\xFF\x00\x00\x00\x00\x00\x00", 2},
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000110 { "\x7F\xFF\x00\x00\x00\x00\x00\x00", 2},
111 { "\x80\x00\x00\x00\x00\x00\x00\x00", 2},
robert.swiecki@gmail.com395278b2015-02-28 22:48:53 +0000112 { "\x80\x01\x00\x00\x00\x00\x00\x00", 2},
Robert Swiecki61cbed82016-03-10 15:32:07 +0100113 { "\xFF\xFE\x00\x00\x00\x00\x00\x00", 2},
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000114 /* 2B - LE */
robert.swiecki@gmail.combe554fb2015-02-23 00:31:53 +0000115 { "\x01\x00\x00\x00\x00\x00\x00\x00", 2},
116 { "\x02\x00\x00\x00\x00\x00\x00\x00", 2},
117 { "\x03\x00\x00\x00\x00\x00\x00\x00", 2},
118 { "\x04\x00\x00\x00\x00\x00\x00\x00", 2},
robert.swiecki@gmail.com03e70392015-03-01 03:53:11 +0000119 { "\xFF\x7E\x00\x00\x00\x00\x00\x00", 2},
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000120 { "\xFF\x7F\x00\x00\x00\x00\x00\x00", 2},
121 { "\x00\x80\x00\x00\x00\x00\x00\x00", 2},
robert.swiecki@gmail.com395278b2015-02-28 22:48:53 +0000122 { "\x01\x80\x00\x00\x00\x00\x00\x00", 2},
Robert Swiecki61cbed82016-03-10 15:32:07 +0100123 { "\xFE\xFF\x00\x00\x00\x00\x00\x00", 2},
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000124 /* 4B - NE */
125 { "\x00\x00\x00\x00\x00\x00\x00\x00", 4},
robert.swiecki@gmail.com1ba76192015-02-22 15:45:49 +0000126 { "\x01\x01\x01\x01\x00\x00\x00\x00", 4},
127 { "\x80\x80\x80\x80\x00\x00\x00\x00", 4},
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000128 { "\xFF\xFF\xFF\xFF\x00\x00\x00\x00", 4},
129 /* 4B - BE */
130 { "\x00\x00\x00\x01\x00\x00\x00\x00", 4},
robert.swiecki@gmail.combe554fb2015-02-23 00:31:53 +0000131 { "\x00\x00\x00\x02\x00\x00\x00\x00", 4},
132 { "\x00\x00\x00\x03\x00\x00\x00\x00", 4},
133 { "\x00\x00\x00\x04\x00\x00\x00\x00", 4},
robert.swiecki@gmail.com03e70392015-03-01 03:53:11 +0000134 { "\x7E\xFF\xFF\xFF\x00\x00\x00\x00", 4},
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000135 { "\x7F\xFF\xFF\xFF\x00\x00\x00\x00", 4},
136 { "\x80\x00\x00\x00\x00\x00\x00\x00", 4},
robert.swiecki@gmail.com395278b2015-02-28 22:48:53 +0000137 { "\x80\x00\x00\x01\x00\x00\x00\x00", 4},
Robert Swiecki61cbed82016-03-10 15:32:07 +0100138 { "\xFF\xFF\xFF\xFE\x00\x00\x00\x00", 4},
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000139 /* 4B - LE */
140 { "\x01\x00\x00\x00\x00\x00\x00\x00", 4},
robert.swiecki@gmail.combe554fb2015-02-23 00:31:53 +0000141 { "\x02\x00\x00\x00\x00\x00\x00\x00", 4},
142 { "\x03\x00\x00\x00\x00\x00\x00\x00", 4},
143 { "\x04\x00\x00\x00\x00\x00\x00\x00", 4},
robert.swiecki@gmail.com03e70392015-03-01 03:53:11 +0000144 { "\xFF\xFF\xFF\x7E\x00\x00\x00\x00", 4},
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000145 { "\xFF\xFF\xFF\x7F\x00\x00\x00\x00", 4},
146 { "\x00\x00\x00\x80\x00\x00\x00\x00", 4},
robert.swiecki@gmail.com395278b2015-02-28 22:48:53 +0000147 { "\x01\x00\x00\x80\x00\x00\x00\x00", 4},
Robert Swiecki61cbed82016-03-10 15:32:07 +0100148 { "\xFE\xFF\xFF\xFF\x00\x00\x00\x00", 4},
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000149 /* 8B - NE */
150 { "\x00\x00\x00\x00\x00\x00\x00\x00", 8},
robert.swiecki@gmail.com1ba76192015-02-22 15:45:49 +0000151 { "\x01\x01\x01\x01\x01\x01\x01\x01", 8},
152 { "\x80\x80\x80\x80\x80\x80\x80\x80", 8},
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000153 { "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 8},
154 /* 8B - BE */
155 { "\x00\x00\x00\x00\x00\x00\x00\x01", 8},
robert.swiecki@gmail.combe554fb2015-02-23 00:31:53 +0000156 { "\x00\x00\x00\x00\x00\x00\x00\x02", 8},
157 { "\x00\x00\x00\x00\x00\x00\x00\x03", 8},
158 { "\x00\x00\x00\x00\x00\x00\x00\x04", 8},
robert.swiecki@gmail.com03e70392015-03-01 03:53:11 +0000159 { "\x7E\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 8},
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000160 { "\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 8},
161 { "\x80\x00\x00\x00\x00\x00\x00\x00", 8},
robert.swiecki@gmail.com395278b2015-02-28 22:48:53 +0000162 { "\x80\x00\x00\x00\x00\x00\x00\x01", 8},
Robert Swiecki61cbed82016-03-10 15:32:07 +0100163 { "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFE", 8},
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000164 /* 8B - LE */
165 { "\x01\x00\x00\x00\x00\x00\x00\x00", 8},
robert.swiecki@gmail.combe554fb2015-02-23 00:31:53 +0000166 { "\x02\x00\x00\x00\x00\x00\x00\x00", 8},
167 { "\x03\x00\x00\x00\x00\x00\x00\x00", 8},
168 { "\x04\x00\x00\x00\x00\x00\x00\x00", 8},
robert.swiecki@gmail.com03e70392015-03-01 03:53:11 +0000169 { "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7E", 8},
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000170 { "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7F", 8},
171 { "\x00\x00\x00\x00\x00\x00\x00\x80", 8},
robert.swiecki@gmail.com395278b2015-02-28 22:48:53 +0000172 { "\x01\x00\x00\x00\x00\x00\x00\x80", 8},
Robert Swiecki61cbed82016-03-10 15:32:07 +0100173 { "\xFE\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 8},
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000174 };
robert.swiecki@gmail.com4be26672015-03-05 03:36:50 +0000175 /* *INDENT-ON* */
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000176
177 uint64_t choice = util_rndGet(0, ARRAYSIZE(mangleMagicVals) - 1);
robert.swiecki@gmail.combcdeaea2015-02-23 17:36:54 +0000178 mangle_Overwrite(buf, mangleMagicVals[choice].val, bufSz, off, mangleMagicVals[choice].size);
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000179}
180
Anestis Bechtsoudis2ff92d12015-12-20 15:33:20 +0200181static void mangle_MemSet(honggfuzz_t * hfuzz UNUSED, uint8_t * buf, size_t bufSz, size_t off)
robert.swiecki@gmail.com89cc38c2015-02-23 02:52:08 +0000182{
183 uint64_t sz = util_rndGet(1, bufSz - off);
184 int val = (int)util_rndGet(0, UINT8_MAX);
185
186 memset(&buf[off], val, sz);
187}
188
Anestis Bechtsoudis2ff92d12015-12-20 15:33:20 +0200189static void mangle_MemMove(honggfuzz_t * hfuzz UNUSED, uint8_t * buf, size_t bufSz, size_t off)
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000190{
robert.swiecki@gmail.comb7779612015-02-22 14:51:17 +0000191 uint64_t mangleTo = util_rndGet(0, bufSz - 1);
robert.swiecki@gmail.com8c3e0f22015-02-22 16:32:16 +0000192 uint64_t mangleSzTo = bufSz - mangleTo;
robert.swiecki@gmail.com0a7eabe2015-02-22 14:47:45 +0000193
robert.swiecki@gmail.come8555c22015-02-22 14:49:22 +0000194 uint64_t mangleSzFrom = util_rndGet(1, bufSz - off);
robert.swiecki@gmail.com0a7eabe2015-02-22 14:47:45 +0000195 uint64_t mangleSz = mangleSzFrom < mangleSzTo ? mangleSzFrom : mangleSzTo;
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000196
197 memmove(&buf[mangleTo], &buf[off], mangleSz);
198}
199
Anestis Bechtsoudis2ff92d12015-12-20 15:33:20 +0200200static void mangle_Random(honggfuzz_t * hfuzz UNUSED, uint8_t * buf, size_t bufSz, size_t off)
robert.swiecki@gmail.com89cc38c2015-02-23 02:52:08 +0000201{
202 uint64_t sz = util_rndGet(1, bufSz - off);
203 util_rndBuf(&buf[off], sz);
204}
205
Anestis Bechtsoudis2ff92d12015-12-20 15:33:20 +0200206static void mangle_AddSub(honggfuzz_t * hfuzz UNUSED, uint8_t * buf, size_t bufSz, size_t off)
robert.swiecki@gmail.com549ff182015-02-28 22:38:00 +0000207{
208 /* 1,2,4 */
209 uint64_t varLen = 1ULL << util_rndGet(0, 2);
210 if ((bufSz - off) < varLen) {
robert.swiecki@gmail.com57197642015-03-01 15:39:30 +0000211 varLen = 1;
robert.swiecki@gmail.com549ff182015-02-28 22:38:00 +0000212 }
213
214 int delta = (int)util_rndGet(0, 64);
215 delta -= 32;
216
217 switch (varLen) {
218 case 1:
robert.swiecki@gmail.com62e34ae2015-03-05 03:39:32 +0000219 {
220 buf[off] += delta;
221 return;
222 break;
223 }
robert.swiecki@gmail.com549ff182015-02-28 22:38:00 +0000224 case 2:
robert.swiecki@gmail.com62e34ae2015-03-05 03:39:32 +0000225 {
226 uint16_t val = *((uint16_t *) & buf[off]);
227 if (util_rndGet(0, 1) == 0) {
robert.swiecki@gmail.com62e34ae2015-03-05 03:39:32 +0000228 val += delta;
robert.swiecki@gmail.com62e34ae2015-03-05 03:39:32 +0000229 } else {
Jaggerd0b147f2016-04-04 22:49:24 +0200230 /* Foreign endianess */
231 val = __builtin_bswap16(val);
robert.swiecki@gmail.com62e34ae2015-03-05 03:39:32 +0000232 val += delta;
Jaggerd0b147f2016-04-04 22:49:24 +0200233 val = __builtin_bswap16(val);
robert.swiecki@gmail.com62e34ae2015-03-05 03:39:32 +0000234 }
235 mangle_Overwrite(buf, (uint8_t *) & val, bufSz, off, varLen);
236 return;
237 break;
robert.swiecki@gmail.com549ff182015-02-28 22:38:00 +0000238 }
239 case 4:
robert.swiecki@gmail.com62e34ae2015-03-05 03:39:32 +0000240 {
241 uint32_t val = *((uint32_t *) & buf[off]);
242 if (util_rndGet(0, 1) == 0) {
robert.swiecki@gmail.com62e34ae2015-03-05 03:39:32 +0000243 val += delta;
robert.swiecki@gmail.com62e34ae2015-03-05 03:39:32 +0000244 } else {
Jaggerd0b147f2016-04-04 22:49:24 +0200245 /* Foreign endianess */
246 val = __builtin_bswap32(val);
robert.swiecki@gmail.com62e34ae2015-03-05 03:39:32 +0000247 val += delta;
Jaggerd0b147f2016-04-04 22:49:24 +0200248 val = __builtin_bswap32(val);
robert.swiecki@gmail.com62e34ae2015-03-05 03:39:32 +0000249 }
250 mangle_Overwrite(buf, (uint8_t *) & val, bufSz, off, varLen);
251 return;
252 break;
robert.swiecki@gmail.com549ff182015-02-28 22:38:00 +0000253 }
254 default:
robert.swiecki@gmail.com62e34ae2015-03-05 03:39:32 +0000255 {
Anestis Bechtsoudis07e14ce2015-12-30 14:15:42 +0200256 LOG_F("Unknown variable length size: %" PRIu64, varLen);
robert.swiecki@gmail.com62e34ae2015-03-05 03:39:32 +0000257 break;
258 }
robert.swiecki@gmail.com549ff182015-02-28 22:38:00 +0000259 }
260}
261
Anestis Bechtsoudis2ff92d12015-12-20 15:33:20 +0200262static void mangle_IncByte(honggfuzz_t * hfuzz UNUSED, uint8_t * buf, size_t bufSz UNUSED,
263 size_t off)
robert.swiecki@gmail.com78973ed2015-03-01 03:57:18 +0000264{
265 buf[off] += (uint8_t) 1UL;
robert.swiecki@gmail.com78973ed2015-03-01 03:57:18 +0000266}
267
Anestis Bechtsoudis2ff92d12015-12-20 15:33:20 +0200268static void mangle_DecByte(honggfuzz_t * hfuzz UNUSED, uint8_t * buf, size_t bufSz UNUSED,
269 size_t off)
robert.swiecki@gmail.com78973ed2015-03-01 03:57:18 +0000270{
271 buf[off] -= (uint8_t) 1UL;
robert.swiecki@gmail.com78973ed2015-03-01 03:57:18 +0000272}
273
Robert Swieckia96d78d2016-03-14 16:50:50 +0100274void mangle_mangleContent(honggfuzz_t * hfuzz, fuzzer_t * fuzzer)
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000275{
robert.swiecki@gmail.com4be26672015-03-05 03:36:50 +0000276 /* *INDENT-OFF* */
Robert Swieckie6389e22015-11-25 15:13:38 +0100277 static void (*const mangleFuncs[]) (honggfuzz_t * hfuzz, uint8_t * buf, size_t bufSz, size_t off) = {
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000278 mangle_Byte,
robert.swiecki@gmail.com17ee6762015-02-22 15:19:31 +0000279 mangle_Byte,
280 mangle_Byte,
281 mangle_Byte,
robert.swiecki@gmail.com17ee6762015-02-22 15:19:31 +0000282 mangle_Bit,
283 mangle_Bit,
284 mangle_Bytes,
285 mangle_Bytes,
286 mangle_Magic,
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000287 mangle_Magic,
robert.swiecki@gmail.com87e72752015-03-03 16:15:59 +0000288 mangle_IncByte,
robert.swiecki@gmail.com87e72752015-03-03 16:15:59 +0000289 mangle_DecByte,
290 mangle_AddSub,
robert.swiecki@gmail.com4f1124f2015-04-21 17:12:22 +0000291 mangle_Dictionary,
robert.swiecki@gmail.com89cc38c2015-02-23 02:52:08 +0000292 mangle_MemMove,
293 mangle_MemSet,
robert.swiecki@gmail.com50e1f3b2015-02-23 17:32:11 +0000294 mangle_Random,
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000295 };
robert.swiecki@gmail.com4be26672015-03-05 03:36:50 +0000296 /* *INDENT-ON* */
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000297
298 /*
299 * Minimal number of changes is 1
300 */
Robert Swieckia96d78d2016-03-14 16:50:50 +0100301 uint64_t changesCnt = fuzzer->dynamicFileSz * fuzzer->flipRate;
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000302 if (changesCnt == 0ULL) {
303 changesCnt = 1;
304 }
305 changesCnt = util_rndGet(1, changesCnt);
306
307 for (uint64_t x = 0; x < changesCnt; x++) {
Robert Swieckia96d78d2016-03-14 16:50:50 +0100308 size_t offset = util_rndGet(0, fuzzer->dynamicFileSz - 1);
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000309 uint64_t choice = util_rndGet(0, ARRAYSIZE(mangleFuncs) - 1);
Robert Swieckia96d78d2016-03-14 16:50:50 +0100310 mangleFuncs[choice] (hfuzz, fuzzer->dynamicFile, fuzzer->dynamicFileSz, offset);
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000311 }
312}
313
robert.swiecki@gmail.comf891cad2015-02-25 12:21:04 +0000314static double mangle_ExpDist(void)
robert.swiecki@gmail.com61b02a52015-02-23 01:14:18 +0000315{
robert.swiecki@gmail.comf891cad2015-02-25 12:21:04 +0000316 double rnd = (double)util_rndGet(1, UINT32_MAX) / (double)(UINT32_MAX);
robert.swiecki@gmail.comedbca382015-02-26 14:21:19 +0000317 return pow(rnd, 4.0L);
robert.swiecki@gmail.com61b02a52015-02-23 01:14:18 +0000318}
319
robert.swiecki@gmail.com173f5192015-02-23 00:06:47 +0000320/* Gauss-like distribution */
robert.swiecki@gmail.comace40862015-03-08 07:09:56 +0000321bool mangle_Resize(honggfuzz_t * hfuzz, uint8_t * buf, size_t * bufSz)
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000322{
Jaggerf08d14c2016-03-15 22:36:55 +0100323 static const uint64_t chance_one_in_x = 5;
robert.swiecki@gmail.come7680522015-02-22 22:22:37 +0000324 if (util_rndGet(1, chance_one_in_x) != 1) {
325 return true;
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000326 }
robert.swiecki@gmail.comf891cad2015-02-25 12:21:04 +0000327 ssize_t newSz = *bufSz;
robert.swiecki@gmail.com1c246502015-02-25 13:47:27 +0000328 int delta = 0;
robert.swiecki@gmail.coma56173d2015-02-26 00:46:24 +0000329 unsigned int val = (unsigned int)util_rndGet(1, 64);
Anestis Bechtsoudisccdf28c2016-01-10 15:04:22 +0200330
331 /* *INDENT-OFF* */
robert.swiecki@gmail.com1c246502015-02-25 13:47:27 +0000332 switch (val) {
robert.swiecki@gmail.coma56173d2015-02-26 00:46:24 +0000333 case 1 ... 16:
robert.swiecki@gmail.com1c246502015-02-25 13:47:27 +0000334 delta = -val;
335 break;
robert.swiecki@gmail.coma56173d2015-02-26 00:46:24 +0000336 case 17 ... 32:
337 delta = val - 16;
robert.swiecki@gmail.com1c246502015-02-25 13:47:27 +0000338 break;
robert.swiecki@gmail.coma56173d2015-02-26 00:46:24 +0000339 case 33 ... 48:
robert.swiecki@gmail.com1c246502015-02-25 13:47:27 +0000340 delta += (int)(mangle_ExpDist() * (double)((hfuzz->maxFileSz - *bufSz)));
341 break;
robert.swiecki@gmail.coma56173d2015-02-26 00:46:24 +0000342 case 49 ... 64:
robert.swiecki@gmail.com1c246502015-02-25 13:47:27 +0000343 delta -= (int)(mangle_ExpDist() * (double)(*bufSz));
344 break;
345 default:
Robert Swieckic8c32db2015-10-09 18:06:22 +0200346 LOG_F("Random value out of scope %u", val);
robert.swiecki@gmail.com1c246502015-02-25 13:47:27 +0000347 break;
348 }
Anestis Bechtsoudisccdf28c2016-01-10 15:04:22 +0200349 /* *INDENT-ON* */
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000350
robert.swiecki@gmail.com1c246502015-02-25 13:47:27 +0000351 newSz += delta;
robert.swiecki@gmail.com173f5192015-02-23 00:06:47 +0000352
robert.swiecki@gmail.com59526032015-02-23 17:10:29 +0000353 if (newSz < 1) {
354 newSz = 1;
robert.swiecki@gmail.com173f5192015-02-23 00:06:47 +0000355 }
robert.swiecki@gmail.com1c246502015-02-25 13:47:27 +0000356 if (newSz > (ssize_t) hfuzz->maxFileSz) {
357 newSz = (ssize_t) hfuzz->maxFileSz;
robert.swiecki@gmail.com173f5192015-02-23 00:06:47 +0000358 }
359
robert.swiecki@gmail.comace40862015-03-08 07:09:56 +0000360 if ((size_t) newSz > *bufSz) {
361 util_rndBuf(&buf[*bufSz], newSz - *bufSz);
362 }
363
Robert Swieckic8c32db2015-10-09 18:06:22 +0200364 LOG_D("Current size: %zu, Maximal size: %zu, New Size: %zu, Delta: %d", *bufSz,
365 hfuzz->maxFileSz, newSz, delta);
robert.swiecki@gmail.com173f5192015-02-23 00:06:47 +0000366
robert.swiecki@gmail.com173f5192015-02-23 00:06:47 +0000367 *bufSz = (size_t) newSz;
robert.swiecki@gmail.come7680522015-02-22 22:22:37 +0000368 return true;
robert.swiecki@gmail.coma3e014e2015-02-22 14:33:46 +0000369}