]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
fixed minor decompression bug in buffered mode
authorYann Collet <yann.collet.73@gmail.com>
Wed, 25 Nov 2015 20:09:17 +0000 (21:09 +0100)
committerYann Collet <yann.collet.73@gmail.com>
Wed, 25 Nov 2015 20:09:17 +0000 (21:09 +0100)
lib/zstd_buffered.c
lib/zstd_decompress.c

index 693943da10bc18ddc8af8795b3ce883dc8be3e0d..242ddf24d772b59f40cf7e03003e1d283d89ef2a 100644 (file)
@@ -439,11 +439,16 @@ size_t ZBUFF_decompressContinue(ZBUFF_DCtx* zbc, void* dst, size_t* maxDstSizePt
                         if (zbc->outBuff == NULL) return ERROR(memory_allocation);
                     }
                 }
-                memcpy(zbc->inBuff, zbc->headerBuffer, zbc->hPos);
-                zbc->inPos = zbc->hPos;
-                zbc->hPos = 0;
-                zbc->stage = ZBUFFds_load;
-                break;   /* useless : stage follows */
+                if (zbc->hPos)
+                {
+                    /* some data already loaded into headerBuffer : transfer into inBuff */
+                    memcpy(zbc->inBuff, zbc->headerBuffer, zbc->hPos);
+                    zbc->inPos = zbc->hPos;
+                    zbc->hPos = 0;
+                    zbc->stage = ZBUFFds_load;
+                    break;
+                }
+                zbc->stage = ZBUFFds_read;
 
         case ZBUFFds_read:
             {
index 54429628d6b957cdc72a5e811d19377a8e35bc17..34d5d86aec18b07790e0c2d9dffcf6a7f23c562b 100644 (file)
@@ -68,7 +68,6 @@
 #  include "zstd_legacy.h"
 #endif
 
-
 /* *******************************************************
 *  Compiler specifics
 *********************************************************/
@@ -120,7 +119,7 @@ const char* ZSTD_getErrorName(size_t code) { return ERR_getErrorName(code); }
 /* *************************************************************
 *   Context management
 ***************************************************************/
-typedef enum { ZSTDds_getFrameHeaderSize, ZSTDds_decodeFrameHeader, 
+typedef enum { ZSTDds_getFrameHeaderSize, ZSTDds_decodeFrameHeader,
                ZSTDds_decodeBlockHeader, ZSTDds_decompressBlock } ZSTD_dStage;
 
 struct ZSTD_DCtx_s
@@ -449,7 +448,7 @@ static void ZSTD_decodeSequence(seq_t* seq, seqState_t* seqState)
 
     /* Literal length */
     litLength = FSE_decodeSymbol(&(seqState->stateLL), &(seqState->DStream));
-    prevOffset = litLength ? seq->offset : seqState->prevOffset;    
+    prevOffset = litLength ? seq->offset : seqState->prevOffset;
     if (litLength == MaxLL)
     {
         U32 add = *dumps++;
@@ -801,7 +800,7 @@ size_t ZSTD_decompressContinue(ZSTD_DCtx* ctx, void* dst, size_t maxDstSize, con
             /* get frame header size */
             if (srcSize != ZSTD_frameHeaderSize_min) return ERROR(srcSize_wrong);   /* impossible */
             ctx->headerSize = ZSTD_decodeFrameHeader_Part1(ctx, src, ZSTD_frameHeaderSize_min);
-            if (ZSTD_isError(ctx->headerSize)) return ctx->headerSize;            
+            if (ZSTD_isError(ctx->headerSize)) return ctx->headerSize;
             memcpy(ctx->headerBuffer, src, ZSTD_frameHeaderSize_min);
             if (ctx->headerSize > ZSTD_frameHeaderSize_min)
             {