From 1d1e92a9fbe38ced73ce07e9b1d96b0a94c40912 Mon Sep 17 00:00:00 2001 From: Tino Reichardt Date: Wed, 5 Dec 2018 22:28:58 +0100 Subject: [PATCH] Fix decompression of zstd again - zIn.size was not correctly set before first decompression loop --- CPP/7zip/Compress/ZstdDecoder.cpp | 38 +++++++++++++++---------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/CPP/7zip/Compress/ZstdDecoder.cpp b/CPP/7zip/Compress/ZstdDecoder.cpp index d08ec9bc..231ac23a 100644 --- a/CPP/7zip/Compress/ZstdDecoder.cpp +++ b/CPP/7zip/Compress/ZstdDecoder.cpp @@ -91,10 +91,6 @@ HRESULT CDecoder::CodeSpec(ISequentialInStream * inStream, ZSTD_resetDStream(_ctx); } - zIn.src = _srcBuf; - zIn.size = _srcBufSize; - zIn.pos = 0; - zOut.dst = _dstBuf; srcBufLen = _srcBufSize; @@ -102,6 +98,10 @@ HRESULT CDecoder::CodeSpec(ISequentialInStream * inStream, RINOK(ReadStream(inStream, _srcBuf, &srcBufLen)); _processedIn += srcBufLen; + zIn.src = _srcBuf; + zIn.size = srcBufLen; + zIn.pos = 0; + /* Main decompression Loop */ for (;;) { for (;;) { @@ -110,16 +110,16 @@ HRESULT CDecoder::CodeSpec(ISequentialInStream * inStream, zOut.pos = 0; result = ZSTD_decompressStream(_ctx, &zOut, &zIn); - if (ZSTD_isError(result)) { + if (ZSTD_isError(result)) return E_FAIL; - } #if DEBUG - printf("res =%u\n", (unsigned)result); - printf("zIn.size =%u\n", (unsigned)zIn.size); - printf("zIn.pos =%u\n", (unsigned)zIn.pos); - printf("zOut.size =%u\n", (unsigned)zOut.size); - printf("zOut.pos =%u\n", (unsigned)zOut.pos); + printf("res = %u\n", (unsigned)result); + printf("zIn.size = %u\n", (unsigned)zIn.size); + printf("zIn.pos = %u\n", (unsigned)zIn.pos); + printf("zOut.size = %u\n", (unsigned)zOut.size); + printf("zOut.pos = %u\n", (unsigned)zOut.pos); + printf("---------------------\n"); fflush(stdout); #endif @@ -130,23 +130,20 @@ HRESULT CDecoder::CodeSpec(ISequentialInStream * inStream, RINOK(progress->SetRatioInfo(&_processedIn, &_processedOut)); } - /* one more round */ - if ((zIn.pos == zIn.size) && (result == 1) && zOut.pos) - continue; - /* finished with buffer */ if (zIn.pos == zIn.size) break; - /* end of frame, but more data there... */ - if (result == 0 && zIn.pos != zIn.size) - continue; - /* end of frame */ if (result == 0) { result = ZSTD_resetDStream(_ctx); if (ZSTD_isError(result)) return E_FAIL; + + /* end of frame, but more data */ + if (zIn.pos < zIn.size) + continue; + /* read next input, or eof */ break; } @@ -156,6 +153,9 @@ HRESULT CDecoder::CodeSpec(ISequentialInStream * inStream, srcBufLen = _srcBufSize; RINOK(ReadStream(inStream, _srcBuf, &srcBufLen)); _processedIn += srcBufLen; +#if DEBUG + printf("READ = %u\n", (unsigned)srcBufLen); +#endif /* finished */ if (srcBufLen == 0)