mirror of
https://github.com/facebook/zstd.git
synced 2025-09-01 04:42:03 +03:00
Fixed decoding error #11 (reported by @magv)
This commit is contained in:
@@ -1269,7 +1269,7 @@ size_t ZSTD_decodeSeqHeaders(int* nbSeq, const BYTE** dumpsPtr,
|
|||||||
ip += dumpsLength;
|
ip += dumpsLength;
|
||||||
|
|
||||||
/* check */
|
/* check */
|
||||||
if (ip > iend-1) return (size_t)-ZSTD_ERROR_SrcSize;
|
if (ip > iend-3) return (size_t)-ZSTD_ERROR_SrcSize; /* min : all 3 are "raw", hence no header, but at least xxLog bits per type */
|
||||||
|
|
||||||
/* sequences */
|
/* sequences */
|
||||||
{
|
{
|
||||||
@@ -1300,6 +1300,7 @@ size_t ZSTD_decodeSeqHeaders(int* nbSeq, const BYTE** dumpsPtr,
|
|||||||
U32 max;
|
U32 max;
|
||||||
case bt_rle :
|
case bt_rle :
|
||||||
Offlog = 0;
|
Offlog = 0;
|
||||||
|
if (ip > iend-2) return (size_t)-ZSTD_ERROR_SrcSize; /* min : "raw", hence no header, but at least xxLog bits */
|
||||||
FSE_buildDTable_rle(DTableOffb, *ip++); break;
|
FSE_buildDTable_rle(DTableOffb, *ip++); break;
|
||||||
case bt_raw :
|
case bt_raw :
|
||||||
Offlog = Offbits;
|
Offlog = Offbits;
|
||||||
@@ -1318,6 +1319,7 @@ size_t ZSTD_decodeSeqHeaders(int* nbSeq, const BYTE** dumpsPtr,
|
|||||||
U32 max;
|
U32 max;
|
||||||
case bt_rle :
|
case bt_rle :
|
||||||
MLlog = 0;
|
MLlog = 0;
|
||||||
|
if (ip > iend-2) return (size_t)-ZSTD_ERROR_SrcSize; /* min : "raw", hence no header, but at least xxLog bits */
|
||||||
FSE_buildDTable_rle(DTableML, *ip++); break;
|
FSE_buildDTable_rle(DTableML, *ip++); break;
|
||||||
case bt_raw :
|
case bt_raw :
|
||||||
MLlog = MLbits;
|
MLlog = MLbits;
|
||||||
|
@@ -360,12 +360,13 @@ unsigned long long FIO_decompressFilename(const char* output_filename, const cha
|
|||||||
|
|
||||||
/* Decode block */
|
/* Decode block */
|
||||||
decodedSize = ZSTD_decompressContinue(dctx, op, oend-op, inBuff, readSize);
|
decodedSize = ZSTD_decompressContinue(dctx, op, oend-op, inBuff, readSize);
|
||||||
|
if (ZSTD_isError(decodedSize)) EXM_THROW(35, "Decoding error : input corrupted");
|
||||||
|
|
||||||
if (decodedSize) /* not a header */
|
if (decodedSize) /* not a header */
|
||||||
{
|
{
|
||||||
/* Write block */
|
/* Write block */
|
||||||
sizeCheck = fwrite(op, 1, decodedSize, foutput);
|
sizeCheck = fwrite(op, 1, decodedSize, foutput);
|
||||||
if (sizeCheck != decodedSize) EXM_THROW(35, "Write error : unable to write data block to destination file");
|
if (sizeCheck != decodedSize) EXM_THROW(36, "Write error : unable to write data block to destination file");
|
||||||
filesize += decodedSize;
|
filesize += decodedSize;
|
||||||
op += decodedSize;
|
op += decodedSize;
|
||||||
if (op==oend) op = outBuff;
|
if (op==oend) op = outBuff;
|
||||||
|
Reference in New Issue
Block a user