]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
stronger tests for zbuff decompression
authorYann Collet <yann.collet.73@gmail.com>
Fri, 27 Nov 2015 13:30:23 +0000 (14:30 +0100)
committerYann Collet <yann.collet.73@gmail.com>
Fri, 27 Nov 2015 13:30:23 +0000 (14:30 +0100)
lib/zstd_static.h
programs/zbufftest.c

index f0656c942eafaf78f63310aa34f350ff4bf3241b..ba16fa87deb0b2479982e8e2aba9a8fd66aea892 100644 (file)
@@ -126,17 +126,17 @@ size_t ZSTD_decompressContinue(ZSTD_DCtx* dctx, void* dst, size_t maxDstSize, co
 
   First operation is to retrieve frame parameters, using ZSTD_getFrameParams().
   This function doesn't consume its input. It needs enough input data to properly decode the frame header.
-  The objective is to retrieve *params.windowlog, to know how much memory is required during decoding.
-  Result : 0 if successfull, it means the ZSTD_parameters structure has been filled.
+  The objective is to retrieve *params.windowlog, to know minimum amount of memory required during decoding.
+  Result : 0 when successful, it means the ZSTD_parameters structure has been filled.
            >0 : means there is not enough data into src. Provides the expected size to successfully decode header.
            errorCode, which can be tested using ZSTD_isError() (For example, if it's not a ZSTD header)
 
   Then it's possible to start decompression.
   Use ZSTD_nextSrcSizeToDecompress() and ZSTD_decompressContinue() alternatively.
   ZSTD_nextSrcSizeToDecompress() tells how much bytes to provide as 'srcSize' to ZSTD_decompressContinue().
-  ZSTD_decompressContinue() will use previous data blocks during decompress.
-  They should be located contiguously prior to current block. Alternatively, a round buffer is possible.
-  Just make sure that the combined of current and accessible past blocks is a minimum of (1 << windowlog).
+  ZSTD_decompressContinue() requires this exact amount of bytes, or just fails.
+  ZSTD_decompressContinue() needs previous data blocks during decompression, up to (1 << windowlog).
+  They should preferably be located contiguously, prior to current block. Alternatively, a round buffer is also possible.
 
   @result of ZSTD_decompressContinue() is the number of bytes regenerated within 'dst'.
   It can be zero, which is not an error; it just means ZSTD_decompressContinue() has decoded some header.
index f1fb5e38747960407a251d06ef259b16a8ed2ee7..590393561de6db05f76882dc4d213da6ab0e0fe5 100644 (file)
@@ -371,7 +371,10 @@ int fuzzerTests(U32 seed, U32 nbTests, unsigned startTest, double compressibilit
             sampleSize  = (size_t)1 << sampleSizeLog;
             sampleSize += FUZ_rand(&lseed) & (sampleSize-1);
             readSize = sampleSize;
-            genSize = dstBufferSize - totalGenSize;
+            sampleSizeLog  = FUZ_rand(&lseed) % maxSampleLog;
+            sampleSize  = (size_t)1 << sampleSizeLog;
+            sampleSize += FUZ_rand(&lseed) & (sampleSize-1);
+            genSize = MIN(sampleSize, dstBufferSize - totalGenSize);
             errorCode = ZBUFF_decompressContinue(zd, dstBuffer+totalGenSize, &genSize, cBuffer+totalCSize, &readSize);
             CHECK (ZBUFF_isError(errorCode), "decompression error : %s", ZBUFF_getErrorName(errorCode));
             totalGenSize += genSize;
@@ -405,13 +408,16 @@ int fuzzerTests(U32 seed, U32 nbTests, unsigned startTest, double compressibilit
         ZBUFF_decompressInit(zd);
         totalCSize = 0;
         totalGenSize = 0;
-        while (totalCSize < cSize)
+        while ( (totalCSize < cSize) && (totalGenSize < dstBufferSize) )
         {
             sampleSizeLog  = FUZ_rand(&lseed) % maxSampleLog;
             sampleSize  = (size_t)1 << sampleSizeLog;
             sampleSize += FUZ_rand(&lseed) & (sampleSize-1);
             readSize = sampleSize;
-            genSize = dstBufferSize - totalGenSize;
+            sampleSizeLog  = FUZ_rand(&lseed) % maxSampleLog;
+            sampleSize  = (size_t)1 << sampleSizeLog;
+            sampleSize += FUZ_rand(&lseed) & (sampleSize-1);
+            genSize = MIN(sampleSize, dstBufferSize - totalGenSize);
             errorCode = ZBUFF_decompressContinue(zd, dstBuffer+totalGenSize, &genSize, cBuffer+totalCSize, &readSize);
             if (ZBUFF_isError(errorCode)) break;   /* error correctly detected */
             totalGenSize += genSize;