From 6bcdeac9545062192e14b3fb4b17d75405b17f61 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Thu, 26 Nov 2015 11:43:00 +0100 Subject: [PATCH] fixed asan warning --- lib/zstd_buffered.c | 2 +- lib/zstd_compress.c | 16 ++++++++-------- programs/zbufftest.c | 17 +++++++++++++---- 3 files changed, 22 insertions(+), 13 deletions(-) diff --git a/lib/zstd_buffered.c b/lib/zstd_buffered.c index aa858c7f..37b5bbcd 100644 --- a/lib/zstd_buffered.c +++ b/lib/zstd_buffered.c @@ -213,7 +213,7 @@ static size_t ZBUFF_compressContinue_generic(ZBUFF_CCtx* zbc, /* prepare next block */ zbc->inBuffTarget = zbc->inBuffPos + zbc->blockSize; if (zbc->inBuffTarget > zbc->inBuffSize) - { zbc->inBuffPos = 0; zbc->inBuffTarget = zbc->blockSize; } + { zbc->inBuffPos = 0; zbc->inBuffTarget = zbc->blockSize; } /* note : inBuffSize >= blockSize */ zbc->inToCompress = zbc->inBuffPos; if (cDst == op) { op += cSize; break; } /* no need to flush */ zbc->outBuffContentSize = cSize; diff --git a/lib/zstd_compress.c b/lib/zstd_compress.c index 21865d33..f7a83de8 100644 --- a/lib/zstd_compress.c +++ b/lib/zstd_compress.c @@ -748,7 +748,7 @@ size_t ZSTD_compressBlock_fast_generic(ZSTD_CCtx* zc, /* init */ ZSTD_resetSeqStore(seqStorePtr); - if (ip == base) + if (ip < base+4) { hashTable[ZSTD_hashPtr(base+1, hBits, mls)] = 1; hashTable[ZSTD_hashPtr(base+2, hBits, mls)] = 2; @@ -787,14 +787,14 @@ size_t ZSTD_compressBlock_fast_generic(ZSTD_CCtx* zc, } /* match found */ - ZSTD_storeSeq(seqStorePtr, ip-anchor, anchor, offset, mlCode); + ZSTD_storeSeq(seqStorePtr, ip-anchor, anchor, offset, mlCode); ip += mlCode + MINMATCH; anchor = ip; if (ip <= ilimit) { /* Fill Table */ - hashTable[ZSTD_hashPtr(ip-(mlCode+MINMATCH)+2, hBits, mls)] = (U32)(ip-(mlCode+MINMATCH)+2-base); /* here because ip-(mlCode+MINMATCH)+2 could be > iend-8 without ip <= ilimit check*/ + hashTable[ZSTD_hashPtr(ip-(mlCode+MINMATCH)+2, hBits, mls)] = (U32)(ip-(mlCode+MINMATCH)+2-base); /* here because ip-(mlCode+MINMATCH)+2 could be > iend-8 without ip <= ilimit check*/ hashTable[ZSTD_hashPtr(ip-2, hBits, mls)] = (U32)(ip-2-base); /* check immediate repcode */ while ( (ip <= ilimit) @@ -887,7 +887,7 @@ size_t ZSTD_compressBlock_fast_extDict_generic(ZSTD_CCtx* ctx, const size_t h = ZSTD_hashPtr(ip, hBits, mls); const U32 matchIndex = hashTable[h]; const BYTE* matchBase = matchIndex < dictLimit ? dictBase : base; - const BYTE* match = matchBase + matchIndex; + const BYTE* match = matchBase + matchIndex; const U32 current = (U32)(ip-base); const U32 repIndex = current + 1 - offset_1; const BYTE* repBase = repIndex < dictLimit ? dictBase : base; @@ -927,7 +927,7 @@ size_t ZSTD_compressBlock_fast_extDict_generic(ZSTD_CCtx* ctx, if (ip <= ilimit) { - /* Fill Table */ + /* Fill Table */ hashTable[ZSTD_hashPtr(base+current+2, hBits, mls)] = current+2; hashTable[ZSTD_hashPtr(ip-2, hBits, mls)] = (U32)(ip-2-base); /* check immediate repcode */ @@ -990,7 +990,7 @@ size_t ZSTD_compressBlock_fast_extDict(ZSTD_CCtx* ctx, * Binary Tree search ***************************************/ /** ZSTD_insertBt1 : add one or multiple positions to tree -* @ip : assumed <= iend-8 +* @ip : assumed <= iend-8 * @return : nb of positions added */ static U32 ZSTD_insertBt1(ZSTD_CCtx* zc, const BYTE* const ip, const U32 mls, const BYTE* const iend, U32 nbCompares) { @@ -1173,7 +1173,7 @@ FORCE_INLINE size_t ZSTD_BtFindBestMatch_selectMLS ( /** ZSTD_insertBt1_extDict : add one or multiple positions to tree -* @ip : assumed <= iend-8 +* @ip : assumed <= iend-8 * @return : nb of positions added */ static U32 ZSTD_insertBt1_extDict(ZSTD_CCtx* zc, const BYTE* const ip, const U32 mls, const BYTE* const iend, U32 nbCompares) { @@ -1389,7 +1389,7 @@ FORCE_INLINE size_t ZSTD_BtFindBestMatch_selectMLS_extDict ( #define NEXT_IN_CHAIN(d, mask) chainTable[(d) & mask] -/* Update chains up to ip (excluded) +/* Update chains up to ip (excluded) Assumption : always within prefix (ie. not within extDict) */ static U32 ZSTD_insertAndFindFirstIndex (ZSTD_CCtx* zc, const BYTE* ip, U32 mls) { diff --git a/programs/zbufftest.c b/programs/zbufftest.c index b6fd7530..c6739083 100644 --- a/programs/zbufftest.c +++ b/programs/zbufftest.c @@ -229,7 +229,7 @@ static size_t findDiff(const void* buf1, const void* buf2, size_t max) # define CHECK(cond, ...) if (cond) { DISPLAY("Error => "); DISPLAY(__VA_ARGS__); \ DISPLAY(" (seed %u, test nb %u) \n", seed, testNb); goto _output_error; } -static const U32 maxSrcLog = 23; +static const U32 maxSrcLog = 24; static const U32 maxSampleLog = 19; int fuzzerTests(U32 seed, U32 nbTests, unsigned startTest, double compressibility) @@ -313,8 +313,8 @@ int fuzzerTests(U32 seed, U32 nbTests, unsigned startTest, double compressibilit /* Multi - segments compression test */ XXH64_reset(&crc64, 0); nbChunks = (FUZ_rand(&lseed) & 127) + 2; - sampleSizeLog = FUZ_rand(&lseed) % maxSrcLog; - maxTestSize = (size_t)1 << sampleSizeLog; + maxTestSize = FUZ_rand(&lseed) % maxSrcLog; + maxTestSize = (size_t)1 << maxTestSize; maxTestSize += FUZ_rand(&lseed) & (maxTestSize-1); ZBUFF_compressInit(zc, (FUZ_rand(&lseed) % (20 - (sampleSizeLog/3))) + 1); totalTestSize = 0; @@ -334,9 +334,18 @@ int fuzzerTests(U32 seed, U32 nbTests, unsigned startTest, double compressibilit errorCode = ZBUFF_compressContinue(zc, cBuffer+cSize, &genSize, srcBuffer+sampleStart, &readSize); CHECK (ZBUFF_isError(errorCode), "compression error : %s", ZBUFF_getErrorName(errorCode)); CHECK (readSize != sampleSize, "compression test condition not respected : input should be fully consumed") - cSize += genSize; totalTestSize += sampleSize; + + if ((FUZ_rand(&lseed) & 15) == 0) + { + /* add a few random flushes operations, to mess around */ + genSize = cBufferSize - cSize; + errorCode = ZBUFF_compressFlush(zc, cBuffer+cSize, &genSize); + CHECK (ZBUFF_isError(errorCode), "flush error : %s", ZBUFF_getErrorName(errorCode)); + cSize += genSize; + } + if (totalTestSize > maxTestSize) break; } genSize = cBufferSize - cSize;