From 5f53b0335ef1b1925fb10e94efea938c63f44063 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Sun, 28 Aug 2016 10:00:49 -0700 Subject: [PATCH] fixed continuation context --- lib/decompress/zstd_decompress.c | 4 ++-- lib/legacy/zstd_v07.c | 3 ++- programs/fileio.c | 20 +++++++++++++++++++- programs/zstdcli.c | 1 + 4 files changed, 24 insertions(+), 4 deletions(-) diff --git a/lib/decompress/zstd_decompress.c b/lib/decompress/zstd_decompress.c index 97adec20..e540e3fe 100644 --- a/lib/decompress/zstd_decompress.c +++ b/lib/decompress/zstd_decompress.c @@ -1399,7 +1399,7 @@ size_t ZSTD_initDStream_usingDict(ZSTD_DStream* zds, const void* dict, size_t di { zds->stage = zdss_loadHeader; zds->lhSize = zds->inPos = zds->outStart = zds->outEnd = 0; - if ((dict != zds->dictSource) || (dictSize != zds->dictSize)) { /* new dictionary */ + if ((dict != zds->dictSource) | (dictSize != zds->dictSize)) { /* new dictionary */ if (dictSize > zds->dictSize) { if (zds->dictContent) zds->customMem.customFree(zds->customMem.opaque, zds->dictContent); zds->dictContent = zds->customMem.customAlloc(zds->customMem.opaque, dictSize); @@ -1457,7 +1457,7 @@ size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inB #if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT>=1) if (zds->legacyVersion) - return ZSTD_decompressLegacyStream(&zds->legacyContext, zds->legacyVersion, output, input); + return ZSTD_decompressLegacyStream(zds->legacyContext, zds->legacyVersion, output, input); #endif while (someMoreWork) { diff --git a/lib/legacy/zstd_v07.c b/lib/legacy/zstd_v07.c index c4ccd24c..16c09af4 100644 --- a/lib/legacy/zstd_v07.c +++ b/lib/legacy/zstd_v07.c @@ -4643,9 +4643,9 @@ size_t ZBUFFv07_decompressContinue(ZBUFFv07_DCtx* zbd, case ZBUFFds_loadHeader : { size_t const hSize = ZSTDv07_getFrameParams(&(zbd->fParams), zbd->headerBuffer, zbd->lhSize); + if (ZSTDv07_isError(hSize)) return hSize; if (hSize != 0) { size_t const toLoad = hSize - zbd->lhSize; /* if hSize!=0, hSize > zbd->lhSize */ - if (ZSTDv07_isError(hSize)) return hSize; if (toLoad > (size_t)(iend-ip)) { /* not enough input to load full header */ memcpy(zbd->headerBuffer + zbd->lhSize, ip, iend-ip); zbd->lhSize += iend-ip; @@ -4685,6 +4685,7 @@ size_t ZBUFFv07_decompressContinue(ZBUFFv07_DCtx* zbd, if (zbd->outBuff == NULL) return ERROR(memory_allocation); } } } zbd->stage = ZBUFFds_read; + /* pass-through */ case ZBUFFds_read: { size_t const neededInSize = ZSTDv07_nextSrcSizeToDecompress(zbd->zd); diff --git a/programs/fileio.c b/programs/fileio.c index 93ecaec3..00cb31ba 100644 --- a/programs/fileio.c +++ b/programs/fileio.c @@ -28,6 +28,16 @@ */ +/* ************************************* + * Tuning options + ***************************************/ +#ifndef ZSTD_LEGACY_SUPPORT +/* LEGACY_SUPPORT : + * decompressor can decode older formats (starting from Zstd 0.1+) */ +# define ZSTD_LEGACY_SUPPORT 1 +#endif + + /* ************************************* * Compiler Options ***************************************/ @@ -54,6 +64,10 @@ #define ZSTD_STATIC_LINKING_ONLY /* ZSTD_magicNumber, ZSTD_frameHeaderSize_max */ #include "zstd.h" +#if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT==1) +# include "zstd_legacy.h" /* ZSTD_isLegacy */ +#endif + /*-************************************* * OS-specific Includes @@ -688,7 +702,11 @@ static int FIO_decompressSrcFile(dRess_t ress, const char* srcFileName) readSomething = 1; if (sizeCheck != toRead) { DISPLAY("zstd: %s: unknown header \n", srcFileName); fclose(srcFile); return 1; } /* srcFileName is empty */ { U32 const magic = MEM_readLE32(ress.srcBuffer); - if (((magic & 0xFFFFFFF0U) != ZSTD_MAGIC_SKIPPABLE_START) & (magic != ZSTD_MAGICNUMBER)) { + if (((magic & 0xFFFFFFF0U) != ZSTD_MAGIC_SKIPPABLE_START) & (magic != ZSTD_MAGICNUMBER) +#if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT >= 1) + & (!ZSTD_isLegacy(ress.srcBuffer, toRead)) +#endif + ) { if ((g_overwrite) && !strcmp (srcFileName, stdinmark)) { /* pass-through mode */ unsigned const result = FIO_passThrough(dstFile, srcFile, ress.srcBuffer, ress.srcBufferSize); if (fclose(srcFile)) EXM_THROW(32, "zstd: %s close error", srcFileName); /* error should never happen */ diff --git a/programs/zstdcli.c b/programs/zstdcli.c index c03d6dde..64d2c2a9 100644 --- a/programs/zstdcli.c +++ b/programs/zstdcli.c @@ -1,3 +1,4 @@ + /* zstdcli - Command Line Interface (cli) for zstd Copyright (C) Yann Collet 2014-2016