mirror of
				https://github.com/facebook/zstd.git
				synced 2025-10-31 08:37:43 +02:00 
			
		
		
		
	Fix uninitialized memory read
This commit is contained in:
		| @@ -104,7 +104,6 @@ struct ZSTD_DCtx_s | |||||||
|     U32 dictID; |     U32 dictID; | ||||||
|     const BYTE* litPtr; |     const BYTE* litPtr; | ||||||
|     ZSTD_customMem customMem; |     ZSTD_customMem customMem; | ||||||
|     size_t litBufSize; |  | ||||||
|     size_t litSize; |     size_t litSize; | ||||||
|     size_t rleSize; |     size_t rleSize; | ||||||
|     BYTE litBuffer[ZSTD_BLOCKSIZE_ABSOLUTEMAX + WILDCOPY_OVERLENGTH]; |     BYTE litBuffer[ZSTD_BLOCKSIZE_ABSOLUTEMAX + WILDCOPY_OVERLENGTH]; | ||||||
| @@ -429,10 +428,10 @@ size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx, | |||||||
|                     return ERROR(corruption_detected); |                     return ERROR(corruption_detected); | ||||||
|  |  | ||||||
|                 dctx->litPtr = dctx->litBuffer; |                 dctx->litPtr = dctx->litBuffer; | ||||||
|                 dctx->litBufSize = ZSTD_BLOCKSIZE_ABSOLUTEMAX+WILDCOPY_OVERLENGTH; |  | ||||||
|                 dctx->litSize = litSize; |                 dctx->litSize = litSize; | ||||||
|                 dctx->litEntropy = 1; |                 dctx->litEntropy = 1; | ||||||
|                 if (litEncType==set_compressed) dctx->HUFptr = dctx->hufTable; |                 if (litEncType==set_compressed) dctx->HUFptr = dctx->hufTable; | ||||||
|  |                 memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH); | ||||||
|                 return litCSize + lhSize; |                 return litCSize + lhSize; | ||||||
|             } |             } | ||||||
|  |  | ||||||
| @@ -459,13 +458,12 @@ size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx, | |||||||
|                     if (litSize+lhSize > srcSize) return ERROR(corruption_detected); |                     if (litSize+lhSize > srcSize) return ERROR(corruption_detected); | ||||||
|                     memcpy(dctx->litBuffer, istart+lhSize, litSize); |                     memcpy(dctx->litBuffer, istart+lhSize, litSize); | ||||||
|                     dctx->litPtr = dctx->litBuffer; |                     dctx->litPtr = dctx->litBuffer; | ||||||
|                     dctx->litBufSize = ZSTD_BLOCKSIZE_ABSOLUTEMAX+8; |  | ||||||
|                     dctx->litSize = litSize; |                     dctx->litSize = litSize; | ||||||
|  |                     memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH); | ||||||
|                     return lhSize+litSize; |                     return lhSize+litSize; | ||||||
|                 } |                 } | ||||||
|                 /* direct reference into compressed stream */ |                 /* direct reference into compressed stream */ | ||||||
|                 dctx->litPtr = istart+lhSize; |                 dctx->litPtr = istart+lhSize; | ||||||
|                 dctx->litBufSize = srcSize-lhSize; |  | ||||||
|                 dctx->litSize = litSize; |                 dctx->litSize = litSize; | ||||||
|                 return lhSize+litSize; |                 return lhSize+litSize; | ||||||
|             } |             } | ||||||
| @@ -492,8 +490,8 @@ size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx, | |||||||
|                 if (litSize > ZSTD_BLOCKSIZE_ABSOLUTEMAX) return ERROR(corruption_detected); |                 if (litSize > ZSTD_BLOCKSIZE_ABSOLUTEMAX) return ERROR(corruption_detected); | ||||||
|                 memset(dctx->litBuffer, istart[lhSize], litSize); |                 memset(dctx->litBuffer, istart[lhSize], litSize); | ||||||
|                 dctx->litPtr = dctx->litBuffer; |                 dctx->litPtr = dctx->litBuffer; | ||||||
|                 dctx->litBufSize = ZSTD_BLOCKSIZE_ABSOLUTEMAX+WILDCOPY_OVERLENGTH; |  | ||||||
|                 dctx->litSize = litSize; |                 dctx->litSize = litSize; | ||||||
|  |                 memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH); | ||||||
|                 return lhSize+1; |                 return lhSize+1; | ||||||
|             } |             } | ||||||
|         default: |         default: | ||||||
| @@ -867,7 +865,7 @@ static seq_t ZSTD_decodeSequence(seqState_t* seqState) | |||||||
| FORCE_NOINLINE | FORCE_NOINLINE | ||||||
| size_t ZSTD_execSequenceLast7(BYTE* op, | size_t ZSTD_execSequenceLast7(BYTE* op, | ||||||
|                               BYTE* const oend, seq_t sequence, |                               BYTE* const oend, seq_t sequence, | ||||||
|                               const BYTE** litPtr, const BYTE* const litLimit_w, |                               const BYTE** litPtr, const BYTE* const litLimit, | ||||||
|                               const BYTE* const base, const BYTE* const vBase, const BYTE* const dictEnd) |                               const BYTE* const base, const BYTE* const vBase, const BYTE* const dictEnd) | ||||||
| { | { | ||||||
|     BYTE* const oLitEnd = op + sequence.litLength; |     BYTE* const oLitEnd = op + sequence.litLength; | ||||||
| @@ -879,7 +877,7 @@ size_t ZSTD_execSequenceLast7(BYTE* op, | |||||||
|  |  | ||||||
|     /* check */ |     /* check */ | ||||||
|     if (oMatchEnd>oend) return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of WILDCOPY_OVERLENGTH from oend */ |     if (oMatchEnd>oend) return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of WILDCOPY_OVERLENGTH from oend */ | ||||||
|     if (iLitEnd > litLimit_w) return ERROR(corruption_detected);   /* over-read beyond lit buffer */ |     if (iLitEnd > litLimit) return ERROR(corruption_detected);   /* over-read beyond lit buffer */ | ||||||
|     if (oLitEnd <= oend_w) return ERROR(GENERIC);   /* Precondition */ |     if (oLitEnd <= oend_w) return ERROR(GENERIC);   /* Precondition */ | ||||||
|  |  | ||||||
|     /* copy literals */ |     /* copy literals */ | ||||||
| @@ -914,7 +912,7 @@ size_t ZSTD_execSequenceLast7(BYTE* op, | |||||||
| FORCE_INLINE | FORCE_INLINE | ||||||
| size_t ZSTD_execSequence(BYTE* op, | size_t ZSTD_execSequence(BYTE* op, | ||||||
|                                 BYTE* const oend, seq_t sequence, |                                 BYTE* const oend, seq_t sequence, | ||||||
|                                 const BYTE** litPtr, const BYTE* const litLimit_w, |                                 const BYTE** litPtr, const BYTE* const litLimit, | ||||||
|                                 const BYTE* const base, const BYTE* const vBase, const BYTE* const dictEnd) |                                 const BYTE* const base, const BYTE* const vBase, const BYTE* const dictEnd) | ||||||
| { | { | ||||||
|     BYTE* const oLitEnd = op + sequence.litLength; |     BYTE* const oLitEnd = op + sequence.litLength; | ||||||
| @@ -926,8 +924,8 @@ size_t ZSTD_execSequence(BYTE* op, | |||||||
|  |  | ||||||
|     /* check */ |     /* check */ | ||||||
|     if (oMatchEnd>oend) return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of WILDCOPY_OVERLENGTH from oend */ |     if (oMatchEnd>oend) return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of WILDCOPY_OVERLENGTH from oend */ | ||||||
|     if (iLitEnd > litLimit_w) return ERROR(corruption_detected);   /* over-read beyond lit buffer */ |     if (iLitEnd > litLimit) return ERROR(corruption_detected);   /* over-read beyond lit buffer */ | ||||||
|     if (oLitEnd>oend_w) return ZSTD_execSequenceLast7(op, oend, sequence, litPtr, litLimit_w, base, vBase, dictEnd); |     if (oLitEnd>oend_w) return ZSTD_execSequenceLast7(op, oend, sequence, litPtr, litLimit, base, vBase, dictEnd); | ||||||
|  |  | ||||||
|     /* copy Literals */ |     /* copy Literals */ | ||||||
|     ZSTD_copy8(op, *litPtr); |     ZSTD_copy8(op, *litPtr); | ||||||
| @@ -1002,7 +1000,6 @@ static size_t ZSTD_decompressSequences( | |||||||
|     BYTE* const oend = ostart + maxDstSize; |     BYTE* const oend = ostart + maxDstSize; | ||||||
|     BYTE* op = ostart; |     BYTE* op = ostart; | ||||||
|     const BYTE* litPtr = dctx->litPtr; |     const BYTE* litPtr = dctx->litPtr; | ||||||
|     const BYTE* const litLimit_w = litPtr + dctx->litBufSize - WILDCOPY_OVERLENGTH; |  | ||||||
|     const BYTE* const litEnd = litPtr + dctx->litSize; |     const BYTE* const litEnd = litPtr + dctx->litSize; | ||||||
|     const BYTE* const base = (const BYTE*) (dctx->base); |     const BYTE* const base = (const BYTE*) (dctx->base); | ||||||
|     const BYTE* const vBase = (const BYTE*) (dctx->vBase); |     const BYTE* const vBase = (const BYTE*) (dctx->vBase); | ||||||
| @@ -1028,7 +1025,7 @@ static size_t ZSTD_decompressSequences( | |||||||
|         for ( ; (BIT_reloadDStream(&(seqState.DStream)) <= BIT_DStream_completed) && nbSeq ; ) { |         for ( ; (BIT_reloadDStream(&(seqState.DStream)) <= BIT_DStream_completed) && nbSeq ; ) { | ||||||
|             nbSeq--; |             nbSeq--; | ||||||
|             {   seq_t const sequence = ZSTD_decodeSequence(&seqState); |             {   seq_t const sequence = ZSTD_decodeSequence(&seqState); | ||||||
|                 size_t const oneSeqSize = ZSTD_execSequence(op, oend, sequence, &litPtr, litLimit_w, base, vBase, dictEnd); |                 size_t const oneSeqSize = ZSTD_execSequence(op, oend, sequence, &litPtr, litEnd, base, vBase, dictEnd); | ||||||
|                 if (ZSTD_isError(oneSeqSize)) return oneSeqSize; |                 if (ZSTD_isError(oneSeqSize)) return oneSeqSize; | ||||||
|                 op += oneSeqSize; |                 op += oneSeqSize; | ||||||
|         }   } |         }   } | ||||||
|   | |||||||
| @@ -2868,7 +2868,6 @@ struct ZSTD_DCtx_s | |||||||
|     blockType_t bType; |     blockType_t bType; | ||||||
|     U32 phase; |     U32 phase; | ||||||
|     const BYTE* litPtr; |     const BYTE* litPtr; | ||||||
|     size_t litBufSize; |  | ||||||
|     size_t litSize; |     size_t litSize; | ||||||
|     BYTE litBuffer[BLOCKSIZE + 8 /* margin for wildcopy */]; |     BYTE litBuffer[BLOCKSIZE + 8 /* margin for wildcopy */]; | ||||||
| };   /* typedef'd to ZSTD_Dctx within "zstd_static.h" */ | };   /* typedef'd to ZSTD_Dctx within "zstd_static.h" */ | ||||||
| @@ -2940,8 +2939,8 @@ static size_t ZSTD_decodeLiteralsBlock(void* ctx, | |||||||
|             size_t litSize = BLOCKSIZE; |             size_t litSize = BLOCKSIZE; | ||||||
|             const size_t readSize = ZSTD_decompressLiterals(dctx->litBuffer, &litSize, src, srcSize); |             const size_t readSize = ZSTD_decompressLiterals(dctx->litBuffer, &litSize, src, srcSize); | ||||||
|             dctx->litPtr = dctx->litBuffer; |             dctx->litPtr = dctx->litBuffer; | ||||||
|             dctx->litBufSize = BLOCKSIZE; |  | ||||||
|             dctx->litSize = litSize; |             dctx->litSize = litSize; | ||||||
|  |             memset(dctx->litBuffer + dctx->litSize, 0, 8); | ||||||
|             return readSize;   /* works if it's an error too */ |             return readSize;   /* works if it's an error too */ | ||||||
|         } |         } | ||||||
|     case IS_RAW: |     case IS_RAW: | ||||||
| @@ -2952,13 +2951,12 @@ static size_t ZSTD_decodeLiteralsBlock(void* ctx, | |||||||
| 				if (litSize > srcSize-3) return ERROR(corruption_detected); | 				if (litSize > srcSize-3) return ERROR(corruption_detected); | ||||||
| 				memcpy(dctx->litBuffer, istart, litSize); | 				memcpy(dctx->litBuffer, istart, litSize); | ||||||
| 				dctx->litPtr = dctx->litBuffer; | 				dctx->litPtr = dctx->litBuffer; | ||||||
| 				dctx->litBufSize = BLOCKSIZE; |  | ||||||
| 				dctx->litSize = litSize; | 				dctx->litSize = litSize; | ||||||
|  | 				memset(dctx->litBuffer + dctx->litSize, 0, 8); | ||||||
| 				return litSize+3; | 				return litSize+3; | ||||||
| 			} | 			} | ||||||
| 			/* direct reference into compressed stream */ | 			/* direct reference into compressed stream */ | ||||||
|             dctx->litPtr = istart+3; |             dctx->litPtr = istart+3; | ||||||
|             dctx->litBufSize = srcSize-3; |  | ||||||
|             dctx->litSize = litSize; |             dctx->litSize = litSize; | ||||||
|             return litSize+3; |             return litSize+3; | ||||||
|         } |         } | ||||||
| @@ -2968,8 +2966,8 @@ static size_t ZSTD_decodeLiteralsBlock(void* ctx, | |||||||
|             if (litSize > BLOCKSIZE) return ERROR(corruption_detected); |             if (litSize > BLOCKSIZE) return ERROR(corruption_detected); | ||||||
|             memset(dctx->litBuffer, istart[3], litSize); |             memset(dctx->litBuffer, istart[3], litSize); | ||||||
|             dctx->litPtr = dctx->litBuffer; |             dctx->litPtr = dctx->litBuffer; | ||||||
|             dctx->litBufSize = BLOCKSIZE; |  | ||||||
|             dctx->litSize = litSize; |             dctx->litSize = litSize; | ||||||
|  |             memset(dctx->litBuffer + dctx->litSize, 0, 8); | ||||||
|             return 4; |             return 4; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @@ -3175,7 +3173,7 @@ static size_t ZSTD_execSequence(BYTE* op, | |||||||
|     /* checks */ |     /* checks */ | ||||||
|     if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall);   /* last match must start at a minimum distance of 8 from oend */ |     if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall);   /* last match must start at a minimum distance of 8 from oend */ | ||||||
|     if (oMatchEnd > oend) return ERROR(dstSize_tooSmall);   /* overwrite beyond dst buffer */ |     if (oMatchEnd > oend) return ERROR(dstSize_tooSmall);   /* overwrite beyond dst buffer */ | ||||||
|     if (litEnd > litLimit-8) return ERROR(corruption_detected);   /* overRead beyond lit buffer */ |     if (litEnd > litLimit) return ERROR(corruption_detected);   /* overRead beyond lit buffer */ | ||||||
|  |  | ||||||
|     /* copy Literals */ |     /* copy Literals */ | ||||||
|     ZSTD_wildcopy(op, *litPtr, sequence.litLength);   /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */ |     ZSTD_wildcopy(op, *litPtr, sequence.litLength);   /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */ | ||||||
| @@ -3241,7 +3239,6 @@ static size_t ZSTD_decompressSequences( | |||||||
|     BYTE* const oend = ostart + maxDstSize; |     BYTE* const oend = ostart + maxDstSize; | ||||||
|     size_t errorCode, dumpsLength; |     size_t errorCode, dumpsLength; | ||||||
|     const BYTE* litPtr = dctx->litPtr; |     const BYTE* litPtr = dctx->litPtr; | ||||||
|     const BYTE* const litMax = litPtr + dctx->litBufSize; |  | ||||||
|     const BYTE* const litEnd = litPtr + dctx->litSize; |     const BYTE* const litEnd = litPtr + dctx->litSize; | ||||||
|     int nbSeq; |     int nbSeq; | ||||||
|     const BYTE* dumps; |     const BYTE* dumps; | ||||||
| @@ -3277,7 +3274,7 @@ static size_t ZSTD_decompressSequences( | |||||||
|             size_t oneSeqSize; |             size_t oneSeqSize; | ||||||
|             nbSeq--; |             nbSeq--; | ||||||
|             ZSTD_decodeSequence(&sequence, &seqState); |             ZSTD_decodeSequence(&sequence, &seqState); | ||||||
|             oneSeqSize = ZSTD_execSequence(op, sequence, &litPtr, litMax, base, oend); |             oneSeqSize = ZSTD_execSequence(op, sequence, &litPtr, litEnd, base, oend); | ||||||
|             if (ZSTD_isError(oneSeqSize)) return oneSeqSize; |             if (ZSTD_isError(oneSeqSize)) return oneSeqSize; | ||||||
|             op += oneSeqSize; |             op += oneSeqSize; | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -2509,7 +2509,6 @@ struct ZSTD_DCtx_s | |||||||
|     blockType_t bType; |     blockType_t bType; | ||||||
|     U32 phase; |     U32 phase; | ||||||
|     const BYTE* litPtr; |     const BYTE* litPtr; | ||||||
|     size_t litBufSize; |  | ||||||
|     size_t litSize; |     size_t litSize; | ||||||
|     BYTE litBuffer[BLOCKSIZE + 8 /* margin for wildcopy */]; |     BYTE litBuffer[BLOCKSIZE + 8 /* margin for wildcopy */]; | ||||||
| };   /* typedef'd to ZSTD_Dctx within "zstd_static.h" */ | };   /* typedef'd to ZSTD_Dctx within "zstd_static.h" */ | ||||||
| @@ -2581,8 +2580,8 @@ static size_t ZSTD_decodeLiteralsBlock(void* ctx, | |||||||
|             size_t litSize = BLOCKSIZE; |             size_t litSize = BLOCKSIZE; | ||||||
|             const size_t readSize = ZSTD_decompressLiterals(dctx->litBuffer, &litSize, src, srcSize); |             const size_t readSize = ZSTD_decompressLiterals(dctx->litBuffer, &litSize, src, srcSize); | ||||||
|             dctx->litPtr = dctx->litBuffer; |             dctx->litPtr = dctx->litBuffer; | ||||||
|             dctx->litBufSize = BLOCKSIZE; |  | ||||||
|             dctx->litSize = litSize; |             dctx->litSize = litSize; | ||||||
|  |             memset(dctx->litBuffer + dctx->litSize, 0, 8); | ||||||
|             return readSize;   /* works if it's an error too */ |             return readSize;   /* works if it's an error too */ | ||||||
|         } |         } | ||||||
|     case IS_RAW: |     case IS_RAW: | ||||||
| @@ -2593,13 +2592,12 @@ static size_t ZSTD_decodeLiteralsBlock(void* ctx, | |||||||
| 				if (litSize > srcSize-3) return ERROR(corruption_detected); | 				if (litSize > srcSize-3) return ERROR(corruption_detected); | ||||||
| 				memcpy(dctx->litBuffer, istart, litSize); | 				memcpy(dctx->litBuffer, istart, litSize); | ||||||
| 				dctx->litPtr = dctx->litBuffer; | 				dctx->litPtr = dctx->litBuffer; | ||||||
| 				dctx->litBufSize = BLOCKSIZE; |  | ||||||
| 				dctx->litSize = litSize; | 				dctx->litSize = litSize; | ||||||
|  | 				memset(dctx->litBuffer + dctx->litSize, 0, 8); | ||||||
| 				return litSize+3; | 				return litSize+3; | ||||||
| 			} | 			} | ||||||
| 			/* direct reference into compressed stream */ | 			/* direct reference into compressed stream */ | ||||||
|             dctx->litPtr = istart+3; |             dctx->litPtr = istart+3; | ||||||
|             dctx->litBufSize = srcSize-3; |  | ||||||
|             dctx->litSize = litSize; |             dctx->litSize = litSize; | ||||||
|             return litSize+3; |             return litSize+3; | ||||||
|         } |         } | ||||||
| @@ -2609,8 +2607,8 @@ static size_t ZSTD_decodeLiteralsBlock(void* ctx, | |||||||
|             if (litSize > BLOCKSIZE) return ERROR(corruption_detected); |             if (litSize > BLOCKSIZE) return ERROR(corruption_detected); | ||||||
|             memset(dctx->litBuffer, istart[3], litSize); |             memset(dctx->litBuffer, istart[3], litSize); | ||||||
|             dctx->litPtr = dctx->litBuffer; |             dctx->litPtr = dctx->litBuffer; | ||||||
|             dctx->litBufSize = BLOCKSIZE; |  | ||||||
|             dctx->litSize = litSize; |             dctx->litSize = litSize; | ||||||
|  |             memset(dctx->litBuffer + dctx->litSize, 0, 8); | ||||||
|             return 4; |             return 4; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @@ -2816,7 +2814,7 @@ static size_t ZSTD_execSequence(BYTE* op, | |||||||
|     /* checks */ |     /* checks */ | ||||||
|     if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall);   /* last match must start at a minimum distance of 8 from oend */ |     if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall);   /* last match must start at a minimum distance of 8 from oend */ | ||||||
|     if (oMatchEnd > oend) return ERROR(dstSize_tooSmall);   /* overwrite beyond dst buffer */ |     if (oMatchEnd > oend) return ERROR(dstSize_tooSmall);   /* overwrite beyond dst buffer */ | ||||||
|     if (litEnd > litLimit-8) return ERROR(corruption_detected);   /* overRead beyond lit buffer */ |     if (litEnd > litLimit) return ERROR(corruption_detected);   /* overRead beyond lit buffer */ | ||||||
|  |  | ||||||
|     /* copy Literals */ |     /* copy Literals */ | ||||||
|     ZSTD_wildcopy(op, *litPtr, sequence.litLength);   /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */ |     ZSTD_wildcopy(op, *litPtr, sequence.litLength);   /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */ | ||||||
| @@ -2882,7 +2880,6 @@ static size_t ZSTD_decompressSequences( | |||||||
|     BYTE* const oend = ostart + maxDstSize; |     BYTE* const oend = ostart + maxDstSize; | ||||||
|     size_t errorCode, dumpsLength; |     size_t errorCode, dumpsLength; | ||||||
|     const BYTE* litPtr = dctx->litPtr; |     const BYTE* litPtr = dctx->litPtr; | ||||||
|     const BYTE* const litMax = litPtr + dctx->litBufSize; |  | ||||||
|     const BYTE* const litEnd = litPtr + dctx->litSize; |     const BYTE* const litEnd = litPtr + dctx->litSize; | ||||||
|     int nbSeq; |     int nbSeq; | ||||||
|     const BYTE* dumps; |     const BYTE* dumps; | ||||||
| @@ -2918,7 +2915,7 @@ static size_t ZSTD_decompressSequences( | |||||||
|             size_t oneSeqSize; |             size_t oneSeqSize; | ||||||
|             nbSeq--; |             nbSeq--; | ||||||
|             ZSTD_decodeSequence(&sequence, &seqState); |             ZSTD_decodeSequence(&sequence, &seqState); | ||||||
|             oneSeqSize = ZSTD_execSequence(op, sequence, &litPtr, litMax, base, oend); |             oneSeqSize = ZSTD_execSequence(op, sequence, &litPtr, litEnd, base, oend); | ||||||
|             if (ZSTD_isError(oneSeqSize)) return oneSeqSize; |             if (ZSTD_isError(oneSeqSize)) return oneSeqSize; | ||||||
|             op += oneSeqSize; |             op += oneSeqSize; | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -2706,7 +2706,6 @@ struct ZSTDv04_Dctx_s | |||||||
|     blockType_t bType; |     blockType_t bType; | ||||||
|     ZSTD_dStage stage; |     ZSTD_dStage stage; | ||||||
|     const BYTE* litPtr; |     const BYTE* litPtr; | ||||||
|     size_t litBufSize; |  | ||||||
|     size_t litSize; |     size_t litSize; | ||||||
|     BYTE litBuffer[BLOCKSIZE + 8 /* margin for wildcopy */]; |     BYTE litBuffer[BLOCKSIZE + 8 /* margin for wildcopy */]; | ||||||
|     BYTE headerBuffer[ZSTD_frameHeaderSize_max]; |     BYTE headerBuffer[ZSTD_frameHeaderSize_max]; | ||||||
| @@ -2847,8 +2846,8 @@ static size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx, | |||||||
|             size_t litSize = BLOCKSIZE; |             size_t litSize = BLOCKSIZE; | ||||||
|             const size_t readSize = ZSTD_decompressLiterals(dctx->litBuffer, &litSize, src, srcSize); |             const size_t readSize = ZSTD_decompressLiterals(dctx->litBuffer, &litSize, src, srcSize); | ||||||
|             dctx->litPtr = dctx->litBuffer; |             dctx->litPtr = dctx->litBuffer; | ||||||
|             dctx->litBufSize = BLOCKSIZE+8; |  | ||||||
|             dctx->litSize = litSize; |             dctx->litSize = litSize; | ||||||
|  |             memset(dctx->litBuffer + dctx->litSize, 0, 8); | ||||||
|             return readSize;   /* works if it's an error too */ |             return readSize;   /* works if it's an error too */ | ||||||
|         } |         } | ||||||
|     case IS_RAW: |     case IS_RAW: | ||||||
| @@ -2859,13 +2858,12 @@ static size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx, | |||||||
|                 if (litSize > srcSize-3) return ERROR(corruption_detected); |                 if (litSize > srcSize-3) return ERROR(corruption_detected); | ||||||
|                 memcpy(dctx->litBuffer, istart, litSize); |                 memcpy(dctx->litBuffer, istart, litSize); | ||||||
|                 dctx->litPtr = dctx->litBuffer; |                 dctx->litPtr = dctx->litBuffer; | ||||||
|                 dctx->litBufSize = BLOCKSIZE+8; |  | ||||||
|                 dctx->litSize = litSize; |                 dctx->litSize = litSize; | ||||||
|  |                 memset(dctx->litBuffer + dctx->litSize, 0, 8); | ||||||
|                 return litSize+3; |                 return litSize+3; | ||||||
|             } |             } | ||||||
|             /* direct reference into compressed stream */ |             /* direct reference into compressed stream */ | ||||||
|             dctx->litPtr = istart+3; |             dctx->litPtr = istart+3; | ||||||
|             dctx->litBufSize = srcSize-3; |  | ||||||
|             dctx->litSize = litSize; |             dctx->litSize = litSize; | ||||||
|             return litSize+3;        } |             return litSize+3;        } | ||||||
|     case IS_RLE: |     case IS_RLE: | ||||||
| @@ -2874,8 +2872,8 @@ static size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx, | |||||||
|             if (litSize > BLOCKSIZE) return ERROR(corruption_detected); |             if (litSize > BLOCKSIZE) return ERROR(corruption_detected); | ||||||
|             memset(dctx->litBuffer, istart[3], litSize); |             memset(dctx->litBuffer, istart[3], litSize); | ||||||
|             dctx->litPtr = dctx->litBuffer; |             dctx->litPtr = dctx->litBuffer; | ||||||
|             dctx->litBufSize = BLOCKSIZE+8; |  | ||||||
|             dctx->litSize = litSize; |             dctx->litSize = litSize; | ||||||
|  |             memset(dctx->litBuffer + dctx->litSize, 0, 8); | ||||||
|             return 4; |             return 4; | ||||||
|         } |         } | ||||||
|     default: |     default: | ||||||
| @@ -3069,7 +3067,7 @@ static void ZSTD_decodeSequence(seq_t* seq, seqState_t* seqState) | |||||||
|  |  | ||||||
| static size_t ZSTD_execSequence(BYTE* op, | static size_t ZSTD_execSequence(BYTE* op, | ||||||
|                                 BYTE* const oend, seq_t sequence, |                                 BYTE* const oend, seq_t sequence, | ||||||
|                                 const BYTE** litPtr, const BYTE* const litLimit_8, |                                 const BYTE** litPtr, const BYTE* const litLimit, | ||||||
|                                 const BYTE* const base, const BYTE* const vBase, const BYTE* const dictEnd) |                                 const BYTE* const base, const BYTE* const vBase, const BYTE* const dictEnd) | ||||||
| { | { | ||||||
|     static const int dec32table[] = { 0, 1, 2, 1, 4, 4, 4, 4 };   /* added */ |     static const int dec32table[] = { 0, 1, 2, 1, 4, 4, 4, 4 };   /* added */ | ||||||
| @@ -3084,7 +3082,7 @@ static size_t ZSTD_execSequence(BYTE* op, | |||||||
|     /* check */ |     /* check */ | ||||||
|     if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall);   /* last match must start at a minimum distance of 8 from oend */ |     if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall);   /* last match must start at a minimum distance of 8 from oend */ | ||||||
|     if (oMatchEnd > oend) return ERROR(dstSize_tooSmall);   /* overwrite beyond dst buffer */ |     if (oMatchEnd > oend) return ERROR(dstSize_tooSmall);   /* overwrite beyond dst buffer */ | ||||||
|     if (litEnd > litLimit_8) return ERROR(corruption_detected);   /* risk read beyond lit buffer */ |     if (litEnd > litLimit) return ERROR(corruption_detected);   /* risk read beyond lit buffer */ | ||||||
|  |  | ||||||
|     /* copy Literals */ |     /* copy Literals */ | ||||||
|     ZSTD_wildcopy(op, *litPtr, sequence.litLength);   /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */ |     ZSTD_wildcopy(op, *litPtr, sequence.litLength);   /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */ | ||||||
| @@ -3167,7 +3165,6 @@ static size_t ZSTD_decompressSequences( | |||||||
|     BYTE* const oend = ostart + maxDstSize; |     BYTE* const oend = ostart + maxDstSize; | ||||||
|     size_t errorCode, dumpsLength; |     size_t errorCode, dumpsLength; | ||||||
|     const BYTE* litPtr = dctx->litPtr; |     const BYTE* litPtr = dctx->litPtr; | ||||||
|     const BYTE* const litLimit_8 = litPtr + dctx->litBufSize - 8; |  | ||||||
|     const BYTE* const litEnd = litPtr + dctx->litSize; |     const BYTE* const litEnd = litPtr + dctx->litSize; | ||||||
|     int nbSeq; |     int nbSeq; | ||||||
|     const BYTE* dumps; |     const BYTE* dumps; | ||||||
| @@ -3206,7 +3203,7 @@ static size_t ZSTD_decompressSequences( | |||||||
|             size_t oneSeqSize; |             size_t oneSeqSize; | ||||||
|             nbSeq--; |             nbSeq--; | ||||||
|             ZSTD_decodeSequence(&sequence, &seqState); |             ZSTD_decodeSequence(&sequence, &seqState); | ||||||
|             oneSeqSize = ZSTD_execSequence(op, oend, sequence, &litPtr, litLimit_8, base, vBase, dictEnd); |             oneSeqSize = ZSTD_execSequence(op, oend, sequence, &litPtr, litEnd, base, vBase, dictEnd); | ||||||
|             if (ZSTD_isError(oneSeqSize)) return oneSeqSize; |             if (ZSTD_isError(oneSeqSize)) return oneSeqSize; | ||||||
|             op += oneSeqSize; |             op += oneSeqSize; | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -2731,7 +2731,6 @@ struct ZSTDv05_DCtx_s | |||||||
|     ZSTDv05_dStage stage; |     ZSTDv05_dStage stage; | ||||||
|     U32 flagStaticTables; |     U32 flagStaticTables; | ||||||
|     const BYTE* litPtr; |     const BYTE* litPtr; | ||||||
|     size_t litBufSize; |  | ||||||
|     size_t litSize; |     size_t litSize; | ||||||
|     BYTE litBuffer[BLOCKSIZE + WILDCOPY_OVERLENGTH]; |     BYTE litBuffer[BLOCKSIZE + WILDCOPY_OVERLENGTH]; | ||||||
|     BYTE headerBuffer[ZSTDv05_frameHeaderSize_max]; |     BYTE headerBuffer[ZSTDv05_frameHeaderSize_max]; | ||||||
| @@ -2978,8 +2977,8 @@ size_t ZSTDv05_decodeLiteralsBlock(ZSTDv05_DCtx* dctx, | |||||||
|                 return ERROR(corruption_detected); |                 return ERROR(corruption_detected); | ||||||
|  |  | ||||||
|             dctx->litPtr = dctx->litBuffer; |             dctx->litPtr = dctx->litBuffer; | ||||||
|             dctx->litBufSize = BLOCKSIZE+8; |  | ||||||
|             dctx->litSize = litSize; |             dctx->litSize = litSize; | ||||||
|  |             memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH); | ||||||
|             return litCSize + lhSize; |             return litCSize + lhSize; | ||||||
|         } |         } | ||||||
|     case IS_PCH: |     case IS_PCH: | ||||||
| @@ -3002,8 +3001,8 @@ size_t ZSTDv05_decodeLiteralsBlock(ZSTDv05_DCtx* dctx, | |||||||
|             if (HUFv05_isError(errorCode)) return ERROR(corruption_detected); |             if (HUFv05_isError(errorCode)) return ERROR(corruption_detected); | ||||||
|  |  | ||||||
|             dctx->litPtr = dctx->litBuffer; |             dctx->litPtr = dctx->litBuffer; | ||||||
|             dctx->litBufSize = BLOCKSIZE+WILDCOPY_OVERLENGTH; |  | ||||||
|             dctx->litSize = litSize; |             dctx->litSize = litSize; | ||||||
|  |             memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH); | ||||||
|             return litCSize + lhSize; |             return litCSize + lhSize; | ||||||
|         } |         } | ||||||
|     case IS_RAW: |     case IS_RAW: | ||||||
| @@ -3028,13 +3027,12 @@ size_t ZSTDv05_decodeLiteralsBlock(ZSTDv05_DCtx* dctx, | |||||||
|                 if (litSize+lhSize > srcSize) return ERROR(corruption_detected); |                 if (litSize+lhSize > srcSize) return ERROR(corruption_detected); | ||||||
|                 memcpy(dctx->litBuffer, istart+lhSize, litSize); |                 memcpy(dctx->litBuffer, istart+lhSize, litSize); | ||||||
|                 dctx->litPtr = dctx->litBuffer; |                 dctx->litPtr = dctx->litBuffer; | ||||||
|                 dctx->litBufSize = BLOCKSIZE+8; |  | ||||||
|                 dctx->litSize = litSize; |                 dctx->litSize = litSize; | ||||||
|  |                 memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH); | ||||||
|                 return lhSize+litSize; |                 return lhSize+litSize; | ||||||
|             } |             } | ||||||
|             /* direct reference into compressed stream */ |             /* direct reference into compressed stream */ | ||||||
|             dctx->litPtr = istart+lhSize; |             dctx->litPtr = istart+lhSize; | ||||||
|             dctx->litBufSize = srcSize-lhSize; |  | ||||||
|             dctx->litSize = litSize; |             dctx->litSize = litSize; | ||||||
|             return lhSize+litSize; |             return lhSize+litSize; | ||||||
|         } |         } | ||||||
| @@ -3059,8 +3057,8 @@ size_t ZSTDv05_decodeLiteralsBlock(ZSTDv05_DCtx* dctx, | |||||||
|             if (litSize > BLOCKSIZE) return ERROR(corruption_detected); |             if (litSize > BLOCKSIZE) return ERROR(corruption_detected); | ||||||
|             memset(dctx->litBuffer, istart[lhSize], litSize); |             memset(dctx->litBuffer, istart[lhSize], litSize); | ||||||
|             dctx->litPtr = dctx->litBuffer; |             dctx->litPtr = dctx->litBuffer; | ||||||
|             dctx->litBufSize = BLOCKSIZE+WILDCOPY_OVERLENGTH; |  | ||||||
|             dctx->litSize = litSize; |             dctx->litSize = litSize; | ||||||
|  |             memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH); | ||||||
|             return lhSize+1; |             return lhSize+1; | ||||||
|         } |         } | ||||||
|     default: |     default: | ||||||
| @@ -3289,7 +3287,7 @@ static void ZSTDv05_decodeSequence(seq_t* seq, seqState_t* seqState) | |||||||
|  |  | ||||||
| static size_t ZSTDv05_execSequence(BYTE* op, | static size_t ZSTDv05_execSequence(BYTE* op, | ||||||
|                                 BYTE* const oend, seq_t sequence, |                                 BYTE* const oend, seq_t sequence, | ||||||
|                                 const BYTE** litPtr, const BYTE* const litLimit_8, |                                 const BYTE** litPtr, const BYTE* const litLimit, | ||||||
|                                 const BYTE* const base, const BYTE* const vBase, const BYTE* const dictEnd) |                                 const BYTE* const base, const BYTE* const vBase, const BYTE* const dictEnd) | ||||||
| { | { | ||||||
|     static const int dec32table[] = { 0, 1, 2, 1, 4, 4, 4, 4 };   /* added */ |     static const int dec32table[] = { 0, 1, 2, 1, 4, 4, 4, 4 };   /* added */ | ||||||
| @@ -3304,7 +3302,7 @@ static size_t ZSTDv05_execSequence(BYTE* op, | |||||||
|     /* check */ |     /* check */ | ||||||
|     if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall);   /* last match must start at a minimum distance of 8 from oend */ |     if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall);   /* last match must start at a minimum distance of 8 from oend */ | ||||||
|     if (oMatchEnd > oend) return ERROR(dstSize_tooSmall);   /* overwrite beyond dst buffer */ |     if (oMatchEnd > oend) return ERROR(dstSize_tooSmall);   /* overwrite beyond dst buffer */ | ||||||
|     if (litEnd > litLimit_8) return ERROR(corruption_detected);   /* risk read beyond lit buffer */ |     if (litEnd > litLimit) return ERROR(corruption_detected);   /* risk read beyond lit buffer */ | ||||||
|  |  | ||||||
|     /* copy Literals */ |     /* copy Literals */ | ||||||
|     ZSTDv05_wildcopy(op, *litPtr, sequence.litLength);   /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */ |     ZSTDv05_wildcopy(op, *litPtr, sequence.litLength);   /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */ | ||||||
| @@ -3378,7 +3376,6 @@ static size_t ZSTDv05_decompressSequences( | |||||||
|     BYTE* const oend = ostart + maxDstSize; |     BYTE* const oend = ostart + maxDstSize; | ||||||
|     size_t errorCode, dumpsLength; |     size_t errorCode, dumpsLength; | ||||||
|     const BYTE* litPtr = dctx->litPtr; |     const BYTE* litPtr = dctx->litPtr; | ||||||
|     const BYTE* const litLimit_8 = litPtr + dctx->litBufSize - 8; |  | ||||||
|     const BYTE* const litEnd = litPtr + dctx->litSize; |     const BYTE* const litEnd = litPtr + dctx->litSize; | ||||||
|     int nbSeq; |     int nbSeq; | ||||||
|     const BYTE* dumps; |     const BYTE* dumps; | ||||||
| @@ -3416,7 +3413,7 @@ static size_t ZSTDv05_decompressSequences( | |||||||
|             size_t oneSeqSize; |             size_t oneSeqSize; | ||||||
|             nbSeq--; |             nbSeq--; | ||||||
|             ZSTDv05_decodeSequence(&sequence, &seqState); |             ZSTDv05_decodeSequence(&sequence, &seqState); | ||||||
|             oneSeqSize = ZSTDv05_execSequence(op, oend, sequence, &litPtr, litLimit_8, base, vBase, dictEnd); |             oneSeqSize = ZSTDv05_execSequence(op, oend, sequence, &litPtr, litEnd, base, vBase, dictEnd); | ||||||
|             if (ZSTDv05_isError(oneSeqSize)) return oneSeqSize; |             if (ZSTDv05_isError(oneSeqSize)) return oneSeqSize; | ||||||
|             op += oneSeqSize; |             op += oneSeqSize; | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -2893,7 +2893,6 @@ struct ZSTDv06_DCtx_s | |||||||
|     ZSTDv06_dStage stage; |     ZSTDv06_dStage stage; | ||||||
|     U32 flagRepeatTable; |     U32 flagRepeatTable; | ||||||
|     const BYTE* litPtr; |     const BYTE* litPtr; | ||||||
|     size_t litBufSize; |  | ||||||
|     size_t litSize; |     size_t litSize; | ||||||
|     BYTE litBuffer[ZSTDv06_BLOCKSIZE_MAX + WILDCOPY_OVERLENGTH]; |     BYTE litBuffer[ZSTDv06_BLOCKSIZE_MAX + WILDCOPY_OVERLENGTH]; | ||||||
|     BYTE headerBuffer[ZSTDv06_FRAMEHEADERSIZE_MAX]; |     BYTE headerBuffer[ZSTDv06_FRAMEHEADERSIZE_MAX]; | ||||||
| @@ -3170,8 +3169,8 @@ size_t ZSTDv06_decodeLiteralsBlock(ZSTDv06_DCtx* dctx, | |||||||
|                 return ERROR(corruption_detected); |                 return ERROR(corruption_detected); | ||||||
|  |  | ||||||
|             dctx->litPtr = dctx->litBuffer; |             dctx->litPtr = dctx->litBuffer; | ||||||
|             dctx->litBufSize = ZSTDv06_BLOCKSIZE_MAX+8; |  | ||||||
|             dctx->litSize = litSize; |             dctx->litSize = litSize; | ||||||
|  |             memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH); | ||||||
|             return litCSize + lhSize; |             return litCSize + lhSize; | ||||||
|         } |         } | ||||||
|     case IS_PCH: |     case IS_PCH: | ||||||
| @@ -3192,8 +3191,8 @@ size_t ZSTDv06_decodeLiteralsBlock(ZSTDv06_DCtx* dctx, | |||||||
|                 if (HUFv06_isError(errorCode)) return ERROR(corruption_detected); |                 if (HUFv06_isError(errorCode)) return ERROR(corruption_detected); | ||||||
|             } |             } | ||||||
|             dctx->litPtr = dctx->litBuffer; |             dctx->litPtr = dctx->litBuffer; | ||||||
|             dctx->litBufSize = ZSTDv06_BLOCKSIZE_MAX+WILDCOPY_OVERLENGTH; |  | ||||||
|             dctx->litSize = litSize; |             dctx->litSize = litSize; | ||||||
|  |             memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH); | ||||||
|             return litCSize + lhSize; |             return litCSize + lhSize; | ||||||
|         } |         } | ||||||
|     case IS_RAW: |     case IS_RAW: | ||||||
| @@ -3217,13 +3216,12 @@ size_t ZSTDv06_decodeLiteralsBlock(ZSTDv06_DCtx* dctx, | |||||||
|                 if (litSize+lhSize > srcSize) return ERROR(corruption_detected); |                 if (litSize+lhSize > srcSize) return ERROR(corruption_detected); | ||||||
|                 memcpy(dctx->litBuffer, istart+lhSize, litSize); |                 memcpy(dctx->litBuffer, istart+lhSize, litSize); | ||||||
|                 dctx->litPtr = dctx->litBuffer; |                 dctx->litPtr = dctx->litBuffer; | ||||||
|                 dctx->litBufSize = ZSTDv06_BLOCKSIZE_MAX+8; |  | ||||||
|                 dctx->litSize = litSize; |                 dctx->litSize = litSize; | ||||||
|  |                 memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH); | ||||||
|                 return lhSize+litSize; |                 return lhSize+litSize; | ||||||
|             } |             } | ||||||
|             /* direct reference into compressed stream */ |             /* direct reference into compressed stream */ | ||||||
|             dctx->litPtr = istart+lhSize; |             dctx->litPtr = istart+lhSize; | ||||||
|             dctx->litBufSize = srcSize-lhSize; |  | ||||||
|             dctx->litSize = litSize; |             dctx->litSize = litSize; | ||||||
|             return lhSize+litSize; |             return lhSize+litSize; | ||||||
|         } |         } | ||||||
| @@ -3247,8 +3245,8 @@ size_t ZSTDv06_decodeLiteralsBlock(ZSTDv06_DCtx* dctx, | |||||||
|             if (litSize > ZSTDv06_BLOCKSIZE_MAX) return ERROR(corruption_detected); |             if (litSize > ZSTDv06_BLOCKSIZE_MAX) return ERROR(corruption_detected); | ||||||
|             memset(dctx->litBuffer, istart[lhSize], litSize); |             memset(dctx->litBuffer, istart[lhSize], litSize); | ||||||
|             dctx->litPtr = dctx->litBuffer; |             dctx->litPtr = dctx->litBuffer; | ||||||
|             dctx->litBufSize = ZSTDv06_BLOCKSIZE_MAX+WILDCOPY_OVERLENGTH; |  | ||||||
|             dctx->litSize = litSize; |             dctx->litSize = litSize; | ||||||
|  |             memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH); | ||||||
|             return lhSize+1; |             return lhSize+1; | ||||||
|         } |         } | ||||||
|     default: |     default: | ||||||
| @@ -3438,7 +3436,7 @@ static void ZSTDv06_decodeSequence(seq_t* seq, seqState_t* seqState) | |||||||
|  |  | ||||||
| size_t ZSTDv06_execSequence(BYTE* op, | size_t ZSTDv06_execSequence(BYTE* op, | ||||||
|                                 BYTE* const oend, seq_t sequence, |                                 BYTE* const oend, seq_t sequence, | ||||||
|                                 const BYTE** litPtr, const BYTE* const litLimit_8, |                                 const BYTE** litPtr, const BYTE* const litLimit, | ||||||
|                                 const BYTE* const base, const BYTE* const vBase, const BYTE* const dictEnd) |                                 const BYTE* const base, const BYTE* const vBase, const BYTE* const dictEnd) | ||||||
| { | { | ||||||
|     BYTE* const oLitEnd = op + sequence.litLength; |     BYTE* const oLitEnd = op + sequence.litLength; | ||||||
| @@ -3451,7 +3449,7 @@ size_t ZSTDv06_execSequence(BYTE* op, | |||||||
|     /* check */ |     /* check */ | ||||||
|     if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall);   /* last match must start at a minimum distance of 8 from oend */ |     if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall);   /* last match must start at a minimum distance of 8 from oend */ | ||||||
|     if (oMatchEnd > oend) return ERROR(dstSize_tooSmall);   /* overwrite beyond dst buffer */ |     if (oMatchEnd > oend) return ERROR(dstSize_tooSmall);   /* overwrite beyond dst buffer */ | ||||||
|     if (iLitEnd > litLimit_8) return ERROR(corruption_detected);   /* over-read beyond lit buffer */ |     if (iLitEnd > litLimit) return ERROR(corruption_detected);   /* over-read beyond lit buffer */ | ||||||
|  |  | ||||||
|     /* copy Literals */ |     /* copy Literals */ | ||||||
|     ZSTDv06_wildcopy(op, *litPtr, sequence.litLength);   /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */ |     ZSTDv06_wildcopy(op, *litPtr, sequence.litLength);   /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */ | ||||||
| @@ -3523,7 +3521,6 @@ static size_t ZSTDv06_decompressSequences( | |||||||
|     BYTE* const oend = ostart + maxDstSize; |     BYTE* const oend = ostart + maxDstSize; | ||||||
|     BYTE* op = ostart; |     BYTE* op = ostart; | ||||||
|     const BYTE* litPtr = dctx->litPtr; |     const BYTE* litPtr = dctx->litPtr; | ||||||
|     const BYTE* const litLimit_8 = litPtr + dctx->litBufSize - 8; |  | ||||||
|     const BYTE* const litEnd = litPtr + dctx->litSize; |     const BYTE* const litEnd = litPtr + dctx->litSize; | ||||||
|     FSEv06_DTable* DTableLL = dctx->LLTable; |     FSEv06_DTable* DTableLL = dctx->LLTable; | ||||||
|     FSEv06_DTable* DTableML = dctx->MLTable; |     FSEv06_DTable* DTableML = dctx->MLTable; | ||||||
| @@ -3567,7 +3564,7 @@ static size_t ZSTDv06_decompressSequences( | |||||||
|                        pos, (U32)sequence.litLength, (U32)sequence.matchLength, (U32)sequence.offset); |                        pos, (U32)sequence.litLength, (U32)sequence.matchLength, (U32)sequence.offset); | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|             {   size_t const oneSeqSize = ZSTDv06_execSequence(op, oend, sequence, &litPtr, litLimit_8, base, vBase, dictEnd); |             {   size_t const oneSeqSize = ZSTDv06_execSequence(op, oend, sequence, &litPtr, litEnd, base, vBase, dictEnd); | ||||||
|                 if (ZSTDv06_isError(oneSeqSize)) return oneSeqSize; |                 if (ZSTDv06_isError(oneSeqSize)) return oneSeqSize; | ||||||
|                 op += oneSeqSize; |                 op += oneSeqSize; | ||||||
|         }   } |         }   } | ||||||
|   | |||||||
| @@ -3021,7 +3021,6 @@ struct ZSTDv07_DCtx_s | |||||||
|     U32 dictID; |     U32 dictID; | ||||||
|     const BYTE* litPtr; |     const BYTE* litPtr; | ||||||
|     ZSTDv07_customMem customMem; |     ZSTDv07_customMem customMem; | ||||||
|     size_t litBufSize; |  | ||||||
|     size_t litSize; |     size_t litSize; | ||||||
|     BYTE litBuffer[ZSTDv07_BLOCKSIZE_ABSOLUTEMAX + WILDCOPY_OVERLENGTH]; |     BYTE litBuffer[ZSTDv07_BLOCKSIZE_ABSOLUTEMAX + WILDCOPY_OVERLENGTH]; | ||||||
|     BYTE headerBuffer[ZSTDv07_FRAMEHEADERSIZE_MAX]; |     BYTE headerBuffer[ZSTDv07_FRAMEHEADERSIZE_MAX]; | ||||||
| @@ -3395,9 +3394,9 @@ size_t ZSTDv07_decodeLiteralsBlock(ZSTDv07_DCtx* dctx, | |||||||
|                 return ERROR(corruption_detected); |                 return ERROR(corruption_detected); | ||||||
|  |  | ||||||
|             dctx->litPtr = dctx->litBuffer; |             dctx->litPtr = dctx->litBuffer; | ||||||
|             dctx->litBufSize = ZSTDv07_BLOCKSIZE_ABSOLUTEMAX+8; |  | ||||||
|             dctx->litSize = litSize; |             dctx->litSize = litSize; | ||||||
|             dctx->litEntropy = 1; |             dctx->litEntropy = 1; | ||||||
|  |             memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH); | ||||||
|             return litCSize + lhSize; |             return litCSize + lhSize; | ||||||
|         } |         } | ||||||
|     case lbt_repeat: |     case lbt_repeat: | ||||||
| @@ -3418,8 +3417,8 @@ size_t ZSTDv07_decodeLiteralsBlock(ZSTDv07_DCtx* dctx, | |||||||
|                 if (HUFv07_isError(errorCode)) return ERROR(corruption_detected); |                 if (HUFv07_isError(errorCode)) return ERROR(corruption_detected); | ||||||
|             } |             } | ||||||
|             dctx->litPtr = dctx->litBuffer; |             dctx->litPtr = dctx->litBuffer; | ||||||
|             dctx->litBufSize = ZSTDv07_BLOCKSIZE_ABSOLUTEMAX+WILDCOPY_OVERLENGTH; |  | ||||||
|             dctx->litSize = litSize; |             dctx->litSize = litSize; | ||||||
|  |             memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH); | ||||||
|             return litCSize + lhSize; |             return litCSize + lhSize; | ||||||
|         } |         } | ||||||
|     case lbt_raw: |     case lbt_raw: | ||||||
| @@ -3443,13 +3442,12 @@ size_t ZSTDv07_decodeLiteralsBlock(ZSTDv07_DCtx* dctx, | |||||||
|                 if (litSize+lhSize > srcSize) return ERROR(corruption_detected); |                 if (litSize+lhSize > srcSize) return ERROR(corruption_detected); | ||||||
|                 memcpy(dctx->litBuffer, istart+lhSize, litSize); |                 memcpy(dctx->litBuffer, istart+lhSize, litSize); | ||||||
|                 dctx->litPtr = dctx->litBuffer; |                 dctx->litPtr = dctx->litBuffer; | ||||||
|                 dctx->litBufSize = ZSTDv07_BLOCKSIZE_ABSOLUTEMAX+8; |  | ||||||
|                 dctx->litSize = litSize; |                 dctx->litSize = litSize; | ||||||
|  |                 memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH); | ||||||
|                 return lhSize+litSize; |                 return lhSize+litSize; | ||||||
|             } |             } | ||||||
|             /* direct reference into compressed stream */ |             /* direct reference into compressed stream */ | ||||||
|             dctx->litPtr = istart+lhSize; |             dctx->litPtr = istart+lhSize; | ||||||
|             dctx->litBufSize = srcSize-lhSize; |  | ||||||
|             dctx->litSize = litSize; |             dctx->litSize = litSize; | ||||||
|             return lhSize+litSize; |             return lhSize+litSize; | ||||||
|         } |         } | ||||||
| @@ -3473,8 +3471,8 @@ size_t ZSTDv07_decodeLiteralsBlock(ZSTDv07_DCtx* dctx, | |||||||
|             if (litSize > ZSTDv07_BLOCKSIZE_ABSOLUTEMAX) return ERROR(corruption_detected); |             if (litSize > ZSTDv07_BLOCKSIZE_ABSOLUTEMAX) return ERROR(corruption_detected); | ||||||
|             memset(dctx->litBuffer, istart[lhSize], litSize); |             memset(dctx->litBuffer, istart[lhSize], litSize); | ||||||
|             dctx->litPtr = dctx->litBuffer; |             dctx->litPtr = dctx->litBuffer; | ||||||
|             dctx->litBufSize = ZSTDv07_BLOCKSIZE_ABSOLUTEMAX+WILDCOPY_OVERLENGTH; |  | ||||||
|             dctx->litSize = litSize; |             dctx->litSize = litSize; | ||||||
|  |             memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH); | ||||||
|             return lhSize+1; |             return lhSize+1; | ||||||
|         } |         } | ||||||
|     default: |     default: | ||||||
| @@ -3662,7 +3660,7 @@ static seq_t ZSTDv07_decodeSequence(seqState_t* seqState) | |||||||
| static | static | ||||||
| size_t ZSTDv07_execSequence(BYTE* op, | size_t ZSTDv07_execSequence(BYTE* op, | ||||||
|                                 BYTE* const oend, seq_t sequence, |                                 BYTE* const oend, seq_t sequence, | ||||||
|                                 const BYTE** litPtr, const BYTE* const litLimit_w, |                                 const BYTE** litPtr, const BYTE* const litLimit, | ||||||
|                                 const BYTE* const base, const BYTE* const vBase, const BYTE* const dictEnd) |                                 const BYTE* const base, const BYTE* const vBase, const BYTE* const dictEnd) | ||||||
| { | { | ||||||
|     BYTE* const oLitEnd = op + sequence.litLength; |     BYTE* const oLitEnd = op + sequence.litLength; | ||||||
| @@ -3674,7 +3672,7 @@ size_t ZSTDv07_execSequence(BYTE* op, | |||||||
|  |  | ||||||
|     /* check */ |     /* check */ | ||||||
|     if ((oLitEnd>oend_w) | (oMatchEnd>oend)) return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of WILDCOPY_OVERLENGTH from oend */ |     if ((oLitEnd>oend_w) | (oMatchEnd>oend)) return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of WILDCOPY_OVERLENGTH from oend */ | ||||||
|     if (iLitEnd > litLimit_w) return ERROR(corruption_detected);   /* over-read beyond lit buffer */ |     if (iLitEnd > litLimit) return ERROR(corruption_detected);   /* over-read beyond lit buffer */ | ||||||
|  |  | ||||||
|     /* copy Literals */ |     /* copy Literals */ | ||||||
|     ZSTDv07_wildcopy(op, *litPtr, sequence.litLength);   /* note : since oLitEnd <= oend-WILDCOPY_OVERLENGTH, no risk of overwrite beyond oend */ |     ZSTDv07_wildcopy(op, *litPtr, sequence.litLength);   /* note : since oLitEnd <= oend-WILDCOPY_OVERLENGTH, no risk of overwrite beyond oend */ | ||||||
| @@ -3746,7 +3744,6 @@ static size_t ZSTDv07_decompressSequences( | |||||||
|     BYTE* const oend = ostart + maxDstSize; |     BYTE* const oend = ostart + maxDstSize; | ||||||
|     BYTE* op = ostart; |     BYTE* op = ostart; | ||||||
|     const BYTE* litPtr = dctx->litPtr; |     const BYTE* litPtr = dctx->litPtr; | ||||||
|     const BYTE* const litLimit_w = litPtr + dctx->litBufSize - WILDCOPY_OVERLENGTH; |  | ||||||
|     const BYTE* const litEnd = litPtr + dctx->litSize; |     const BYTE* const litEnd = litPtr + dctx->litSize; | ||||||
|     FSEv07_DTable* DTableLL = dctx->LLTable; |     FSEv07_DTable* DTableLL = dctx->LLTable; | ||||||
|     FSEv07_DTable* DTableML = dctx->MLTable; |     FSEv07_DTable* DTableML = dctx->MLTable; | ||||||
| @@ -3776,7 +3773,7 @@ static size_t ZSTDv07_decompressSequences( | |||||||
|         for ( ; (BITv07_reloadDStream(&(seqState.DStream)) <= BITv07_DStream_completed) && nbSeq ; ) { |         for ( ; (BITv07_reloadDStream(&(seqState.DStream)) <= BITv07_DStream_completed) && nbSeq ; ) { | ||||||
|             nbSeq--; |             nbSeq--; | ||||||
|             {   seq_t const sequence = ZSTDv07_decodeSequence(&seqState); |             {   seq_t const sequence = ZSTDv07_decodeSequence(&seqState); | ||||||
|                 size_t const oneSeqSize = ZSTDv07_execSequence(op, oend, sequence, &litPtr, litLimit_w, base, vBase, dictEnd); |                 size_t const oneSeqSize = ZSTDv07_execSequence(op, oend, sequence, &litPtr, litEnd, base, vBase, dictEnd); | ||||||
|                 if (ZSTDv07_isError(oneSeqSize)) return oneSeqSize; |                 if (ZSTDv07_isError(oneSeqSize)) return oneSeqSize; | ||||||
|                 op += oneSeqSize; |                 op += oneSeqSize; | ||||||
|         }   } |         }   } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user