#include #include #include #include #include #include #include #include "zlib.h" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t dataLen) { uint32_t crc0 = crc32(0L, NULL, 0); uint32_t crc1 = crc0; uint32_t crc2 = crc0; uint32_t adler0 = adler32(0L, NULL, 0); uint32_t adler1 = adler0; uint32_t adler2 = adler0; /* Checksum with a buffer of size equal to the first byte in the input. */ uint32_t buffSize = data[0]; uint32_t offset = 0; uint32_t op; /* Discard inputs larger than 1Mb. */ static size_t kMaxSize = 1024 * 1024; if (dataLen < 1 || dataLen > kMaxSize) return 0; /* Make sure the buffer has at least a byte. */ if (buffSize == 0) ++buffSize; /* CRC32 */ op = crc32_combine_gen(buffSize); for (offset = 0; offset + buffSize <= dataLen; offset += buffSize) { uint32_t crc3 = crc32_z(crc0, data + offset, buffSize); uint32_t crc4 = crc32_combine_op(crc1, crc3, op); crc1 = crc32_z(crc1, data + offset, buffSize); assert(crc1 == crc4); } crc1 = crc32_z(crc1, data + offset, dataLen % buffSize); crc2 = crc32(crc2, data, (uint32_t) dataLen); assert(crc1 == crc2); assert(crc32_combine(crc1, crc2, dataLen) == crc32_combine(crc1, crc1, dataLen)); /* Fast CRC32 combine. */ op = crc32_combine_gen(dataLen); assert(crc32_combine_op(crc1, crc2, op) == crc32_combine_op(crc2, crc1, op)); assert(crc32_combine(crc1, crc2, dataLen) == crc32_combine_op(crc2, crc1, op)); /* Adler32 */ for (offset = 0; offset + buffSize <= dataLen; offset += buffSize) adler1 = adler32_z(adler1, data + offset, buffSize); adler1 = adler32_z(adler1, data + offset, dataLen % buffSize); adler2 = adler32(adler2, data, (uint32_t) dataLen); assert(adler1 == adler2); assert(adler32_combine(adler1, adler2, dataLen) == adler32_combine(adler1, adler1, dataLen)); /* This function must return 0. */ return 0; }