diff --git a/lib/zstd_decompress.c b/lib/zstd_decompress.c index fe4ae972d..d1e01c3e5 100644 --- a/lib/zstd_decompress.c +++ b/lib/zstd_decompress.c @@ -538,13 +538,13 @@ FORCE_INLINE size_t ZSTD_execSequence(BYTE* op, match = dictEnd - (base-match); if (match + sequence.matchLength <= dictEnd) { - memcpy(oLitEnd, match, sequence.matchLength); + memmove(oLitEnd, match, sequence.matchLength); return sequenceLength; } /* span extDict & currentPrefixSegment */ { size_t length1 = dictEnd - match; - memcpy(oLitEnd, match, length1); + memmove(oLitEnd, match, length1); op = oLitEnd + length1; sequence.matchLength -= length1; match = base; diff --git a/programs/fuzzer.c b/programs/fuzzer.c index 152d1c149..f3fda456a 100644 --- a/programs/fuzzer.c +++ b/programs/fuzzer.c @@ -309,6 +309,8 @@ int fuzzerTests(U32 seed, U32 nbTests, unsigned startTest, double compressibilit U64 crcOrig, crcDest; int cLevel; BYTE* sampleBuffer; + const BYTE* dict; + size_t dictSize; /* init */ if (nbTests >= testNb) @@ -451,8 +453,18 @@ int fuzzerTests(U32 seed, U32 nbTests, unsigned startTest, double compressibilit maxTestSize = (size_t)1 << sampleSizeLog; maxTestSize += FUZ_rand(&lseed) & (maxTestSize-1); if (maxTestSize >= dstBufferSize) maxTestSize = dstBufferSize-1; - totalTestSize = 0; + + sampleSizeLog = FUZ_rand(&lseed) % maxSampleLog; + sampleSize = (size_t)1 << sampleSizeLog; + sampleSize += FUZ_rand(&lseed) & (sampleSize-1); + sampleStart = FUZ_rand(&lseed) % (srcBufferSize - sampleSize); + dict = srcBuffer + sampleStart; + dictSize = sampleSize; + cSize = ZSTD_compressBegin(ctx, cBuffer, cBufferSize, (FUZ_rand(&lseed) % (20 - (sampleSizeLog/3))) + 1); + errorCode = ZSTD_compress_insertDictionary(ctx, dict, dictSize); + CHECK (ZSTD_isError(errorCode), "dictionary insertion error : %s", ZSTD_getErrorName(errorCode)); + totalTestSize = 0; for (n=0; n