Lines Matching +full:5 +full:- +full:byte

2  * Copyright (c) 2016-present, Yann Collet, Facebook, Inc.
5 * This source code is licensed under the BSD-style license found in the
12 * Free Software Foundation. This program is dual-licensed; you may select
29 /*-*******************************************************
42 /*-*************************************
54 /*-*************************************************************
96 const BYTE *litPtr;
100 BYTE litBuffer[ZSTD_BLOCKSIZE_ABSOLUTEMAX + WILDCOPY_OVERLENGTH];
101 BYTE headerBuffer[ZSTD_FRAMEHEADERSIZE_MAX];
108 dctx->expected = ZSTD_frameHeaderSize_prefix; in ZSTD_decompressBegin()
109 dctx->stage = ZSTDds_getFrameHeaderSize; in ZSTD_decompressBegin()
110 dctx->previousDstEnd = NULL; in ZSTD_decompressBegin()
111 dctx->base = NULL; in ZSTD_decompressBegin()
112 dctx->vBase = NULL; in ZSTD_decompressBegin()
113 dctx->dictEnd = NULL; in ZSTD_decompressBegin()
114 …dctx->entropy.hufTable[0] = (HUF_DTable)((HufLog)*0x1000001); /* cover both little and big endian … in ZSTD_decompressBegin()
115 dctx->litEntropy = dctx->fseEntropy = 0; in ZSTD_decompressBegin()
116 dctx->dictID = 0; in ZSTD_decompressBegin()
117 ZSTD_STATIC_ASSERT(sizeof(dctx->entropy.rep) == sizeof(repStartValue)); in ZSTD_decompressBegin()
118 memcpy(dctx->entropy.rep, repStartValue, sizeof(repStartValue)); /* initial repcodes */ in ZSTD_decompressBegin()
119 dctx->LLTptr = dctx->entropy.LLTable; in ZSTD_decompressBegin()
120 dctx->MLTptr = dctx->entropy.MLTable; in ZSTD_decompressBegin()
121 dctx->OFTptr = dctx->entropy.OFTable; in ZSTD_decompressBegin()
122 dctx->HUFptr = dctx->entropy.hufTable; in ZSTD_decompressBegin()
136 memcpy(&dctx->customMem, &customMem, sizeof(customMem)); in ZSTD_createDCtx_advanced()
151 ZSTD_free(dctx, dctx->customMem); in ZSTD_freeDCtx()
158 memcpy(dstDCtx, srcDCtx, sizeof(ZSTD_DCtx) - workSpaceSize); /* no need to copy workspace */ in ZSTD_copyDCtx()
163 /*-*************************************************************
194 BYTE const fhd = ((const BYTE *)src)[4]; in ZSTD_frameHeaderSize()
196 U32 const singleSegment = (fhd >> 5) & 1; in ZSTD_frameHeaderSize()
209 const BYTE *ip = (const BYTE *)src; in ZSTD_getFrameParams()
218 fparamsPtr->frameContentSize = ZSTD_readLE32((const char *)src + 4); in ZSTD_getFrameParams()
219 fparamsPtr->windowSize = 0; /* windowSize==0 means a frame is skippable */ in ZSTD_getFrameParams()
233 BYTE const fhdByte = ip[4]; in ZSTD_getFrameParams()
234 size_t pos = 5; in ZSTD_getFrameParams()
237 U32 const singleSegment = (fhdByte >> 5) & 1; in ZSTD_getFrameParams()
246 BYTE const wlByte = ip[pos++]; in ZSTD_getFrameParams()
284 fparamsPtr->frameContentSize = frameContentSize; in ZSTD_getFrameParams()
285 fparamsPtr->windowSize = windowSize; in ZSTD_getFrameParams()
286 fparamsPtr->dictID = dictID; in ZSTD_getFrameParams()
287 fparamsPtr->checksumFlag = checksumFlag; in ZSTD_getFrameParams()
295 * - ZSTD_CONTENTSIZE_UNKNOWN if the size cannot be determined
296 * - ZSTD_CONTENTSIZE_ERROR if an error occurred (e.g. invalid magic number, srcSize too…
330 skippableSize = ZSTD_readLE32((const BYTE *)src + 4) + ZSTD_skippableHeaderSize; in ZSTD_findDecompressedSize()
335 src = (const BYTE *)src + skippableSize; in ZSTD_findDecompressedSize()
336 srcSize -= skippableSize; in ZSTD_findDecompressedSize()
356 src = (const BYTE *)src + frameSrcSize; in ZSTD_findDecompressedSize()
357 srcSize -= frameSrcSize; in ZSTD_findDecompressedSize()
374 size_t const result = ZSTD_getFrameParams(&(dctx->fParams), src, headerSize); in ZSTD_decodeFrameHeader()
379 if (dctx->fParams.dictID && (dctx->dictID != dctx->fParams.dictID)) in ZSTD_decodeFrameHeader()
381 if (dctx->fParams.checksumFlag) in ZSTD_decodeFrameHeader()
382 xxh64_reset(&dctx->xxhState, 0); in ZSTD_decodeFrameHeader()
401 bpPtr->lastBlock = cBlockHeader & 1; in ZSTD_getcBlockSize()
402 bpPtr->blockType = (blockType_e)((cBlockHeader >> 1) & 3); in ZSTD_getcBlockSize()
403 bpPtr->origSize = cSize; /* only useful for RLE */ in ZSTD_getcBlockSize()
404 if (bpPtr->blockType == bt_rle) in ZSTD_getcBlockSize()
406 if (bpPtr->blockType == bt_reserved) in ZSTD_getcBlockSize()
426 memset(dst, *(const BYTE *)src, regenSize); in ZSTD_setRleBlock()
438 const BYTE *const istart = (const BYTE *)src; in ZSTD_decodeLiteralsBlock()
443 if (dctx->litEntropy == 0) in ZSTD_decodeLiteralsBlock()
447 if (srcSize < 5) in ZSTD_decodeLiteralsBlock()
448 …return ERROR(corruption_detected); /* srcSize >= MIN_CBLOCK_SIZE == 3; here we need up to 5 for ca… in ZSTD_decodeLiteralsBlock()
458 /* 2 - 2 - 10 - 10 */ in ZSTD_decodeLiteralsBlock()
465 /* 2 - 2 - 14 - 14 */ in ZSTD_decodeLiteralsBlock()
471 /* 2 - 2 - 18 - 18 */ in ZSTD_decodeLiteralsBlock()
472 lhSize = 5; in ZSTD_decodeLiteralsBlock()
484 …(singleStream ? HUF_decompress1X_usingDTable(dctx->litBuffer, litSize, istart + lhSize, litCSize, … in ZSTD_decodeLiteralsBlock()
485 … : HUF_decompress4X_usingDTable(dctx->litBuffer, litSize, istart + lhSize, litCSize, dctx->HUFptr)) in ZSTD_decodeLiteralsBlock()
487 …? HUF_decompress1X2_DCtx_wksp(dctx->entropy.hufTable, dctx->litBuffer, litSize, istart + lhSize, l… in ZSTD_decodeLiteralsBlock()
488 dctx->entropy.workspace, sizeof(dctx->entropy.workspace)) in ZSTD_decodeLiteralsBlock()
489 …: HUF_decompress4X_hufOnly_wksp(dctx->entropy.hufTable, dctx->litBuffer, litSize, istart + lhSize,… in ZSTD_decodeLiteralsBlock()
490 dctx->entropy.workspace, sizeof(dctx->entropy.workspace))))) in ZSTD_decodeLiteralsBlock()
493 dctx->litPtr = dctx->litBuffer; in ZSTD_decodeLiteralsBlock()
494 dctx->litSize = litSize; in ZSTD_decodeLiteralsBlock()
495 dctx->litEntropy = 1; in ZSTD_decodeLiteralsBlock()
497 dctx->HUFptr = dctx->entropy.hufTable; in ZSTD_decodeLiteralsBlock()
498 memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH); in ZSTD_decodeLiteralsBlock()
525 memcpy(dctx->litBuffer, istart + lhSize, litSize); in ZSTD_decodeLiteralsBlock()
526 dctx->litPtr = dctx->litBuffer; in ZSTD_decodeLiteralsBlock()
527 dctx->litSize = litSize; in ZSTD_decodeLiteralsBlock()
528 memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH); in ZSTD_decodeLiteralsBlock()
532 dctx->litPtr = istart + lhSize; in ZSTD_decodeLiteralsBlock()
533 dctx->litSize = litSize; in ZSTD_decodeLiteralsBlock()
560 memset(dctx->litBuffer, istart[lhSize], litSize + WILDCOPY_OVERLENGTH); in ZSTD_decodeLiteralsBlock()
561 dctx->litPtr = dctx->litBuffer; in ZSTD_decodeLiteralsBlock()
562 dctx->litSize = litSize; in ZSTD_decodeLiteralsBlock()
580 {{32, 1, 5}},
581 {{0, 3, 5}},
582 {{0, 4, 5}},
583 {{0, 6, 5}},
584 {{0, 7, 5}},
585 {{0, 9, 5}},
586 {{0, 10, 5}},
587 {{0, 12, 5}},
589 {{0, 16, 5}},
590 {{0, 18, 5}},
591 {{0, 19, 5}},
592 {{0, 21, 5}},
593 {{0, 22, 5}},
594 {{0, 24, 5}},
595 {{32, 25, 5}},
596 {{0, 26, 5}},
602 {{0, 2, 5}},
603 {{32, 4, 5}},
604 {{0, 5, 5}},
605 {{32, 7, 5}},
606 {{0, 8, 5}},
607 {{32, 10, 5}},
608 {{0, 11, 5}},
610 {{32, 16, 5}},
611 {{0, 17, 5}},
612 {{32, 19, 5}},
613 {{0, 20, 5}},
614 {{32, 22, 5}},
615 {{0, 23, 5}},
618 {{32, 26, 5}},
623 {{32, 2, 5}},
624 {{32, 3, 5}},
625 {{32, 5, 5}},
626 {{32, 6, 5}},
627 {{32, 8, 5}},
628 {{32, 9, 5}},
629 {{32, 11, 5}},
630 {{32, 12, 5}},
632 {{32, 17, 5}},
633 {{32, 18, 5}},
634 {{32, 20, 5}},
635 {{32, 21, 5}},
636 {{32, 23, 5}},
637 {{32, 24, 5}},
648 {{32, 2, 5}},
649 {{0, 3, 5}},
650 {{0, 5, 5}},
651 {{0, 6, 5}},
652 {{0, 8, 5}},
670 {{32, 3, 5}},
671 {{0, 4, 5}},
672 {{32, 6, 5}},
673 {{0, 7, 5}},
692 {{32, 4, 5}},
693 {{32, 5, 5}},
694 {{32, 7, 5}},
695 {{32, 8, 5}},
714 {{0, 0, 5}}, /* 0 : base, symbol, bits */
716 {{0, 9, 5}},
717 {{0, 15, 5}},
718 {{0, 21, 5}},
719 {{0, 3, 5}},
721 {{0, 12, 5}},
722 {{0, 18, 5}},
723 {{0, 23, 5}},
724 {{0, 5, 5}},
726 {{0, 14, 5}},
727 {{0, 20, 5}},
728 {{0, 2, 5}},
730 {{0, 11, 5}},
731 {{0, 17, 5}},
732 {{0, 22, 5}},
733 {{0, 4, 5}},
735 {{0, 13, 5}},
736 {{0, 19, 5}},
737 {{0, 1, 5}},
739 {{0, 10, 5}},
740 {{0, 16, 5}},
741 {{0, 28, 5}},
742 {{0, 27, 5}},
743 {{0, 26, 5}},
744 {{0, 25, 5}},
745 {{0, 24, 5}},
760 if ((*(const BYTE *)src) > max) in ZSTD_buildSeqTable()
762 FSE_buildDTable_rle(DTableSpace, *(const BYTE *)src); in ZSTD_buildSeqTable()
779 workspaceSize -= (spaceUsed32 << 2); in ZSTD_buildSeqTable()
796 const BYTE *const istart = (const BYTE *const)src; in ZSTD_decodeSeqHeaders()
797 const BYTE *const iend = istart + srcSize; in ZSTD_decodeSeqHeaders()
798 const BYTE *ip = istart; in ZSTD_decodeSeqHeaders()
819 nbSeq = ((nbSeq - 0x80) << 8) + *ip++; in ZSTD_decodeSeqHeaders()
836 …_t const llhSize = ZSTD_buildSeqTable(dctx->entropy.LLTable, &dctx->LLTptr, LLtype, MaxLL, LLFSELo… in ZSTD_decodeSeqHeaders()
837 … LL_defaultDTable, dctx->fseEntropy, dctx->entropy.workspace, sizeof(dctx->entropy.workspace)); in ZSTD_decodeSeqHeaders()
843 …t const ofhSize = ZSTD_buildSeqTable(dctx->entropy.OFTable, &dctx->OFTptr, OFtype, MaxOff, OffFSEL… in ZSTD_decodeSeqHeaders()
844 … OF_defaultDTable, dctx->fseEntropy, dctx->entropy.workspace, sizeof(dctx->entropy.workspace)); in ZSTD_decodeSeqHeaders()
850 …_t const mlhSize = ZSTD_buildSeqTable(dctx->entropy.MLTable, &dctx->MLTptr, MLtype, MaxML, MLFSELo… in ZSTD_decodeSeqHeaders()
851 … ML_defaultDTable, dctx->fseEntropy, dctx->entropy.workspace, sizeof(dctx->entropy.workspace)); in ZSTD_decodeSeqHeaders()
858 return ip - istart; in ZSTD_decodeSeqHeaders()
865 const BYTE *match;
874 const BYTE *base;
880 …t ZSTD_execSequenceLast7(BYTE *op, BYTE *const oend, seq_t sequence, const BYTE **litPtr, const BY… in ZSTD_execSequenceLast7()
881 const BYTE *const vBase, const BYTE *const dictEnd) in ZSTD_execSequenceLast7()
883 BYTE *const oLitEnd = op + sequence.litLength; in ZSTD_execSequenceLast7()
885 BYTE *const oMatchEnd = op + sequenceLength; /* risk : address space overflow (32-bits) */ in ZSTD_execSequenceLast7()
886 BYTE *const oend_w = oend - WILDCOPY_OVERLENGTH; in ZSTD_execSequenceLast7()
887 const BYTE *const iLitEnd = *litPtr + sequence.litLength; in ZSTD_execSequenceLast7()
888 const BYTE *match = oLitEnd - sequence.offset; in ZSTD_execSequenceLast7()
894 return ERROR(corruption_detected); /* over-read beyond lit buffer */ in ZSTD_execSequenceLast7()
900 ZSTD_wildcopy(op, *litPtr, oend_w - op); in ZSTD_execSequenceLast7()
901 *litPtr += oend_w - op; in ZSTD_execSequenceLast7()
908 if (sequence.offset > (size_t)(oLitEnd - base)) { in ZSTD_execSequenceLast7()
910 if (sequence.offset > (size_t)(oLitEnd - vBase)) in ZSTD_execSequenceLast7()
912 match = dictEnd - (base - match); in ZSTD_execSequenceLast7()
919 size_t const length1 = dictEnd - match; in ZSTD_execSequenceLast7()
922 sequence.matchLength -= length1; in ZSTD_execSequenceLast7()
935 U32 const llCode = FSE_peekSymbol(&seqState->stateLL); in ZSTD_decodeSequence()
936 U32 const mlCode = FSE_peekSymbol(&seqState->stateML); in ZSTD_decodeSequence()
937 U32 const ofCode = FSE_peekSymbol(&seqState->stateOffb); /* <= maxOff, by table construction */ in ZSTD_decodeSequence()
944 …static const U32 LL_base[MaxLL + 1] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, … in ZSTD_decodeSequence()
947 …static const U32 ML_base[MaxML + 1] = {3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, … in ZSTD_decodeSequence()
951 …static const U32 OF_base[MaxOff + 1] = {0, 1, 1, 5, 0xD, 0x1D, 0x3D, 0x7D, … in ZSTD_decodeSequence()
961 …offset = OF_base[ofCode] + BIT_readBitsFast(&seqState->DStream, ofBits); /* <= (ZSTD_WINDOWLOG_MA… in ZSTD_decodeSequence()
963 BIT_reloadDStream(&seqState->DStream); in ZSTD_decodeSequence()
969 size_t temp = (offset == 3) ? seqState->prevOffset[0] - 1 : seqState->prevOffset[offset]; in ZSTD_decodeSequence()
972 seqState->prevOffset[2] = seqState->prevOffset[1]; in ZSTD_decodeSequence()
973 seqState->prevOffset[1] = seqState->prevOffset[0]; in ZSTD_decodeSequence()
974 seqState->prevOffset[0] = offset = temp; in ZSTD_decodeSequence()
976 offset = seqState->prevOffset[0]; in ZSTD_decodeSequence()
979 seqState->prevOffset[2] = seqState->prevOffset[1]; in ZSTD_decodeSequence()
980 seqState->prevOffset[1] = seqState->prevOffset[0]; in ZSTD_decodeSequence()
981 seqState->prevOffset[0] = offset; in ZSTD_decodeSequence()
986 …seq.matchLength = ML_base[mlCode] + ((mlCode > 31) ? BIT_readBitsFast(&seqState->DStream, mlBits) … in ZSTD_decodeSequence()
988 BIT_reloadDStream(&seqState->DStream); in ZSTD_decodeSequence()
990 …seq.litLength = LL_base[llCode] + ((llCode > 15) ? BIT_readBitsFast(&seqState->DStream, llBits) : … in ZSTD_decodeSequence()
991 if (ZSTD_32bits() || (totalBits > 64 - 7 - (LLFSELog + MLFSELog + OffFSELog))) in ZSTD_decodeSequence()
992 BIT_reloadDStream(&seqState->DStream); in ZSTD_decodeSequence()
995 FSE_updateState(&seqState->stateLL, &seqState->DStream); /* <= 9 bits */ in ZSTD_decodeSequence()
996 FSE_updateState(&seqState->stateML, &seqState->DStream); /* <= 9 bits */ in ZSTD_decodeSequence()
998 BIT_reloadDStream(&seqState->DStream); /* <= 18 bits */ in ZSTD_decodeSequence()
999 FSE_updateState(&seqState->stateOffb, &seqState->DStream); /* <= 8 bits */ in ZSTD_decodeSequence()
1007 size_t ZSTD_execSequence(BYTE *op, BYTE *const oend, seq_t sequence, const BYTE **litPtr, const BYT… in ZSTD_execSequence()
1008 const BYTE *const vBase, const BYTE *const dictEnd) in ZSTD_execSequence()
1010 BYTE *const oLitEnd = op + sequence.litLength; in ZSTD_execSequence()
1012 BYTE *const oMatchEnd = op + sequenceLength; /* risk : address space overflow (32-bits) */ in ZSTD_execSequence()
1013 BYTE *const oend_w = oend - WILDCOPY_OVERLENGTH; in ZSTD_execSequence()
1014 const BYTE *const iLitEnd = *litPtr + sequence.litLength; in ZSTD_execSequence()
1015 const BYTE *match = oLitEnd - sequence.offset; in ZSTD_execSequence()
1021 return ERROR(corruption_detected); /* over-read beyond lit buffer */ in ZSTD_execSequence()
1029 …sequence.litLength - 8); /* note : since oLitEnd <= oend-WILDCOPY_OVERLENGTH, no risk of overwrite… in ZSTD_execSequence()
1034 if (sequence.offset > (size_t)(oLitEnd - base)) { in ZSTD_execSequence()
1036 if (sequence.offset > (size_t)(oLitEnd - vBase)) in ZSTD_execSequence()
1038 match = dictEnd + (match - base); in ZSTD_execSequence()
1045 size_t const length1 = dictEnd - match; in ZSTD_execSequence()
1048 sequence.matchLength -= length1; in ZSTD_execSequence()
1072 match -= sub2; in ZSTD_execSequence()
1079 if (oMatchEnd > oend - (16 - MINMATCH)) { in ZSTD_execSequence()
1081 ZSTD_wildcopy(op, match, oend_w - op); in ZSTD_execSequence()
1082 match += oend_w - op; in ZSTD_execSequence()
1088 ZSTD_wildcopy(op, match, (ptrdiff_t)sequence.matchLength - 8); /* works even if matchLength < 8 */ in ZSTD_execSequence()
1095 const BYTE *ip = (const BYTE *)seqStart; in ZSTD_decompressSequences()
1096 const BYTE *const iend = ip + seqSize; in ZSTD_decompressSequences()
1097 BYTE *const ostart = (BYTE * const)dst; in ZSTD_decompressSequences()
1098 BYTE *const oend = ostart + maxDstSize; in ZSTD_decompressSequences()
1099 BYTE *op = ostart; in ZSTD_decompressSequences()
1100 const BYTE *litPtr = dctx->litPtr; in ZSTD_decompressSequences()
1101 const BYTE *const litEnd = litPtr + dctx->litSize; in ZSTD_decompressSequences()
1102 const BYTE *const base = (const BYTE *)(dctx->base); in ZSTD_decompressSequences()
1103 const BYTE *const vBase = (const BYTE *)(dctx->vBase); in ZSTD_decompressSequences()
1104 const BYTE *const dictEnd = (const BYTE *)(dctx->dictEnd); in ZSTD_decompressSequences()
1118 dctx->fseEntropy = 1; in ZSTD_decompressSequences()
1122 seqState.prevOffset[i] = dctx->entropy.rep[i]; in ZSTD_decompressSequences()
1124 CHECK_E(BIT_initDStream(&seqState.DStream, ip, iend - ip), corruption_detected); in ZSTD_decompressSequences()
1125 FSE_initDState(&seqState.stateLL, &seqState.DStream, dctx->LLTptr); in ZSTD_decompressSequences()
1126 FSE_initDState(&seqState.stateOffb, &seqState.DStream, dctx->OFTptr); in ZSTD_decompressSequences()
1127 FSE_initDState(&seqState.stateML, &seqState.DStream, dctx->MLTptr); in ZSTD_decompressSequences()
1130 nbSeq--; in ZSTD_decompressSequences()
1147 dctx->entropy.rep[i] = (U32)(seqState.prevOffset[i]); in ZSTD_decompressSequences()
1153 size_t const lastLLSize = litEnd - litPtr; in ZSTD_decompressSequences()
1154 if (lastLLSize > (size_t)(oend - op)) in ZSTD_decompressSequences()
1160 return op - ostart; in ZSTD_decompressSequences()
1167 U32 const llCode = FSE_peekSymbol(&seqState->stateLL); in ZSTD_decodeSequenceLong_generic()
1168 U32 const mlCode = FSE_peekSymbol(&seqState->stateML); in ZSTD_decodeSequenceLong_generic()
1169 U32 const ofCode = FSE_peekSymbol(&seqState->stateOffb); /* <= maxOff, by table construction */ in ZSTD_decodeSequenceLong_generic()
1176 …static const U32 LL_base[MaxLL + 1] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, … in ZSTD_decodeSequenceLong_generic()
1179 …static const U32 ML_base[MaxML + 1] = {3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, … in ZSTD_decodeSequenceLong_generic()
1183 …static const U32 OF_base[MaxOff + 1] = {0, 1, 1, 5, 0xD, 0x1D, 0x3D, 0x7D, … in ZSTD_decodeSequenceLong_generic()
1194 int const extraBits = ofBits - MIN(ofBits, STREAM_ACCUMULATOR_MIN); in ZSTD_decodeSequenceLong_generic()
1195 …offset = OF_base[ofCode] + (BIT_readBitsFast(&seqState->DStream, ofBits - extraBits) << extraBits); in ZSTD_decodeSequenceLong_generic()
1197 BIT_reloadDStream(&seqState->DStream); in ZSTD_decodeSequenceLong_generic()
1199 offset += BIT_readBitsFast(&seqState->DStream, extraBits); in ZSTD_decodeSequenceLong_generic()
1201 …offset = OF_base[ofCode] + BIT_readBitsFast(&seqState->DStream, ofBits); /* <= (ZSTD_WINDOWLOG_MA… in ZSTD_decodeSequenceLong_generic()
1203 BIT_reloadDStream(&seqState->DStream); in ZSTD_decodeSequenceLong_generic()
1210 size_t temp = (offset == 3) ? seqState->prevOffset[0] - 1 : seqState->prevOffset[offset]; in ZSTD_decodeSequenceLong_generic()
1213 seqState->prevOffset[2] = seqState->prevOffset[1]; in ZSTD_decodeSequenceLong_generic()
1214 seqState->prevOffset[1] = seqState->prevOffset[0]; in ZSTD_decodeSequenceLong_generic()
1215 seqState->prevOffset[0] = offset = temp; in ZSTD_decodeSequenceLong_generic()
1217 offset = seqState->prevOffset[0]; in ZSTD_decodeSequenceLong_generic()
1220 seqState->prevOffset[2] = seqState->prevOffset[1]; in ZSTD_decodeSequenceLong_generic()
1221 seqState->prevOffset[1] = seqState->prevOffset[0]; in ZSTD_decodeSequenceLong_generic()
1222 seqState->prevOffset[0] = offset; in ZSTD_decodeSequenceLong_generic()
1227 …seq.matchLength = ML_base[mlCode] + ((mlCode > 31) ? BIT_readBitsFast(&seqState->DStream, mlBits) … in ZSTD_decodeSequenceLong_generic()
1229 BIT_reloadDStream(&seqState->DStream); in ZSTD_decodeSequenceLong_generic()
1231 …seq.litLength = LL_base[llCode] + ((llCode > 15) ? BIT_readBitsFast(&seqState->DStream, llBits) : … in ZSTD_decodeSequenceLong_generic()
1232 if (ZSTD_32bits() || (totalBits > 64 - 7 - (LLFSELog + MLFSELog + OffFSELog))) in ZSTD_decodeSequenceLong_generic()
1233 BIT_reloadDStream(&seqState->DStream); in ZSTD_decodeSequenceLong_generic()
1236 size_t const pos = seqState->pos + seq.litLength; in ZSTD_decodeSequenceLong_generic()
1237 seq.match = seqState->base + pos - seq.offset; /* single memory segment */ in ZSTD_decodeSequenceLong_generic()
1239 seq.match += seqState->gotoDict; /* separate memory segment */ in ZSTD_decodeSequenceLong_generic()
1240 seqState->pos = pos + seq.matchLength; in ZSTD_decodeSequenceLong_generic()
1244 FSE_updateState(&seqState->stateLL, &seqState->DStream); /* <= 9 bits */ in ZSTD_decodeSequenceLong_generic()
1245 FSE_updateState(&seqState->stateML, &seqState->DStream); /* <= 9 bits */ in ZSTD_decodeSequenceLong_generic()
1247 BIT_reloadDStream(&seqState->DStream); /* <= 18 bits */ in ZSTD_decodeSequenceLong_generic()
1248 FSE_updateState(&seqState->stateOffb, &seqState->DStream); /* <= 8 bits */ in ZSTD_decodeSequenceLong_generic()
1263 …_t ZSTD_execSequenceLong(BYTE *op, BYTE *const oend, seq_t sequence, const BYTE **litPtr, const BY… in ZSTD_execSequenceLong()
1264 const BYTE *const vBase, const BYTE *const dictEnd) in ZSTD_execSequenceLong()
1266 BYTE *const oLitEnd = op + sequence.litLength; in ZSTD_execSequenceLong()
1268 BYTE *const oMatchEnd = op + sequenceLength; /* risk : address space overflow (32-bits) */ in ZSTD_execSequenceLong()
1269 BYTE *const oend_w = oend - WILDCOPY_OVERLENGTH; in ZSTD_execSequenceLong()
1270 const BYTE *const iLitEnd = *litPtr + sequence.litLength; in ZSTD_execSequenceLong()
1271 const BYTE *match = sequence.match; in ZSTD_execSequenceLong()
1277 return ERROR(corruption_detected); /* over-read beyond lit buffer */ in ZSTD_execSequenceLong()
1285 …sequence.litLength - 8); /* note : since oLitEnd <= oend-WILDCOPY_OVERLENGTH, no risk of overwrite… in ZSTD_execSequenceLong()
1290 if (sequence.offset > (size_t)(oLitEnd - base)) { in ZSTD_execSequenceLong()
1292 if (sequence.offset > (size_t)(oLitEnd - vBase)) in ZSTD_execSequenceLong()
1300 size_t const length1 = dictEnd - match; in ZSTD_execSequenceLong()
1303 sequence.matchLength -= length1; in ZSTD_execSequenceLong()
1327 match -= sub2; in ZSTD_execSequenceLong()
1334 if (oMatchEnd > oend - (16 - MINMATCH)) { in ZSTD_execSequenceLong()
1336 ZSTD_wildcopy(op, match, oend_w - op); in ZSTD_execSequenceLong()
1337 match += oend_w - op; in ZSTD_execSequenceLong()
1343 ZSTD_wildcopy(op, match, (ptrdiff_t)sequence.matchLength - 8); /* works even if matchLength < 8 */ in ZSTD_execSequenceLong()
1350 const BYTE *ip = (const BYTE *)seqStart; in ZSTD_decompressSequencesLong()
1351 const BYTE *const iend = ip + seqSize; in ZSTD_decompressSequencesLong()
1352 BYTE *const ostart = (BYTE * const)dst; in ZSTD_decompressSequencesLong()
1353 BYTE *const oend = ostart + maxDstSize; in ZSTD_decompressSequencesLong()
1354 BYTE *op = ostart; in ZSTD_decompressSequencesLong()
1355 const BYTE *litPtr = dctx->litPtr; in ZSTD_decompressSequencesLong()
1356 const BYTE *const litEnd = litPtr + dctx->litSize; in ZSTD_decompressSequencesLong()
1357 const BYTE *const base = (const BYTE *)(dctx->base); in ZSTD_decompressSequencesLong()
1358 const BYTE *const vBase = (const BYTE *)(dctx->vBase); in ZSTD_decompressSequencesLong()
1359 const BYTE *const dictEnd = (const BYTE *)(dctx->dictEnd); in ZSTD_decompressSequencesLong()
1360 unsigned const windowSize = dctx->fParams.windowSize; in ZSTD_decompressSequencesLong()
1374 #define STOSEQ_MASK (STORED_SEQS - 1) in ZSTD_decompressSequencesLong()
1376 seq_t *sequences = (seq_t *)dctx->entropy.workspace; in ZSTD_decompressSequencesLong()
1380 ZSTD_STATIC_ASSERT(sizeof(dctx->entropy.workspace) >= sizeof(seq_t) * STORED_SEQS); in ZSTD_decompressSequencesLong()
1381 dctx->fseEntropy = 1; in ZSTD_decompressSequencesLong()
1385 seqState.prevOffset[i] = dctx->entropy.rep[i]; in ZSTD_decompressSequencesLong()
1388 seqState.pos = (size_t)(op - base); in ZSTD_decompressSequencesLong()
1389 seqState.gotoDict = (uPtrDiff)dictEnd - (uPtrDiff)base; /* cast to avoid undefined behaviour */ in ZSTD_decompressSequencesLong()
1390 CHECK_E(BIT_initDStream(&seqState.DStream, ip, iend - ip), corruption_detected); in ZSTD_decompressSequencesLong()
1391 FSE_initDState(&seqState.stateLL, &seqState.DStream, dctx->LLTptr); in ZSTD_decompressSequencesLong()
1392 FSE_initDState(&seqState.stateOffb, &seqState.DStream, dctx->OFTptr); in ZSTD_decompressSequencesLong()
1393 FSE_initDState(&seqState.stateML, &seqState.DStream, dctx->MLTptr); in ZSTD_decompressSequencesLong()
1406 …ZSTD_execSequenceLong(op, oend, sequences[(seqNb - ADVANCED_SEQS) & STOSEQ_MASK], &litPtr, litEnd,… in ZSTD_decompressSequencesLong()
1417 seqNb -= seqAdvance; in ZSTD_decompressSequencesLong()
1429 dctx->entropy.rep[i] = (U32)(seqState.prevOffset[i]); in ZSTD_decompressSequencesLong()
1435 size_t const lastLLSize = litEnd - litPtr; in ZSTD_decompressSequencesLong()
1436 if (lastLLSize > (size_t)(oend - op)) in ZSTD_decompressSequencesLong()
1442 return op - ostart; in ZSTD_decompressSequencesLong()
1447 const BYTE *ip = (const BYTE *)src; in ZSTD_decompressBlock_internal()
1458 srcSize -= litCSize; in ZSTD_decompressBlock_internal()
1460 …if (sizeof(size_t) > 4) /* do not enable prefetching on 32-bits x86, as it's performance detriment… in ZSTD_decompressBlock_internal()
1462 /* if that's the correct cause, then 32-bits ARM should be affected differently */ in ZSTD_decompressBlock_internal()
1464 if (dctx->fParams.windowSize > (1 << 23)) in ZSTD_decompressBlock_internal()
1471 if (dst != dctx->previousDstEnd) { /* not contiguous */ in ZSTD_checkContinuity()
1472 dctx->dictEnd = dctx->previousDstEnd; in ZSTD_checkContinuity()
1473 …dctx->vBase = (const char *)dst - ((const char *)(dctx->previousDstEnd) - (const char *)(dctx->bas… in ZSTD_checkContinuity()
1474 dctx->base = dst; in ZSTD_checkContinuity()
1475 dctx->previousDstEnd = dst; in ZSTD_checkContinuity()
1484 dctx->previousDstEnd = (char *)dst + dSize; in ZSTD_decompressBlock()
1493 dctx->previousDstEnd = (const char *)blockStart + blockSize; in ZSTD_insertBlock()
1497 size_t ZSTD_generateNxBytes(void *dst, size_t dstCapacity, BYTE byte, size_t length) in ZSTD_generateNxBytes() argument
1501 memset(dst, byte, length); in ZSTD_generateNxBytes()
1513 return ZSTD_skippableHeaderSize + ZSTD_readLE32((const BYTE *)src + 4); in ZSTD_findFrameCompressedSize()
1515 const BYTE *ip = (const BYTE *)src; in ZSTD_findFrameCompressedSize()
1516 const BYTE *const ipstart = ip; in ZSTD_findFrameCompressedSize()
1534 remainingSize -= headerSize; in ZSTD_findFrameCompressedSize()
1547 remainingSize -= ZSTD_blockHeaderSize + cBlockSize; in ZSTD_findFrameCompressedSize()
1557 remainingSize -= 4; in ZSTD_findFrameCompressedSize()
1560 return ip - ipstart; in ZSTD_findFrameCompressedSize()
1568 const BYTE *ip = (const BYTE *)(*srcPtr); in ZSTD_decompressFrame()
1569 BYTE *const ostart = (BYTE * const)dst; in ZSTD_decompressFrame()
1570 BYTE *const oend = ostart + dstCapacity; in ZSTD_decompressFrame()
1571 BYTE *op = ostart; in ZSTD_decompressFrame()
1587 remainingSize -= frameHeaderSize; in ZSTD_decompressFrame()
1599 remainingSize -= ZSTD_blockHeaderSize; in ZSTD_decompressFrame()
1604 …case bt_compressed: decodedSize = ZSTD_decompressBlock_internal(dctx, op, oend - op, ip, cBlockSiz… in ZSTD_decompressFrame()
1605 case bt_raw: decodedSize = ZSTD_copyRawBlock(op, oend - op, ip, cBlockSize); break; in ZSTD_decompressFrame()
1606 …case bt_rle: decodedSize = ZSTD_generateNxBytes(op, oend - op, *ip, blockProperties.origSize); bre… in ZSTD_decompressFrame()
1613 if (dctx->fParams.checksumFlag) in ZSTD_decompressFrame()
1614 xxh64_update(&dctx->xxhState, op, decodedSize); in ZSTD_decompressFrame()
1617 remainingSize -= cBlockSize; in ZSTD_decompressFrame()
1622 if (dctx->fParams.checksumFlag) { /* Frame content checksum verification */ in ZSTD_decompressFrame()
1623 U32 const checkCalc = (U32)xxh64_digest(&dctx->xxhState); in ZSTD_decompressFrame()
1631 remainingSize -= 4; in ZSTD_decompressFrame()
1637 return op - ostart; in ZSTD_decompressFrame()
1667 skippableSize = ZSTD_readLE32((const BYTE *)src + 4) + ZSTD_skippableHeaderSize; in ZSTD_decompressMultiFrame()
1672 src = (const BYTE *)src + skippableSize; in ZSTD_decompressMultiFrame()
1673 srcSize -= skippableSize; in ZSTD_decompressMultiFrame()
1696 dst = (BYTE *)dst + res; in ZSTD_decompressMultiFrame()
1697 dstCapacity -= res; in ZSTD_decompressMultiFrame()
1704 return (BYTE *)dst - (BYTE *)dststart; in ZSTD_decompressMultiFrame()
1717 /*-**************************************
1721 size_t ZSTD_nextSrcSizeToDecompress(ZSTD_DCtx *dctx) { return dctx->expected; } in ZSTD_nextSrcSizeToDecompress()
1725 switch (dctx->stage) { in ZSTD_nextInputType()
1738 int ZSTD_isSkipFrame(ZSTD_DCtx *dctx) { return dctx->stage == ZSTDds_skipFrame; } /* for zbuff */ in ZSTD_isSkipFrame()
1746 if (srcSize != dctx->expected) in ZSTD_decompressContinue()
1751 switch (dctx->stage) { in ZSTD_decompressContinue()
1756 memcpy(dctx->headerBuffer, src, ZSTD_frameHeaderSize_prefix); in ZSTD_decompressContinue()
1757 …dctx->expected = ZSTD_skippableHeaderSize - ZSTD_frameHeaderSize_prefix; /* magic number + skippab… in ZSTD_decompressContinue()
1758 dctx->stage = ZSTDds_decodeSkippableHeader; in ZSTD_decompressContinue()
1761 dctx->headerSize = ZSTD_frameHeaderSize(src, ZSTD_frameHeaderSize_prefix); in ZSTD_decompressContinue()
1762 if (ZSTD_isError(dctx->headerSize)) in ZSTD_decompressContinue()
1763 return dctx->headerSize; in ZSTD_decompressContinue()
1764 memcpy(dctx->headerBuffer, src, ZSTD_frameHeaderSize_prefix); in ZSTD_decompressContinue()
1765 if (dctx->headerSize > ZSTD_frameHeaderSize_prefix) { in ZSTD_decompressContinue()
1766 dctx->expected = dctx->headerSize - ZSTD_frameHeaderSize_prefix; in ZSTD_decompressContinue()
1767 dctx->stage = ZSTDds_decodeFrameHeader; in ZSTD_decompressContinue()
1770 dctx->expected = 0; /* not necessary to copy more */ in ZSTD_decompressContinue()
1774 memcpy(dctx->headerBuffer + ZSTD_frameHeaderSize_prefix, src, dctx->expected); in ZSTD_decompressContinue()
1775 CHECK_F(ZSTD_decodeFrameHeader(dctx, dctx->headerBuffer, dctx->headerSize)); in ZSTD_decompressContinue()
1776 dctx->expected = ZSTD_blockHeaderSize; in ZSTD_decompressContinue()
1777 dctx->stage = ZSTDds_decodeBlockHeader; in ZSTD_decompressContinue()
1785 dctx->expected = cBlockSize; in ZSTD_decompressContinue()
1786 dctx->bType = bp.blockType; in ZSTD_decompressContinue()
1787 dctx->rleSize = bp.origSize; in ZSTD_decompressContinue()
1789 dctx->stage = bp.lastBlock ? ZSTDds_decompressLastBlock : ZSTDds_decompressBlock; in ZSTD_decompressContinue()
1794 if (dctx->fParams.checksumFlag) { in ZSTD_decompressContinue()
1795 dctx->expected = 4; in ZSTD_decompressContinue()
1796 dctx->stage = ZSTDds_checkChecksum; in ZSTD_decompressContinue()
1798 dctx->expected = 0; /* end of frame */ in ZSTD_decompressContinue()
1799 dctx->stage = ZSTDds_getFrameHeaderSize; in ZSTD_decompressContinue()
1802 dctx->expected = 3; /* go directly to next header */ in ZSTD_decompressContinue()
1803 dctx->stage = ZSTDds_decodeBlockHeader; in ZSTD_decompressContinue()
1810 switch (dctx->bType) { in ZSTD_decompressContinue()
1813 case bt_rle: rSize = ZSTD_setRleBlock(dst, dstCapacity, src, srcSize, dctx->rleSize); break; in ZSTD_decompressContinue()
1819 if (dctx->fParams.checksumFlag) in ZSTD_decompressContinue()
1820 xxh64_update(&dctx->xxhState, dst, rSize); in ZSTD_decompressContinue()
1822 if (dctx->stage == ZSTDds_decompressLastBlock) { /* end of frame */ in ZSTD_decompressContinue()
1823 if (dctx->fParams.checksumFlag) { /* another round for frame checksum */ in ZSTD_decompressContinue()
1824 dctx->expected = 4; in ZSTD_decompressContinue()
1825 dctx->stage = ZSTDds_checkChecksum; in ZSTD_decompressContinue()
1827 dctx->expected = 0; /* ends here */ in ZSTD_decompressContinue()
1828 dctx->stage = ZSTDds_getFrameHeaderSize; in ZSTD_decompressContinue()
1831 dctx->stage = ZSTDds_decodeBlockHeader; in ZSTD_decompressContinue()
1832 dctx->expected = ZSTD_blockHeaderSize; in ZSTD_decompressContinue()
1833 dctx->previousDstEnd = (char *)dst + rSize; in ZSTD_decompressContinue()
1838 U32 const h32 = (U32)xxh64_digest(&dctx->xxhState); in ZSTD_decompressContinue()
1839 U32 const check32 = ZSTD_readLE32(src); /* srcSize == 4, guaranteed by dctx->expected */ in ZSTD_decompressContinue()
1842 dctx->expected = 0; in ZSTD_decompressContinue()
1843 dctx->stage = ZSTDds_getFrameHeaderSize; in ZSTD_decompressContinue()
1847 memcpy(dctx->headerBuffer + ZSTD_frameHeaderSize_prefix, src, dctx->expected); in ZSTD_decompressContinue()
1848 dctx->expected = ZSTD_readLE32(dctx->headerBuffer + 4); in ZSTD_decompressContinue()
1849 dctx->stage = ZSTDds_skipFrame; in ZSTD_decompressContinue()
1853 dctx->expected = 0; in ZSTD_decompressContinue()
1854 dctx->stage = ZSTDds_getFrameHeaderSize; in ZSTD_decompressContinue()
1864 dctx->dictEnd = dctx->previousDstEnd; in ZSTD_refDictContent()
1865 …dctx->vBase = (const char *)dict - ((const char *)(dctx->previousDstEnd) - (const char *)(dctx->ba… in ZSTD_refDictContent()
1866 dctx->base = dict; in ZSTD_refDictContent()
1867 dctx->previousDstEnd = (const char *)dict + dictSize; in ZSTD_refDictContent()
1876 const BYTE *dictPtr = (const BYTE *)dict; in ZSTD_loadEntropy()
1877 const BYTE *const dictEnd = dictPtr + dictSize; in ZSTD_loadEntropy()
1884 …t hSize = HUF_readDTableX4_wksp(entropy->hufTable, dictPtr, dictEnd - dictPtr, entropy->workspace,… in ZSTD_loadEntropy()
1893 …derSize = FSE_readNCount(offcodeNCount, &offcodeMaxValue, &offcodeLog, dictPtr, dictEnd - dictPtr); in ZSTD_loadEntropy()
1898 …_E(FSE_buildDTable_wksp(entropy->OFTable, offcodeNCount, offcodeMaxValue, offcodeLog, entropy->wor… in ZSTD_loadEntropy()
1905 …E_readNCount(matchlengthNCount, &matchlengthMaxValue, &matchlengthLog, dictPtr, dictEnd - dictPtr); in ZSTD_loadEntropy()
1910 …_buildDTable_wksp(entropy->MLTable, matchlengthNCount, matchlengthMaxValue, matchlengthLog, entrop… in ZSTD_loadEntropy()
1917 …e = FSE_readNCount(litlengthNCount, &litlengthMaxValue, &litlengthLog, dictPtr, dictEnd - dictPtr); in ZSTD_loadEntropy()
1922 …FSE_buildDTable_wksp(entropy->LLTable, litlengthNCount, litlengthMaxValue, litlengthLog, entropy->… in ZSTD_loadEntropy()
1930 size_t const dictContentSize = (size_t)(dictEnd - (dictPtr + 12)); in ZSTD_loadEntropy()
1936 entropy->rep[i] = rep; in ZSTD_loadEntropy()
1940 return dictPtr - (const BYTE *)dict; in ZSTD_loadEntropy()
1953 dctx->dictID = ZSTD_readLE32((const char *)dict + 4); in ZSTD_decompress_insertDictionary()
1957 size_t const eSize = ZSTD_loadEntropy(&dctx->entropy, dict, dictSize); in ZSTD_decompress_insertDictionary()
1961 dictSize -= eSize; in ZSTD_decompress_insertDictionary()
1963 dctx->litEntropy = dctx->fseEntropy = 1; in ZSTD_decompress_insertDictionary()
1991 static const void *ZSTD_DDictDictContent(const ZSTD_DDict *ddict) { return ddict->dictContent; } in ZSTD_DDictDictContent()
1993 static size_t ZSTD_DDictDictSize(const ZSTD_DDict *ddict) { return ddict->dictSize; } in ZSTD_DDictDictSize()
1999 dstDCtx->dictID = ddict->dictID; in ZSTD_refDDict()
2000 dstDCtx->base = ddict->dictContent; in ZSTD_refDDict()
2001 dstDCtx->vBase = ddict->dictContent; in ZSTD_refDDict()
2002 dstDCtx->dictEnd = (const BYTE *)ddict->dictContent + ddict->dictSize; in ZSTD_refDDict()
2003 dstDCtx->previousDstEnd = dstDCtx->dictEnd; in ZSTD_refDDict()
2004 if (ddict->entropyPresent) { in ZSTD_refDDict()
2005 dstDCtx->litEntropy = 1; in ZSTD_refDDict()
2006 dstDCtx->fseEntropy = 1; in ZSTD_refDDict()
2007 dstDCtx->LLTptr = ddict->entropy.LLTable; in ZSTD_refDDict()
2008 dstDCtx->MLTptr = ddict->entropy.MLTable; in ZSTD_refDDict()
2009 dstDCtx->OFTptr = ddict->entropy.OFTable; in ZSTD_refDDict()
2010 dstDCtx->HUFptr = ddict->entropy.hufTable; in ZSTD_refDDict()
2011 dstDCtx->entropy.rep[0] = ddict->entropy.rep[0]; in ZSTD_refDDict()
2012 dstDCtx->entropy.rep[1] = ddict->entropy.rep[1]; in ZSTD_refDDict()
2013 dstDCtx->entropy.rep[2] = ddict->entropy.rep[2]; in ZSTD_refDDict()
2015 dstDCtx->litEntropy = 0; in ZSTD_refDDict()
2016 dstDCtx->fseEntropy = 0; in ZSTD_refDDict()
2023 ddict->dictID = 0; in ZSTD_loadEntropy_inDDict()
2024 ddict->entropyPresent = 0; in ZSTD_loadEntropy_inDDict()
2025 if (ddict->dictSize < 8) in ZSTD_loadEntropy_inDDict()
2028 U32 const magic = ZSTD_readLE32(ddict->dictContent); in ZSTD_loadEntropy_inDDict()
2032 ddict->dictID = ZSTD_readLE32((const char *)ddict->dictContent + 4); in ZSTD_loadEntropy_inDDict()
2035 …CHECK_E(ZSTD_loadEntropy(&ddict->entropy, ddict->dictContent, ddict->dictSize), dictionary_corrupt… in ZSTD_loadEntropy_inDDict()
2036 ddict->entropyPresent = 1; in ZSTD_loadEntropy_inDDict()
2049 ddict->cMem = customMem; in ZSTD_createDDict_advanced()
2052 ddict->dictBuffer = NULL; in ZSTD_createDDict_advanced()
2053 ddict->dictContent = dict; in ZSTD_createDDict_advanced()
2061 ddict->dictBuffer = internalBuffer; in ZSTD_createDDict_advanced()
2062 ddict->dictContent = internalBuffer; in ZSTD_createDDict_advanced()
2064 ddict->dictSize = dictSize; in ZSTD_createDDict_advanced()
2065 …ddict->entropy.hufTable[0] = (HUF_DTable)((HufLog)*0x1000001); /* cover both little and big endian… in ZSTD_createDDict_advanced()
2094 ZSTD_customMem const cMem = ddict->cMem; in ZSTD_freeDDict()
2095 ZSTD_free(ddict->dictBuffer, cMem); in ZSTD_freeDDict()
2104 * It can still be loaded, but as a content-only dictionary. */
2117 * Non-conformant dictionaries can still be loaded, but as content-only dictionaries. */
2122 return ZSTD_getDictID_fromDict(ddict->dictContent, ddict->dictSize); in ZSTD_getDictID_fromDDict()
2129 * - The frame does not require a dictionary to be decoded (most common case).
2130 …* - The frame was built with dictID intentionally removed. Whatever dictionary is necessary is a …
2131 * Note : this use case also happens when using a non-conformant dictionary.
2132 …* - `srcSize` is too small, and as a result, the frame header could not be decoded (only possible…
2133 * - This is not a Zstandard frame.
2145 * Decompression using a pre-digested Dictionary
2175 BYTE headerBuffer[ZSTD_FRAMEHEADERSIZE_MAX]; /* tmp buffer to store frame header */
2203 memcpy(&zds->customMem, &customMem, sizeof(ZSTD_customMem)); in ZSTD_createDStream_advanced()
2204 zds->dctx = ZSTD_createDCtx_advanced(customMem); in ZSTD_createDStream_advanced()
2205 if (zds->dctx == NULL) { in ZSTD_createDStream_advanced()
2209 zds->stage = zdss_init; in ZSTD_createDStream_advanced()
2210 zds->maxWindowSize = ZSTD_MAXWINDOWSIZE_DEFAULT; in ZSTD_createDStream_advanced()
2222 zds->maxWindowSize = maxWindowSize; in ZSTD_initDStream()
2223 zds->stage = zdss_loadHeader; in ZSTD_initDStream()
2224 zds->lhSize = zds->inPos = zds->outStart = zds->outEnd = 0; in ZSTD_initDStream()
2225 ZSTD_freeDDict(zds->ddictLocal); in ZSTD_initDStream()
2226 zds->ddictLocal = NULL; in ZSTD_initDStream()
2227 zds->ddict = zds->ddictLocal; in ZSTD_initDStream()
2228 zds->legacyVersion = 0; in ZSTD_initDStream()
2229 zds->hostageByte = 0; in ZSTD_initDStream()
2232 size_t const blockSize = MIN(zds->maxWindowSize, ZSTD_BLOCKSIZE_ABSOLUTEMAX); in ZSTD_initDStream()
2233 size_t const neededOutSize = zds->maxWindowSize + blockSize + WILDCOPY_OVERLENGTH * 2; in ZSTD_initDStream()
2235 zds->inBuff = (char *)ZSTD_malloc(blockSize, zds->customMem); in ZSTD_initDStream()
2236 zds->inBuffSize = blockSize; in ZSTD_initDStream()
2237 zds->outBuff = (char *)ZSTD_malloc(neededOutSize, zds->customMem); in ZSTD_initDStream()
2238 zds->outBuffSize = neededOutSize; in ZSTD_initDStream()
2239 if (zds->inBuff == NULL || zds->outBuff == NULL) { in ZSTD_initDStream()
2251 zds->ddict = ddict; in ZSTD_initDStream_usingDDict()
2261 ZSTD_customMem const cMem = zds->customMem; in ZSTD_freeDStream()
2262 ZSTD_freeDCtx(zds->dctx); in ZSTD_freeDStream()
2263 zds->dctx = NULL; in ZSTD_freeDStream()
2264 ZSTD_freeDDict(zds->ddictLocal); in ZSTD_freeDStream()
2265 zds->ddictLocal = NULL; in ZSTD_freeDStream()
2266 ZSTD_free(zds->inBuff, cMem); in ZSTD_freeDStream()
2267 zds->inBuff = NULL; in ZSTD_freeDStream()
2268 ZSTD_free(zds->outBuff, cMem); in ZSTD_freeDStream()
2269 zds->outBuff = NULL; in ZSTD_freeDStream()
2282 zds->stage = zdss_loadHeader; in ZSTD_resetDStream()
2283 zds->lhSize = zds->inPos = zds->outStart = zds->outEnd = 0; in ZSTD_resetDStream()
2284 zds->legacyVersion = 0; in ZSTD_resetDStream()
2285 zds->hostageByte = 0; in ZSTD_resetDStream()
2300 const char *const istart = (const char *)(input->src) + input->pos; in ZSTD_decompressStream()
2301 const char *const iend = (const char *)(input->src) + input->size; in ZSTD_decompressStream()
2303 char *const ostart = (char *)(output->dst) + output->pos; in ZSTD_decompressStream()
2304 char *const oend = (char *)(output->dst) + output->size; in ZSTD_decompressStream()
2309 switch (zds->stage) { in ZSTD_decompressStream()
2315 size_t const hSize = ZSTD_getFrameParams(&zds->fParams, zds->headerBuffer, zds->lhSize); in ZSTD_decompressStream()
2319 size_t const toLoad = hSize - zds->lhSize; /* if hSize!=0, hSize > zds->lhSize */ in ZSTD_decompressStream()
2320 if (toLoad > (size_t)(iend - ip)) { /* not enough input to load full header */ in ZSTD_decompressStream()
2321 memcpy(zds->headerBuffer + zds->lhSize, ip, iend - ip); in ZSTD_decompressStream()
2322 zds->lhSize += iend - ip; in ZSTD_decompressStream()
2323 input->pos = input->size; in ZSTD_decompressStream()
2324 return (MAX(ZSTD_frameHeaderSize_min, hSize) - zds->lhSize) + in ZSTD_decompressStream()
2327 memcpy(zds->headerBuffer + zds->lhSize, ip, toLoad); in ZSTD_decompressStream()
2328 zds->lhSize = hSize; in ZSTD_decompressStream()
2333 /* check for single-pass mode opportunity */ in ZSTD_decompressStream()
2334 if (zds->fParams.frameContentSize && zds->fParams.windowSize /* skippable frame if == 0 */ in ZSTD_decompressStream()
2335 && (U64)(size_t)(oend - op) >= zds->fParams.frameContentSize) { in ZSTD_decompressStream()
2336 size_t const cSize = ZSTD_findFrameCompressedSize(istart, iend - istart); in ZSTD_decompressStream()
2337 if (cSize <= (size_t)(iend - istart)) { in ZSTD_decompressStream()
2338 …const decompressedSize = ZSTD_decompress_usingDDict(zds->dctx, op, oend - op, istart, cSize, zds->… in ZSTD_decompressStream()
2343 zds->dctx->expected = 0; in ZSTD_decompressStream()
2344 zds->stage = zdss_init; in ZSTD_decompressStream()
2351 ZSTD_refDDict(zds->dctx, zds->ddict); in ZSTD_decompressStream()
2353 …size_t const h1Size = ZSTD_nextSrcSizeToDecompress(zds->dctx); /* == ZSTD_frameHeaderSize_prefix */ in ZSTD_decompressStream()
2354 CHECK_F(ZSTD_decompressContinue(zds->dctx, NULL, 0, zds->headerBuffer, h1Size)); in ZSTD_decompressStream()
2356 size_t const h2Size = ZSTD_nextSrcSizeToDecompress(zds->dctx); in ZSTD_decompressStream()
2357 CHECK_F(ZSTD_decompressContinue(zds->dctx, NULL, 0, zds->headerBuffer + h1Size, h2Size)); in ZSTD_decompressStream()
2361 zds->fParams.windowSize = MAX(zds->fParams.windowSize, 1U << ZSTD_WINDOWLOG_ABSOLUTEMIN); in ZSTD_decompressStream()
2362 if (zds->fParams.windowSize > zds->maxWindowSize) in ZSTD_decompressStream()
2367 size_t const blockSize = MIN(zds->maxWindowSize, ZSTD_BLOCKSIZE_ABSOLUTEMAX); in ZSTD_decompressStream()
2368 size_t const neededOutSize = zds->maxWindowSize + blockSize + WILDCOPY_OVERLENGTH * 2; in ZSTD_decompressStream()
2369 if (zds->inBuffSize < blockSize) { in ZSTD_decompressStream()
2372 if (zds->outBuffSize < neededOutSize) { in ZSTD_decompressStream()
2375 zds->blockSize = blockSize; in ZSTD_decompressStream()
2377 zds->stage = zdss_read; in ZSTD_decompressStream()
2382 size_t const neededInSize = ZSTD_nextSrcSizeToDecompress(zds->dctx); in ZSTD_decompressStream()
2384 zds->stage = zdss_init; in ZSTD_decompressStream()
2388 if ((size_t)(iend - ip) >= neededInSize) { /* decode directly from src */ in ZSTD_decompressStream()
2389 const int isSkipFrame = ZSTD_isSkipFrame(zds->dctx); in ZSTD_decompressStream()
2390 size_t const decodedSize = ZSTD_decompressContinue(zds->dctx, zds->outBuff + zds->outStart, in ZSTD_decompressStream()
2391 (isSkipFrame ? 0 : zds->outBuffSize - zds->outStart), ip, neededInSize); in ZSTD_decompressStream()
2397 zds->outEnd = zds->outStart + decodedSize; in ZSTD_decompressStream()
2398 zds->stage = zdss_flush; in ZSTD_decompressStream()
2405 zds->stage = zdss_load; in ZSTD_decompressStream()
2406 /* pass-through */ in ZSTD_decompressStream()
2411 size_t const neededInSize = ZSTD_nextSrcSizeToDecompress(zds->dctx); in ZSTD_decompressStream()
2412 …size_t const toLoad = neededInSize - zds->inPos; /* should always be <= remaining space within inB… in ZSTD_decompressStream()
2414 if (toLoad > zds->inBuffSize - zds->inPos) in ZSTD_decompressStream()
2416 loadedSize = ZSTD_limitCopy(zds->inBuff + zds->inPos, toLoad, ip, iend - ip); in ZSTD_decompressStream()
2418 zds->inPos += loadedSize; in ZSTD_decompressStream()
2426 const int isSkipFrame = ZSTD_isSkipFrame(zds->dctx); in ZSTD_decompressStream()
2427 …onst decodedSize = ZSTD_decompressContinue(zds->dctx, zds->outBuff + zds->outStart, zds->outBuffSi… in ZSTD_decompressStream()
2428 zds->inBuff, neededInSize); in ZSTD_decompressStream()
2431 zds->inPos = 0; /* input is consumed */ in ZSTD_decompressStream()
2433 zds->stage = zdss_read; in ZSTD_decompressStream()
2436 zds->outEnd = zds->outStart + decodedSize; in ZSTD_decompressStream()
2437 zds->stage = zdss_flush; in ZSTD_decompressStream()
2438 /* pass-through */ in ZSTD_decompressStream()
2444 size_t const toFlushSize = zds->outEnd - zds->outStart; in ZSTD_decompressStream()
2445 …size_t const flushedSize = ZSTD_limitCopy(op, oend - op, zds->outBuff + zds->outStart, toFlushSize… in ZSTD_decompressStream()
2447 zds->outStart += flushedSize; in ZSTD_decompressStream()
2449 zds->stage = zdss_read; in ZSTD_decompressStream()
2450 if (zds->outStart + zds->blockSize > zds->outBuffSize) in ZSTD_decompressStream()
2451 zds->outStart = zds->outEnd = 0; in ZSTD_decompressStream()
2464 input->pos += (size_t)(ip - istart); in ZSTD_decompressStream()
2465 output->pos += (size_t)(op - ostart); in ZSTD_decompressStream()
2467 size_t nextSrcSizeHint = ZSTD_nextSrcSizeToDecompress(zds->dctx); in ZSTD_decompressStream()
2469 if (zds->outEnd == zds->outStart) { /* output fully flushed */ in ZSTD_decompressStream()
2470 if (zds->hostageByte) { in ZSTD_decompressStream()
2471 if (input->pos >= input->size) { in ZSTD_decompressStream()
2472 zds->stage = zdss_read; in ZSTD_decompressStream()
2475 input->pos++; /* release hostage */ in ZSTD_decompressStream()
2479 …if (!zds->hostageByte) { /* output not fully flushed; keep last byte as hostage; will be released … in ZSTD_decompressStream()
2480 input->pos--; /* note : pos > 0, otherwise, impossible to finish reading last block */ in ZSTD_decompressStream()
2481 zds->hostageByte = 1; in ZSTD_decompressStream()
2485 …nextSrcSizeHint += ZSTD_blockHeaderSize * (ZSTD_nextInputType(zds->dctx) == ZSTDnit_block); /* pre… in ZSTD_decompressStream()
2486 if (zds->inPos > nextSrcSizeHint) in ZSTD_decompressStream()
2488 nextSrcSizeHint -= zds->inPos; /* already loaded*/ in ZSTD_decompressStream()