summaryrefslogtreecommitdiff
path: root/mangle.c
diff options
context:
space:
mode:
authorplusun <tomsun.0.7@gmail.com>2018-07-31 13:55:50 +0000
committerplusun <tomsun.0.7@gmail.com>2018-07-31 13:55:50 +0000
commitdc64d05a49df87432bd7cb30739904cc35422e3f (patch)
treed53fc22fe69efccc8927d7436b1d8716dfed0bec /mangle.c
parent99ef77ef624387a00a9f23d429aa268f29f338c0 (diff)
downloadhonggfuzz-dc64d05a49df87432bd7cb30739904cc35422e3f.tar.gz
Add mangle functions for printable inputs
Diffstat (limited to 'mangle.c')
-rw-r--r--mangle.c495
1 files changed, 473 insertions, 22 deletions
diff --git a/mangle.c b/mangle.c
index e1da094f..f7c39a9a 100644
--- a/mangle.c
+++ b/mangle.c
@@ -94,6 +94,11 @@ static void mangle_Byte(run_t* run) {
run->dynamicFile[off] = (uint8_t)util_rnd64();
}
+static void mangle_PrintableByte(run_t* run) {
+ size_t off = util_rndGet(0, run->dynamicFileSz - 1);
+ run->dynamicFile[off] = util_rndPrintable();
+}
+
static void mangle_Bytes(run_t* run) {
size_t off = util_rndGet(0, run->dynamicFileSz - 1);
uint32_t val = (uint32_t)util_rnd64();
@@ -103,11 +108,27 @@ static void mangle_Bytes(run_t* run) {
mangle_Overwrite(run, (uint8_t*)&val, off, toCopy);
}
+static void mangle_PrintableBytes(run_t* run) {
+ size_t off = util_rndGet(0, run->dynamicFileSz - 1);
+ uint32_t val = (uint32_t)util_rnd64();
+ util_turnToPrintable((uint8_t *)&val, sizeof(val));
+
+ /* Overwrite with random 2,3,4-byte values */
+ size_t toCopy = util_rndGet(2, 4);
+ mangle_Overwrite(run, (uint8_t*)&val, off, toCopy);
+}
+
static void mangle_Bit(run_t* run) {
size_t off = util_rndGet(0, run->dynamicFileSz - 1);
run->dynamicFile[off] ^= (uint8_t)(1U << util_rndGet(0, 7));
}
+static void mangle_BitPrintable(run_t* run) {
+ size_t off = util_rndGet(0, run->dynamicFileSz - 1);
+ run->dynamicFile[off] ^= (uint8_t)(1U << util_rndGet(0, 7));
+ util_turnToPrintable(&(run->dynamicFile[off]), 1);
+}
+
static void mangle_DictionaryInsert(run_t* run) {
if (run->global->mutate.dictionaryCnt == 0) {
mangle_Bit(run);
@@ -126,6 +147,24 @@ static void mangle_DictionaryInsert(run_t* run) {
mangle_Overwrite(run, (uint8_t*)str->s, off, str->len);
}
+static void mangle_DictionaryInsertPrintable(run_t* run) {
+ if (run->global->mutate.dictionaryCnt == 0) {
+ mangle_BitPrintable(run);
+ return;
+ }
+
+ uint64_t choice = util_rndGet(0, run->global->mutate.dictionaryCnt - 1);
+ struct strings_t* str = TAILQ_FIRST(&run->global->mutate.dictq);
+ for (uint64_t i = 0; i < choice; i++) {
+ str = TAILQ_NEXT(str, pointers);
+ }
+
+ size_t off = util_rndGet(0, run->dynamicFileSz - 1);
+ mangle_Inflate(run, off, str->len);
+ mangle_Move(run, off, off + str->len, str->len);
+ mangle_Overwrite(run, (uint8_t*)str->s, off, str->len);
+}
+
static void mangle_Dictionary(run_t* run) {
if (run->global->mutate.dictionaryCnt == 0) {
mangle_Bit(run);
@@ -141,6 +180,25 @@ static void mangle_Dictionary(run_t* run) {
}
mangle_Overwrite(run, (uint8_t*)str->s, off, str->len);
+ /* FIXME */
+}
+
+static void mangle_DictionaryPrintable(run_t* run) {
+ if (run->global->mutate.dictionaryCnt == 0) {
+ mangle_BitPrintable(run);
+ return;
+ }
+
+ size_t off = util_rndGet(0, run->dynamicFileSz - 1);
+
+ uint64_t choice = util_rndGet(0, run->global->mutate.dictionaryCnt - 1);
+ struct strings_t* str = TAILQ_FIRST(&run->global->mutate.dictq);
+ for (uint64_t i = 0; i < choice; i++) {
+ str = TAILQ_NEXT(str, pointers);
+ }
+
+ mangle_Overwrite(run, (uint8_t*)str->s, off, str->len);
+ /* FIXME */
}
static void mangle_Magic(run_t* run) {
@@ -386,6 +444,250 @@ static void mangle_Magic(run_t* run) {
mangle_Overwrite(run, mangleMagicVals[choice].val, off, mangleMagicVals[choice].size);
}
+static void mangle_MagicPrintable(run_t* run) {
+ static const struct {
+ const uint8_t val[8];
+ const size_t size;
+ } mangleMagicVals[] = {
+ /* 1B - No endianness */
+ {"\x00\x00\x00\x00\x00\x00\x00\x00", 1},
+ {"\x01\x00\x00\x00\x00\x00\x00\x00", 1},
+ {"\x02\x00\x00\x00\x00\x00\x00\x00", 1},
+ {"\x03\x00\x00\x00\x00\x00\x00\x00", 1},
+ {"\x04\x00\x00\x00\x00\x00\x00\x00", 1},
+ {"\x05\x00\x00\x00\x00\x00\x00\x00", 1},
+ {"\x06\x00\x00\x00\x00\x00\x00\x00", 1},
+ {"\x07\x00\x00\x00\x00\x00\x00\x00", 1},
+ {"\x08\x00\x00\x00\x00\x00\x00\x00", 1},
+ {"\x09\x00\x00\x00\x00\x00\x00\x00", 1},
+ {"\x0A\x00\x00\x00\x00\x00\x00\x00", 1},
+ {"\x0B\x00\x00\x00\x00\x00\x00\x00", 1},
+ {"\x0C\x00\x00\x00\x00\x00\x00\x00", 1},
+ {"\x0D\x00\x00\x00\x00\x00\x00\x00", 1},
+ {"\x0E\x00\x00\x00\x00\x00\x00\x00", 1},
+ {"\x0F\x00\x00\x00\x00\x00\x00\x00", 1},
+ {"\x10\x00\x00\x00\x00\x00\x00\x00", 1},
+ {"\x20\x00\x00\x00\x00\x00\x00\x00", 1},
+ {"\x40\x00\x00\x00\x00\x00\x00\x00", 1},
+ {"\x7E\x00\x00\x00\x00\x00\x00\x00", 1},
+ {"\x7F\x00\x00\x00\x00\x00\x00\x00", 1},
+ {"\x80\x00\x00\x00\x00\x00\x00\x00", 1},
+ {"\x81\x00\x00\x00\x00\x00\x00\x00", 1},
+ {"\xC0\x00\x00\x00\x00\x00\x00\x00", 1},
+ {"\xFE\x00\x00\x00\x00\x00\x00\x00", 1},
+ {"\xFF\x00\x00\x00\x00\x00\x00\x00", 1},
+ /* 2B - NE */
+ {"\x00\x00\x00\x00\x00\x00\x00\x00", 2},
+ {"\x01\x01\x00\x00\x00\x00\x00\x00", 2},
+ {"\x80\x80\x00\x00\x00\x00\x00\x00", 2},
+ {"\xFF\xFF\x00\x00\x00\x00\x00\x00", 2},
+ /* 2B - BE */
+ {"\x00\x01\x00\x00\x00\x00\x00\x00", 2},
+ {"\x00\x02\x00\x00\x00\x00\x00\x00", 2},
+ {"\x00\x03\x00\x00\x00\x00\x00\x00", 2},
+ {"\x00\x04\x00\x00\x00\x00\x00\x00", 2},
+ {"\x00\x05\x00\x00\x00\x00\x00\x00", 2},
+ {"\x00\x06\x00\x00\x00\x00\x00\x00", 2},
+ {"\x00\x07\x00\x00\x00\x00\x00\x00", 2},
+ {"\x00\x08\x00\x00\x00\x00\x00\x00", 2},
+ {"\x00\x09\x00\x00\x00\x00\x00\x00", 2},
+ {"\x00\x0A\x00\x00\x00\x00\x00\x00", 2},
+ {"\x00\x0B\x00\x00\x00\x00\x00\x00", 2},
+ {"\x00\x0C\x00\x00\x00\x00\x00\x00", 2},
+ {"\x00\x0D\x00\x00\x00\x00\x00\x00", 2},
+ {"\x00\x0E\x00\x00\x00\x00\x00\x00", 2},
+ {"\x00\x0F\x00\x00\x00\x00\x00\x00", 2},
+ {"\x00\x10\x00\x00\x00\x00\x00\x00", 2},
+ {"\x00\x20\x00\x00\x00\x00\x00\x00", 2},
+ {"\x00\x40\x00\x00\x00\x00\x00\x00", 2},
+ {"\x00\x7E\x00\x00\x00\x00\x00\x00", 2},
+ {"\x00\x7F\x00\x00\x00\x00\x00\x00", 2},
+ {"\x00\x80\x00\x00\x00\x00\x00\x00", 2},
+ {"\x00\x81\x00\x00\x00\x00\x00\x00", 2},
+ {"\x00\xC0\x00\x00\x00\x00\x00\x00", 2},
+ {"\x00\xFE\x00\x00\x00\x00\x00\x00", 2},
+ {"\x00\xFF\x00\x00\x00\x00\x00\x00", 2},
+ {"\x7E\xFF\x00\x00\x00\x00\x00\x00", 2},
+ {"\x7F\xFF\x00\x00\x00\x00\x00\x00", 2},
+ {"\x80\x00\x00\x00\x00\x00\x00\x00", 2},
+ {"\x80\x01\x00\x00\x00\x00\x00\x00", 2},
+ {"\xFF\xFE\x00\x00\x00\x00\x00\x00", 2},
+ /* 2B - LE */
+ {"\x00\x00\x00\x00\x00\x00\x00\x00", 2},
+ {"\x01\x00\x00\x00\x00\x00\x00\x00", 2},
+ {"\x02\x00\x00\x00\x00\x00\x00\x00", 2},
+ {"\x03\x00\x00\x00\x00\x00\x00\x00", 2},
+ {"\x04\x00\x00\x00\x00\x00\x00\x00", 2},
+ {"\x05\x00\x00\x00\x00\x00\x00\x00", 2},
+ {"\x06\x00\x00\x00\x00\x00\x00\x00", 2},
+ {"\x07\x00\x00\x00\x00\x00\x00\x00", 2},
+ {"\x08\x00\x00\x00\x00\x00\x00\x00", 2},
+ {"\x09\x00\x00\x00\x00\x00\x00\x00", 2},
+ {"\x0A\x00\x00\x00\x00\x00\x00\x00", 2},
+ {"\x0B\x00\x00\x00\x00\x00\x00\x00", 2},
+ {"\x0C\x00\x00\x00\x00\x00\x00\x00", 2},
+ {"\x0D\x00\x00\x00\x00\x00\x00\x00", 2},
+ {"\x0E\x00\x00\x00\x00\x00\x00\x00", 2},
+ {"\x0F\x00\x00\x00\x00\x00\x00\x00", 2},
+ {"\x10\x00\x00\x00\x00\x00\x00\x00", 2},
+ {"\x20\x00\x00\x00\x00\x00\x00\x00", 2},
+ {"\x40\x00\x00\x00\x00\x00\x00\x00", 2},
+ {"\x7E\x00\x00\x00\x00\x00\x00\x00", 2},
+ {"\x7F\x00\x00\x00\x00\x00\x00\x00", 2},
+ {"\x80\x00\x00\x00\x00\x00\x00\x00", 2},
+ {"\x81\x00\x00\x00\x00\x00\x00\x00", 2},
+ {"\xC0\x00\x00\x00\x00\x00\x00\x00", 2},
+ {"\xFE\x00\x00\x00\x00\x00\x00\x00", 2},
+ {"\xFF\x00\x00\x00\x00\x00\x00\x00", 2},
+ {"\xFF\x7E\x00\x00\x00\x00\x00\x00", 2},
+ {"\xFF\x7F\x00\x00\x00\x00\x00\x00", 2},
+ {"\x00\x80\x00\x00\x00\x00\x00\x00", 2},
+ {"\x01\x80\x00\x00\x00\x00\x00\x00", 2},
+ {"\xFE\xFF\x00\x00\x00\x00\x00\x00", 2},
+ /* 4B - NE */
+ {"\x00\x00\x00\x00\x00\x00\x00\x00", 4},
+ {"\x01\x01\x01\x01\x00\x00\x00\x00", 4},
+ {"\x80\x80\x80\x80\x00\x00\x00\x00", 4},
+ {"\xFF\xFF\xFF\xFF\x00\x00\x00\x00", 4},
+ /* 4B - BE */
+ {"\x00\x00\x00\x01\x00\x00\x00\x00", 4},
+ {"\x00\x00\x00\x02\x00\x00\x00\x00", 4},
+ {"\x00\x00\x00\x03\x00\x00\x00\x00", 4},
+ {"\x00\x00\x00\x04\x00\x00\x00\x00", 4},
+ {"\x00\x00\x00\x05\x00\x00\x00\x00", 4},
+ {"\x00\x00\x00\x06\x00\x00\x00\x00", 4},
+ {"\x00\x00\x00\x07\x00\x00\x00\x00", 4},
+ {"\x00\x00\x00\x08\x00\x00\x00\x00", 4},
+ {"\x00\x00\x00\x09\x00\x00\x00\x00", 4},
+ {"\x00\x00\x00\x0A\x00\x00\x00\x00", 4},
+ {"\x00\x00\x00\x0B\x00\x00\x00\x00", 4},
+ {"\x00\x00\x00\x0C\x00\x00\x00\x00", 4},
+ {"\x00\x00\x00\x0D\x00\x00\x00\x00", 4},
+ {"\x00\x00\x00\x0E\x00\x00\x00\x00", 4},
+ {"\x00\x00\x00\x0F\x00\x00\x00\x00", 4},
+ {"\x00\x00\x00\x10\x00\x00\x00\x00", 4},
+ {"\x00\x00\x00\x20\x00\x00\x00\x00", 4},
+ {"\x00\x00\x00\x40\x00\x00\x00\x00", 4},
+ {"\x00\x00\x00\x7E\x00\x00\x00\x00", 4},
+ {"\x00\x00\x00\x7F\x00\x00\x00\x00", 4},
+ {"\x00\x00\x00\x80\x00\x00\x00\x00", 4},
+ {"\x00\x00\x00\x81\x00\x00\x00\x00", 4},
+ {"\x00\x00\x00\xC0\x00\x00\x00\x00", 4},
+ {"\x00\x00\x00\xFE\x00\x00\x00\x00", 4},
+ {"\x00\x00\x00\xFF\x00\x00\x00\x00", 4},
+ {"\x7E\xFF\xFF\xFF\x00\x00\x00\x00", 4},
+ {"\x7F\xFF\xFF\xFF\x00\x00\x00\x00", 4},
+ {"\x80\x00\x00\x00\x00\x00\x00\x00", 4},
+ {"\x80\x00\x00\x01\x00\x00\x00\x00", 4},
+ {"\xFF\xFF\xFF\xFE\x00\x00\x00\x00", 4},
+ /* 4B - LE */
+ {"\x00\x00\x00\x00\x00\x00\x00\x00", 4},
+ {"\x01\x00\x00\x00\x00\x00\x00\x00", 4},
+ {"\x02\x00\x00\x00\x00\x00\x00\x00", 4},
+ {"\x03\x00\x00\x00\x00\x00\x00\x00", 4},
+ {"\x04\x00\x00\x00\x00\x00\x00\x00", 4},
+ {"\x05\x00\x00\x00\x00\x00\x00\x00", 4},
+ {"\x06\x00\x00\x00\x00\x00\x00\x00", 4},
+ {"\x07\x00\x00\x00\x00\x00\x00\x00", 4},
+ {"\x08\x00\x00\x00\x00\x00\x00\x00", 4},
+ {"\x09\x00\x00\x00\x00\x00\x00\x00", 4},
+ {"\x0A\x00\x00\x00\x00\x00\x00\x00", 4},
+ {"\x0B\x00\x00\x00\x00\x00\x00\x00", 4},
+ {"\x0C\x00\x00\x00\x00\x00\x00\x00", 4},
+ {"\x0D\x00\x00\x00\x00\x00\x00\x00", 4},
+ {"\x0E\x00\x00\x00\x00\x00\x00\x00", 4},
+ {"\x0F\x00\x00\x00\x00\x00\x00\x00", 4},
+ {"\x10\x00\x00\x00\x00\x00\x00\x00", 4},
+ {"\x20\x00\x00\x00\x00\x00\x00\x00", 4},
+ {"\x40\x00\x00\x00\x00\x00\x00\x00", 4},
+ {"\x7E\x00\x00\x00\x00\x00\x00\x00", 4},
+ {"\x7F\x00\x00\x00\x00\x00\x00\x00", 4},
+ {"\x80\x00\x00\x00\x00\x00\x00\x00", 4},
+ {"\x81\x00\x00\x00\x00\x00\x00\x00", 4},
+ {"\xC0\x00\x00\x00\x00\x00\x00\x00", 4},
+ {"\xFE\x00\x00\x00\x00\x00\x00\x00", 4},
+ {"\xFF\x00\x00\x00\x00\x00\x00\x00", 4},
+ {"\xFF\xFF\xFF\x7E\x00\x00\x00\x00", 4},
+ {"\xFF\xFF\xFF\x7F\x00\x00\x00\x00", 4},
+ {"\x00\x00\x00\x80\x00\x00\x00\x00", 4},
+ {"\x01\x00\x00\x80\x00\x00\x00\x00", 4},
+ {"\xFE\xFF\xFF\xFF\x00\x00\x00\x00", 4},
+ /* 8B - NE */
+ {"\x00\x00\x00\x00\x00\x00\x00\x00", 8},
+ {"\x01\x01\x01\x01\x01\x01\x01\x01", 8},
+ {"\x80\x80\x80\x80\x80\x80\x80\x80", 8},
+ {"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 8},
+ /* 8B - BE */
+ {"\x00\x00\x00\x00\x00\x00\x00\x01", 8},
+ {"\x00\x00\x00\x00\x00\x00\x00\x02", 8},
+ {"\x00\x00\x00\x00\x00\x00\x00\x03", 8},
+ {"\x00\x00\x00\x00\x00\x00\x00\x04", 8},
+ {"\x00\x00\x00\x00\x00\x00\x00\x05", 8},
+ {"\x00\x00\x00\x00\x00\x00\x00\x06", 8},
+ {"\x00\x00\x00\x00\x00\x00\x00\x07", 8},
+ {"\x00\x00\x00\x00\x00\x00\x00\x08", 8},
+ {"\x00\x00\x00\x00\x00\x00\x00\x09", 8},
+ {"\x00\x00\x00\x00\x00\x00\x00\x0A", 8},
+ {"\x00\x00\x00\x00\x00\x00\x00\x0B", 8},
+ {"\x00\x00\x00\x00\x00\x00\x00\x0C", 8},
+ {"\x00\x00\x00\x00\x00\x00\x00\x0D", 8},
+ {"\x00\x00\x00\x00\x00\x00\x00\x0E", 8},
+ {"\x00\x00\x00\x00\x00\x00\x00\x0F", 8},
+ {"\x00\x00\x00\x00\x00\x00\x00\x10", 8},
+ {"\x00\x00\x00\x00\x00\x00\x00\x20", 8},
+ {"\x00\x00\x00\x00\x00\x00\x00\x40", 8},
+ {"\x00\x00\x00\x00\x00\x00\x00\x7E", 8},
+ {"\x00\x00\x00\x00\x00\x00\x00\x7F", 8},
+ {"\x00\x00\x00\x00\x00\x00\x00\x80", 8},
+ {"\x00\x00\x00\x00\x00\x00\x00\x81", 8},
+ {"\x00\x00\x00\x00\x00\x00\x00\xC0", 8},
+ {"\x00\x00\x00\x00\x00\x00\x00\xFE", 8},
+ {"\x00\x00\x00\x00\x00\x00\x00\xFF", 8},
+ {"\x7E\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 8},
+ {"\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 8},
+ {"\x80\x00\x00\x00\x00\x00\x00\x00", 8},
+ {"\x80\x00\x00\x00\x00\x00\x00\x01", 8},
+ {"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFE", 8},
+ /* 8B - LE */
+ {"\x00\x00\x00\x00\x00\x00\x00\x00", 8},
+ {"\x01\x00\x00\x00\x00\x00\x00\x00", 8},
+ {"\x02\x00\x00\x00\x00\x00\x00\x00", 8},
+ {"\x03\x00\x00\x00\x00\x00\x00\x00", 8},
+ {"\x04\x00\x00\x00\x00\x00\x00\x00", 8},
+ {"\x05\x00\x00\x00\x00\x00\x00\x00", 8},
+ {"\x06\x00\x00\x00\x00\x00\x00\x00", 8},
+ {"\x07\x00\x00\x00\x00\x00\x00\x00", 8},
+ {"\x08\x00\x00\x00\x00\x00\x00\x00", 8},
+ {"\x09\x00\x00\x00\x00\x00\x00\x00", 8},
+ {"\x0A\x00\x00\x00\x00\x00\x00\x00", 8},
+ {"\x0B\x00\x00\x00\x00\x00\x00\x00", 8},
+ {"\x0C\x00\x00\x00\x00\x00\x00\x00", 8},
+ {"\x0D\x00\x00\x00\x00\x00\x00\x00", 8},
+ {"\x0E\x00\x00\x00\x00\x00\x00\x00", 8},
+ {"\x0F\x00\x00\x00\x00\x00\x00\x00", 8},
+ {"\x10\x00\x00\x00\x00\x00\x00\x00", 8},
+ {"\x20\x00\x00\x00\x00\x00\x00\x00", 8},
+ {"\x40\x00\x00\x00\x00\x00\x00\x00", 8},
+ {"\x7E\x00\x00\x00\x00\x00\x00\x00", 8},
+ {"\x7F\x00\x00\x00\x00\x00\x00\x00", 8},
+ {"\x80\x00\x00\x00\x00\x00\x00\x00", 8},
+ {"\x81\x00\x00\x00\x00\x00\x00\x00", 8},
+ {"\xC0\x00\x00\x00\x00\x00\x00\x00", 8},
+ {"\xFE\x00\x00\x00\x00\x00\x00\x00", 8},
+ {"\xFF\x00\x00\x00\x00\x00\x00\x00", 8},
+ {"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7E", 8},
+ {"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7F", 8},
+ {"\x00\x00\x00\x00\x00\x00\x00\x80", 8},
+ {"\x01\x00\x00\x00\x00\x00\x00\x80", 8},
+ {"\xFE\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 8},
+ };
+
+ size_t off = util_rndGet(0, run->dynamicFileSz - 1);
+ uint64_t choice = util_rndGet(0, ARRAYSIZE(mangleMagicVals) - 1);
+ mangle_Overwrite(run, mangleMagicVals[choice].val, off, mangleMagicVals[choice].size);
+ /* FIXME */
+}
+
static void mangle_MemSet(run_t* run) {
size_t off = util_rndGet(0, run->dynamicFileSz - 1);
size_t sz = util_rndGet(1, run->dynamicFileSz - off);
@@ -394,12 +696,27 @@ static void mangle_MemSet(run_t* run) {
memset(&run->dynamicFile[off], val, sz);
}
+static void mangle_MemSetPrintable(run_t* run) {
+ size_t off = util_rndGet(0, run->dynamicFileSz - 1);
+ size_t sz = util_rndGet(1, run->dynamicFileSz - off);
+ int val = (int)util_rndPrintable();
+
+ memset(&run->dynamicFile[off], val, sz);
+}
+
static void mangle_Random(run_t* run) {
size_t off = util_rndGet(0, run->dynamicFileSz - 1);
size_t len = util_rndGet(1, run->dynamicFileSz - off);
util_rndBuf(&run->dynamicFile[off], len);
}
+static void mangle_RandomPrintable(run_t* run) {
+ size_t off = util_rndGet(0, run->dynamicFileSz - 1);
+ size_t len = util_rndGet(1, run->dynamicFileSz - off);
+ util_rndBuf(&run->dynamicFile[off], len);
+ util_turnToPrintable(&run->dynamicFile[off], len);
+}
+
static void mangle_AddSub(run_t* run) {
size_t off = util_rndGet(0, run->dynamicFileSz - 1);
@@ -470,21 +787,115 @@ static void mangle_AddSub(run_t* run) {
}
}
+static void mangle_AddSubPrintable(run_t* run) {
+ size_t off = util_rndGet(0, run->dynamicFileSz - 1);
+
+ /* 1,2,4,8 */
+ uint64_t varLen = 1U << util_rndGet(0, 3);
+ if ((run->dynamicFileSz - off) < varLen) {
+ varLen = 1;
+ }
+
+ int delta = (int)util_rndGet(0, 8192);
+ delta -= 4096;
+
+ switch (varLen) {
+ case 1: {
+ run->dynamicFile[off] += delta;
+ break;
+ }
+ case 2: {
+ int16_t val;
+ memcpy(&val, &run->dynamicFile[off], sizeof(val));
+ if (util_rnd64() & 0x1) {
+ val += delta;
+ } else {
+ /* Foreign endianess */
+ val = __builtin_bswap16(val);
+ val += delta;
+ val = __builtin_bswap16(val);
+ }
+ mangle_Overwrite(run, (uint8_t*)&val, off, varLen);
+ break;
+ }
+ case 4: {
+ int32_t val;
+ memcpy(&val, &run->dynamicFile[off], sizeof(val));
+ if (util_rnd64() & 0x1) {
+ val += delta;
+ } else {
+ /* Foreign endianess */
+ val = __builtin_bswap32(val);
+ val += delta;
+ val = __builtin_bswap32(val);
+ }
+ mangle_Overwrite(run, (uint8_t*)&val, off, varLen);
+ break;
+ }
+ case 8: {
+ int64_t val;
+ memcpy(&val, &run->dynamicFile[off], sizeof(val));
+ if (util_rnd64() & 0x1) {
+ val += delta;
+ } else {
+ /* Foreign endianess */
+ val = __builtin_bswap64(val);
+ val += delta;
+ val = __builtin_bswap64(val);
+ }
+ mangle_Overwrite(run, (uint8_t*)&val, off, varLen);
+ break;
+ }
+ default: {
+ LOG_F("Unknown variable length size: %" PRIu64, varLen);
+ break;
+ }
+ }
+ util_turnToPrintable((uint8_t *)&run->dynamicFile[off], varLen);
+}
+
+static void addPrintable(uint8_t *byte) {
+ *byte = ((*byte) - 32 + 1) % 95 + 32;
+}
+
+static void decPrintable(uint8_t *byte) {
+ *byte = ((*byte) - 32 + 94) % 95 + 32;
+}
+
+static void negPrintable(uint8_t *byte) {
+ *byte = 95 - ((*byte) - 32) + 32;
+}
+
static void mangle_IncByte(run_t* run) {
size_t off = util_rndGet(0, run->dynamicFileSz - 1);
run->dynamicFile[off] += (uint8_t)1UL;
}
+static void mangle_IncBytePrintable(run_t* run) {
+ size_t off = util_rndGet(0, run->dynamicFileSz - 1);
+ addPrintable(&run->dynamicFile[off]);
+}
+
static void mangle_DecByte(run_t* run) {
size_t off = util_rndGet(0, run->dynamicFileSz - 1);
run->dynamicFile[off] -= (uint8_t)1UL;
}
+static void mangle_DecBytePrintable(run_t* run) {
+ size_t off = util_rndGet(0, run->dynamicFileSz - 1);
+ decPrintable(&run->dynamicFile[off]);
+}
+
static void mangle_NegByte(run_t* run) {
size_t off = util_rndGet(0, run->dynamicFileSz - 1);
run->dynamicFile[off] = ~(run->dynamicFile[off]);
}
+static void mangle_NegBytePrintable(run_t* run) {
+ size_t off = util_rndGet(0, run->dynamicFileSz - 1);
+ negPrintable(&run->dynamicFile[off]);
+}
+
static void mangle_CloneByte(run_t* run) {
size_t off1 = util_rndGet(0, run->dynamicFileSz - 1);
size_t off2 = util_rndGet(0, run->dynamicFileSz - 1);
@@ -528,6 +939,16 @@ static void mangle_InsertRnd(run_t* run) {
util_rndBuf(&run->dynamicFile[off], len);
}
+static void mangle_InsertRndPrintable(run_t* run) {
+ size_t off = util_rndGet(0, run->dynamicFileSz - 1);
+ size_t len = util_rndGet(1, run->dynamicFileSz - off);
+
+ mangle_Inflate(run, off, len);
+ mangle_Move(run, off, off + len, run->dynamicFileSz);
+ util_rndBuf(&run->dynamicFile[off], len);
+ util_turnToPrintable(&run->dynamicFile[off], len);
+}
+
static void mangle_ASCIIVal(run_t* run) {
char buf[32];
snprintf(buf, sizeof(buf), "%" PRId64, (int64_t)util_rnd64());
@@ -536,6 +957,58 @@ static void mangle_ASCIIVal(run_t* run) {
mangle_Overwrite(run, (uint8_t*)buf, off, strlen(buf));
}
+static void (*mangleFuncs[])(run_t * run) = {
+ mangle_Resize,
+ mangle_Byte,
+ mangle_Bit,
+ mangle_Bytes,
+ mangle_Magic,
+ mangle_IncByte,
+ mangle_DecByte,
+ mangle_NegByte,
+ mangle_AddSub,
+ mangle_Dictionary,
+ mangle_DictionaryInsert,
+ mangle_MemMove,
+ mangle_MemSet,
+ mangle_Random,
+ mangle_CloneByte,
+ mangle_Expand,
+ mangle_Shrink,
+ mangle_InsertRnd,
+ mangle_ASCIIVal,
+};
+
+void mangle_init(bool only_printable) {
+ if (only_printable) {
+ static void (*const manglePrintableFuncs[])(run_t * run) = {
+ mangle_Resize,
+ mangle_PrintableByte,
+ mangle_BitPrintable,
+ mangle_PrintableBytes,
+ mangle_MagicPrintable,
+ mangle_IncBytePrintable,
+ mangle_DecBytePrintable,
+ mangle_NegBytePrintable,
+ mangle_AddSubPrintable,
+ mangle_DictionaryPrintable,
+ mangle_DictionaryInsertPrintable,
+ mangle_MemMove,
+ mangle_MemSetPrintable,
+ mangle_RandomPrintable,
+ mangle_CloneByte,
+ mangle_Expand,
+ mangle_Shrink,
+ mangle_InsertRndPrintable,
+ mangle_ASCIIVal,
+ };
+ if (ARRAYSIZE(mangleFuncs) != ARRAYSIZE(manglePrintableFuncs)) {
+ LOG_F("mangle function list sizes are different")
+ }
+ memcpy(mangleFuncs, manglePrintableFuncs, sizeof(mangleFuncs));
+ }
+}
+
void mangle_mangleContent(run_t* run) {
if (run->mutationsPerRun == 0U) {
return;
@@ -546,28 +1019,6 @@ void mangle_mangleContent(run_t* run) {
input_setSize(run, 1UL);
}
- static void (*const mangleFuncs[])(run_t * run) = {
- mangle_Resize,
- mangle_Byte,
- mangle_Bit,
- mangle_Bytes,
- mangle_Magic,
- mangle_IncByte,
- mangle_DecByte,
- mangle_NegByte,
- mangle_AddSub,
- mangle_Dictionary,
- mangle_DictionaryInsert,
- mangle_MemMove,
- mangle_MemSet,
- mangle_Random,
- mangle_CloneByte,
- mangle_Expand,
- mangle_Shrink,
- mangle_InsertRnd,
- mangle_ASCIIVal,
- };
-
/* Max number of stacked changes is 6 */
uint64_t changesCnt = util_rndGet(1, run->global->mutate.mutationsPerRun);