2 * Copyright (c) 2016-present, Yann Collet, Facebook, Inc.
5 * This source code is licensed under both the BSD-style license (found in the
6 * LICENSE file in the root directory of this source tree) and the GPLv2 (found
7 * in the COPYING file in the root directory of this source tree).
8 * You may select, at your option, one of the above-listed licenses.
12 /* ***************************************************************
14 *****************************************************************/
17 * Select how default decompression function ZSTD_decompress() allocates its context,
18 * on stack (0), or into heap (1, default; requires malloc()).
19 * Note that functions with explicit context such as ZSTD_decompressDCtx() are unaffected.
22 # define ZSTD_HEAPMODE 1
27 * if set to 1+, ZSTD_decompress() can decode older formats (v0.1+)
29 #ifndef ZSTD_LEGACY_SUPPORT
30 # define ZSTD_LEGACY_SUPPORT 0
34 * MAXWINDOWSIZE_DEFAULT :
35 * maximum window size accepted by DStream __by default__.
36 * Frames requiring more memory will be rejected.
37 * It's possible to set a different limit using ZSTD_DCtx_setMaxWindowSize().
39 #ifndef ZSTD_MAXWINDOWSIZE_DEFAULT
40 # define ZSTD_MAXWINDOWSIZE_DEFAULT (((U32)1 << ZSTD_WINDOWLOG_DEFAULTMAX) + 1)
44 /*-*******************************************************
46 *********************************************************/
47 #include <string.h> /* memcpy, memmove, memset */
49 #include "mem.h" /* low level memory routines */
50 #define FSE_STATIC_LINKING_ONLY
52 #define HUF_STATIC_LINKING_ONLY
54 #include "zstd_internal.h"
56 #if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT>=1)
57 # include "zstd_legacy.h"
61 /*-*************************************
63 ***************************************/
64 #define ZSTD_isError ERR_isError /* for inlining */
65 #define FSE_isError ERR_isError
66 #define HUF_isError ERR_isError
69 /*_*******************************************************
71 **********************************************************/
72 static void ZSTD_copy4(void* dst, const void* src) { memcpy(dst, src, 4); }
75 /*-*************************************************************
77 ***************************************************************/
78 typedef enum { ZSTDds_getFrameHeaderSize, ZSTDds_decodeFrameHeader,
79 ZSTDds_decodeBlockHeader, ZSTDds_decompressBlock,
80 ZSTDds_decompressLastBlock, ZSTDds_checkChecksum,
81 ZSTDds_decodeSkippableHeader, ZSTDds_skipFrame } ZSTD_dStage;
83 typedef enum { zdss_init=0, zdss_loadHeader,
84 zdss_read, zdss_load, zdss_flush } ZSTD_dStreamStage;
90 } ZSTD_seqSymbol_header;
94 BYTE nbAdditionalBits;
99 #define SEQSYMBOL_TABLE_SIZE(log) (1 + (1 << (log)))
102 ZSTD_seqSymbol LLTable[SEQSYMBOL_TABLE_SIZE(LLFSELog)];
103 ZSTD_seqSymbol OFTable[SEQSYMBOL_TABLE_SIZE(OffFSELog)];
104 ZSTD_seqSymbol MLTable[SEQSYMBOL_TABLE_SIZE(MLFSELog)];
105 HUF_DTable hufTable[HUF_DTABLE_SIZE(HufLog)]; /* can accommodate HUF_decompress4X */
106 U32 workspace[HUF_DECOMPRESS_WORKSPACE_SIZE_U32];
107 U32 rep[ZSTD_REP_NUM];
108 } ZSTD_entropyDTables_t;
112 const ZSTD_seqSymbol* LLTptr;
113 const ZSTD_seqSymbol* MLTptr;
114 const ZSTD_seqSymbol* OFTptr;
115 const HUF_DTable* HUFptr;
116 ZSTD_entropyDTables_t entropy;
117 const void* previousDstEnd; /* detect continuity */
118 const void* base; /* start of current segment */
119 const void* vBase; /* virtual start of previous segment if it was just before current one */
120 const void* dictEnd; /* end of previous segment */
122 ZSTD_frameHeader fParams;
124 blockType_e bType; /* used in ZSTD_decompressContinue(), store blockType between block header decoding and block decompression stages */
128 XXH64_state_t xxhState;
131 ZSTD_format_e format;
133 ZSTD_customMem customMem;
137 int bmi2; /* == 1 if the CPU supports BMI2 and 0 otherwise. CPU support is determined dynamically once per context lifetime. */
140 ZSTD_DDict* ddictLocal;
141 const ZSTD_DDict* ddict;
142 ZSTD_dStreamStage streamStage;
146 size_t maxWindowSize;
153 U32 previousLegacyVersion;
158 BYTE litBuffer[ZSTD_BLOCKSIZE_MAX + WILDCOPY_OVERLENGTH];
159 BYTE headerBuffer[ZSTD_FRAMEHEADERSIZE_MAX];
160 }; /* typedef'd to ZSTD_DCtx within "zstd.h" */
162 size_t ZSTD_sizeof_DCtx (const ZSTD_DCtx* dctx)
164 if (dctx==NULL) return 0; /* support sizeof NULL */
166 + ZSTD_sizeof_DDict(dctx->ddictLocal)
167 + dctx->inBuffSize + dctx->outBuffSize;
170 size_t ZSTD_estimateDCtxSize(void) { return sizeof(ZSTD_DCtx); }
173 static size_t ZSTD_startingInputLength(ZSTD_format_e format)
175 size_t const startingInputLength = (format==ZSTD_f_zstd1_magicless) ?
176 ZSTD_frameHeaderSize_prefix - ZSTD_frameIdSize :
177 ZSTD_frameHeaderSize_prefix;
178 ZSTD_STATIC_ASSERT(ZSTD_FRAMEHEADERSIZE_PREFIX >= ZSTD_FRAMEIDSIZE);
179 /* only supports formats ZSTD_f_zstd1 and ZSTD_f_zstd1_magicless */
180 assert( (format == ZSTD_f_zstd1) || (format == ZSTD_f_zstd1_magicless) );
181 return startingInputLength;
184 static void ZSTD_initDCtx_internal(ZSTD_DCtx* dctx)
186 dctx->format = ZSTD_f_zstd1; /* ZSTD_decompressBegin() invokes ZSTD_startingInputLength() with argument dctx->format */
187 dctx->staticSize = 0;
188 dctx->maxWindowSize = ZSTD_MAXWINDOWSIZE_DEFAULT;
190 dctx->ddictLocal = NULL;
192 dctx->inBuffSize = 0;
193 dctx->outBuffSize = 0;
194 dctx->streamStage = zdss_init;
195 dctx->bmi2 = ZSTD_cpuid_bmi2(ZSTD_cpuid());
198 ZSTD_DCtx* ZSTD_initStaticDCtx(void *workspace, size_t workspaceSize)
200 ZSTD_DCtx* const dctx = (ZSTD_DCtx*) workspace;
202 if ((size_t)workspace & 7) return NULL; /* 8-aligned */
203 if (workspaceSize < sizeof(ZSTD_DCtx)) return NULL; /* minimum size */
205 ZSTD_initDCtx_internal(dctx);
206 dctx->staticSize = workspaceSize;
207 dctx->inBuff = (char*)(dctx+1);
211 ZSTD_DCtx* ZSTD_createDCtx_advanced(ZSTD_customMem customMem)
213 if (!customMem.customAlloc ^ !customMem.customFree) return NULL;
215 { ZSTD_DCtx* const dctx = (ZSTD_DCtx*)ZSTD_malloc(sizeof(*dctx), customMem);
216 if (!dctx) return NULL;
217 dctx->customMem = customMem;
218 dctx->legacyContext = NULL;
219 dctx->previousLegacyVersion = 0;
220 ZSTD_initDCtx_internal(dctx);
225 ZSTD_DCtx* ZSTD_createDCtx(void)
227 DEBUGLOG(3, "ZSTD_createDCtx");
228 return ZSTD_createDCtx_advanced(ZSTD_defaultCMem);
231 size_t ZSTD_freeDCtx(ZSTD_DCtx* dctx)
233 if (dctx==NULL) return 0; /* support free on NULL */
234 if (dctx->staticSize) return ERROR(memory_allocation); /* not compatible with static DCtx */
235 { ZSTD_customMem const cMem = dctx->customMem;
236 ZSTD_freeDDict(dctx->ddictLocal);
237 dctx->ddictLocal = NULL;
238 ZSTD_free(dctx->inBuff, cMem);
240 #if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT >= 1)
241 if (dctx->legacyContext)
242 ZSTD_freeLegacyStreamContext(dctx->legacyContext, dctx->previousLegacyVersion);
244 ZSTD_free(dctx, cMem);
249 /* no longer useful */
250 void ZSTD_copyDCtx(ZSTD_DCtx* dstDCtx, const ZSTD_DCtx* srcDCtx)
252 size_t const toCopy = (size_t)((char*)(&dstDCtx->inBuff) - (char*)dstDCtx);
253 memcpy(dstDCtx, srcDCtx, toCopy); /* no need to copy workspace */
257 /*-*************************************************************
258 * Frame header decoding
259 ***************************************************************/
262 * Tells if the content of `buffer` starts with a valid Frame Identifier.
263 * Note : Frame Identifier is 4 bytes. If `size < 4`, @return will always be 0.
264 * Note 2 : Legacy Frame Identifiers are considered valid only if Legacy Support is enabled.
265 * Note 3 : Skippable Frame Identifiers are considered valid. */
266 unsigned ZSTD_isFrame(const void* buffer, size_t size)
268 if (size < ZSTD_frameIdSize) return 0;
269 { U32 const magic = MEM_readLE32(buffer);
270 if (magic == ZSTD_MAGICNUMBER) return 1;
271 if ((magic & 0xFFFFFFF0U) == ZSTD_MAGIC_SKIPPABLE_START) return 1;
273 #if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT >= 1)
274 if (ZSTD_isLegacy(buffer, size)) return 1;
279 /** ZSTD_frameHeaderSize_internal() :
280 * srcSize must be large enough to reach header size fields.
281 * note : only works for formats ZSTD_f_zstd1 and ZSTD_f_zstd1_magicless.
282 * @return : size of the Frame Header
283 * or an error code, which can be tested with ZSTD_isError() */
284 static size_t ZSTD_frameHeaderSize_internal(const void* src, size_t srcSize, ZSTD_format_e format)
286 size_t const minInputSize = ZSTD_startingInputLength(format);
287 if (srcSize < minInputSize) return ERROR(srcSize_wrong);
289 { BYTE const fhd = ((const BYTE*)src)[minInputSize-1];
290 U32 const dictID= fhd & 3;
291 U32 const singleSegment = (fhd >> 5) & 1;
292 U32 const fcsId = fhd >> 6;
293 return minInputSize + !singleSegment
294 + ZSTD_did_fieldSize[dictID] + ZSTD_fcs_fieldSize[fcsId]
295 + (singleSegment && !fcsId);
299 /** ZSTD_frameHeaderSize() :
300 * srcSize must be >= ZSTD_frameHeaderSize_prefix.
301 * @return : size of the Frame Header */
302 size_t ZSTD_frameHeaderSize(const void* src, size_t srcSize)
304 return ZSTD_frameHeaderSize_internal(src, srcSize, ZSTD_f_zstd1);
308 /** ZSTD_getFrameHeader_internal() :
309 * decode Frame Header, or require larger `srcSize`.
310 * note : only works for formats ZSTD_f_zstd1 and ZSTD_f_zstd1_magicless
311 * @return : 0, `zfhPtr` is correctly filled,
312 * >0, `srcSize` is too small, value is wanted `srcSize` amount,
313 * or an error code, which can be tested using ZSTD_isError() */
314 static size_t ZSTD_getFrameHeader_internal(ZSTD_frameHeader* zfhPtr, const void* src, size_t srcSize, ZSTD_format_e format)
316 const BYTE* ip = (const BYTE*)src;
317 size_t const minInputSize = ZSTD_startingInputLength(format);
319 if (srcSize < minInputSize) return minInputSize;
321 if ( (format != ZSTD_f_zstd1_magicless)
322 && (MEM_readLE32(src) != ZSTD_MAGICNUMBER) ) {
323 if ((MEM_readLE32(src) & 0xFFFFFFF0U) == ZSTD_MAGIC_SKIPPABLE_START) {
324 /* skippable frame */
325 if (srcSize < ZSTD_skippableHeaderSize)
326 return ZSTD_skippableHeaderSize; /* magic number + frame length */
327 memset(zfhPtr, 0, sizeof(*zfhPtr));
328 zfhPtr->frameContentSize = MEM_readLE32((const char *)src + ZSTD_frameIdSize);
329 zfhPtr->frameType = ZSTD_skippableFrame;
332 return ERROR(prefix_unknown);
335 /* ensure there is enough `srcSize` to fully read/decode frame header */
336 { size_t const fhsize = ZSTD_frameHeaderSize_internal(src, srcSize, format);
337 if (srcSize < fhsize) return fhsize;
338 zfhPtr->headerSize = (U32)fhsize;
341 { BYTE const fhdByte = ip[minInputSize-1];
342 size_t pos = minInputSize;
343 U32 const dictIDSizeCode = fhdByte&3;
344 U32 const checksumFlag = (fhdByte>>2)&1;
345 U32 const singleSegment = (fhdByte>>5)&1;
346 U32 const fcsID = fhdByte>>6;
349 U64 frameContentSize = ZSTD_CONTENTSIZE_UNKNOWN;
350 if ((fhdByte & 0x08) != 0)
351 return ERROR(frameParameter_unsupported); /* reserved bits, must be zero */
353 if (!singleSegment) {
354 BYTE const wlByte = ip[pos++];
355 U32 const windowLog = (wlByte >> 3) + ZSTD_WINDOWLOG_ABSOLUTEMIN;
356 if (windowLog > ZSTD_WINDOWLOG_MAX)
357 return ERROR(frameParameter_windowTooLarge);
358 windowSize = (1ULL << windowLog);
359 windowSize += (windowSize >> 3) * (wlByte&7);
361 switch(dictIDSizeCode)
363 default: assert(0); /* impossible */
365 case 1 : dictID = ip[pos]; pos++; break;
366 case 2 : dictID = MEM_readLE16(ip+pos); pos+=2; break;
367 case 3 : dictID = MEM_readLE32(ip+pos); pos+=4; break;
371 default: assert(0); /* impossible */
372 case 0 : if (singleSegment) frameContentSize = ip[pos]; break;
373 case 1 : frameContentSize = MEM_readLE16(ip+pos)+256; break;
374 case 2 : frameContentSize = MEM_readLE32(ip+pos); break;
375 case 3 : frameContentSize = MEM_readLE64(ip+pos); break;
377 if (singleSegment) windowSize = frameContentSize;
379 zfhPtr->frameType = ZSTD_frame;
380 zfhPtr->frameContentSize = frameContentSize;
381 zfhPtr->windowSize = windowSize;
382 zfhPtr->blockSizeMax = (unsigned) MIN(windowSize, ZSTD_BLOCKSIZE_MAX);
383 zfhPtr->dictID = dictID;
384 zfhPtr->checksumFlag = checksumFlag;
389 /** ZSTD_getFrameHeader() :
390 * decode Frame Header, or require larger `srcSize`.
391 * note : this function does not consume input, it only reads it.
392 * @return : 0, `zfhPtr` is correctly filled,
393 * >0, `srcSize` is too small, value is wanted `srcSize` amount,
394 * or an error code, which can be tested using ZSTD_isError() */
395 size_t ZSTD_getFrameHeader(ZSTD_frameHeader* zfhPtr, const void* src, size_t srcSize)
397 return ZSTD_getFrameHeader_internal(zfhPtr, src, srcSize, ZSTD_f_zstd1);
401 /** ZSTD_getFrameContentSize() :
402 * compatible with legacy mode
403 * @return : decompressed size of the single frame pointed to be `src` if known, otherwise
404 * - ZSTD_CONTENTSIZE_UNKNOWN if the size cannot be determined
405 * - ZSTD_CONTENTSIZE_ERROR if an error occurred (e.g. invalid magic number, srcSize too small) */
406 unsigned long long ZSTD_getFrameContentSize(const void *src, size_t srcSize)
408 #if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT >= 1)
409 if (ZSTD_isLegacy(src, srcSize)) {
410 unsigned long long const ret = ZSTD_getDecompressedSize_legacy(src, srcSize);
411 return ret == 0 ? ZSTD_CONTENTSIZE_UNKNOWN : ret;
414 { ZSTD_frameHeader zfh;
415 if (ZSTD_getFrameHeader(&zfh, src, srcSize) != 0)
416 return ZSTD_CONTENTSIZE_ERROR;
417 if (zfh.frameType == ZSTD_skippableFrame) {
420 return zfh.frameContentSize;
424 /** ZSTD_findDecompressedSize() :
425 * compatible with legacy mode
426 * `srcSize` must be the exact length of some number of ZSTD compressed and/or
428 * @return : decompressed size of the frames contained */
429 unsigned long long ZSTD_findDecompressedSize(const void* src, size_t srcSize)
431 unsigned long long totalDstSize = 0;
433 while (srcSize >= ZSTD_frameHeaderSize_prefix) {
434 U32 const magicNumber = MEM_readLE32(src);
436 if ((magicNumber & 0xFFFFFFF0U) == ZSTD_MAGIC_SKIPPABLE_START) {
437 size_t skippableSize;
438 if (srcSize < ZSTD_skippableHeaderSize)
439 return ERROR(srcSize_wrong);
440 skippableSize = MEM_readLE32((const BYTE *)src + ZSTD_frameIdSize)
441 + ZSTD_skippableHeaderSize;
442 if (srcSize < skippableSize) {
443 return ZSTD_CONTENTSIZE_ERROR;
446 src = (const BYTE *)src + skippableSize;
447 srcSize -= skippableSize;
451 { unsigned long long const ret = ZSTD_getFrameContentSize(src, srcSize);
452 if (ret >= ZSTD_CONTENTSIZE_ERROR) return ret;
454 /* check for overflow */
455 if (totalDstSize + ret < totalDstSize) return ZSTD_CONTENTSIZE_ERROR;
458 { size_t const frameSrcSize = ZSTD_findFrameCompressedSize(src, srcSize);
459 if (ZSTD_isError(frameSrcSize)) {
460 return ZSTD_CONTENTSIZE_ERROR;
463 src = (const BYTE *)src + frameSrcSize;
464 srcSize -= frameSrcSize;
466 } /* while (srcSize >= ZSTD_frameHeaderSize_prefix) */
468 if (srcSize) return ZSTD_CONTENTSIZE_ERROR;
473 /** ZSTD_getDecompressedSize() :
474 * compatible with legacy mode
475 * @return : decompressed size if known, 0 otherwise
476 note : 0 can mean any of the following :
477 - frame content is empty
478 - decompressed size field is not present in frame header
479 - frame header unknown / not supported
480 - frame header not complete (`srcSize` too small) */
481 unsigned long long ZSTD_getDecompressedSize(const void* src, size_t srcSize)
483 unsigned long long const ret = ZSTD_getFrameContentSize(src, srcSize);
484 ZSTD_STATIC_ASSERT(ZSTD_CONTENTSIZE_ERROR < ZSTD_CONTENTSIZE_UNKNOWN);
485 return (ret >= ZSTD_CONTENTSIZE_ERROR) ? 0 : ret;
489 /** ZSTD_decodeFrameHeader() :
490 * `headerSize` must be the size provided by ZSTD_frameHeaderSize().
491 * @return : 0 if success, or an error code, which can be tested using ZSTD_isError() */
492 static size_t ZSTD_decodeFrameHeader(ZSTD_DCtx* dctx, const void* src, size_t headerSize)
494 size_t const result = ZSTD_getFrameHeader_internal(&(dctx->fParams), src, headerSize, dctx->format);
495 if (ZSTD_isError(result)) return result; /* invalid header */
496 if (result>0) return ERROR(srcSize_wrong); /* headerSize too small */
497 if (dctx->fParams.dictID && (dctx->dictID != dctx->fParams.dictID))
498 return ERROR(dictionary_wrong);
499 if (dctx->fParams.checksumFlag) XXH64_reset(&dctx->xxhState, 0);
504 /*-*************************************************************
506 ***************************************************************/
508 /*! ZSTD_getcBlockSize() :
509 * Provides the size of compressed block from block header `src` */
510 size_t ZSTD_getcBlockSize(const void* src, size_t srcSize,
511 blockProperties_t* bpPtr)
513 if (srcSize < ZSTD_blockHeaderSize) return ERROR(srcSize_wrong);
514 { U32 const cBlockHeader = MEM_readLE24(src);
515 U32 const cSize = cBlockHeader >> 3;
516 bpPtr->lastBlock = cBlockHeader & 1;
517 bpPtr->blockType = (blockType_e)((cBlockHeader >> 1) & 3);
518 bpPtr->origSize = cSize; /* only useful for RLE */
519 if (bpPtr->blockType == bt_rle) return 1;
520 if (bpPtr->blockType == bt_reserved) return ERROR(corruption_detected);
526 static size_t ZSTD_copyRawBlock(void* dst, size_t dstCapacity,
527 const void* src, size_t srcSize)
529 if (srcSize > dstCapacity) return ERROR(dstSize_tooSmall);
530 memcpy(dst, src, srcSize);
535 static size_t ZSTD_setRleBlock(void* dst, size_t dstCapacity,
536 const void* src, size_t srcSize,
539 if (srcSize != 1) return ERROR(srcSize_wrong);
540 if (regenSize > dstCapacity) return ERROR(dstSize_tooSmall);
541 memset(dst, *(const BYTE*)src, regenSize);
545 /*! ZSTD_decodeLiteralsBlock() :
546 * @return : nb of bytes read from src (< srcSize )
547 * note : symbol not declared but exposed for fullbench */
548 size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx,
549 const void* src, size_t srcSize) /* note : srcSize < BLOCKSIZE */
551 if (srcSize < MIN_CBLOCK_SIZE) return ERROR(corruption_detected);
553 { const BYTE* const istart = (const BYTE*) src;
554 symbolEncodingType_e const litEncType = (symbolEncodingType_e)(istart[0] & 3);
559 if (dctx->litEntropy==0) return ERROR(dictionary_corrupted);
562 if (srcSize < 5) return ERROR(corruption_detected); /* srcSize >= MIN_CBLOCK_SIZE == 3; here we need up to 5 for case 3 */
563 { size_t lhSize, litSize, litCSize;
565 U32 const lhlCode = (istart[0] >> 2) & 3;
566 U32 const lhc = MEM_readLE32(istart);
569 case 0: case 1: default: /* note : default is impossible, since lhlCode into [0..3] */
570 /* 2 - 2 - 10 - 10 */
571 singleStream = !lhlCode;
573 litSize = (lhc >> 4) & 0x3FF;
574 litCSize = (lhc >> 14) & 0x3FF;
577 /* 2 - 2 - 14 - 14 */
579 litSize = (lhc >> 4) & 0x3FFF;
580 litCSize = lhc >> 18;
583 /* 2 - 2 - 18 - 18 */
585 litSize = (lhc >> 4) & 0x3FFFF;
586 litCSize = (lhc >> 22) + (istart[4] << 10);
589 if (litSize > ZSTD_BLOCKSIZE_MAX) return ERROR(corruption_detected);
590 if (litCSize + lhSize > srcSize) return ERROR(corruption_detected);
592 if (HUF_isError((litEncType==set_repeat) ?
594 HUF_decompress1X_usingDTable_bmi2(dctx->litBuffer, litSize, istart+lhSize, litCSize, dctx->HUFptr, dctx->bmi2) :
595 HUF_decompress4X_usingDTable_bmi2(dctx->litBuffer, litSize, istart+lhSize, litCSize, dctx->HUFptr, dctx->bmi2) ) :
597 HUF_decompress1X2_DCtx_wksp_bmi2(dctx->entropy.hufTable, dctx->litBuffer, litSize, istart+lhSize, litCSize,
598 dctx->entropy.workspace, sizeof(dctx->entropy.workspace), dctx->bmi2) :
599 HUF_decompress4X_hufOnly_wksp_bmi2(dctx->entropy.hufTable, dctx->litBuffer, litSize, istart+lhSize, litCSize,
600 dctx->entropy.workspace, sizeof(dctx->entropy.workspace), dctx->bmi2))))
601 return ERROR(corruption_detected);
603 dctx->litPtr = dctx->litBuffer;
604 dctx->litSize = litSize;
605 dctx->litEntropy = 1;
606 if (litEncType==set_compressed) dctx->HUFptr = dctx->entropy.hufTable;
607 memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH);
608 return litCSize + lhSize;
612 { size_t litSize, lhSize;
613 U32 const lhlCode = ((istart[0]) >> 2) & 3;
616 case 0: case 2: default: /* note : default is impossible, since lhlCode into [0..3] */
618 litSize = istart[0] >> 3;
622 litSize = MEM_readLE16(istart) >> 4;
626 litSize = MEM_readLE24(istart) >> 4;
630 if (lhSize+litSize+WILDCOPY_OVERLENGTH > srcSize) { /* risk reading beyond src buffer with wildcopy */
631 if (litSize+lhSize > srcSize) return ERROR(corruption_detected);
632 memcpy(dctx->litBuffer, istart+lhSize, litSize);
633 dctx->litPtr = dctx->litBuffer;
634 dctx->litSize = litSize;
635 memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH);
636 return lhSize+litSize;
638 /* direct reference into compressed stream */
639 dctx->litPtr = istart+lhSize;
640 dctx->litSize = litSize;
641 return lhSize+litSize;
645 { U32 const lhlCode = ((istart[0]) >> 2) & 3;
646 size_t litSize, lhSize;
649 case 0: case 2: default: /* note : default is impossible, since lhlCode into [0..3] */
651 litSize = istart[0] >> 3;
655 litSize = MEM_readLE16(istart) >> 4;
659 litSize = MEM_readLE24(istart) >> 4;
660 if (srcSize<4) return ERROR(corruption_detected); /* srcSize >= MIN_CBLOCK_SIZE == 3; here we need lhSize+1 = 4 */
663 if (litSize > ZSTD_BLOCKSIZE_MAX) return ERROR(corruption_detected);
664 memset(dctx->litBuffer, istart[lhSize], litSize + WILDCOPY_OVERLENGTH);
665 dctx->litPtr = dctx->litBuffer;
666 dctx->litSize = litSize;
670 return ERROR(corruption_detected); /* impossible */
675 /* Default FSE distribution tables.
676 * These are pre-calculated FSE decoding tables using default distributions as defined in specification :
677 * https://github.com/facebook/zstd/blob/master/doc/zstd_compression_format.md#default-distributions
678 * They were generated programmatically with following method :
679 * - start from default distributions, present in /lib/common/zstd_internal.h
680 * - generate tables normally, using ZSTD_buildFSETable()
681 * - printout the content of tables
682 * - pretify output, report below, test with fuzzer to ensure it's correct */
684 /* Default FSE distribution table for Literal Lengths */
685 static const ZSTD_seqSymbol LL_defaultDTable[(1<<LL_DEFAULTNORMLOG)+1] = {
686 { 1, 1, 1, LL_DEFAULTNORMLOG}, /* header : fastMode, tableLog */
687 /* nextState, nbAddBits, nbBits, baseVal */
688 { 0, 0, 4, 0}, { 16, 0, 4, 0},
689 { 32, 0, 5, 1}, { 0, 0, 5, 3},
690 { 0, 0, 5, 4}, { 0, 0, 5, 6},
691 { 0, 0, 5, 7}, { 0, 0, 5, 9},
692 { 0, 0, 5, 10}, { 0, 0, 5, 12},
693 { 0, 0, 6, 14}, { 0, 1, 5, 16},
694 { 0, 1, 5, 20}, { 0, 1, 5, 22},
695 { 0, 2, 5, 28}, { 0, 3, 5, 32},
696 { 0, 4, 5, 48}, { 32, 6, 5, 64},
697 { 0, 7, 5, 128}, { 0, 8, 6, 256},
698 { 0, 10, 6, 1024}, { 0, 12, 6, 4096},
699 { 32, 0, 4, 0}, { 0, 0, 4, 1},
700 { 0, 0, 5, 2}, { 32, 0, 5, 4},
701 { 0, 0, 5, 5}, { 32, 0, 5, 7},
702 { 0, 0, 5, 8}, { 32, 0, 5, 10},
703 { 0, 0, 5, 11}, { 0, 0, 6, 13},
704 { 32, 1, 5, 16}, { 0, 1, 5, 18},
705 { 32, 1, 5, 22}, { 0, 2, 5, 24},
706 { 32, 3, 5, 32}, { 0, 3, 5, 40},
707 { 0, 6, 4, 64}, { 16, 6, 4, 64},
708 { 32, 7, 5, 128}, { 0, 9, 6, 512},
709 { 0, 11, 6, 2048}, { 48, 0, 4, 0},
710 { 16, 0, 4, 1}, { 32, 0, 5, 2},
711 { 32, 0, 5, 3}, { 32, 0, 5, 5},
712 { 32, 0, 5, 6}, { 32, 0, 5, 8},
713 { 32, 0, 5, 9}, { 32, 0, 5, 11},
714 { 32, 0, 5, 12}, { 0, 0, 6, 15},
715 { 32, 1, 5, 18}, { 32, 1, 5, 20},
716 { 32, 2, 5, 24}, { 32, 2, 5, 28},
717 { 32, 3, 5, 40}, { 32, 4, 5, 48},
718 { 0, 16, 6,65536}, { 0, 15, 6,32768},
719 { 0, 14, 6,16384}, { 0, 13, 6, 8192},
720 }; /* LL_defaultDTable */
722 /* Default FSE distribution table for Offset Codes */
723 static const ZSTD_seqSymbol OF_defaultDTable[(1<<OF_DEFAULTNORMLOG)+1] = {
724 { 1, 1, 1, OF_DEFAULTNORMLOG}, /* header : fastMode, tableLog */
725 /* nextState, nbAddBits, nbBits, baseVal */
726 { 0, 0, 5, 0}, { 0, 6, 4, 61},
727 { 0, 9, 5, 509}, { 0, 15, 5,32765},
728 { 0, 21, 5,2097149}, { 0, 3, 5, 5},
729 { 0, 7, 4, 125}, { 0, 12, 5, 4093},
730 { 0, 18, 5,262141}, { 0, 23, 5,8388605},
731 { 0, 5, 5, 29}, { 0, 8, 4, 253},
732 { 0, 14, 5,16381}, { 0, 20, 5,1048573},
733 { 0, 2, 5, 1}, { 16, 7, 4, 125},
734 { 0, 11, 5, 2045}, { 0, 17, 5,131069},
735 { 0, 22, 5,4194301}, { 0, 4, 5, 13},
736 { 16, 8, 4, 253}, { 0, 13, 5, 8189},
737 { 0, 19, 5,524285}, { 0, 1, 5, 1},
738 { 16, 6, 4, 61}, { 0, 10, 5, 1021},
739 { 0, 16, 5,65533}, { 0, 28, 5,268435453},
740 { 0, 27, 5,134217725}, { 0, 26, 5,67108861},
741 { 0, 25, 5,33554429}, { 0, 24, 5,16777213},
742 }; /* OF_defaultDTable */
745 /* Default FSE distribution table for Match Lengths */
746 static const ZSTD_seqSymbol ML_defaultDTable[(1<<ML_DEFAULTNORMLOG)+1] = {
747 { 1, 1, 1, ML_DEFAULTNORMLOG}, /* header : fastMode, tableLog */
748 /* nextState, nbAddBits, nbBits, baseVal */
749 { 0, 0, 6, 3}, { 0, 0, 4, 4},
750 { 32, 0, 5, 5}, { 0, 0, 5, 6},
751 { 0, 0, 5, 8}, { 0, 0, 5, 9},
752 { 0, 0, 5, 11}, { 0, 0, 6, 13},
753 { 0, 0, 6, 16}, { 0, 0, 6, 19},
754 { 0, 0, 6, 22}, { 0, 0, 6, 25},
755 { 0, 0, 6, 28}, { 0, 0, 6, 31},
756 { 0, 0, 6, 34}, { 0, 1, 6, 37},
757 { 0, 1, 6, 41}, { 0, 2, 6, 47},
758 { 0, 3, 6, 59}, { 0, 4, 6, 83},
759 { 0, 7, 6, 131}, { 0, 9, 6, 515},
760 { 16, 0, 4, 4}, { 0, 0, 4, 5},
761 { 32, 0, 5, 6}, { 0, 0, 5, 7},
762 { 32, 0, 5, 9}, { 0, 0, 5, 10},
763 { 0, 0, 6, 12}, { 0, 0, 6, 15},
764 { 0, 0, 6, 18}, { 0, 0, 6, 21},
765 { 0, 0, 6, 24}, { 0, 0, 6, 27},
766 { 0, 0, 6, 30}, { 0, 0, 6, 33},
767 { 0, 1, 6, 35}, { 0, 1, 6, 39},
768 { 0, 2, 6, 43}, { 0, 3, 6, 51},
769 { 0, 4, 6, 67}, { 0, 5, 6, 99},
770 { 0, 8, 6, 259}, { 32, 0, 4, 4},
771 { 48, 0, 4, 4}, { 16, 0, 4, 5},
772 { 32, 0, 5, 7}, { 32, 0, 5, 8},
773 { 32, 0, 5, 10}, { 32, 0, 5, 11},
774 { 0, 0, 6, 14}, { 0, 0, 6, 17},
775 { 0, 0, 6, 20}, { 0, 0, 6, 23},
776 { 0, 0, 6, 26}, { 0, 0, 6, 29},
777 { 0, 0, 6, 32}, { 0, 16, 6,65539},
778 { 0, 15, 6,32771}, { 0, 14, 6,16387},
779 { 0, 13, 6, 8195}, { 0, 12, 6, 4099},
780 { 0, 11, 6, 2051}, { 0, 10, 6, 1027},
781 }; /* ML_defaultDTable */
784 static void ZSTD_buildSeqTable_rle(ZSTD_seqSymbol* dt, U32 baseValue, U32 nbAddBits)
787 ZSTD_seqSymbol_header* const DTableH = (ZSTD_seqSymbol_header*)ptr;
788 ZSTD_seqSymbol* const cell = dt + 1;
790 DTableH->tableLog = 0;
791 DTableH->fastMode = 0;
795 assert(nbAddBits < 255);
796 cell->nbAdditionalBits = (BYTE)nbAddBits;
797 cell->baseValue = baseValue;
801 /* ZSTD_buildFSETable() :
802 * generate FSE decoding table for one symbol (ll, ml or off) */
804 ZSTD_buildFSETable(ZSTD_seqSymbol* dt,
805 const short* normalizedCounter, unsigned maxSymbolValue,
806 const U32* baseValue, const U32* nbAdditionalBits,
809 ZSTD_seqSymbol* const tableDecode = dt+1;
810 U16 symbolNext[MaxSeq+1];
812 U32 const maxSV1 = maxSymbolValue + 1;
813 U32 const tableSize = 1 << tableLog;
814 U32 highThreshold = tableSize-1;
817 assert(maxSymbolValue <= MaxSeq);
818 assert(tableLog <= MaxFSELog);
820 /* Init, lay down lowprob symbols */
821 { ZSTD_seqSymbol_header DTableH;
822 DTableH.tableLog = tableLog;
823 DTableH.fastMode = 1;
824 { S16 const largeLimit= (S16)(1 << (tableLog-1));
826 for (s=0; s<maxSV1; s++) {
827 if (normalizedCounter[s]==-1) {
828 tableDecode[highThreshold--].baseValue = s;
831 if (normalizedCounter[s] >= largeLimit) DTableH.fastMode=0;
832 symbolNext[s] = normalizedCounter[s];
834 memcpy(dt, &DTableH, sizeof(DTableH));
838 { U32 const tableMask = tableSize-1;
839 U32 const step = FSE_TABLESTEP(tableSize);
841 for (s=0; s<maxSV1; s++) {
843 for (i=0; i<normalizedCounter[s]; i++) {
844 tableDecode[position].baseValue = s;
845 position = (position + step) & tableMask;
846 while (position > highThreshold) position = (position + step) & tableMask; /* lowprob area */
848 assert(position == 0); /* position must reach all cells once, otherwise normalizedCounter is incorrect */
851 /* Build Decoding table */
853 for (u=0; u<tableSize; u++) {
854 U32 const symbol = tableDecode[u].baseValue;
855 U32 const nextState = symbolNext[symbol]++;
856 tableDecode[u].nbBits = (BYTE) (tableLog - BIT_highbit32(nextState) );
857 tableDecode[u].nextState = (U16) ( (nextState << tableDecode[u].nbBits) - tableSize);
858 assert(nbAdditionalBits[symbol] < 255);
859 tableDecode[u].nbAdditionalBits = (BYTE)nbAdditionalBits[symbol];
860 tableDecode[u].baseValue = baseValue[symbol];
865 /*! ZSTD_buildSeqTable() :
866 * @return : nb bytes read from src,
867 * or an error code if it fails */
868 static size_t ZSTD_buildSeqTable(ZSTD_seqSymbol* DTableSpace, const ZSTD_seqSymbol** DTablePtr,
869 symbolEncodingType_e type, U32 max, U32 maxLog,
870 const void* src, size_t srcSize,
871 const U32* baseValue, const U32* nbAdditionalBits,
872 const ZSTD_seqSymbol* defaultTable, U32 flagRepeatTable)
877 if (!srcSize) return ERROR(srcSize_wrong);
878 if ( (*(const BYTE*)src) > max) return ERROR(corruption_detected);
879 { U32 const symbol = *(const BYTE*)src;
880 U32 const baseline = baseValue[symbol];
881 U32 const nbBits = nbAdditionalBits[symbol];
882 ZSTD_buildSeqTable_rle(DTableSpace, baseline, nbBits);
884 *DTablePtr = DTableSpace;
887 *DTablePtr = defaultTable;
890 if (!flagRepeatTable) return ERROR(corruption_detected);
892 case set_compressed :
895 size_t const headerSize = FSE_readNCount(norm, &max, &tableLog, src, srcSize);
896 if (FSE_isError(headerSize)) return ERROR(corruption_detected);
897 if (tableLog > maxLog) return ERROR(corruption_detected);
898 ZSTD_buildFSETable(DTableSpace, norm, max, baseValue, nbAdditionalBits, tableLog);
899 *DTablePtr = DTableSpace;
902 default : /* impossible */
904 return ERROR(GENERIC);
908 static const U32 LL_base[MaxLL+1] = {
909 0, 1, 2, 3, 4, 5, 6, 7,
910 8, 9, 10, 11, 12, 13, 14, 15,
911 16, 18, 20, 22, 24, 28, 32, 40,
912 48, 64, 0x80, 0x100, 0x200, 0x400, 0x800, 0x1000,
913 0x2000, 0x4000, 0x8000, 0x10000 };
915 static const U32 OF_base[MaxOff+1] = {
916 0, 1, 1, 5, 0xD, 0x1D, 0x3D, 0x7D,
917 0xFD, 0x1FD, 0x3FD, 0x7FD, 0xFFD, 0x1FFD, 0x3FFD, 0x7FFD,
918 0xFFFD, 0x1FFFD, 0x3FFFD, 0x7FFFD, 0xFFFFD, 0x1FFFFD, 0x3FFFFD, 0x7FFFFD,
919 0xFFFFFD, 0x1FFFFFD, 0x3FFFFFD, 0x7FFFFFD, 0xFFFFFFD, 0x1FFFFFFD, 0x3FFFFFFD, 0x7FFFFFFD };
921 static const U32 OF_bits[MaxOff+1] = {
922 0, 1, 2, 3, 4, 5, 6, 7,
923 8, 9, 10, 11, 12, 13, 14, 15,
924 16, 17, 18, 19, 20, 21, 22, 23,
925 24, 25, 26, 27, 28, 29, 30, 31 };
927 static const U32 ML_base[MaxML+1] = {
928 3, 4, 5, 6, 7, 8, 9, 10,
929 11, 12, 13, 14, 15, 16, 17, 18,
930 19, 20, 21, 22, 23, 24, 25, 26,
931 27, 28, 29, 30, 31, 32, 33, 34,
932 35, 37, 39, 41, 43, 47, 51, 59,
933 67, 83, 99, 0x83, 0x103, 0x203, 0x403, 0x803,
934 0x1003, 0x2003, 0x4003, 0x8003, 0x10003 };
937 size_t ZSTD_decodeSeqHeaders(ZSTD_DCtx* dctx, int* nbSeqPtr,
938 const void* src, size_t srcSize)
940 const BYTE* const istart = (const BYTE* const)src;
941 const BYTE* const iend = istart + srcSize;
942 const BYTE* ip = istart;
943 DEBUGLOG(5, "ZSTD_decodeSeqHeaders");
946 if (srcSize < MIN_SEQUENCES_SIZE) return ERROR(srcSize_wrong);
950 if (!nbSeq) { *nbSeqPtr=0; return 1; }
953 if (ip+2 > iend) return ERROR(srcSize_wrong);
954 nbSeq = MEM_readLE16(ip) + LONGNBSEQ, ip+=2;
956 if (ip >= iend) return ERROR(srcSize_wrong);
957 nbSeq = ((nbSeq-0x80)<<8) + *ip++;
963 /* FSE table descriptors */
964 if (ip+4 > iend) return ERROR(srcSize_wrong); /* minimum possible size */
965 { symbolEncodingType_e const LLtype = (symbolEncodingType_e)(*ip >> 6);
966 symbolEncodingType_e const OFtype = (symbolEncodingType_e)((*ip >> 4) & 3);
967 symbolEncodingType_e const MLtype = (symbolEncodingType_e)((*ip >> 2) & 3);
971 { size_t const llhSize = ZSTD_buildSeqTable(dctx->entropy.LLTable, &dctx->LLTptr,
972 LLtype, MaxLL, LLFSELog,
975 LL_defaultDTable, dctx->fseEntropy);
976 if (ZSTD_isError(llhSize)) return ERROR(corruption_detected);
980 { size_t const ofhSize = ZSTD_buildSeqTable(dctx->entropy.OFTable, &dctx->OFTptr,
981 OFtype, MaxOff, OffFSELog,
984 OF_defaultDTable, dctx->fseEntropy);
985 if (ZSTD_isError(ofhSize)) return ERROR(corruption_detected);
989 { size_t const mlhSize = ZSTD_buildSeqTable(dctx->entropy.MLTable, &dctx->MLTptr,
990 MLtype, MaxML, MLFSELog,
993 ML_defaultDTable, dctx->fseEntropy);
994 if (ZSTD_isError(mlhSize)) return ERROR(corruption_detected);
1012 const ZSTD_seqSymbol* table;
1016 BIT_DStream_t DStream;
1017 ZSTD_fseState stateLL;
1018 ZSTD_fseState stateOffb;
1019 ZSTD_fseState stateML;
1020 size_t prevOffset[ZSTD_REP_NUM];
1021 const BYTE* prefixStart;
1022 const BYTE* dictEnd;
1028 size_t ZSTD_execSequenceLast7(BYTE* op,
1029 BYTE* const oend, seq_t sequence,
1030 const BYTE** litPtr, const BYTE* const litLimit,
1031 const BYTE* const base, const BYTE* const vBase, const BYTE* const dictEnd)
1033 BYTE* const oLitEnd = op + sequence.litLength;
1034 size_t const sequenceLength = sequence.litLength + sequence.matchLength;
1035 BYTE* const oMatchEnd = op + sequenceLength; /* risk : address space overflow (32-bits) */
1036 BYTE* const oend_w = oend - WILDCOPY_OVERLENGTH;
1037 const BYTE* const iLitEnd = *litPtr + sequence.litLength;
1038 const BYTE* match = oLitEnd - sequence.offset;
1041 if (oMatchEnd>oend) return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of WILDCOPY_OVERLENGTH from oend */
1042 if (iLitEnd > litLimit) return ERROR(corruption_detected); /* over-read beyond lit buffer */
1043 if (oLitEnd <= oend_w) return ERROR(GENERIC); /* Precondition */
1047 ZSTD_wildcopy(op, *litPtr, oend_w - op);
1048 *litPtr += oend_w - op;
1051 while (op < oLitEnd) *op++ = *(*litPtr)++;
1054 if (sequence.offset > (size_t)(oLitEnd - base)) {
1055 /* offset beyond prefix */
1056 if (sequence.offset > (size_t)(oLitEnd - vBase)) return ERROR(corruption_detected);
1057 match = dictEnd - (base-match);
1058 if (match + sequence.matchLength <= dictEnd) {
1059 memmove(oLitEnd, match, sequence.matchLength);
1060 return sequenceLength;
1062 /* span extDict & currentPrefixSegment */
1063 { size_t const length1 = dictEnd - match;
1064 memmove(oLitEnd, match, length1);
1065 op = oLitEnd + length1;
1066 sequence.matchLength -= length1;
1069 while (op < oMatchEnd) *op++ = *match++;
1070 return sequenceLength;
1075 size_t ZSTD_execSequence(BYTE* op,
1076 BYTE* const oend, seq_t sequence,
1077 const BYTE** litPtr, const BYTE* const litLimit,
1078 const BYTE* const base, const BYTE* const vBase, const BYTE* const dictEnd)
1080 BYTE* const oLitEnd = op + sequence.litLength;
1081 size_t const sequenceLength = sequence.litLength + sequence.matchLength;
1082 BYTE* const oMatchEnd = op + sequenceLength; /* risk : address space overflow (32-bits) */
1083 BYTE* const oend_w = oend - WILDCOPY_OVERLENGTH;
1084 const BYTE* const iLitEnd = *litPtr + sequence.litLength;
1085 const BYTE* match = oLitEnd - sequence.offset;
1088 if (oMatchEnd>oend) return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of WILDCOPY_OVERLENGTH from oend */
1089 if (iLitEnd > litLimit) return ERROR(corruption_detected); /* over-read beyond lit buffer */
1090 if (oLitEnd>oend_w) return ZSTD_execSequenceLast7(op, oend, sequence, litPtr, litLimit, base, vBase, dictEnd);
1093 ZSTD_copy8(op, *litPtr);
1094 if (sequence.litLength > 8)
1095 ZSTD_wildcopy(op+8, (*litPtr)+8, sequence.litLength - 8); /* note : since oLitEnd <= oend-WILDCOPY_OVERLENGTH, no risk of overwrite beyond oend */
1097 *litPtr = iLitEnd; /* update for next sequence */
1100 if (sequence.offset > (size_t)(oLitEnd - base)) {
1101 /* offset beyond prefix -> go into extDict */
1102 if (sequence.offset > (size_t)(oLitEnd - vBase))
1103 return ERROR(corruption_detected);
1104 match = dictEnd + (match - base);
1105 if (match + sequence.matchLength <= dictEnd) {
1106 memmove(oLitEnd, match, sequence.matchLength);
1107 return sequenceLength;
1109 /* span extDict & currentPrefixSegment */
1110 { size_t const length1 = dictEnd - match;
1111 memmove(oLitEnd, match, length1);
1112 op = oLitEnd + length1;
1113 sequence.matchLength -= length1;
1115 if (op > oend_w || sequence.matchLength < MINMATCH) {
1117 for (i = 0; i < sequence.matchLength; ++i) op[i] = match[i];
1118 return sequenceLength;
1121 /* Requirement: op <= oend_w && sequence.matchLength >= MINMATCH */
1123 /* match within prefix */
1124 if (sequence.offset < 8) {
1125 /* close range match, overlap */
1126 static const U32 dec32table[] = { 0, 1, 2, 1, 4, 4, 4, 4 }; /* added */
1127 static const int dec64table[] = { 8, 8, 8, 7, 8, 9,10,11 }; /* subtracted */
1128 int const sub2 = dec64table[sequence.offset];
1133 match += dec32table[sequence.offset];
1134 ZSTD_copy4(op+4, match);
1137 ZSTD_copy8(op, match);
1139 op += 8; match += 8;
1141 if (oMatchEnd > oend-(16-MINMATCH)) {
1143 ZSTD_wildcopy(op, match, oend_w - op);
1144 match += oend_w - op;
1147 while (op < oMatchEnd) *op++ = *match++;
1149 ZSTD_wildcopy(op, match, (ptrdiff_t)sequence.matchLength-8); /* works even if matchLength < 8 */
1151 return sequenceLength;
1156 size_t ZSTD_execSequenceLong(BYTE* op,
1157 BYTE* const oend, seq_t sequence,
1158 const BYTE** litPtr, const BYTE* const litLimit,
1159 const BYTE* const prefixStart, const BYTE* const dictStart, const BYTE* const dictEnd)
1161 BYTE* const oLitEnd = op + sequence.litLength;
1162 size_t const sequenceLength = sequence.litLength + sequence.matchLength;
1163 BYTE* const oMatchEnd = op + sequenceLength; /* risk : address space overflow (32-bits) */
1164 BYTE* const oend_w = oend - WILDCOPY_OVERLENGTH;
1165 const BYTE* const iLitEnd = *litPtr + sequence.litLength;
1166 const BYTE* match = sequence.match;
1169 if (oMatchEnd > oend) return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of WILDCOPY_OVERLENGTH from oend */
1170 if (iLitEnd > litLimit) return ERROR(corruption_detected); /* over-read beyond lit buffer */
1171 if (oLitEnd > oend_w) return ZSTD_execSequenceLast7(op, oend, sequence, litPtr, litLimit, prefixStart, dictStart, dictEnd);
1174 ZSTD_copy8(op, *litPtr); /* note : op <= oLitEnd <= oend_w == oend - 8 */
1175 if (sequence.litLength > 8)
1176 ZSTD_wildcopy(op+8, (*litPtr)+8, sequence.litLength - 8); /* note : since oLitEnd <= oend-WILDCOPY_OVERLENGTH, no risk of overwrite beyond oend */
1178 *litPtr = iLitEnd; /* update for next sequence */
1181 if (sequence.offset > (size_t)(oLitEnd - prefixStart)) {
1182 /* offset beyond prefix */
1183 if (sequence.offset > (size_t)(oLitEnd - dictStart)) return ERROR(corruption_detected);
1184 if (match + sequence.matchLength <= dictEnd) {
1185 memmove(oLitEnd, match, sequence.matchLength);
1186 return sequenceLength;
1188 /* span extDict & currentPrefixSegment */
1189 { size_t const length1 = dictEnd - match;
1190 memmove(oLitEnd, match, length1);
1191 op = oLitEnd + length1;
1192 sequence.matchLength -= length1;
1193 match = prefixStart;
1194 if (op > oend_w || sequence.matchLength < MINMATCH) {
1196 for (i = 0; i < sequence.matchLength; ++i) op[i] = match[i];
1197 return sequenceLength;
1200 assert(op <= oend_w);
1201 assert(sequence.matchLength >= MINMATCH);
1203 /* match within prefix */
1204 if (sequence.offset < 8) {
1205 /* close range match, overlap */
1206 static const U32 dec32table[] = { 0, 1, 2, 1, 4, 4, 4, 4 }; /* added */
1207 static const int dec64table[] = { 8, 8, 8, 7, 8, 9,10,11 }; /* subtracted */
1208 int const sub2 = dec64table[sequence.offset];
1213 match += dec32table[sequence.offset];
1214 ZSTD_copy4(op+4, match);
1217 ZSTD_copy8(op, match);
1219 op += 8; match += 8;
1221 if (oMatchEnd > oend-(16-MINMATCH)) {
1223 ZSTD_wildcopy(op, match, oend_w - op);
1224 match += oend_w - op;
1227 while (op < oMatchEnd) *op++ = *match++;
1229 ZSTD_wildcopy(op, match, (ptrdiff_t)sequence.matchLength-8); /* works even if matchLength < 8 */
1231 return sequenceLength;
1235 ZSTD_initFseState(ZSTD_fseState* DStatePtr, BIT_DStream_t* bitD, const ZSTD_seqSymbol* dt)
1237 const void* ptr = dt;
1238 const ZSTD_seqSymbol_header* const DTableH = (const ZSTD_seqSymbol_header*)ptr;
1239 DStatePtr->state = BIT_readBits(bitD, DTableH->tableLog);
1240 DEBUGLOG(6, "ZSTD_initFseState : val=%u using %u bits",
1241 (U32)DStatePtr->state, DTableH->tableLog);
1242 BIT_reloadDStream(bitD);
1243 DStatePtr->table = dt + 1;
1246 FORCE_INLINE_TEMPLATE void
1247 ZSTD_updateFseState(ZSTD_fseState* DStatePtr, BIT_DStream_t* bitD)
1249 ZSTD_seqSymbol const DInfo = DStatePtr->table[DStatePtr->state];
1250 U32 const nbBits = DInfo.nbBits;
1251 size_t const lowBits = BIT_readBits(bitD, nbBits);
1252 DStatePtr->state = DInfo.nextState + lowBits;
1255 /* We need to add at most (ZSTD_WINDOWLOG_MAX_32 - 1) bits to read the maximum
1256 * offset bits. But we can only read at most (STREAM_ACCUMULATOR_MIN_32 - 1)
1257 * bits before reloading. This value is the maximum number of bytes we read
1258 * after reloading when we are decoding long offets.
1260 #define LONG_OFFSETS_MAX_EXTRA_BITS_32 \
1261 (ZSTD_WINDOWLOG_MAX_32 > STREAM_ACCUMULATOR_MIN_32 \
1262 ? ZSTD_WINDOWLOG_MAX_32 - STREAM_ACCUMULATOR_MIN_32 \
1265 typedef enum { ZSTD_lo_isRegularOffset, ZSTD_lo_isLongOffset=1 } ZSTD_longOffset_e;
1267 FORCE_INLINE_TEMPLATE seq_t
1268 ZSTD_decodeSequence(seqState_t* seqState, const ZSTD_longOffset_e longOffsets)
1271 U32 const llBits = seqState->stateLL.table[seqState->stateLL.state].nbAdditionalBits;
1272 U32 const mlBits = seqState->stateML.table[seqState->stateML.state].nbAdditionalBits;
1273 U32 const ofBits = seqState->stateOffb.table[seqState->stateOffb.state].nbAdditionalBits;
1274 U32 const totalBits = llBits+mlBits+ofBits;
1275 U32 const llBase = seqState->stateLL.table[seqState->stateLL.state].baseValue;
1276 U32 const mlBase = seqState->stateML.table[seqState->stateML.state].baseValue;
1277 U32 const ofBase = seqState->stateOffb.table[seqState->stateOffb.state].baseValue;
1284 ZSTD_STATIC_ASSERT(ZSTD_lo_isLongOffset == 1);
1285 ZSTD_STATIC_ASSERT(LONG_OFFSETS_MAX_EXTRA_BITS_32 == 5);
1286 assert(ofBits <= MaxOff);
1287 if (MEM_32bits() && longOffsets && (ofBits >= STREAM_ACCUMULATOR_MIN_32)) {
1288 U32 const extraBits = ofBits - MIN(ofBits, 32 - seqState->DStream.bitsConsumed);
1289 offset = ofBase + (BIT_readBitsFast(&seqState->DStream, ofBits - extraBits) << extraBits);
1290 BIT_reloadDStream(&seqState->DStream);
1291 if (extraBits) offset += BIT_readBitsFast(&seqState->DStream, extraBits);
1292 assert(extraBits <= LONG_OFFSETS_MAX_EXTRA_BITS_32); /* to avoid another reload */
1294 offset = ofBase + BIT_readBitsFast(&seqState->DStream, ofBits/*>0*/); /* <= (ZSTD_WINDOWLOG_MAX-1) bits */
1295 if (MEM_32bits()) BIT_reloadDStream(&seqState->DStream);
1300 offset += (llBase==0);
1302 size_t temp = (offset==3) ? seqState->prevOffset[0] - 1 : seqState->prevOffset[offset];
1303 temp += !temp; /* 0 is not valid; input is corrupted; force offset to 1 */
1304 if (offset != 1) seqState->prevOffset[2] = seqState->prevOffset[1];
1305 seqState->prevOffset[1] = seqState->prevOffset[0];
1306 seqState->prevOffset[0] = offset = temp;
1307 } else { /* offset == 0 */
1308 offset = seqState->prevOffset[0];
1311 seqState->prevOffset[2] = seqState->prevOffset[1];
1312 seqState->prevOffset[1] = seqState->prevOffset[0];
1313 seqState->prevOffset[0] = offset;
1315 seq.offset = offset;
1318 seq.matchLength = mlBase
1319 + ((mlBits>0) ? BIT_readBitsFast(&seqState->DStream, mlBits/*>0*/) : 0); /* <= 16 bits */
1320 if (MEM_32bits() && (mlBits+llBits >= STREAM_ACCUMULATOR_MIN_32-LONG_OFFSETS_MAX_EXTRA_BITS_32))
1321 BIT_reloadDStream(&seqState->DStream);
1322 if (MEM_64bits() && (totalBits >= STREAM_ACCUMULATOR_MIN_64-(LLFSELog+MLFSELog+OffFSELog)))
1323 BIT_reloadDStream(&seqState->DStream);
1324 /* Ensure there are enough bits to read the rest of data in 64-bit mode. */
1325 ZSTD_STATIC_ASSERT(16+LLFSELog+MLFSELog+OffFSELog < STREAM_ACCUMULATOR_MIN_64);
1327 seq.litLength = llBase
1328 + ((llBits>0) ? BIT_readBitsFast(&seqState->DStream, llBits/*>0*/) : 0); /* <= 16 bits */
1330 BIT_reloadDStream(&seqState->DStream);
1332 DEBUGLOG(6, "seq: litL=%u, matchL=%u, offset=%u",
1333 (U32)seq.litLength, (U32)seq.matchLength, (U32)seq.offset);
1335 /* ANS state update */
1336 ZSTD_updateFseState(&seqState->stateLL, &seqState->DStream); /* <= 9 bits */
1337 ZSTD_updateFseState(&seqState->stateML, &seqState->DStream); /* <= 9 bits */
1338 if (MEM_32bits()) BIT_reloadDStream(&seqState->DStream); /* <= 18 bits */
1339 ZSTD_updateFseState(&seqState->stateOffb, &seqState->DStream); /* <= 8 bits */
1344 FORCE_INLINE_TEMPLATE size_t
1345 ZSTD_decompressSequences_body( ZSTD_DCtx* dctx,
1346 void* dst, size_t maxDstSize,
1347 const void* seqStart, size_t seqSize, int nbSeq,
1348 const ZSTD_longOffset_e isLongOffset)
1350 const BYTE* ip = (const BYTE*)seqStart;
1351 const BYTE* const iend = ip + seqSize;
1352 BYTE* const ostart = (BYTE* const)dst;
1353 BYTE* const oend = ostart + maxDstSize;
1355 const BYTE* litPtr = dctx->litPtr;
1356 const BYTE* const litEnd = litPtr + dctx->litSize;
1357 const BYTE* const base = (const BYTE*) (dctx->base);
1358 const BYTE* const vBase = (const BYTE*) (dctx->vBase);
1359 const BYTE* const dictEnd = (const BYTE*) (dctx->dictEnd);
1360 DEBUGLOG(5, "ZSTD_decompressSequences");
1362 /* Regen sequences */
1364 seqState_t seqState;
1365 dctx->fseEntropy = 1;
1366 { U32 i; for (i=0; i<ZSTD_REP_NUM; i++) seqState.prevOffset[i] = dctx->entropy.rep[i]; }
1367 CHECK_E(BIT_initDStream(&seqState.DStream, ip, iend-ip), corruption_detected);
1368 ZSTD_initFseState(&seqState.stateLL, &seqState.DStream, dctx->LLTptr);
1369 ZSTD_initFseState(&seqState.stateOffb, &seqState.DStream, dctx->OFTptr);
1370 ZSTD_initFseState(&seqState.stateML, &seqState.DStream, dctx->MLTptr);
1372 for ( ; (BIT_reloadDStream(&(seqState.DStream)) <= BIT_DStream_completed) && nbSeq ; ) {
1374 { seq_t const sequence = ZSTD_decodeSequence(&seqState, isLongOffset);
1375 size_t const oneSeqSize = ZSTD_execSequence(op, oend, sequence, &litPtr, litEnd, base, vBase, dictEnd);
1376 DEBUGLOG(6, "regenerated sequence size : %u", (U32)oneSeqSize);
1377 if (ZSTD_isError(oneSeqSize)) return oneSeqSize;
1381 /* check if reached exact end */
1382 DEBUGLOG(5, "ZSTD_decompressSequences: after decode loop, remaining nbSeq : %i", nbSeq);
1383 if (nbSeq) return ERROR(corruption_detected);
1384 /* save reps for next block */
1385 { U32 i; for (i=0; i<ZSTD_REP_NUM; i++) dctx->entropy.rep[i] = (U32)(seqState.prevOffset[i]); }
1388 /* last literal segment */
1389 { size_t const lastLLSize = litEnd - litPtr;
1390 if (lastLLSize > (size_t)(oend-op)) return ERROR(dstSize_tooSmall);
1391 memcpy(op, litPtr, lastLLSize);
1399 ZSTD_decompressSequences_default(ZSTD_DCtx* dctx,
1400 void* dst, size_t maxDstSize,
1401 const void* seqStart, size_t seqSize, int nbSeq,
1402 const ZSTD_longOffset_e isLongOffset)
1404 return ZSTD_decompressSequences_body(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
1409 FORCE_INLINE_TEMPLATE seq_t
1410 ZSTD_decodeSequenceLong(seqState_t* seqState, ZSTD_longOffset_e const longOffsets)
1413 U32 const llBits = seqState->stateLL.table[seqState->stateLL.state].nbAdditionalBits;
1414 U32 const mlBits = seqState->stateML.table[seqState->stateML.state].nbAdditionalBits;
1415 U32 const ofBits = seqState->stateOffb.table[seqState->stateOffb.state].nbAdditionalBits;
1416 U32 const totalBits = llBits+mlBits+ofBits;
1417 U32 const llBase = seqState->stateLL.table[seqState->stateLL.state].baseValue;
1418 U32 const mlBase = seqState->stateML.table[seqState->stateML.state].baseValue;
1419 U32 const ofBase = seqState->stateOffb.table[seqState->stateOffb.state].baseValue;
1426 ZSTD_STATIC_ASSERT(ZSTD_lo_isLongOffset == 1);
1427 ZSTD_STATIC_ASSERT(LONG_OFFSETS_MAX_EXTRA_BITS_32 == 5);
1428 assert(ofBits <= MaxOff);
1429 if (MEM_32bits() && longOffsets) {
1430 U32 const extraBits = ofBits - MIN(ofBits, STREAM_ACCUMULATOR_MIN_32-1);
1431 offset = ofBase + (BIT_readBitsFast(&seqState->DStream, ofBits - extraBits) << extraBits);
1432 if (MEM_32bits() || extraBits) BIT_reloadDStream(&seqState->DStream);
1433 if (extraBits) offset += BIT_readBitsFast(&seqState->DStream, extraBits);
1435 offset = ofBase + BIT_readBitsFast(&seqState->DStream, ofBits); /* <= (ZSTD_WINDOWLOG_MAX-1) bits */
1436 if (MEM_32bits()) BIT_reloadDStream(&seqState->DStream);
1441 offset += (llBase==0);
1443 size_t temp = (offset==3) ? seqState->prevOffset[0] - 1 : seqState->prevOffset[offset];
1444 temp += !temp; /* 0 is not valid; input is corrupted; force offset to 1 */
1445 if (offset != 1) seqState->prevOffset[2] = seqState->prevOffset[1];
1446 seqState->prevOffset[1] = seqState->prevOffset[0];
1447 seqState->prevOffset[0] = offset = temp;
1449 offset = seqState->prevOffset[0];
1452 seqState->prevOffset[2] = seqState->prevOffset[1];
1453 seqState->prevOffset[1] = seqState->prevOffset[0];
1454 seqState->prevOffset[0] = offset;
1456 seq.offset = offset;
1459 seq.matchLength = mlBase + ((mlBits>0) ? BIT_readBitsFast(&seqState->DStream, mlBits) : 0); /* <= 16 bits */
1460 if (MEM_32bits() && (mlBits+llBits >= STREAM_ACCUMULATOR_MIN_32-LONG_OFFSETS_MAX_EXTRA_BITS_32))
1461 BIT_reloadDStream(&seqState->DStream);
1462 if (MEM_64bits() && (totalBits >= STREAM_ACCUMULATOR_MIN_64-(LLFSELog+MLFSELog+OffFSELog)))
1463 BIT_reloadDStream(&seqState->DStream);
1464 /* Verify that there is enough bits to read the rest of the data in 64-bit mode. */
1465 ZSTD_STATIC_ASSERT(16+LLFSELog+MLFSELog+OffFSELog < STREAM_ACCUMULATOR_MIN_64);
1467 seq.litLength = llBase + ((llBits>0) ? BIT_readBitsFast(&seqState->DStream, llBits) : 0); /* <= 16 bits */
1469 BIT_reloadDStream(&seqState->DStream);
1471 { size_t const pos = seqState->pos + seq.litLength;
1472 const BYTE* const matchBase = (seq.offset > pos) ? seqState->dictEnd : seqState->prefixStart;
1473 seq.match = matchBase + pos - seq.offset; /* note : this operation can overflow when seq.offset is really too large, which can only happen when input is corrupted.
1474 * No consequence though : no memory access will occur, overly large offset will be detected in ZSTD_execSequenceLong() */
1475 seqState->pos = pos + seq.matchLength;
1478 /* ANS state update */
1479 ZSTD_updateFseState(&seqState->stateLL, &seqState->DStream); /* <= 9 bits */
1480 ZSTD_updateFseState(&seqState->stateML, &seqState->DStream); /* <= 9 bits */
1481 if (MEM_32bits()) BIT_reloadDStream(&seqState->DStream); /* <= 18 bits */
1482 ZSTD_updateFseState(&seqState->stateOffb, &seqState->DStream); /* <= 8 bits */
1487 FORCE_INLINE_TEMPLATE size_t
1488 ZSTD_decompressSequencesLong_body(
1490 void* dst, size_t maxDstSize,
1491 const void* seqStart, size_t seqSize, int nbSeq,
1492 const ZSTD_longOffset_e isLongOffset)
1494 const BYTE* ip = (const BYTE*)seqStart;
1495 const BYTE* const iend = ip + seqSize;
1496 BYTE* const ostart = (BYTE* const)dst;
1497 BYTE* const oend = ostart + maxDstSize;
1499 const BYTE* litPtr = dctx->litPtr;
1500 const BYTE* const litEnd = litPtr + dctx->litSize;
1501 const BYTE* const prefixStart = (const BYTE*) (dctx->base);
1502 const BYTE* const dictStart = (const BYTE*) (dctx->vBase);
1503 const BYTE* const dictEnd = (const BYTE*) (dctx->dictEnd);
1505 /* Regen sequences */
1507 #define STORED_SEQS 4
1508 #define STOSEQ_MASK (STORED_SEQS-1)
1509 #define ADVANCED_SEQS 4
1510 seq_t sequences[STORED_SEQS];
1511 int const seqAdvance = MIN(nbSeq, ADVANCED_SEQS);
1512 seqState_t seqState;
1514 dctx->fseEntropy = 1;
1515 { U32 i; for (i=0; i<ZSTD_REP_NUM; i++) seqState.prevOffset[i] = dctx->entropy.rep[i]; }
1516 seqState.prefixStart = prefixStart;
1517 seqState.pos = (size_t)(op-prefixStart);
1518 seqState.dictEnd = dictEnd;
1519 CHECK_E(BIT_initDStream(&seqState.DStream, ip, iend-ip), corruption_detected);
1520 ZSTD_initFseState(&seqState.stateLL, &seqState.DStream, dctx->LLTptr);
1521 ZSTD_initFseState(&seqState.stateOffb, &seqState.DStream, dctx->OFTptr);
1522 ZSTD_initFseState(&seqState.stateML, &seqState.DStream, dctx->MLTptr);
1524 /* prepare in advance */
1525 for (seqNb=0; (BIT_reloadDStream(&seqState.DStream) <= BIT_DStream_completed) && (seqNb<seqAdvance); seqNb++) {
1526 sequences[seqNb] = ZSTD_decodeSequenceLong(&seqState, isLongOffset);
1528 if (seqNb<seqAdvance) return ERROR(corruption_detected);
1530 /* decode and decompress */
1531 for ( ; (BIT_reloadDStream(&(seqState.DStream)) <= BIT_DStream_completed) && (seqNb<nbSeq) ; seqNb++) {
1532 seq_t const sequence = ZSTD_decodeSequenceLong(&seqState, isLongOffset);
1533 size_t const oneSeqSize = ZSTD_execSequenceLong(op, oend, sequences[(seqNb-ADVANCED_SEQS) & STOSEQ_MASK], &litPtr, litEnd, prefixStart, dictStart, dictEnd);
1534 if (ZSTD_isError(oneSeqSize)) return oneSeqSize;
1535 PREFETCH(sequence.match); /* note : it's safe to invoke PREFETCH() on any memory address, including invalid ones */
1536 sequences[seqNb&STOSEQ_MASK] = sequence;
1539 if (seqNb<nbSeq) return ERROR(corruption_detected);
1542 seqNb -= seqAdvance;
1543 for ( ; seqNb<nbSeq ; seqNb++) {
1544 size_t const oneSeqSize = ZSTD_execSequenceLong(op, oend, sequences[seqNb&STOSEQ_MASK], &litPtr, litEnd, prefixStart, dictStart, dictEnd);
1545 if (ZSTD_isError(oneSeqSize)) return oneSeqSize;
1549 /* save reps for next block */
1550 { U32 i; for (i=0; i<ZSTD_REP_NUM; i++) dctx->entropy.rep[i] = (U32)(seqState.prevOffset[i]); }
1553 #undef ADVANCED_SEQS
1556 /* last literal segment */
1557 { size_t const lastLLSize = litEnd - litPtr;
1558 if (lastLLSize > (size_t)(oend-op)) return ERROR(dstSize_tooSmall);
1559 memcpy(op, litPtr, lastLLSize);
1567 ZSTD_decompressSequencesLong_default(ZSTD_DCtx* dctx,
1568 void* dst, size_t maxDstSize,
1569 const void* seqStart, size_t seqSize, int nbSeq,
1570 const ZSTD_longOffset_e isLongOffset)
1572 return ZSTD_decompressSequencesLong_body(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
1579 static TARGET_ATTRIBUTE("bmi2") size_t
1580 ZSTD_decompressSequences_bmi2(ZSTD_DCtx* dctx,
1581 void* dst, size_t maxDstSize,
1582 const void* seqStart, size_t seqSize, int nbSeq,
1583 const ZSTD_longOffset_e isLongOffset)
1585 return ZSTD_decompressSequences_body(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
1588 static TARGET_ATTRIBUTE("bmi2") size_t
1589 ZSTD_decompressSequencesLong_bmi2(ZSTD_DCtx* dctx,
1590 void* dst, size_t maxDstSize,
1591 const void* seqStart, size_t seqSize, int nbSeq,
1592 const ZSTD_longOffset_e isLongOffset)
1594 return ZSTD_decompressSequencesLong_body(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
1599 typedef size_t (*ZSTD_decompressSequences_t)(
1600 ZSTD_DCtx *dctx, void *dst, size_t maxDstSize,
1601 const void *seqStart, size_t seqSize, int nbSeq,
1602 const ZSTD_longOffset_e isLongOffset);
1604 static size_t ZSTD_decompressSequences(ZSTD_DCtx* dctx, void* dst, size_t maxDstSize,
1605 const void* seqStart, size_t seqSize, int nbSeq,
1606 const ZSTD_longOffset_e isLongOffset)
1608 DEBUGLOG(5, "ZSTD_decompressSequences");
1611 return ZSTD_decompressSequences_bmi2(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
1614 return ZSTD_decompressSequences_default(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
1617 static size_t ZSTD_decompressSequencesLong(ZSTD_DCtx* dctx,
1618 void* dst, size_t maxDstSize,
1619 const void* seqStart, size_t seqSize, int nbSeq,
1620 const ZSTD_longOffset_e isLongOffset)
1622 DEBUGLOG(5, "ZSTD_decompressSequencesLong");
1625 return ZSTD_decompressSequencesLong_bmi2(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
1628 return ZSTD_decompressSequencesLong_default(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
1631 /* ZSTD_getLongOffsetsShare() :
1632 * condition : offTable must be valid
1633 * @return : "share" of long offsets (arbitrarily defined as > (1<<23))
1634 * compared to maximum possible of (1<<OffFSELog) */
1636 ZSTD_getLongOffsetsShare(const ZSTD_seqSymbol* offTable)
1638 const void* ptr = offTable;
1639 U32 const tableLog = ((const ZSTD_seqSymbol_header*)ptr)[0].tableLog;
1640 const ZSTD_seqSymbol* table = offTable + 1;
1641 U32 const max = 1 << tableLog;
1643 DEBUGLOG(5, "ZSTD_getLongOffsetsShare: (tableLog=%u)", tableLog);
1645 assert(max <= (1 << OffFSELog)); /* max not too large */
1646 for (u=0; u<max; u++) {
1647 if (table[u].nbAdditionalBits > 22) total += 1;
1650 assert(tableLog <= OffFSELog);
1651 total <<= (OffFSELog - tableLog); /* scale to OffFSELog */
1657 static size_t ZSTD_decompressBlock_internal(ZSTD_DCtx* dctx,
1658 void* dst, size_t dstCapacity,
1659 const void* src, size_t srcSize, const int frame)
1660 { /* blockType == blockCompressed */
1661 const BYTE* ip = (const BYTE*)src;
1662 /* isLongOffset must be true if there are long offsets.
1663 * Offsets are long if they are larger than 2^STREAM_ACCUMULATOR_MIN.
1664 * We don't expect that to be the case in 64-bit mode.
1665 * In block mode, window size is not known, so we have to be conservative. (note: but it could be evaluated from current-lowLimit)
1667 ZSTD_longOffset_e const isLongOffset = (ZSTD_longOffset_e)(MEM_32bits() && (!frame || dctx->fParams.windowSize > (1ULL << STREAM_ACCUMULATOR_MIN)));
1668 DEBUGLOG(5, "ZSTD_decompressBlock_internal (size : %u)", (U32)srcSize);
1670 if (srcSize >= ZSTD_BLOCKSIZE_MAX) return ERROR(srcSize_wrong);
1672 /* Decode literals section */
1673 { size_t const litCSize = ZSTD_decodeLiteralsBlock(dctx, src, srcSize);
1674 DEBUGLOG(5, "ZSTD_decodeLiteralsBlock : %u", (U32)litCSize);
1675 if (ZSTD_isError(litCSize)) return litCSize;
1677 srcSize -= litCSize;
1680 /* Build Decoding Tables */
1682 size_t const seqHSize = ZSTD_decodeSeqHeaders(dctx, &nbSeq, ip, srcSize);
1683 if (ZSTD_isError(seqHSize)) return seqHSize;
1685 srcSize -= seqHSize;
1687 if ( (!frame || dctx->fParams.windowSize > (1<<24))
1688 && (nbSeq>0) ) { /* could probably use a larger nbSeq limit */
1689 U32 const shareLongOffsets = ZSTD_getLongOffsetsShare(dctx->OFTptr);
1690 U32 const minShare = MEM_64bits() ? 7 : 20; /* heuristic values, correspond to 2.73% and 7.81% */
1691 if (shareLongOffsets >= minShare)
1692 return ZSTD_decompressSequencesLong(dctx, dst, dstCapacity, ip, srcSize, nbSeq, isLongOffset);
1695 return ZSTD_decompressSequences(dctx, dst, dstCapacity, ip, srcSize, nbSeq, isLongOffset);
1700 static void ZSTD_checkContinuity(ZSTD_DCtx* dctx, const void* dst)
1702 if (dst != dctx->previousDstEnd) { /* not contiguous */
1703 dctx->dictEnd = dctx->previousDstEnd;
1704 dctx->vBase = (const char*)dst - ((const char*)(dctx->previousDstEnd) - (const char*)(dctx->base));
1706 dctx->previousDstEnd = dst;
1710 size_t ZSTD_decompressBlock(ZSTD_DCtx* dctx,
1711 void* dst, size_t dstCapacity,
1712 const void* src, size_t srcSize)
1715 ZSTD_checkContinuity(dctx, dst);
1716 dSize = ZSTD_decompressBlock_internal(dctx, dst, dstCapacity, src, srcSize, /* frame */ 0);
1717 dctx->previousDstEnd = (char*)dst + dSize;
1722 /** ZSTD_insertBlock() :
1723 insert `src` block into `dctx` history. Useful to track uncompressed blocks. */
1724 ZSTDLIB_API size_t ZSTD_insertBlock(ZSTD_DCtx* dctx, const void* blockStart, size_t blockSize)
1726 ZSTD_checkContinuity(dctx, blockStart);
1727 dctx->previousDstEnd = (const char*)blockStart + blockSize;
1732 static size_t ZSTD_generateNxBytes(void* dst, size_t dstCapacity, BYTE byte, size_t length)
1734 if (length > dstCapacity) return ERROR(dstSize_tooSmall);
1735 memset(dst, byte, length);
1739 /** ZSTD_findFrameCompressedSize() :
1740 * compatible with legacy mode
1741 * `src` must point to the start of a ZSTD frame, ZSTD legacy frame, or skippable frame
1742 * `srcSize` must be at least as large as the frame contained
1743 * @return : the compressed size of the frame starting at `src` */
1744 size_t ZSTD_findFrameCompressedSize(const void *src, size_t srcSize)
1746 #if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT >= 1)
1747 if (ZSTD_isLegacy(src, srcSize))
1748 return ZSTD_findFrameCompressedSizeLegacy(src, srcSize);
1750 if ( (srcSize >= ZSTD_skippableHeaderSize)
1751 && (MEM_readLE32(src) & 0xFFFFFFF0U) == ZSTD_MAGIC_SKIPPABLE_START ) {
1752 return ZSTD_skippableHeaderSize + MEM_readLE32((const BYTE*)src + ZSTD_frameIdSize);
1754 const BYTE* ip = (const BYTE*)src;
1755 const BYTE* const ipstart = ip;
1756 size_t remainingSize = srcSize;
1757 ZSTD_frameHeader zfh;
1759 /* Extract Frame Header */
1760 { size_t const ret = ZSTD_getFrameHeader(&zfh, src, srcSize);
1761 if (ZSTD_isError(ret)) return ret;
1762 if (ret > 0) return ERROR(srcSize_wrong);
1765 ip += zfh.headerSize;
1766 remainingSize -= zfh.headerSize;
1768 /* Loop on each block */
1770 blockProperties_t blockProperties;
1771 size_t const cBlockSize = ZSTD_getcBlockSize(ip, remainingSize, &blockProperties);
1772 if (ZSTD_isError(cBlockSize)) return cBlockSize;
1774 if (ZSTD_blockHeaderSize + cBlockSize > remainingSize)
1775 return ERROR(srcSize_wrong);
1777 ip += ZSTD_blockHeaderSize + cBlockSize;
1778 remainingSize -= ZSTD_blockHeaderSize + cBlockSize;
1780 if (blockProperties.lastBlock) break;
1783 if (zfh.checksumFlag) { /* Final frame content checksum */
1784 if (remainingSize < 4) return ERROR(srcSize_wrong);
1789 return ip - ipstart;
1793 /*! ZSTD_decompressFrame() :
1794 * @dctx must be properly initialized */
1795 static size_t ZSTD_decompressFrame(ZSTD_DCtx* dctx,
1796 void* dst, size_t dstCapacity,
1797 const void** srcPtr, size_t *srcSizePtr)
1799 const BYTE* ip = (const BYTE*)(*srcPtr);
1800 BYTE* const ostart = (BYTE* const)dst;
1801 BYTE* const oend = ostart + dstCapacity;
1803 size_t remainingSize = *srcSizePtr;
1806 if (remainingSize < ZSTD_frameHeaderSize_min+ZSTD_blockHeaderSize)
1807 return ERROR(srcSize_wrong);
1810 { size_t const frameHeaderSize = ZSTD_frameHeaderSize(ip, ZSTD_frameHeaderSize_prefix);
1811 if (ZSTD_isError(frameHeaderSize)) return frameHeaderSize;
1812 if (remainingSize < frameHeaderSize+ZSTD_blockHeaderSize)
1813 return ERROR(srcSize_wrong);
1814 CHECK_F( ZSTD_decodeFrameHeader(dctx, ip, frameHeaderSize) );
1815 ip += frameHeaderSize; remainingSize -= frameHeaderSize;
1818 /* Loop on each block */
1821 blockProperties_t blockProperties;
1822 size_t const cBlockSize = ZSTD_getcBlockSize(ip, remainingSize, &blockProperties);
1823 if (ZSTD_isError(cBlockSize)) return cBlockSize;
1825 ip += ZSTD_blockHeaderSize;
1826 remainingSize -= ZSTD_blockHeaderSize;
1827 if (cBlockSize > remainingSize) return ERROR(srcSize_wrong);
1829 switch(blockProperties.blockType)
1832 decodedSize = ZSTD_decompressBlock_internal(dctx, op, oend-op, ip, cBlockSize, /* frame */ 1);
1835 decodedSize = ZSTD_copyRawBlock(op, oend-op, ip, cBlockSize);
1838 decodedSize = ZSTD_generateNxBytes(op, oend-op, *ip, blockProperties.origSize);
1842 return ERROR(corruption_detected);
1845 if (ZSTD_isError(decodedSize)) return decodedSize;
1846 if (dctx->fParams.checksumFlag)
1847 XXH64_update(&dctx->xxhState, op, decodedSize);
1850 remainingSize -= cBlockSize;
1851 if (blockProperties.lastBlock) break;
1854 if (dctx->fParams.frameContentSize != ZSTD_CONTENTSIZE_UNKNOWN) {
1855 if ((U64)(op-ostart) != dctx->fParams.frameContentSize) {
1856 return ERROR(corruption_detected);
1858 if (dctx->fParams.checksumFlag) { /* Frame content checksum verification */
1859 U32 const checkCalc = (U32)XXH64_digest(&dctx->xxhState);
1861 if (remainingSize<4) return ERROR(checksum_wrong);
1862 checkRead = MEM_readLE32(ip);
1863 if (checkRead != checkCalc) return ERROR(checksum_wrong);
1868 /* Allow caller to get size read */
1870 *srcSizePtr = remainingSize;
1874 static const void* ZSTD_DDictDictContent(const ZSTD_DDict* ddict);
1875 static size_t ZSTD_DDictDictSize(const ZSTD_DDict* ddict);
1877 static size_t ZSTD_decompressMultiFrame(ZSTD_DCtx* dctx,
1878 void* dst, size_t dstCapacity,
1879 const void* src, size_t srcSize,
1880 const void* dict, size_t dictSize,
1881 const ZSTD_DDict* ddict)
1883 void* const dststart = dst;
1884 assert(dict==NULL || ddict==NULL); /* either dict or ddict set, not both */
1887 dict = ZSTD_DDictDictContent(ddict);
1888 dictSize = ZSTD_DDictDictSize(ddict);
1891 while (srcSize >= ZSTD_frameHeaderSize_prefix) {
1894 #if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT >= 1)
1895 if (ZSTD_isLegacy(src, srcSize)) {
1897 size_t const frameSize = ZSTD_findFrameCompressedSizeLegacy(src, srcSize);
1898 if (ZSTD_isError(frameSize)) return frameSize;
1899 /* legacy support is not compatible with static dctx */
1900 if (dctx->staticSize) return ERROR(memory_allocation);
1902 decodedSize = ZSTD_decompressLegacy(dst, dstCapacity, src, frameSize, dict, dictSize);
1904 dst = (BYTE*)dst + decodedSize;
1905 dstCapacity -= decodedSize;
1907 src = (const BYTE*)src + frameSize;
1908 srcSize -= frameSize;
1914 magicNumber = MEM_readLE32(src);
1915 DEBUGLOG(4, "reading magic number %08X (expecting %08X)",
1916 (U32)magicNumber, (U32)ZSTD_MAGICNUMBER);
1917 if (magicNumber != ZSTD_MAGICNUMBER) {
1918 if ((magicNumber & 0xFFFFFFF0U) == ZSTD_MAGIC_SKIPPABLE_START) {
1919 size_t skippableSize;
1920 if (srcSize < ZSTD_skippableHeaderSize)
1921 return ERROR(srcSize_wrong);
1922 skippableSize = MEM_readLE32((const BYTE*)src + ZSTD_frameIdSize)
1923 + ZSTD_skippableHeaderSize;
1924 if (srcSize < skippableSize) return ERROR(srcSize_wrong);
1926 src = (const BYTE *)src + skippableSize;
1927 srcSize -= skippableSize;
1930 return ERROR(prefix_unknown);
1934 /* we were called from ZSTD_decompress_usingDDict */
1935 CHECK_F(ZSTD_decompressBegin_usingDDict(dctx, ddict));
1937 /* this will initialize correctly with no dict if dict == NULL, so
1938 * use this in all cases but ddict */
1939 CHECK_F(ZSTD_decompressBegin_usingDict(dctx, dict, dictSize));
1941 ZSTD_checkContinuity(dctx, dst);
1943 { const size_t res = ZSTD_decompressFrame(dctx, dst, dstCapacity,
1945 if (ZSTD_isError(res)) return res;
1946 /* no need to bound check, ZSTD_decompressFrame already has */
1947 dst = (BYTE*)dst + res;
1950 } /* while (srcSize >= ZSTD_frameHeaderSize_prefix) */
1952 if (srcSize) return ERROR(srcSize_wrong); /* input not entirely consumed */
1954 return (BYTE*)dst - (BYTE*)dststart;
1957 size_t ZSTD_decompress_usingDict(ZSTD_DCtx* dctx,
1958 void* dst, size_t dstCapacity,
1959 const void* src, size_t srcSize,
1960 const void* dict, size_t dictSize)
1962 return ZSTD_decompressMultiFrame(dctx, dst, dstCapacity, src, srcSize, dict, dictSize, NULL);
1966 size_t ZSTD_decompressDCtx(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize)
1968 return ZSTD_decompress_usingDict(dctx, dst, dstCapacity, src, srcSize, NULL, 0);
1972 size_t ZSTD_decompress(void* dst, size_t dstCapacity, const void* src, size_t srcSize)
1974 #if defined(ZSTD_HEAPMODE) && (ZSTD_HEAPMODE>=1)
1976 ZSTD_DCtx* const dctx = ZSTD_createDCtx();
1977 if (dctx==NULL) return ERROR(memory_allocation);
1978 regenSize = ZSTD_decompressDCtx(dctx, dst, dstCapacity, src, srcSize);
1979 ZSTD_freeDCtx(dctx);
1981 #else /* stack mode */
1983 return ZSTD_decompressDCtx(&dctx, dst, dstCapacity, src, srcSize);
1988 /*-**************************************
1989 * Advanced Streaming Decompression API
1990 * Bufferless and synchronous
1991 ****************************************/
1992 size_t ZSTD_nextSrcSizeToDecompress(ZSTD_DCtx* dctx) { return dctx->expected; }
1994 ZSTD_nextInputType_e ZSTD_nextInputType(ZSTD_DCtx* dctx) {
1997 default: /* should not happen */
1999 case ZSTDds_getFrameHeaderSize:
2000 case ZSTDds_decodeFrameHeader:
2001 return ZSTDnit_frameHeader;
2002 case ZSTDds_decodeBlockHeader:
2003 return ZSTDnit_blockHeader;
2004 case ZSTDds_decompressBlock:
2005 return ZSTDnit_block;
2006 case ZSTDds_decompressLastBlock:
2007 return ZSTDnit_lastBlock;
2008 case ZSTDds_checkChecksum:
2009 return ZSTDnit_checksum;
2010 case ZSTDds_decodeSkippableHeader:
2011 case ZSTDds_skipFrame:
2012 return ZSTDnit_skippableFrame;
2016 static int ZSTD_isSkipFrame(ZSTD_DCtx* dctx) { return dctx->stage == ZSTDds_skipFrame; }
2018 /** ZSTD_decompressContinue() :
2019 * srcSize : must be the exact nb of bytes expected (see ZSTD_nextSrcSizeToDecompress())
2020 * @return : nb of bytes generated into `dst` (necessarily <= `dstCapacity)
2021 * or an error code, which can be tested using ZSTD_isError() */
2022 size_t ZSTD_decompressContinue(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize)
2024 DEBUGLOG(5, "ZSTD_decompressContinue (srcSize:%u)", (U32)srcSize);
2026 if (srcSize != dctx->expected) return ERROR(srcSize_wrong); /* not allowed */
2027 if (dstCapacity) ZSTD_checkContinuity(dctx, dst);
2029 switch (dctx->stage)
2031 case ZSTDds_getFrameHeaderSize :
2032 assert(src != NULL);
2033 if (dctx->format == ZSTD_f_zstd1) { /* allows header */
2034 assert(srcSize >= ZSTD_frameIdSize); /* to read skippable magic number */
2035 if ((MEM_readLE32(src) & 0xFFFFFFF0U) == ZSTD_MAGIC_SKIPPABLE_START) { /* skippable frame */
2036 memcpy(dctx->headerBuffer, src, srcSize);
2037 dctx->expected = ZSTD_skippableHeaderSize - srcSize; /* remaining to load to get full skippable frame header */
2038 dctx->stage = ZSTDds_decodeSkippableHeader;
2041 dctx->headerSize = ZSTD_frameHeaderSize_internal(src, srcSize, dctx->format);
2042 if (ZSTD_isError(dctx->headerSize)) return dctx->headerSize;
2043 memcpy(dctx->headerBuffer, src, srcSize);
2044 dctx->expected = dctx->headerSize - srcSize;
2045 dctx->stage = ZSTDds_decodeFrameHeader;
2048 case ZSTDds_decodeFrameHeader:
2049 assert(src != NULL);
2050 memcpy(dctx->headerBuffer + (dctx->headerSize - srcSize), src, srcSize);
2051 CHECK_F(ZSTD_decodeFrameHeader(dctx, dctx->headerBuffer, dctx->headerSize));
2052 dctx->expected = ZSTD_blockHeaderSize;
2053 dctx->stage = ZSTDds_decodeBlockHeader;
2056 case ZSTDds_decodeBlockHeader:
2057 { blockProperties_t bp;
2058 size_t const cBlockSize = ZSTD_getcBlockSize(src, ZSTD_blockHeaderSize, &bp);
2059 if (ZSTD_isError(cBlockSize)) return cBlockSize;
2060 dctx->expected = cBlockSize;
2061 dctx->bType = bp.blockType;
2062 dctx->rleSize = bp.origSize;
2064 dctx->stage = bp.lastBlock ? ZSTDds_decompressLastBlock : ZSTDds_decompressBlock;
2069 if (dctx->fParams.checksumFlag) {
2071 dctx->stage = ZSTDds_checkChecksum;
2073 dctx->expected = 0; /* end of frame */
2074 dctx->stage = ZSTDds_getFrameHeaderSize;
2077 dctx->expected = ZSTD_blockHeaderSize; /* jump to next header */
2078 dctx->stage = ZSTDds_decodeBlockHeader;
2083 case ZSTDds_decompressLastBlock:
2084 case ZSTDds_decompressBlock:
2085 DEBUGLOG(5, "ZSTD_decompressContinue: case ZSTDds_decompressBlock");
2090 DEBUGLOG(5, "ZSTD_decompressContinue: case bt_compressed");
2091 rSize = ZSTD_decompressBlock_internal(dctx, dst, dstCapacity, src, srcSize, /* frame */ 1);
2094 rSize = ZSTD_copyRawBlock(dst, dstCapacity, src, srcSize);
2097 rSize = ZSTD_setRleBlock(dst, dstCapacity, src, srcSize, dctx->rleSize);
2099 case bt_reserved : /* should never happen */
2101 return ERROR(corruption_detected);
2103 if (ZSTD_isError(rSize)) return rSize;
2104 DEBUGLOG(5, "ZSTD_decompressContinue: decoded size from block : %u", (U32)rSize);
2105 dctx->decodedSize += rSize;
2106 if (dctx->fParams.checksumFlag) XXH64_update(&dctx->xxhState, dst, rSize);
2108 if (dctx->stage == ZSTDds_decompressLastBlock) { /* end of frame */
2109 DEBUGLOG(4, "ZSTD_decompressContinue: decoded size from frame : %u", (U32)dctx->decodedSize);
2110 if (dctx->fParams.frameContentSize != ZSTD_CONTENTSIZE_UNKNOWN) {
2111 if (dctx->decodedSize != dctx->fParams.frameContentSize) {
2112 return ERROR(corruption_detected);
2114 if (dctx->fParams.checksumFlag) { /* another round for frame checksum */
2116 dctx->stage = ZSTDds_checkChecksum;
2118 dctx->expected = 0; /* ends here */
2119 dctx->stage = ZSTDds_getFrameHeaderSize;
2122 dctx->stage = ZSTDds_decodeBlockHeader;
2123 dctx->expected = ZSTD_blockHeaderSize;
2124 dctx->previousDstEnd = (char*)dst + rSize;
2129 case ZSTDds_checkChecksum:
2130 assert(srcSize == 4); /* guaranteed by dctx->expected */
2131 { U32 const h32 = (U32)XXH64_digest(&dctx->xxhState);
2132 U32 const check32 = MEM_readLE32(src);
2133 DEBUGLOG(4, "ZSTD_decompressContinue: checksum : calculated %08X :: %08X read", h32, check32);
2134 if (check32 != h32) return ERROR(checksum_wrong);
2136 dctx->stage = ZSTDds_getFrameHeaderSize;
2140 case ZSTDds_decodeSkippableHeader:
2141 assert(src != NULL);
2142 assert(srcSize <= ZSTD_skippableHeaderSize);
2143 memcpy(dctx->headerBuffer + (ZSTD_skippableHeaderSize - srcSize), src, srcSize); /* complete skippable header */
2144 dctx->expected = MEM_readLE32(dctx->headerBuffer + ZSTD_frameIdSize); /* note : dctx->expected can grow seriously large, beyond local buffer size */
2145 dctx->stage = ZSTDds_skipFrame;
2148 case ZSTDds_skipFrame:
2150 dctx->stage = ZSTDds_getFrameHeaderSize;
2154 return ERROR(GENERIC); /* impossible */
2159 static size_t ZSTD_refDictContent(ZSTD_DCtx* dctx, const void* dict, size_t dictSize)
2161 dctx->dictEnd = dctx->previousDstEnd;
2162 dctx->vBase = (const char*)dict - ((const char*)(dctx->previousDstEnd) - (const char*)(dctx->base));
2164 dctx->previousDstEnd = (const char*)dict + dictSize;
2168 /* ZSTD_loadEntropy() :
2169 * dict : must point at beginning of a valid zstd dictionary
2170 * @return : size of entropy tables read */
2171 static size_t ZSTD_loadEntropy(ZSTD_entropyDTables_t* entropy, const void* const dict, size_t const dictSize)
2173 const BYTE* dictPtr = (const BYTE*)dict;
2174 const BYTE* const dictEnd = dictPtr + dictSize;
2176 if (dictSize <= 8) return ERROR(dictionary_corrupted);
2177 dictPtr += 8; /* skip header = magic + dictID */
2180 { size_t const hSize = HUF_readDTableX4_wksp(
2181 entropy->hufTable, dictPtr, dictEnd - dictPtr,
2182 entropy->workspace, sizeof(entropy->workspace));
2183 if (HUF_isError(hSize)) return ERROR(dictionary_corrupted);
2187 { short offcodeNCount[MaxOff+1];
2188 U32 offcodeMaxValue = MaxOff, offcodeLog;
2189 size_t const offcodeHeaderSize = FSE_readNCount(offcodeNCount, &offcodeMaxValue, &offcodeLog, dictPtr, dictEnd-dictPtr);
2190 if (FSE_isError(offcodeHeaderSize)) return ERROR(dictionary_corrupted);
2191 if (offcodeMaxValue > MaxOff) return ERROR(dictionary_corrupted);
2192 if (offcodeLog > OffFSELog) return ERROR(dictionary_corrupted);
2193 ZSTD_buildFSETable(entropy->OFTable,
2194 offcodeNCount, offcodeMaxValue,
2197 dictPtr += offcodeHeaderSize;
2200 { short matchlengthNCount[MaxML+1];
2201 unsigned matchlengthMaxValue = MaxML, matchlengthLog;
2202 size_t const matchlengthHeaderSize = FSE_readNCount(matchlengthNCount, &matchlengthMaxValue, &matchlengthLog, dictPtr, dictEnd-dictPtr);
2203 if (FSE_isError(matchlengthHeaderSize)) return ERROR(dictionary_corrupted);
2204 if (matchlengthMaxValue > MaxML) return ERROR(dictionary_corrupted);
2205 if (matchlengthLog > MLFSELog) return ERROR(dictionary_corrupted);
2206 ZSTD_buildFSETable(entropy->MLTable,
2207 matchlengthNCount, matchlengthMaxValue,
2210 dictPtr += matchlengthHeaderSize;
2213 { short litlengthNCount[MaxLL+1];
2214 unsigned litlengthMaxValue = MaxLL, litlengthLog;
2215 size_t const litlengthHeaderSize = FSE_readNCount(litlengthNCount, &litlengthMaxValue, &litlengthLog, dictPtr, dictEnd-dictPtr);
2216 if (FSE_isError(litlengthHeaderSize)) return ERROR(dictionary_corrupted);
2217 if (litlengthMaxValue > MaxLL) return ERROR(dictionary_corrupted);
2218 if (litlengthLog > LLFSELog) return ERROR(dictionary_corrupted);
2219 ZSTD_buildFSETable(entropy->LLTable,
2220 litlengthNCount, litlengthMaxValue,
2223 dictPtr += litlengthHeaderSize;
2226 if (dictPtr+12 > dictEnd) return ERROR(dictionary_corrupted);
2228 size_t const dictContentSize = (size_t)(dictEnd - (dictPtr+12));
2229 for (i=0; i<3; i++) {
2230 U32 const rep = MEM_readLE32(dictPtr); dictPtr += 4;
2231 if (rep==0 || rep >= dictContentSize) return ERROR(dictionary_corrupted);
2232 entropy->rep[i] = rep;
2235 return dictPtr - (const BYTE*)dict;
2238 static size_t ZSTD_decompress_insertDictionary(ZSTD_DCtx* dctx, const void* dict, size_t dictSize)
2240 if (dictSize < 8) return ZSTD_refDictContent(dctx, dict, dictSize);
2241 { U32 const magic = MEM_readLE32(dict);
2242 if (magic != ZSTD_MAGIC_DICTIONARY) {
2243 return ZSTD_refDictContent(dctx, dict, dictSize); /* pure content mode */
2245 dctx->dictID = MEM_readLE32((const char*)dict + ZSTD_frameIdSize);
2247 /* load entropy tables */
2248 { size_t const eSize = ZSTD_loadEntropy(&dctx->entropy, dict, dictSize);
2249 if (ZSTD_isError(eSize)) return ERROR(dictionary_corrupted);
2250 dict = (const char*)dict + eSize;
2253 dctx->litEntropy = dctx->fseEntropy = 1;
2255 /* reference dictionary content */
2256 return ZSTD_refDictContent(dctx, dict, dictSize);
2259 /* Note : this function cannot fail */
2260 size_t ZSTD_decompressBegin(ZSTD_DCtx* dctx)
2262 assert(dctx != NULL);
2263 dctx->expected = ZSTD_startingInputLength(dctx->format); /* dctx->format must be properly set */
2264 dctx->stage = ZSTDds_getFrameHeaderSize;
2265 dctx->decodedSize = 0;
2266 dctx->previousDstEnd = NULL;
2269 dctx->dictEnd = NULL;
2270 dctx->entropy.hufTable[0] = (HUF_DTable)((HufLog)*0x1000001); /* cover both little and big endian */
2271 dctx->litEntropy = dctx->fseEntropy = 0;
2273 ZSTD_STATIC_ASSERT(sizeof(dctx->entropy.rep) == sizeof(repStartValue));
2274 memcpy(dctx->entropy.rep, repStartValue, sizeof(repStartValue)); /* initial repcodes */
2275 dctx->LLTptr = dctx->entropy.LLTable;
2276 dctx->MLTptr = dctx->entropy.MLTable;
2277 dctx->OFTptr = dctx->entropy.OFTable;
2278 dctx->HUFptr = dctx->entropy.hufTable;
2282 size_t ZSTD_decompressBegin_usingDict(ZSTD_DCtx* dctx, const void* dict, size_t dictSize)
2284 CHECK_F( ZSTD_decompressBegin(dctx) );
2285 if (dict && dictSize)
2286 CHECK_E(ZSTD_decompress_insertDictionary(dctx, dict, dictSize), dictionary_corrupted);
2291 /* ====== ZSTD_DDict ====== */
2293 struct ZSTD_DDict_s {
2295 const void* dictContent;
2297 ZSTD_entropyDTables_t entropy;
2300 ZSTD_customMem cMem;
2301 }; /* typedef'd to ZSTD_DDict within "zstd.h" */
2303 static const void* ZSTD_DDictDictContent(const ZSTD_DDict* ddict)
2305 return ddict->dictContent;
2308 static size_t ZSTD_DDictDictSize(const ZSTD_DDict* ddict)
2310 return ddict->dictSize;
2313 size_t ZSTD_decompressBegin_usingDDict(ZSTD_DCtx* dstDCtx, const ZSTD_DDict* ddict)
2315 CHECK_F( ZSTD_decompressBegin(dstDCtx) );
2316 if (ddict) { /* support begin on NULL */
2317 dstDCtx->dictID = ddict->dictID;
2318 dstDCtx->base = ddict->dictContent;
2319 dstDCtx->vBase = ddict->dictContent;
2320 dstDCtx->dictEnd = (const BYTE*)ddict->dictContent + ddict->dictSize;
2321 dstDCtx->previousDstEnd = dstDCtx->dictEnd;
2322 if (ddict->entropyPresent) {
2323 dstDCtx->litEntropy = 1;
2324 dstDCtx->fseEntropy = 1;
2325 dstDCtx->LLTptr = ddict->entropy.LLTable;
2326 dstDCtx->MLTptr = ddict->entropy.MLTable;
2327 dstDCtx->OFTptr = ddict->entropy.OFTable;
2328 dstDCtx->HUFptr = ddict->entropy.hufTable;
2329 dstDCtx->entropy.rep[0] = ddict->entropy.rep[0];
2330 dstDCtx->entropy.rep[1] = ddict->entropy.rep[1];
2331 dstDCtx->entropy.rep[2] = ddict->entropy.rep[2];
2333 dstDCtx->litEntropy = 0;
2334 dstDCtx->fseEntropy = 0;
2340 static size_t ZSTD_loadEntropy_inDDict(ZSTD_DDict* ddict, ZSTD_dictContentType_e dictContentType)
2343 ddict->entropyPresent = 0;
2344 if (dictContentType == ZSTD_dct_rawContent) return 0;
2346 if (ddict->dictSize < 8) {
2347 if (dictContentType == ZSTD_dct_fullDict)
2348 return ERROR(dictionary_corrupted); /* only accept specified dictionaries */
2349 return 0; /* pure content mode */
2351 { U32 const magic = MEM_readLE32(ddict->dictContent);
2352 if (magic != ZSTD_MAGIC_DICTIONARY) {
2353 if (dictContentType == ZSTD_dct_fullDict)
2354 return ERROR(dictionary_corrupted); /* only accept specified dictionaries */
2355 return 0; /* pure content mode */
2358 ddict->dictID = MEM_readLE32((const char*)ddict->dictContent + ZSTD_frameIdSize);
2360 /* load entropy tables */
2361 CHECK_E( ZSTD_loadEntropy(&ddict->entropy, ddict->dictContent, ddict->dictSize), dictionary_corrupted );
2362 ddict->entropyPresent = 1;
2367 static size_t ZSTD_initDDict_internal(ZSTD_DDict* ddict,
2368 const void* dict, size_t dictSize,
2369 ZSTD_dictLoadMethod_e dictLoadMethod,
2370 ZSTD_dictContentType_e dictContentType)
2372 if ((dictLoadMethod == ZSTD_dlm_byRef) || (!dict) || (!dictSize)) {
2373 ddict->dictBuffer = NULL;
2374 ddict->dictContent = dict;
2376 void* const internalBuffer = ZSTD_malloc(dictSize, ddict->cMem);
2377 ddict->dictBuffer = internalBuffer;
2378 ddict->dictContent = internalBuffer;
2379 if (!internalBuffer) return ERROR(memory_allocation);
2380 memcpy(internalBuffer, dict, dictSize);
2382 ddict->dictSize = dictSize;
2383 ddict->entropy.hufTable[0] = (HUF_DTable)((HufLog)*0x1000001); /* cover both little and big endian */
2385 /* parse dictionary content */
2386 CHECK_F( ZSTD_loadEntropy_inDDict(ddict, dictContentType) );
2391 ZSTD_DDict* ZSTD_createDDict_advanced(const void* dict, size_t dictSize,
2392 ZSTD_dictLoadMethod_e dictLoadMethod,
2393 ZSTD_dictContentType_e dictContentType,
2394 ZSTD_customMem customMem)
2396 if (!customMem.customAlloc ^ !customMem.customFree) return NULL;
2398 { ZSTD_DDict* const ddict = (ZSTD_DDict*) ZSTD_malloc(sizeof(ZSTD_DDict), customMem);
2399 if (!ddict) return NULL;
2400 ddict->cMem = customMem;
2402 if (ZSTD_isError( ZSTD_initDDict_internal(ddict, dict, dictSize, dictLoadMethod, dictContentType) )) {
2403 ZSTD_freeDDict(ddict);
2411 /*! ZSTD_createDDict() :
2412 * Create a digested dictionary, to start decompression without startup delay.
2413 * `dict` content is copied inside DDict.
2414 * Consequently, `dict` can be released after `ZSTD_DDict` creation */
2415 ZSTD_DDict* ZSTD_createDDict(const void* dict, size_t dictSize)
2417 ZSTD_customMem const allocator = { NULL, NULL, NULL };
2418 return ZSTD_createDDict_advanced(dict, dictSize, ZSTD_dlm_byCopy, ZSTD_dct_auto, allocator);
2421 /*! ZSTD_createDDict_byReference() :
2422 * Create a digested dictionary, to start decompression without startup delay.
2423 * Dictionary content is simply referenced, it will be accessed during decompression.
2424 * Warning : dictBuffer must outlive DDict (DDict must be freed before dictBuffer) */
2425 ZSTD_DDict* ZSTD_createDDict_byReference(const void* dictBuffer, size_t dictSize)
2427 ZSTD_customMem const allocator = { NULL, NULL, NULL };
2428 return ZSTD_createDDict_advanced(dictBuffer, dictSize, ZSTD_dlm_byRef, ZSTD_dct_auto, allocator);
2432 const ZSTD_DDict* ZSTD_initStaticDDict(
2433 void* workspace, size_t workspaceSize,
2434 const void* dict, size_t dictSize,
2435 ZSTD_dictLoadMethod_e dictLoadMethod,
2436 ZSTD_dictContentType_e dictContentType)
2438 size_t const neededSpace =
2439 sizeof(ZSTD_DDict) + (dictLoadMethod == ZSTD_dlm_byRef ? 0 : dictSize);
2440 ZSTD_DDict* const ddict = (ZSTD_DDict*)workspace;
2441 assert(workspace != NULL);
2442 assert(dict != NULL);
2443 if ((size_t)workspace & 7) return NULL; /* 8-aligned */
2444 if (workspaceSize < neededSpace) return NULL;
2445 if (dictLoadMethod == ZSTD_dlm_byCopy) {
2446 memcpy(ddict+1, dict, dictSize); /* local copy */
2449 if (ZSTD_isError( ZSTD_initDDict_internal(ddict, dict, dictSize, ZSTD_dlm_byRef, dictContentType) ))
2455 size_t ZSTD_freeDDict(ZSTD_DDict* ddict)
2457 if (ddict==NULL) return 0; /* support free on NULL */
2458 { ZSTD_customMem const cMem = ddict->cMem;
2459 ZSTD_free(ddict->dictBuffer, cMem);
2460 ZSTD_free(ddict, cMem);
2465 /*! ZSTD_estimateDDictSize() :
2466 * Estimate amount of memory that will be needed to create a dictionary for decompression.
2467 * Note : dictionary created by reference using ZSTD_dlm_byRef are smaller */
2468 size_t ZSTD_estimateDDictSize(size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod)
2470 return sizeof(ZSTD_DDict) + (dictLoadMethod == ZSTD_dlm_byRef ? 0 : dictSize);
2473 size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict)
2475 if (ddict==NULL) return 0; /* support sizeof on NULL */
2476 return sizeof(*ddict) + (ddict->dictBuffer ? ddict->dictSize : 0) ;
2479 /*! ZSTD_getDictID_fromDict() :
2480 * Provides the dictID stored within dictionary.
2481 * if @return == 0, the dictionary is not conformant with Zstandard specification.
2482 * It can still be loaded, but as a content-only dictionary. */
2483 unsigned ZSTD_getDictID_fromDict(const void* dict, size_t dictSize)
2485 if (dictSize < 8) return 0;
2486 if (MEM_readLE32(dict) != ZSTD_MAGIC_DICTIONARY) return 0;
2487 return MEM_readLE32((const char*)dict + ZSTD_frameIdSize);
2490 /*! ZSTD_getDictID_fromDDict() :
2491 * Provides the dictID of the dictionary loaded into `ddict`.
2492 * If @return == 0, the dictionary is not conformant to Zstandard specification, or empty.
2493 * Non-conformant dictionaries can still be loaded, but as content-only dictionaries. */
2494 unsigned ZSTD_getDictID_fromDDict(const ZSTD_DDict* ddict)
2496 if (ddict==NULL) return 0;
2497 return ZSTD_getDictID_fromDict(ddict->dictContent, ddict->dictSize);
2500 /*! ZSTD_getDictID_fromFrame() :
2501 * Provides the dictID required to decompresse frame stored within `src`.
2502 * If @return == 0, the dictID could not be decoded.
2503 * This could for one of the following reasons :
2504 * - The frame does not require a dictionary (most common case).
2505 * - The frame was built with dictID intentionally removed.
2506 * Needed dictionary is a hidden information.
2507 * Note : this use case also happens when using a non-conformant dictionary.
2508 * - `srcSize` is too small, and as a result, frame header could not be decoded.
2509 * Note : possible if `srcSize < ZSTD_FRAMEHEADERSIZE_MAX`.
2510 * - This is not a Zstandard frame.
2511 * When identifying the exact failure cause, it's possible to use
2512 * ZSTD_getFrameHeader(), which will provide a more precise error code. */
2513 unsigned ZSTD_getDictID_fromFrame(const void* src, size_t srcSize)
2515 ZSTD_frameHeader zfp = { 0, 0, 0, ZSTD_frame, 0, 0, 0 };
2516 size_t const hError = ZSTD_getFrameHeader(&zfp, src, srcSize);
2517 if (ZSTD_isError(hError)) return 0;
2522 /*! ZSTD_decompress_usingDDict() :
2523 * Decompression using a pre-digested Dictionary
2524 * Use dictionary without significant overhead. */
2525 size_t ZSTD_decompress_usingDDict(ZSTD_DCtx* dctx,
2526 void* dst, size_t dstCapacity,
2527 const void* src, size_t srcSize,
2528 const ZSTD_DDict* ddict)
2530 /* pass content and size in case legacy frames are encountered */
2531 return ZSTD_decompressMultiFrame(dctx, dst, dstCapacity, src, srcSize,
2537 /*=====================================
2538 * Streaming decompression
2539 *====================================*/
2541 ZSTD_DStream* ZSTD_createDStream(void)
2543 DEBUGLOG(3, "ZSTD_createDStream");
2544 return ZSTD_createDStream_advanced(ZSTD_defaultCMem);
2547 ZSTD_DStream* ZSTD_initStaticDStream(void *workspace, size_t workspaceSize)
2549 return ZSTD_initStaticDCtx(workspace, workspaceSize);
2552 ZSTD_DStream* ZSTD_createDStream_advanced(ZSTD_customMem customMem)
2554 return ZSTD_createDCtx_advanced(customMem);
2557 size_t ZSTD_freeDStream(ZSTD_DStream* zds)
2559 return ZSTD_freeDCtx(zds);
2563 /* *** Initialization *** */
2565 size_t ZSTD_DStreamInSize(void) { return ZSTD_BLOCKSIZE_MAX + ZSTD_blockHeaderSize; }
2566 size_t ZSTD_DStreamOutSize(void) { return ZSTD_BLOCKSIZE_MAX; }
2568 size_t ZSTD_DCtx_loadDictionary_advanced(ZSTD_DCtx* dctx, const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_dictContentType_e dictContentType)
2570 if (dctx->streamStage != zdss_init) return ERROR(stage_wrong);
2571 ZSTD_freeDDict(dctx->ddictLocal);
2572 if (dict && dictSize >= 8) {
2573 dctx->ddictLocal = ZSTD_createDDict_advanced(dict, dictSize, dictLoadMethod, dictContentType, dctx->customMem);
2574 if (dctx->ddictLocal == NULL) return ERROR(memory_allocation);
2576 dctx->ddictLocal = NULL;
2578 dctx->ddict = dctx->ddictLocal;
2582 size_t ZSTD_DCtx_loadDictionary_byReference(ZSTD_DCtx* dctx, const void* dict, size_t dictSize)
2584 return ZSTD_DCtx_loadDictionary_advanced(dctx, dict, dictSize, ZSTD_dlm_byRef, ZSTD_dct_auto);
2587 size_t ZSTD_DCtx_loadDictionary(ZSTD_DCtx* dctx, const void* dict, size_t dictSize)
2589 return ZSTD_DCtx_loadDictionary_advanced(dctx, dict, dictSize, ZSTD_dlm_byCopy, ZSTD_dct_auto);
2592 size_t ZSTD_DCtx_refPrefix_advanced(ZSTD_DCtx* dctx, const void* prefix, size_t prefixSize, ZSTD_dictContentType_e dictContentType)
2594 return ZSTD_DCtx_loadDictionary_advanced(dctx, prefix, prefixSize, ZSTD_dlm_byRef, dictContentType);
2597 size_t ZSTD_DCtx_refPrefix(ZSTD_DCtx* dctx, const void* prefix, size_t prefixSize)
2599 return ZSTD_DCtx_refPrefix_advanced(dctx, prefix, prefixSize, ZSTD_dct_rawContent);
2603 /* ZSTD_initDStream_usingDict() :
2604 * return : expected size, aka ZSTD_frameHeaderSize_prefix.
2605 * this function cannot fail */
2606 size_t ZSTD_initDStream_usingDict(ZSTD_DStream* zds, const void* dict, size_t dictSize)
2608 DEBUGLOG(4, "ZSTD_initDStream_usingDict");
2609 zds->streamStage = zdss_init;
2610 CHECK_F( ZSTD_DCtx_loadDictionary(zds, dict, dictSize) );
2611 return ZSTD_frameHeaderSize_prefix;
2614 /* note : this variant can't fail */
2615 size_t ZSTD_initDStream(ZSTD_DStream* zds)
2617 DEBUGLOG(4, "ZSTD_initDStream");
2618 return ZSTD_initDStream_usingDict(zds, NULL, 0);
2621 size_t ZSTD_DCtx_refDDict(ZSTD_DCtx* dctx, const ZSTD_DDict* ddict)
2623 if (dctx->streamStage != zdss_init) return ERROR(stage_wrong);
2624 dctx->ddict = ddict;
2628 /* ZSTD_initDStream_usingDDict() :
2629 * ddict will just be referenced, and must outlive decompression session
2630 * this function cannot fail */
2631 size_t ZSTD_initDStream_usingDDict(ZSTD_DStream* dctx, const ZSTD_DDict* ddict)
2633 size_t const initResult = ZSTD_initDStream(dctx);
2634 dctx->ddict = ddict;
2638 /* ZSTD_resetDStream() :
2639 * return : expected size, aka ZSTD_frameHeaderSize_prefix.
2640 * this function cannot fail */
2641 size_t ZSTD_resetDStream(ZSTD_DStream* dctx)
2643 DEBUGLOG(4, "ZSTD_resetDStream");
2644 dctx->streamStage = zdss_loadHeader;
2645 dctx->lhSize = dctx->inPos = dctx->outStart = dctx->outEnd = 0;
2646 dctx->legacyVersion = 0;
2647 dctx->hostageByte = 0;
2648 return ZSTD_frameHeaderSize_prefix;
2651 size_t ZSTD_setDStreamParameter(ZSTD_DStream* dctx,
2652 ZSTD_DStreamParameter_e paramType, unsigned paramValue)
2654 if (dctx->streamStage != zdss_init) return ERROR(stage_wrong);
2657 default : return ERROR(parameter_unsupported);
2658 case DStream_p_maxWindowSize :
2659 DEBUGLOG(4, "setting maxWindowSize = %u KB", paramValue >> 10);
2660 dctx->maxWindowSize = paramValue ? paramValue : (U32)(-1);
2666 size_t ZSTD_DCtx_setMaxWindowSize(ZSTD_DCtx* dctx, size_t maxWindowSize)
2668 if (dctx->streamStage != zdss_init) return ERROR(stage_wrong);
2669 dctx->maxWindowSize = maxWindowSize;
2673 size_t ZSTD_DCtx_setFormat(ZSTD_DCtx* dctx, ZSTD_format_e format)
2675 DEBUGLOG(4, "ZSTD_DCtx_setFormat : %u", (unsigned)format);
2676 if (dctx->streamStage != zdss_init) return ERROR(stage_wrong);
2677 dctx->format = format;
2682 size_t ZSTD_sizeof_DStream(const ZSTD_DStream* dctx)
2684 return ZSTD_sizeof_DCtx(dctx);
2687 size_t ZSTD_decodingBufferSize_min(unsigned long long windowSize, unsigned long long frameContentSize)
2689 size_t const blockSize = (size_t) MIN(windowSize, ZSTD_BLOCKSIZE_MAX);
2690 unsigned long long const neededRBSize = windowSize + blockSize + (WILDCOPY_OVERLENGTH * 2);
2691 unsigned long long const neededSize = MIN(frameContentSize, neededRBSize);
2692 size_t const minRBSize = (size_t) neededSize;
2693 if ((unsigned long long)minRBSize != neededSize) return ERROR(frameParameter_windowTooLarge);
2697 size_t ZSTD_estimateDStreamSize(size_t windowSize)
2699 size_t const blockSize = MIN(windowSize, ZSTD_BLOCKSIZE_MAX);
2700 size_t const inBuffSize = blockSize; /* no block can be larger */
2701 size_t const outBuffSize = ZSTD_decodingBufferSize_min(windowSize, ZSTD_CONTENTSIZE_UNKNOWN);
2702 return ZSTD_estimateDCtxSize() + inBuffSize + outBuffSize;
2705 size_t ZSTD_estimateDStreamSize_fromFrame(const void* src, size_t srcSize)
2707 U32 const windowSizeMax = 1U << ZSTD_WINDOWLOG_MAX; /* note : should be user-selectable */
2708 ZSTD_frameHeader zfh;
2709 size_t const err = ZSTD_getFrameHeader(&zfh, src, srcSize);
2710 if (ZSTD_isError(err)) return err;
2711 if (err>0) return ERROR(srcSize_wrong);
2712 if (zfh.windowSize > windowSizeMax)
2713 return ERROR(frameParameter_windowTooLarge);
2714 return ZSTD_estimateDStreamSize((size_t)zfh.windowSize);
2718 /* ***** Decompression ***** */
2720 MEM_STATIC size_t ZSTD_limitCopy(void* dst, size_t dstCapacity, const void* src, size_t srcSize)
2722 size_t const length = MIN(dstCapacity, srcSize);
2723 memcpy(dst, src, length);
2728 size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inBuffer* input)
2730 const char* const istart = (const char*)(input->src) + input->pos;
2731 const char* const iend = (const char*)(input->src) + input->size;
2732 const char* ip = istart;
2733 char* const ostart = (char*)(output->dst) + output->pos;
2734 char* const oend = (char*)(output->dst) + output->size;
2736 U32 someMoreWork = 1;
2738 DEBUGLOG(5, "ZSTD_decompressStream");
2739 if (input->pos > input->size) { /* forbidden */
2740 DEBUGLOG(5, "in: pos: %u vs size: %u",
2741 (U32)input->pos, (U32)input->size);
2742 return ERROR(srcSize_wrong);
2744 if (output->pos > output->size) { /* forbidden */
2745 DEBUGLOG(5, "out: pos: %u vs size: %u",
2746 (U32)output->pos, (U32)output->size);
2747 return ERROR(dstSize_tooSmall);
2749 DEBUGLOG(5, "input size : %u", (U32)(input->size - input->pos));
2751 while (someMoreWork) {
2752 switch(zds->streamStage)
2755 DEBUGLOG(5, "stage zdss_init => transparent reset ");
2756 ZSTD_resetDStream(zds); /* transparent reset on starting decoding a new frame */
2759 case zdss_loadHeader :
2760 DEBUGLOG(5, "stage zdss_loadHeader (srcSize : %u)", (U32)(iend - ip));
2761 #if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT>=1)
2762 if (zds->legacyVersion) {
2763 /* legacy support is incompatible with static dctx */
2764 if (zds->staticSize) return ERROR(memory_allocation);
2765 { size_t const hint = ZSTD_decompressLegacyStream(zds->legacyContext, zds->legacyVersion, output, input);
2766 if (hint==0) zds->streamStage = zdss_init;
2770 { size_t const hSize = ZSTD_getFrameHeader_internal(&zds->fParams, zds->headerBuffer, zds->lhSize, zds->format);
2771 DEBUGLOG(5, "header size : %u", (U32)hSize);
2772 if (ZSTD_isError(hSize)) {
2773 #if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT>=1)
2774 U32 const legacyVersion = ZSTD_isLegacy(istart, iend-istart);
2775 if (legacyVersion) {
2776 const void* const dict = zds->ddict ? zds->ddict->dictContent : NULL;
2777 size_t const dictSize = zds->ddict ? zds->ddict->dictSize : 0;
2778 DEBUGLOG(5, "ZSTD_decompressStream: detected legacy version v0.%u", legacyVersion);
2779 /* legacy support is incompatible with static dctx */
2780 if (zds->staticSize) return ERROR(memory_allocation);
2781 CHECK_F(ZSTD_initLegacyStream(&zds->legacyContext,
2782 zds->previousLegacyVersion, legacyVersion,
2784 zds->legacyVersion = zds->previousLegacyVersion = legacyVersion;
2785 { size_t const hint = ZSTD_decompressLegacyStream(zds->legacyContext, legacyVersion, output, input);
2786 if (hint==0) zds->streamStage = zdss_init; /* or stay in stage zdss_loadHeader */
2790 return hSize; /* error */
2792 if (hSize != 0) { /* need more input */
2793 size_t const toLoad = hSize - zds->lhSize; /* if hSize!=0, hSize > zds->lhSize */
2794 size_t const remainingInput = (size_t)(iend-ip);
2796 if (toLoad > remainingInput) { /* not enough input to load full header */
2797 if (remainingInput > 0) {
2798 memcpy(zds->headerBuffer + zds->lhSize, ip, remainingInput);
2799 zds->lhSize += remainingInput;
2801 input->pos = input->size;
2802 return (MAX(ZSTD_frameHeaderSize_min, hSize) - zds->lhSize) + ZSTD_blockHeaderSize; /* remaining header bytes + next block header */
2805 memcpy(zds->headerBuffer + zds->lhSize, ip, toLoad); zds->lhSize = hSize; ip += toLoad;
2809 /* check for single-pass mode opportunity */
2810 if (zds->fParams.frameContentSize && zds->fParams.windowSize /* skippable frame if == 0 */
2811 && (U64)(size_t)(oend-op) >= zds->fParams.frameContentSize) {
2812 size_t const cSize = ZSTD_findFrameCompressedSize(istart, iend-istart);
2813 if (cSize <= (size_t)(iend-istart)) {
2814 /* shortcut : using single-pass mode */
2815 size_t const decompressedSize = ZSTD_decompress_usingDDict(zds, op, oend-op, istart, cSize, zds->ddict);
2816 if (ZSTD_isError(decompressedSize)) return decompressedSize;
2817 DEBUGLOG(4, "shortcut to single-pass ZSTD_decompress_usingDDict()")
2818 ip = istart + cSize;
2819 op += decompressedSize;
2821 zds->streamStage = zdss_init;
2826 /* Consume header (see ZSTDds_decodeFrameHeader) */
2827 DEBUGLOG(4, "Consume header");
2828 CHECK_F(ZSTD_decompressBegin_usingDDict(zds, zds->ddict));
2830 if ((MEM_readLE32(zds->headerBuffer) & 0xFFFFFFF0U) == ZSTD_MAGIC_SKIPPABLE_START) { /* skippable frame */
2831 zds->expected = MEM_readLE32(zds->headerBuffer + ZSTD_frameIdSize);
2832 zds->stage = ZSTDds_skipFrame;
2834 CHECK_F(ZSTD_decodeFrameHeader(zds, zds->headerBuffer, zds->lhSize));
2835 zds->expected = ZSTD_blockHeaderSize;
2836 zds->stage = ZSTDds_decodeBlockHeader;
2839 /* control buffer memory usage */
2840 DEBUGLOG(4, "Control max memory usage (%u KB <= max %u KB)",
2841 (U32)(zds->fParams.windowSize >>10),
2842 (U32)(zds->maxWindowSize >> 10) );
2843 zds->fParams.windowSize = MAX(zds->fParams.windowSize, 1U << ZSTD_WINDOWLOG_ABSOLUTEMIN);
2844 if (zds->fParams.windowSize > zds->maxWindowSize) return ERROR(frameParameter_windowTooLarge);
2846 /* Adapt buffer sizes to frame header instructions */
2847 { size_t const neededInBuffSize = MAX(zds->fParams.blockSizeMax, 4 /* frame checksum */);
2848 size_t const neededOutBuffSize = ZSTD_decodingBufferSize_min(zds->fParams.windowSize, zds->fParams.frameContentSize);
2849 if ((zds->inBuffSize < neededInBuffSize) || (zds->outBuffSize < neededOutBuffSize)) {
2850 size_t const bufferSize = neededInBuffSize + neededOutBuffSize;
2851 DEBUGLOG(4, "inBuff : from %u to %u",
2852 (U32)zds->inBuffSize, (U32)neededInBuffSize);
2853 DEBUGLOG(4, "outBuff : from %u to %u",
2854 (U32)zds->outBuffSize, (U32)neededOutBuffSize);
2855 if (zds->staticSize) { /* static DCtx */
2856 DEBUGLOG(4, "staticSize : %u", (U32)zds->staticSize);
2857 assert(zds->staticSize >= sizeof(ZSTD_DCtx)); /* controlled at init */
2858 if (bufferSize > zds->staticSize - sizeof(ZSTD_DCtx))
2859 return ERROR(memory_allocation);
2861 ZSTD_free(zds->inBuff, zds->customMem);
2862 zds->inBuffSize = 0;
2863 zds->outBuffSize = 0;
2864 zds->inBuff = (char*)ZSTD_malloc(bufferSize, zds->customMem);
2865 if (zds->inBuff == NULL) return ERROR(memory_allocation);
2867 zds->inBuffSize = neededInBuffSize;
2868 zds->outBuff = zds->inBuff + zds->inBuffSize;
2869 zds->outBuffSize = neededOutBuffSize;
2871 zds->streamStage = zdss_read;
2875 DEBUGLOG(5, "stage zdss_read");
2876 { size_t const neededInSize = ZSTD_nextSrcSizeToDecompress(zds);
2877 DEBUGLOG(5, "neededInSize = %u", (U32)neededInSize);
2878 if (neededInSize==0) { /* end of frame */
2879 zds->streamStage = zdss_init;
2883 if ((size_t)(iend-ip) >= neededInSize) { /* decode directly from src */
2884 int const isSkipFrame = ZSTD_isSkipFrame(zds);
2885 size_t const decodedSize = ZSTD_decompressContinue(zds,
2886 zds->outBuff + zds->outStart, (isSkipFrame ? 0 : zds->outBuffSize - zds->outStart),
2888 if (ZSTD_isError(decodedSize)) return decodedSize;
2890 if (!decodedSize && !isSkipFrame) break; /* this was just a header */
2891 zds->outEnd = zds->outStart + decodedSize;
2892 zds->streamStage = zdss_flush;
2895 if (ip==iend) { someMoreWork = 0; break; } /* no more input */
2896 zds->streamStage = zdss_load;
2900 { size_t const neededInSize = ZSTD_nextSrcSizeToDecompress(zds);
2901 size_t const toLoad = neededInSize - zds->inPos;
2902 int const isSkipFrame = ZSTD_isSkipFrame(zds);
2905 loadedSize = MIN(toLoad, (size_t)(iend-ip));
2907 if (toLoad > zds->inBuffSize - zds->inPos) return ERROR(corruption_detected); /* should never happen */
2908 loadedSize = ZSTD_limitCopy(zds->inBuff + zds->inPos, toLoad, ip, iend-ip);
2911 zds->inPos += loadedSize;
2912 if (loadedSize < toLoad) { someMoreWork = 0; break; } /* not enough input, wait for more */
2914 /* decode loaded input */
2915 { size_t const decodedSize = ZSTD_decompressContinue(zds,
2916 zds->outBuff + zds->outStart, zds->outBuffSize - zds->outStart,
2917 zds->inBuff, neededInSize);
2918 if (ZSTD_isError(decodedSize)) return decodedSize;
2919 zds->inPos = 0; /* input is consumed */
2920 if (!decodedSize && !isSkipFrame) { zds->streamStage = zdss_read; break; } /* this was just a header */
2921 zds->outEnd = zds->outStart + decodedSize;
2923 zds->streamStage = zdss_flush;
2927 { size_t const toFlushSize = zds->outEnd - zds->outStart;
2928 size_t const flushedSize = ZSTD_limitCopy(op, oend-op, zds->outBuff + zds->outStart, toFlushSize);
2930 zds->outStart += flushedSize;
2931 if (flushedSize == toFlushSize) { /* flush completed */
2932 zds->streamStage = zdss_read;
2933 if ( (zds->outBuffSize < zds->fParams.frameContentSize)
2934 && (zds->outStart + zds->fParams.blockSizeMax > zds->outBuffSize) ) {
2935 DEBUGLOG(5, "restart filling outBuff from beginning (left:%i, needed:%u)",
2936 (int)(zds->outBuffSize - zds->outStart),
2937 (U32)zds->fParams.blockSizeMax);
2938 zds->outStart = zds->outEnd = 0;
2942 /* cannot complete flush */
2946 default: return ERROR(GENERIC); /* impossible */
2950 input->pos += (size_t)(ip-istart);
2951 output->pos += (size_t)(op-ostart);
2952 { size_t nextSrcSizeHint = ZSTD_nextSrcSizeToDecompress(zds);
2953 if (!nextSrcSizeHint) { /* frame fully decoded */
2954 if (zds->outEnd == zds->outStart) { /* output fully flushed */
2955 if (zds->hostageByte) {
2956 if (input->pos >= input->size) {
2957 /* can't release hostage (not present) */
2958 zds->streamStage = zdss_read;
2961 input->pos++; /* release hostage */
2962 } /* zds->hostageByte */
2964 } /* zds->outEnd == zds->outStart */
2965 if (!zds->hostageByte) { /* output not fully flushed; keep last byte as hostage; will be released when all output is flushed */
2966 input->pos--; /* note : pos > 0, otherwise, impossible to finish reading last block */
2970 } /* nextSrcSizeHint==0 */
2971 nextSrcSizeHint += ZSTD_blockHeaderSize * (ZSTD_nextInputType(zds) == ZSTDnit_block); /* preload header of next block */
2972 assert(zds->inPos <= nextSrcSizeHint);
2973 nextSrcSizeHint -= zds->inPos; /* part already loaded*/
2974 return nextSrcSizeHint;
2979 size_t ZSTD_decompress_generic(ZSTD_DCtx* dctx, ZSTD_outBuffer* output, ZSTD_inBuffer* input)
2981 return ZSTD_decompressStream(dctx, output, input);
2984 size_t ZSTD_decompress_generic_simpleArgs (
2986 void* dst, size_t dstCapacity, size_t* dstPos,
2987 const void* src, size_t srcSize, size_t* srcPos)
2989 ZSTD_outBuffer output = { dst, dstCapacity, *dstPos };
2990 ZSTD_inBuffer input = { src, srcSize, *srcPos };
2991 /* ZSTD_compress_generic() will check validity of dstPos and srcPos */
2992 size_t const cErr = ZSTD_decompress_generic(dctx, &output, &input);
2993 *dstPos = output.pos;
2994 *srcPos = input.pos;
2998 void ZSTD_DCtx_reset(ZSTD_DCtx* dctx)
3000 (void)ZSTD_initDStream(dctx);
3001 dctx->format = ZSTD_f_zstd1;
3002 dctx->maxWindowSize = ZSTD_MAXWINDOWSIZE_DEFAULT;