]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
fixed leak 78/head
authorYann Collet <yann.collet.73@gmail.com>
Thu, 26 Nov 2015 11:43:28 +0000 (12:43 +0100)
committerYann Collet <yann.collet.73@gmail.com>
Thu, 26 Nov 2015 11:43:28 +0000 (12:43 +0100)
lib/zstd_buffered.c
lib/zstd_decompress.c
programs/Makefile
programs/zbufftest.c

index 37b5bbcd3c305369c3e2867bd081655674caebd3..bbd513d2b13f4dbedfd56e9f7247c2ee76183f36 100644 (file)
@@ -345,6 +345,8 @@ size_t ZBUFF_freeDCtx(ZBUFF_DCtx* zbc)
 {
     if (zbc==NULL) return 0;   /* support free on null */
     ZSTD_freeDCtx(zbc->zc);
+    free(zbc->inBuff);
+    free(zbc->outBuff);
     free(zbc);
     return 0;
 }
index 34d5d86aec18b07790e0c2d9dffcf6a7f23c562b..122ff2b06a41cf9b233aa295be15b082bc79a2e2 100644 (file)
@@ -186,19 +186,6 @@ static size_t ZSTD_decodeFrameHeader_Part1(ZSTD_DCtx* zc, const void* src, size_
     return zc->headerSize;
 }
 
