11#include < cifuzz/cifuzz.h>
2+ #include < cstdlib>
23#include < fuzzer/FuzzedDataProvider.h>
34#include < iostream>
5+ #include < zlib.h>
46
57#include " explore_me.h"
68
79#ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
810#include < gtest/gtest.h>
911
10- TEST (ExploreStructuredInputChecks, DeveloperTest) {
11- InputStruct inputStruct = (InputStrut) {.a =0 , .b = 10 , .c =" Developer" };
12- EXPECT_NO_THROW (ExploreStructuredInputChecks (inputStruct));
12+ TEST (ExploreCompressedInputChecks, HI) {
13+ uint8_t uncompressed[3 ];
14+ size_t uncompressedLen = sizeof (uncompressed);
15+ uncompressed[0 ] = ' H' ;
16+ uncompressed[1 ] = ' I' ;
17+ uncompressed[2 ] = ' \0 ' ;
18+ uint8_t compressed[3 ];
19+ size_t compressedLen = sizeof (compressed);
20+ if (Z_OK != compress (compressed, &compressedLen, uncompressed, uncompressedLen)) {
21+ abort ();
22+ }
23+ EXPECT_NO_THROW (ExploreCompressedInputChecks (compressed, compressedLen));
1324}
1425
15- TEST (ExploreStructuredInputChecks, MaintainerTest) {
16- InputStruct inputStruct = (InputStruct) {.a =20 , .b = -10 , .c =" Maintainer" };
17- EXPECT_NO_THROW (ExploreStructuredInputChecks (inputStruct));
26+ TEST (ExploreCompressedInputChecks, HO) {
27+ uint8_t uncompressed[3 ];
28+ size_t uncompressedLen = sizeof (uncompressed);
29+ uncompressed[0 ] = ' H' ;
30+ uncompressed[1 ] = ' O' ;
31+ uncompressed[2 ] = ' \0 ' ;
32+ uint8_t compressed[3 ];
33+ size_t compressedLen = sizeof (compressed);
34+ if (Z_OK != compress (compressed, &compressedLen, uncompressed, uncompressedLen)) {
35+ abort ();
36+ }
37+ EXPECT_NO_THROW (ExploreCompressedInputChecks (compressed, compressedLen));
1838}
1939
2040#endif
2141
2242FUZZ_TEST (const uint8_t *data, size_t size) {
23- FuzzedDataProvider fdp (data, size);
24- long a = fdp.ConsumeIntegral <long >();
25- long b = fdp.ConsumeIntegral <long >();
26- std::string c = fdp.ConsumeRemainingBytesAsString ();
27-
28- InputStruct inputStruct = (InputStruct) {
29- .a = a,
30- .b = b,
31- .c = c,
32- };
33- ExploreStructuredInputChecks (inputStruct);
43+ ExploreCompressedInputChecks (data, size);
3444}
3545
3646extern " C" size_t LLVMFuzzerMutate (uint8_t *Data, size_t Size, size_t MaxSize);
@@ -39,15 +49,36 @@ extern "C" size_t LLVMFuzzerMutate(uint8_t *Data, size_t Size, size_t MaxSize);
3949Custom mutator example. In this case we only print out once that we are in a custom mutator and then use te regular one,
4050but you can also change the Data how you like. Make sure to return the new length.
4151*/
42- extern " C" size_t LLVMFuzzerCustomMutator (uint8_t *Data , size_t Size ,
43- size_t MaxSize , unsigned int Seed ) {
52+ extern " C" size_t LLVMFuzzerCustomMutator (uint8_t *data , size_t size ,
53+ size_t maxSize , unsigned int seed ) {
4454
45- static bool Printed ;
46- if (!Printed ) {
55+ static bool printed ;
56+ if (!printed ) {
4757 std::cerr << " In custom mutator.\n " ;
48- Printed = true ;
58+ printed = true ;
4959 }
5060
61+ uint8_t uncompressed[100 ];
62+ size_t uncompressedLen = sizeof (uncompressed);
63+ size_t compressedLen = maxSize;
64+ if (Z_OK != uncompress (uncompressed, &uncompressedLen, data, size)) {
65+ // The data didn't uncompress.
66+ // So, it's either a broken input and we want to ignore it,
67+ // or we've started fuzzing from an empty corpus and we need to supply
68+ // out first properly compressed input.
69+ uint8_t dummy[] = {' H' , ' i' };
70+ if (Z_OK != compress (data, &compressedLen, dummy, sizeof (dummy))) {
71+ return 0 ;
72+ } else {
73+ // fprintf(stderr, "Dummy: max %zd res %zd\n", MaxSize, CompressedLen);
74+ return compressedLen;
75+ }
76+ }
77+
78+ uncompressedLen = LLVMFuzzerMutate (uncompressed, uncompressedLen, sizeof (uncompressed));
79+ if (Z_OK != compress (data, &compressedLen, uncompressed, uncompressedLen)) {
80+ return 0 ;
81+ }
5182 // make sure to return the new Size (that needs to be <= MaxSize) as return value!
52- return LLVMFuzzerMutate (Data, Size, MaxSize) ;
83+ return compressedLen ;
5384}
0 commit comments