diff options
author | plusun <tomsun.0.7@gmail.com> | 2018-07-31 13:55:50 +0000 |
---|---|---|
committer | plusun <tomsun.0.7@gmail.com> | 2018-07-31 13:55:50 +0000 |
commit | dc64d05a49df87432bd7cb30739904cc35422e3f (patch) | |
tree | d53fc22fe69efccc8927d7436b1d8716dfed0bec /mangle.c | |
parent | 99ef77ef624387a00a9f23d429aa268f29f338c0 (diff) | |
download | honggfuzz-dc64d05a49df87432bd7cb30739904cc35422e3f.tar.gz |
Add mangle functions for printable inputs
Diffstat (limited to 'mangle.c')
-rw-r--r-- | mangle.c | 495 |
1 files changed, 473 insertions, 22 deletions
@@ -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); |