mirror of
https://github.com/Xevion/easy7zip.git
synced 2025-12-06 23:14:54 -06:00
Fix decompression of zstd again
- zIn.size was not correctly set before first decompression loop
This commit is contained in:
@@ -91,10 +91,6 @@ HRESULT CDecoder::CodeSpec(ISequentialInStream * inStream,
|
|||||||
ZSTD_resetDStream(_ctx);
|
ZSTD_resetDStream(_ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
zIn.src = _srcBuf;
|
|
||||||
zIn.size = _srcBufSize;
|
|
||||||
zIn.pos = 0;
|
|
||||||
|
|
||||||
zOut.dst = _dstBuf;
|
zOut.dst = _dstBuf;
|
||||||
srcBufLen = _srcBufSize;
|
srcBufLen = _srcBufSize;
|
||||||
|
|
||||||
@@ -102,6 +98,10 @@ HRESULT CDecoder::CodeSpec(ISequentialInStream * inStream,
|
|||||||
RINOK(ReadStream(inStream, _srcBuf, &srcBufLen));
|
RINOK(ReadStream(inStream, _srcBuf, &srcBufLen));
|
||||||
_processedIn += srcBufLen;
|
_processedIn += srcBufLen;
|
||||||
|
|
||||||
|
zIn.src = _srcBuf;
|
||||||
|
zIn.size = srcBufLen;
|
||||||
|
zIn.pos = 0;
|
||||||
|
|
||||||
/* Main decompression Loop */
|
/* Main decompression Loop */
|
||||||
for (;;) {
|
for (;;) {
|
||||||
for (;;) {
|
for (;;) {
|
||||||
@@ -110,16 +110,16 @@ HRESULT CDecoder::CodeSpec(ISequentialInStream * inStream,
|
|||||||
zOut.pos = 0;
|
zOut.pos = 0;
|
||||||
|
|
||||||
result = ZSTD_decompressStream(_ctx, &zOut, &zIn);
|
result = ZSTD_decompressStream(_ctx, &zOut, &zIn);
|
||||||
if (ZSTD_isError(result)) {
|
if (ZSTD_isError(result))
|
||||||
return E_FAIL;
|
return E_FAIL;
|
||||||
}
|
|
||||||
|
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
printf("res =%u\n", (unsigned)result);
|
printf("res = %u\n", (unsigned)result);
|
||||||
printf("zIn.size =%u\n", (unsigned)zIn.size);
|
printf("zIn.size = %u\n", (unsigned)zIn.size);
|
||||||
printf("zIn.pos =%u\n", (unsigned)zIn.pos);
|
printf("zIn.pos = %u\n", (unsigned)zIn.pos);
|
||||||
printf("zOut.size =%u\n", (unsigned)zOut.size);
|
printf("zOut.size = %u\n", (unsigned)zOut.size);
|
||||||
printf("zOut.pos =%u\n", (unsigned)zOut.pos);
|
printf("zOut.pos = %u\n", (unsigned)zOut.pos);
|
||||||
|
printf("---------------------\n");
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -130,23 +130,20 @@ HRESULT CDecoder::CodeSpec(ISequentialInStream * inStream,
|
|||||||
RINOK(progress->SetRatioInfo(&_processedIn, &_processedOut));
|
RINOK(progress->SetRatioInfo(&_processedIn, &_processedOut));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* one more round */
|
|
||||||
if ((zIn.pos == zIn.size) && (result == 1) && zOut.pos)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
/* finished with buffer */
|
/* finished with buffer */
|
||||||
if (zIn.pos == zIn.size)
|
if (zIn.pos == zIn.size)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* end of frame, but more data there... */
|
|
||||||
if (result == 0 && zIn.pos != zIn.size)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
/* end of frame */
|
/* end of frame */
|
||||||
if (result == 0) {
|
if (result == 0) {
|
||||||
result = ZSTD_resetDStream(_ctx);
|
result = ZSTD_resetDStream(_ctx);
|
||||||
if (ZSTD_isError(result))
|
if (ZSTD_isError(result))
|
||||||
return E_FAIL;
|
return E_FAIL;
|
||||||
|
|
||||||
|
/* end of frame, but more data */
|
||||||
|
if (zIn.pos < zIn.size)
|
||||||
|
continue;
|
||||||
|
|
||||||
/* read next input, or eof */
|
/* read next input, or eof */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -156,6 +153,9 @@ HRESULT CDecoder::CodeSpec(ISequentialInStream * inStream,
|
|||||||
srcBufLen = _srcBufSize;
|
srcBufLen = _srcBufSize;
|
||||||
RINOK(ReadStream(inStream, _srcBuf, &srcBufLen));
|
RINOK(ReadStream(inStream, _srcBuf, &srcBufLen));
|
||||||
_processedIn += srcBufLen;
|
_processedIn += srcBufLen;
|
||||||
|
#if DEBUG
|
||||||
|
printf("READ = %u\n", (unsigned)srcBufLen);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* finished */
|
/* finished */
|
||||||
if (srcBufLen == 0)
|
if (srcBufLen == 0)
|
||||||
|
|||||||
Reference in New Issue
Block a user