From: Yann Collet Date: Thu, 12 Nov 2015 15:19:30 +0000 (+0100) Subject: fixed streaming decoder X-Git-Tag: zstd-0.4.0^2~23^2~49 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0f366c61eda83db0346666a41befb1cc75c37370;p=thirdparty%2Fzstd.git fixed streaming decoder --- diff --git a/lib/zstd_decompress.c b/lib/zstd_decompress.c index f1019588d..9eab86b5e 100644 --- a/lib/zstd_decompress.c +++ b/lib/zstd_decompress.c @@ -187,7 +187,7 @@ size_t ZSTD_getcBlockSize(const void* src, size_t srcSize, blockProperties_t* bp return cSize; } -static size_t ZSTD_copyUncompressedBlock(void* dst, size_t maxDstSize, const void* src, size_t srcSize) +static size_t ZSTD_copyRawBlock(void* dst, size_t maxDstSize, const void* src, size_t srcSize) { if (srcSize > maxDstSize) return ERROR(dstSize_tooSmall); memcpy(dst, src, srcSize); @@ -486,10 +486,10 @@ FORCE_INLINE size_t ZSTD_execSequence(BYTE* op, const BYTE* match = op - sequence.offset; /* check */ - //if (match > op) return ERROR(corruption_detected); /* address space overflow test (is clang optimizer removing this test ?) */ + //if (match > op) return ERROR(corruption_detected); /* address space overflow test (is clang optimizer wrongly removing this test ?) */ if (sequence.offset > (size_t)op) return ERROR(corruption_detected); /* address space overflow test (this test seems kept by clang optimizer) */ if (match < vBase) return ERROR(corruption_detected); - + if (match < base) match = dictEnd - (base-match); /* only works if match + matchLength <= dictEnd */ /* close range match, overlap */ @@ -663,7 +663,7 @@ size_t ZSTD_decompressDCtx(ZSTD_DCtx* ctx, void* dst, size_t maxDstSize, const v decodedSize = ZSTD_decompressBlock(ctx, op, oend-op, ip, cBlockSize); break; case bt_raw : - decodedSize = ZSTD_copyUncompressedBlock(op, oend-op, ip, cBlockSize); + decodedSize = ZSTD_copyRawBlock(op, oend-op, ip, cBlockSize); break; case bt_rle : return ERROR(GENERIC); /* not yet supported */ @@ -744,6 +744,7 @@ size_t ZSTD_decompressContinue(ZSTD_DCtx* ctx, void* dst, size_t maxDstSize, con ctx->phase = 2; } + ctx->previousDstEnd = dst; return 0; } @@ -756,7 +757,7 @@ size_t ZSTD_decompressContinue(ZSTD_DCtx* ctx, void* dst, size_t maxDstSize, con rSize = ZSTD_decompressBlock(ctx, dst, maxDstSize, src, srcSize); break; case bt_raw : - rSize = ZSTD_copyUncompressedBlock(dst, maxDstSize, src, srcSize); + rSize = ZSTD_copyRawBlock(dst, maxDstSize, src, srcSize); break; case bt_rle : return ERROR(GENERIC); /* not yet handled */ diff --git a/programs/fullbench.c b/programs/fullbench.c index edf6f4b6f..5471134dd 100644 --- a/programs/fullbench.c +++ b/programs/fullbench.c @@ -360,8 +360,8 @@ size_t benchMem(void* src, size_t srcSize, U32 benchNb) free(buff2); return 0; } - iend = ip + 3 + blockSize; // Get end of first block - ip += 3; // jump first block header + iend = ip + 3 + blockSize; /* End of first block */ + ip += 3; /* skip block header */ ip += ZSTD_decodeLiteralsBlock(g_dctxPtr, ip, iend-ip); // jump literal sub block and its header g_cSize = iend-ip; memcpy(buff2, ip, g_cSize); // copy rest of block (starting with SeqHeader)