xref: /aosp_15_r20/external/lz4/ossfuzz/lz4_helpers.c (revision 27162e4e17433d5aa7cb38e7b6a433a09405fc7f)
1*27162e4eSAndroid Build Coastguard Worker #include "fuzz_helpers.h"
2*27162e4eSAndroid Build Coastguard Worker #include "lz4_helpers.h"
3*27162e4eSAndroid Build Coastguard Worker #include "lz4hc.h"
4*27162e4eSAndroid Build Coastguard Worker 
FUZZ_randomFrameInfo(uint32_t * seed)5*27162e4eSAndroid Build Coastguard Worker LZ4F_frameInfo_t FUZZ_randomFrameInfo(uint32_t* seed)
6*27162e4eSAndroid Build Coastguard Worker {
7*27162e4eSAndroid Build Coastguard Worker     LZ4F_frameInfo_t info = LZ4F_INIT_FRAMEINFO;
8*27162e4eSAndroid Build Coastguard Worker     info.blockSizeID = FUZZ_rand32(seed, LZ4F_max64KB - 1, LZ4F_max4MB);
9*27162e4eSAndroid Build Coastguard Worker     if (info.blockSizeID < LZ4F_max64KB) {
10*27162e4eSAndroid Build Coastguard Worker         info.blockSizeID = LZ4F_default;
11*27162e4eSAndroid Build Coastguard Worker     }
12*27162e4eSAndroid Build Coastguard Worker     info.blockMode = FUZZ_rand32(seed, LZ4F_blockLinked, LZ4F_blockIndependent);
13*27162e4eSAndroid Build Coastguard Worker     info.contentChecksumFlag = FUZZ_rand32(seed, LZ4F_noContentChecksum,
14*27162e4eSAndroid Build Coastguard Worker                                            LZ4F_contentChecksumEnabled);
15*27162e4eSAndroid Build Coastguard Worker     info.blockChecksumFlag = FUZZ_rand32(seed, LZ4F_noBlockChecksum,
16*27162e4eSAndroid Build Coastguard Worker                                          LZ4F_blockChecksumEnabled);
17*27162e4eSAndroid Build Coastguard Worker     return info;
18*27162e4eSAndroid Build Coastguard Worker }
19*27162e4eSAndroid Build Coastguard Worker 
FUZZ_randomPreferences(uint32_t * seed)20*27162e4eSAndroid Build Coastguard Worker LZ4F_preferences_t FUZZ_randomPreferences(uint32_t* seed)
21*27162e4eSAndroid Build Coastguard Worker {
22*27162e4eSAndroid Build Coastguard Worker     LZ4F_preferences_t prefs = LZ4F_INIT_PREFERENCES;
23*27162e4eSAndroid Build Coastguard Worker     prefs.frameInfo = FUZZ_randomFrameInfo(seed);
24*27162e4eSAndroid Build Coastguard Worker     prefs.compressionLevel = FUZZ_rand32(seed, 0, LZ4HC_CLEVEL_MAX + 3) - 3;
25*27162e4eSAndroid Build Coastguard Worker     prefs.autoFlush = FUZZ_rand32(seed, 0, 1);
26*27162e4eSAndroid Build Coastguard Worker     prefs.favorDecSpeed = FUZZ_rand32(seed, 0, 1);
27*27162e4eSAndroid Build Coastguard Worker     return prefs;
28*27162e4eSAndroid Build Coastguard Worker }
29*27162e4eSAndroid Build Coastguard Worker 
FUZZ_decompressFrame(void * dst,const size_t dstCapacity,const void * src,const size_t srcSize)30*27162e4eSAndroid Build Coastguard Worker size_t FUZZ_decompressFrame(void* dst, const size_t dstCapacity,
31*27162e4eSAndroid Build Coastguard Worker                             const void* src, const size_t srcSize)
32*27162e4eSAndroid Build Coastguard Worker {
33*27162e4eSAndroid Build Coastguard Worker     LZ4F_decompressOptions_t opts;
34*27162e4eSAndroid Build Coastguard Worker     memset(&opts, 0, sizeof(opts));
35*27162e4eSAndroid Build Coastguard Worker     opts.stableDst = 1;
36*27162e4eSAndroid Build Coastguard Worker     LZ4F_dctx* dctx;
37*27162e4eSAndroid Build Coastguard Worker     LZ4F_createDecompressionContext(&dctx, LZ4F_VERSION);
38*27162e4eSAndroid Build Coastguard Worker     FUZZ_ASSERT(dctx);
39*27162e4eSAndroid Build Coastguard Worker 
40*27162e4eSAndroid Build Coastguard Worker     size_t dstSize = dstCapacity;
41*27162e4eSAndroid Build Coastguard Worker     size_t srcConsumed = srcSize;
42*27162e4eSAndroid Build Coastguard Worker     size_t const rc =
43*27162e4eSAndroid Build Coastguard Worker             LZ4F_decompress(dctx, dst, &dstSize, src, &srcConsumed, &opts);
44*27162e4eSAndroid Build Coastguard Worker     FUZZ_ASSERT(!LZ4F_isError(rc));
45*27162e4eSAndroid Build Coastguard Worker     FUZZ_ASSERT(rc == 0);
46*27162e4eSAndroid Build Coastguard Worker     FUZZ_ASSERT(srcConsumed == srcSize);
47*27162e4eSAndroid Build Coastguard Worker 
48*27162e4eSAndroid Build Coastguard Worker     LZ4F_freeDecompressionContext(dctx);
49*27162e4eSAndroid Build Coastguard Worker 
50*27162e4eSAndroid Build Coastguard Worker     return dstSize;
51*27162e4eSAndroid Build Coastguard Worker }
52