Fix decompression of zstd again

- zIn.size was not correctly set before first decompression loop
This commit is contained in:
Tino Reichardt
2018-12-05 22:28:58 +01:00
parent 28bc209464
commit 1d1e92a9fb

View File

@@ -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)