-/** ZSTD_decodeFrameHeader_Part2
-*   decode the full Frame Header
-*   srcSize must be the size provided by ZSTD_decodeFrameHeader_Part1
-*   @return : 0, or an error code, which can be tested using ZSTD_isError() */
-static size_t ZSTD_decodeFrameHeader_Part2(ZSTD_DCtx* zc, const void* src, size_t srcSize)
-{
-    const BYTE* ip = (const BYTE*)src;
-    if (srcSize != zc->headerSize) return ERROR(srcSize_wrong);
-    memset(&(zc->params), 0, sizeof(zc->params));
-    zc->params.windowLog = ip[4] + ZSTD_WINDOWLOG_ABSOLUTEMIN;
-    return 0;
-}
-
 
 size_t ZSTD_getFrameParams(ZSTD_parameters* params, const void* src, size_t srcSize)
 {
@@ -207,10 +194,20 @@ size_t ZSTD_getFrameParams(ZSTD_parameters* params, const void* src, size_t srcS
     magicNumber = MEM_readLE32(src);
     if (magicNumber != ZSTD_MAGICNUMBER) return ERROR(prefix_unknown);
     memset(params, 0, sizeof(*params));
-    params->windowLog = ((const BYTE*)src)[4] + ZSTD_WINDOWLOG_ABSOLUTEMIN;
+    params->windowLog = (((const BYTE*)src)[4] & 15) + ZSTD_WINDOWLOG_ABSOLUTEMIN;
     return 0;
 }
 
+/** ZSTD_decodeFrameHeader_Part2
+*   decode the full Frame Header
+*   srcSize must be the size provided by ZSTD_decodeFrameHeader_Part1
+*   @return : 0, or an error code, which can be tested using ZSTD_isError() */
+static size_t ZSTD_decodeFrameHeader_Part2(ZSTD_DCtx* zc, const void* src, size_t srcSize)
+{
+    if (srcSize != zc->headerSize) return ERROR(srcSize_wrong);
+    return ZSTD_getFrameParams(&(zc->params), src, srcSize);
+}
+
 
 size_t ZSTD_getcBlockSize(const void* src, size_t srcSize, blockProperties_t* bpPtr)
 {
index a8ca605cd428f9b3341fb5abed5c400a5e17c057..2fd7e8dc375272bc6277a9f30c6f83c469b7dc1e 100644 (file)
@@ -247,17 +247,19 @@ test-zbuff: zbufftest
 test-zbuff32: zbufftest32
        ./zbufftest32 $(ZBUFFTEST)
 
-valgrindTest: zstd datagen fuzzer fullbench
+valgrindTest: zstd datagen fuzzer fullbench zbufftest
        @echo "\n ---- valgrind tests : memory analyzer ----"
        valgrind --leak-check=yes --error-exitcode=1 ./datagen -g50M > $(VOID)
        ./datagen -g16KB > tmp
        valgrind --leak-check=yes --error-exitcode=1 ./zstd -vf tmp $(VOID)
        ./datagen -g2930KB > tmp
-       valgrind --leak-check=yes --error-exitcode=1 ./zstd -5 -vf tmp $(VOID)
+       valgrind --leak-check=yes --error-exitcode=1 ./zstd -5 -vf tmp tmp2
+       valgrind --leak-check=yes --error-exitcode=1 ./zstd -vdf tmp2 $(VOID)
        ./datagen -g64MB > tmp
        valgrind --leak-check=yes --error-exitcode=1 ./zstd -vf tmp $(VOID)
        @rm tmp
        valgrind --leak-check=yes --error-exitcode=1 ./fuzzer -i1000 -t1
        valgrind --leak-check=yes --error-exitcode=1 ./fullbench -i1
+       valgrind --leak-check=yes --error-exitcode=1 ./zbufftest -T1mn
 
 endif
index c673908395cd12395747e552a1fcab8e669bf375..81285fa29c851ce0e68ae235d368285f0e9fec7d 100644 (file)
@@ -289,7 +289,8 @@ int fuzzerTests(U32 seed, U32 nbTests, unsigned startTest, double compressibilit
         U64 crcOrig, crcDest;
 
         /* init */
-        DISPLAYUPDATE(2, "\r%6u/%6u   ", testNb, nbTests);
+        DISPLAYUPDATE(2, "\r%6u", testNb);
+        if (nbTests >= testNb) DISPLAYUPDATE(2, "/%6u   ", nbTests);
         FUZ_rand(&coreSeed);
         lseed = coreSeed ^ prime1;
         buffNb = FUZ_rand(&lseed) & 127;
@@ -313,8 +314,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;
-        maxTestSize = FUZ_rand(&lseed) % maxSrcLog;
-        maxTestSize = (size_t)1 << maxTestSize;
+        sampleSizeLog = FUZ_rand(&lseed) % maxSrcLog;
+        maxTestSize = (size_t)1 << sampleSizeLog;
         maxTestSize += FUZ_rand(&lseed) & (maxTestSize-1);
         ZBUFF_compressInit(zc, (FUZ_rand(&lseed) % (20 - (sampleSizeLog/3))) + 1);
         totalTestSize = 0;
@@ -379,7 +380,36 @@ int fuzzerTests(U32 seed, U32 nbTests, unsigned startTest, double compressibilit
         CHECK (crcDest!=crcOrig, "decompressed data corrupted");
 
         /* noisy/erroneous src decompression test */
-        /* TBD later */
+        /* add some noise */
+        nbChunks = (FUZ_rand(&lseed) & 7) + 2;
+        for (n=0; n<nbChunks; n++)
+        {
+            size_t cStart;
+
+            sampleSizeLog = FUZ_rand(&lseed) % maxSampleLog;
+            sampleSize = (size_t)1 << sampleSizeLog;
+            sampleSize += FUZ_rand(&lseed) & (sampleSize-1);
+            if (sampleSize > cSize/3) sampleSize = cSize/3;
+            sampleStart = FUZ_rand(&lseed) % (srcBufferSize - sampleSize);
+            cStart = FUZ_rand(&lseed) % (cSize - sampleSize);
+
+            memcpy(cBuffer+cStart, srcBuffer+sampleStart, sampleSize);
+        }
+
+        /* try decompression on noisy data */
+        ZBUFF_decompressInit(zd);
+        totalCSize = 0;
+        totalGenSize = 0;
+        while (totalCSize < cSize)
+        {
+            sampleSizeLog  = FUZ_rand(&lseed) % maxSampleLog;
+            sampleSize  = (size_t)1 << sampleSizeLog;
+            sampleSize += FUZ_rand(&lseed) & (sampleSize-1);
+            readSize = sampleSize;
+            genSize = dstBufferSize - totalGenSize;
+            errorCode = ZBUFF_decompressContinue(zd, dstBuffer+totalGenSize, &genSize, cBuffer+totalCSize, &readSize);
+            if (ZBUFF_isError(errorCode)) break;   /* error correctly detected */
+        }
     }
     DISPLAY("\r%u fuzzer tests completed   \n", testNb);