zstd_decompress.c 122 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003
  1. /*
  2. * Copyright (c) 2016-present, Yann Collet, Facebook, Inc.
  3. * All rights reserved.
  4. *
  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.
  9. */
  10. /* ***************************************************************
  11. * Tuning parameters
  12. *****************************************************************/
  13. /*!
  14. * HEAPMODE :
  15. * Select how default decompression function ZSTD_decompress() allocates its context,
  16. * on stack (0), or into heap (1, default; requires malloc()).
  17. * Note that functions with explicit context such as ZSTD_decompressDCtx() are unaffected.
  18. */
  19. #ifndef ZSTD_HEAPMODE
  20. # define ZSTD_HEAPMODE 1
  21. #endif
  22. /*!
  23. * LEGACY_SUPPORT :
  24. * if set to 1+, ZSTD_decompress() can decode older formats (v0.1+)
  25. */
  26. #ifndef ZSTD_LEGACY_SUPPORT
  27. # define ZSTD_LEGACY_SUPPORT 0
  28. #endif
  29. /*!
  30. * MAXWINDOWSIZE_DEFAULT :
  31. * maximum window size accepted by DStream __by default__.
  32. * Frames requiring more memory will be rejected.
  33. * It's possible to set a different limit using ZSTD_DCtx_setMaxWindowSize().
  34. */
  35. #ifndef ZSTD_MAXWINDOWSIZE_DEFAULT
  36. # define ZSTD_MAXWINDOWSIZE_DEFAULT (((U32)1 << ZSTD_WINDOWLOG_DEFAULTMAX) + 1)
  37. #endif
  38. /*-*******************************************************
  39. * Dependencies
  40. *********************************************************/
  41. #include <string.h> /* memcpy, memmove, memset */
  42. #include "cpu.h"
  43. #include "mem.h" /* low level memory routines */
  44. #define FSE_STATIC_LINKING_ONLY
  45. #include "fse.h"
  46. #define HUF_STATIC_LINKING_ONLY
  47. #include "huf.h"
  48. #include "zstd_internal.h"
  49. #if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT>=1)
  50. # include "zstd_legacy.h"
  51. #endif
  52. /*-*************************************
  53. * Errors
  54. ***************************************/
  55. #define ZSTD_isError ERR_isError /* for inlining */
  56. #define FSE_isError ERR_isError
  57. #define HUF_isError ERR_isError
  58. /*_*******************************************************
  59. * Memory operations
  60. **********************************************************/
  61. static void ZSTD_copy4(void* dst, const void* src) { memcpy(dst, src, 4); }
  62. /*-*************************************************************
  63. * Context management
  64. ***************************************************************/
  65. typedef enum { ZSTDds_getFrameHeaderSize, ZSTDds_decodeFrameHeader,
  66. ZSTDds_decodeBlockHeader, ZSTDds_decompressBlock,
  67. ZSTDds_decompressLastBlock, ZSTDds_checkChecksum,
  68. ZSTDds_decodeSkippableHeader, ZSTDds_skipFrame } ZSTD_dStage;
  69. typedef enum { zdss_init=0, zdss_loadHeader,
  70. zdss_read, zdss_load, zdss_flush } ZSTD_dStreamStage;
  71. typedef struct {
  72. U32 fastMode;
  73. U32 tableLog;
  74. } ZSTD_seqSymbol_header;
  75. typedef struct {
  76. U16 nextState;
  77. BYTE nbAdditionalBits;
  78. BYTE nbBits;
  79. U32 baseValue;
  80. } ZSTD_seqSymbol;
  81. #define SEQSYMBOL_TABLE_SIZE(log) (1 + (1 << (log)))
  82. typedef struct {
  83. ZSTD_seqSymbol LLTable[SEQSYMBOL_TABLE_SIZE(LLFSELog)];
  84. ZSTD_seqSymbol OFTable[SEQSYMBOL_TABLE_SIZE(OffFSELog)];
  85. ZSTD_seqSymbol MLTable[SEQSYMBOL_TABLE_SIZE(MLFSELog)];
  86. HUF_DTable hufTable[HUF_DTABLE_SIZE(HufLog)]; /* can accommodate HUF_decompress4X */
  87. U32 workspace[HUF_DECOMPRESS_WORKSPACE_SIZE_U32];
  88. U32 rep[ZSTD_REP_NUM];
  89. } ZSTD_entropyDTables_t;
  90. struct ZSTD_DCtx_s
  91. {
  92. const ZSTD_seqSymbol* LLTptr;
  93. const ZSTD_seqSymbol* MLTptr;
  94. const ZSTD_seqSymbol* OFTptr;
  95. const HUF_DTable* HUFptr;
  96. ZSTD_entropyDTables_t entropy;
  97. const void* previousDstEnd; /* detect continuity */
  98. const void* base; /* start of current segment */
  99. const void* vBase; /* virtual start of previous segment if it was just before current one */
  100. const void* dictEnd; /* end of previous segment */
  101. size_t expected;
  102. ZSTD_frameHeader fParams;
  103. U64 decodedSize;
  104. blockType_e bType; /* used in ZSTD_decompressContinue(), store blockType between block header decoding and block decompression stages */
  105. ZSTD_dStage stage;
  106. U32 litEntropy;
  107. U32 fseEntropy;
  108. XXH64_state_t xxhState;
  109. size_t headerSize;
  110. U32 dictID;
  111. ZSTD_format_e format;
  112. const BYTE* litPtr;
  113. ZSTD_customMem customMem;
  114. size_t litSize;
  115. size_t rleSize;
  116. size_t staticSize;
  117. int bmi2; /* == 1 if the CPU supports BMI2 and 0 otherwise. CPU support is determined dynamically once per context lifetime. */
  118. /* streaming */
  119. ZSTD_DDict* ddictLocal;
  120. const ZSTD_DDict* ddict;
  121. ZSTD_dStreamStage streamStage;
  122. char* inBuff;
  123. size_t inBuffSize;
  124. size_t inPos;
  125. size_t maxWindowSize;
  126. char* outBuff;
  127. size_t outBuffSize;
  128. size_t outStart;
  129. size_t outEnd;
  130. size_t lhSize;
  131. void* legacyContext;
  132. U32 previousLegacyVersion;
  133. U32 legacyVersion;
  134. U32 hostageByte;
  135. /* workspace */
  136. BYTE litBuffer[ZSTD_BLOCKSIZE_MAX + WILDCOPY_OVERLENGTH];
  137. BYTE headerBuffer[ZSTD_FRAMEHEADERSIZE_MAX];
  138. }; /* typedef'd to ZSTD_DCtx within "zstd.h" */
  139. size_t ZSTD_sizeof_DCtx (const ZSTD_DCtx* dctx)
  140. {
  141. if (dctx==NULL) return 0; /* support sizeof NULL */
  142. return sizeof(*dctx)
  143. + ZSTD_sizeof_DDict(dctx->ddictLocal)
  144. + dctx->inBuffSize + dctx->outBuffSize;
  145. }
  146. size_t ZSTD_estimateDCtxSize(void) { return sizeof(ZSTD_DCtx); }
  147. static size_t ZSTD_startingInputLength(ZSTD_format_e format)
  148. {
  149. size_t const startingInputLength = (format==ZSTD_f_zstd1_magicless) ?
  150. ZSTD_frameHeaderSize_prefix - ZSTD_frameIdSize :
  151. ZSTD_frameHeaderSize_prefix;
  152. ZSTD_STATIC_ASSERT(ZSTD_FRAMEHEADERSIZE_PREFIX >= ZSTD_FRAMEIDSIZE);
  153. /* only supports formats ZSTD_f_zstd1 and ZSTD_f_zstd1_magicless */
  154. assert( (format == ZSTD_f_zstd1) || (format == ZSTD_f_zstd1_magicless) );
  155. return startingInputLength;
  156. }
  157. static void ZSTD_initDCtx_internal(ZSTD_DCtx* dctx)
  158. {
  159. dctx->format = ZSTD_f_zstd1; /* ZSTD_decompressBegin() invokes ZSTD_startingInputLength() with argument dctx->format */
  160. dctx->staticSize = 0;
  161. dctx->maxWindowSize = ZSTD_MAXWINDOWSIZE_DEFAULT;
  162. dctx->ddict = NULL;
  163. dctx->ddictLocal = NULL;
  164. dctx->inBuff = NULL;
  165. dctx->inBuffSize = 0;
  166. dctx->outBuffSize = 0;
  167. dctx->streamStage = zdss_init;
  168. dctx->bmi2 = ZSTD_cpuid_bmi2(ZSTD_cpuid());
  169. }
  170. ZSTD_DCtx* ZSTD_initStaticDCtx(void *workspace, size_t workspaceSize)
  171. {
  172. ZSTD_DCtx* const dctx = (ZSTD_DCtx*) workspace;
  173. if ((size_t)workspace & 7) return NULL; /* 8-aligned */
  174. if (workspaceSize < sizeof(ZSTD_DCtx)) return NULL; /* minimum size */
  175. ZSTD_initDCtx_internal(dctx);
  176. dctx->staticSize = workspaceSize;
  177. dctx->inBuff = (char*)(dctx+1);
  178. return dctx;
  179. }
  180. ZSTD_DCtx* ZSTD_createDCtx_advanced(ZSTD_customMem customMem)
  181. {
  182. if (!customMem.customAlloc ^ !customMem.customFree) return NULL;
  183. { ZSTD_DCtx* const dctx = (ZSTD_DCtx*)ZSTD_malloc(sizeof(*dctx), customMem);
  184. if (!dctx) return NULL;
  185. dctx->customMem = customMem;
  186. dctx->legacyContext = NULL;
  187. dctx->previousLegacyVersion = 0;
  188. ZSTD_initDCtx_internal(dctx);
  189. return dctx;
  190. }
  191. }
  192. ZSTD_DCtx* ZSTD_createDCtx(void)
  193. {
  194. DEBUGLOG(3, "ZSTD_createDCtx");
  195. return ZSTD_createDCtx_advanced(ZSTD_defaultCMem);
  196. }
  197. size_t ZSTD_freeDCtx(ZSTD_DCtx* dctx)
  198. {
  199. if (dctx==NULL) return 0; /* support free on NULL */
  200. if (dctx->staticSize) return ERROR(memory_allocation); /* not compatible with static DCtx */
  201. { ZSTD_customMem const cMem = dctx->customMem;
  202. ZSTD_freeDDict(dctx->ddictLocal);
  203. dctx->ddictLocal = NULL;
  204. ZSTD_free(dctx->inBuff, cMem);
  205. dctx->inBuff = NULL;
  206. #if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT >= 1)
  207. if (dctx->legacyContext)
  208. ZSTD_freeLegacyStreamContext(dctx->legacyContext, dctx->previousLegacyVersion);
  209. #endif
  210. ZSTD_free(dctx, cMem);
  211. return 0;
  212. }
  213. }
  214. /* no longer useful */
  215. void ZSTD_copyDCtx(ZSTD_DCtx* dstDCtx, const ZSTD_DCtx* srcDCtx)
  216. {
  217. size_t const toCopy = (size_t)((char*)(&dstDCtx->inBuff) - (char*)dstDCtx);
  218. memcpy(dstDCtx, srcDCtx, toCopy); /* no need to copy workspace */
  219. }
  220. /*-*************************************************************
  221. * Frame header decoding
  222. ***************************************************************/
  223. /*! ZSTD_isFrame() :
  224. * Tells if the content of `buffer` starts with a valid Frame Identifier.
  225. * Note : Frame Identifier is 4 bytes. If `size < 4`, @return will always be 0.
  226. * Note 2 : Legacy Frame Identifiers are considered valid only if Legacy Support is enabled.
  227. * Note 3 : Skippable Frame Identifiers are considered valid. */
  228. unsigned ZSTD_isFrame(const void* buffer, size_t size)
  229. {
  230. if (size < ZSTD_frameIdSize) return 0;
  231. { U32 const magic = MEM_readLE32(buffer);
  232. if (magic == ZSTD_MAGICNUMBER) return 1;
  233. if ((magic & 0xFFFFFFF0U) == ZSTD_MAGIC_SKIPPABLE_START) return 1;
  234. }
  235. #if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT >= 1)
  236. if (ZSTD_isLegacy(buffer, size)) return 1;
  237. #endif
  238. return 0;
  239. }
  240. /** ZSTD_frameHeaderSize_internal() :
  241. * srcSize must be large enough to reach header size fields.
  242. * note : only works for formats ZSTD_f_zstd1 and ZSTD_f_zstd1_magicless.
  243. * @return : size of the Frame Header
  244. * or an error code, which can be tested with ZSTD_isError() */
  245. static size_t ZSTD_frameHeaderSize_internal(const void* src, size_t srcSize, ZSTD_format_e format)
  246. {
  247. size_t const minInputSize = ZSTD_startingInputLength(format);
  248. if (srcSize < minInputSize) return ERROR(srcSize_wrong);
  249. { BYTE const fhd = ((const BYTE*)src)[minInputSize-1];
  250. U32 const dictID= fhd & 3;
  251. U32 const singleSegment = (fhd >> 5) & 1;
  252. U32 const fcsId = fhd >> 6;
  253. return minInputSize + !singleSegment
  254. + ZSTD_did_fieldSize[dictID] + ZSTD_fcs_fieldSize[fcsId]
  255. + (singleSegment && !fcsId);
  256. }
  257. }
  258. /** ZSTD_frameHeaderSize() :
  259. * srcSize must be >= ZSTD_frameHeaderSize_prefix.
  260. * @return : size of the Frame Header */
  261. size_t ZSTD_frameHeaderSize(const void* src, size_t srcSize)
  262. {
  263. return ZSTD_frameHeaderSize_internal(src, srcSize, ZSTD_f_zstd1);
  264. }
  265. /** ZSTD_getFrameHeader_internal() :
  266. * decode Frame Header, or require larger `srcSize`.
  267. * note : only works for formats ZSTD_f_zstd1 and ZSTD_f_zstd1_magicless
  268. * @return : 0, `zfhPtr` is correctly filled,
  269. * >0, `srcSize` is too small, value is wanted `srcSize` amount,
  270. * or an error code, which can be tested using ZSTD_isError() */
  271. static size_t ZSTD_getFrameHeader_internal(ZSTD_frameHeader* zfhPtr, const void* src, size_t srcSize, ZSTD_format_e format)
  272. {
  273. const BYTE* ip = (const BYTE*)src;
  274. size_t const minInputSize = ZSTD_startingInputLength(format);
  275. if (srcSize < minInputSize) return minInputSize;
  276. if ( (format != ZSTD_f_zstd1_magicless)
  277. && (MEM_readLE32(src) != ZSTD_MAGICNUMBER) ) {
  278. if ((MEM_readLE32(src) & 0xFFFFFFF0U) == ZSTD_MAGIC_SKIPPABLE_START) {
  279. /* skippable frame */
  280. if (srcSize < ZSTD_skippableHeaderSize)
  281. return ZSTD_skippableHeaderSize; /* magic number + frame length */
  282. memset(zfhPtr, 0, sizeof(*zfhPtr));
  283. zfhPtr->frameContentSize = MEM_readLE32((const char *)src + ZSTD_frameIdSize);
  284. zfhPtr->frameType = ZSTD_skippableFrame;
  285. return 0;
  286. }
  287. return ERROR(prefix_unknown);
  288. }
  289. /* ensure there is enough `srcSize` to fully read/decode frame header */
  290. { size_t const fhsize = ZSTD_frameHeaderSize_internal(src, srcSize, format);
  291. if (srcSize < fhsize) return fhsize;
  292. zfhPtr->headerSize = (U32)fhsize;
  293. }
  294. { BYTE const fhdByte = ip[minInputSize-1];
  295. size_t pos = minInputSize;
  296. U32 const dictIDSizeCode = fhdByte&3;
  297. U32 const checksumFlag = (fhdByte>>2)&1;
  298. U32 const singleSegment = (fhdByte>>5)&1;
  299. U32 const fcsID = fhdByte>>6;
  300. U64 windowSize = 0;
  301. U32 dictID = 0;
  302. U64 frameContentSize = ZSTD_CONTENTSIZE_UNKNOWN;
  303. if ((fhdByte & 0x08) != 0)
  304. return ERROR(frameParameter_unsupported); /* reserved bits, must be zero */
  305. if (!singleSegment) {
  306. BYTE const wlByte = ip[pos++];
  307. U32 const windowLog = (wlByte >> 3) + ZSTD_WINDOWLOG_ABSOLUTEMIN;
  308. if (windowLog > ZSTD_WINDOWLOG_MAX)
  309. return ERROR(frameParameter_windowTooLarge);
  310. windowSize = (1ULL << windowLog);
  311. windowSize += (windowSize >> 3) * (wlByte&7);
  312. }
  313. switch(dictIDSizeCode)
  314. {
  315. default: assert(0); /* impossible */
  316. case 0 : break;
  317. case 1 : dictID = ip[pos]; pos++; break;
  318. case 2 : dictID = MEM_readLE16(ip+pos); pos+=2; break;
  319. case 3 : dictID = MEM_readLE32(ip+pos); pos+=4; break;
  320. }
  321. switch(fcsID)
  322. {
  323. default: assert(0); /* impossible */
  324. case 0 : if (singleSegment) frameContentSize = ip[pos]; break;
  325. case 1 : frameContentSize = MEM_readLE16(ip+pos)+256; break;
  326. case 2 : frameContentSize = MEM_readLE32(ip+pos); break;
  327. case 3 : frameContentSize = MEM_readLE64(ip+pos); break;
  328. }
  329. if (singleSegment) windowSize = frameContentSize;
  330. zfhPtr->frameType = ZSTD_frame;
  331. zfhPtr->frameContentSize = frameContentSize;
  332. zfhPtr->windowSize = windowSize;
  333. zfhPtr->blockSizeMax = (unsigned) MIN(windowSize, ZSTD_BLOCKSIZE_MAX);
  334. zfhPtr->dictID = dictID;
  335. zfhPtr->checksumFlag = checksumFlag;
  336. }
  337. return 0;
  338. }
  339. /** ZSTD_getFrameHeader() :
  340. * decode Frame Header, or require larger `srcSize`.
  341. * note : this function does not consume input, it only reads it.
  342. * @return : 0, `zfhPtr` is correctly filled,
  343. * >0, `srcSize` is too small, value is wanted `srcSize` amount,
  344. * or an error code, which can be tested using ZSTD_isError() */
  345. size_t ZSTD_getFrameHeader(ZSTD_frameHeader* zfhPtr, const void* src, size_t srcSize)
  346. {
  347. return ZSTD_getFrameHeader_internal(zfhPtr, src, srcSize, ZSTD_f_zstd1);
  348. }
  349. /** ZSTD_getFrameContentSize() :
  350. * compatible with legacy mode
  351. * @return : decompressed size of the single frame pointed to be `src` if known, otherwise
  352. * - ZSTD_CONTENTSIZE_UNKNOWN if the size cannot be determined
  353. * - ZSTD_CONTENTSIZE_ERROR if an error occurred (e.g. invalid magic number, srcSize too small) */
  354. unsigned long long ZSTD_getFrameContentSize(const void *src, size_t srcSize)
  355. {
  356. #if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT >= 1)
  357. if (ZSTD_isLegacy(src, srcSize)) {
  358. unsigned long long const ret = ZSTD_getDecompressedSize_legacy(src, srcSize);
  359. return ret == 0 ? ZSTD_CONTENTSIZE_UNKNOWN : ret;
  360. }
  361. #endif
  362. { ZSTD_frameHeader zfh;
  363. if (ZSTD_getFrameHeader(&zfh, src, srcSize) != 0)
  364. return ZSTD_CONTENTSIZE_ERROR;
  365. if (zfh.frameType == ZSTD_skippableFrame) {
  366. return 0;
  367. } else {
  368. return zfh.frameContentSize;
  369. } }
  370. }
  371. /** ZSTD_findDecompressedSize() :
  372. * compatible with legacy mode
  373. * `srcSize` must be the exact length of some number of ZSTD compressed and/or
  374. * skippable frames
  375. * @return : decompressed size of the frames contained */
  376. unsigned long long ZSTD_findDecompressedSize(const void* src, size_t srcSize)
  377. {
  378. unsigned long long totalDstSize = 0;
  379. while (srcSize >= ZSTD_frameHeaderSize_prefix) {
  380. U32 const magicNumber = MEM_readLE32(src);
  381. if ((magicNumber & 0xFFFFFFF0U) == ZSTD_MAGIC_SKIPPABLE_START) {
  382. size_t skippableSize;
  383. if (srcSize < ZSTD_skippableHeaderSize)
  384. return ERROR(srcSize_wrong);
  385. skippableSize = MEM_readLE32((const BYTE *)src + ZSTD_frameIdSize)
  386. + ZSTD_skippableHeaderSize;
  387. if (srcSize < skippableSize) {
  388. return ZSTD_CONTENTSIZE_ERROR;
  389. }
  390. src = (const BYTE *)src + skippableSize;
  391. srcSize -= skippableSize;
  392. continue;
  393. }
  394. { unsigned long long const ret = ZSTD_getFrameContentSize(src, srcSize);
  395. if (ret >= ZSTD_CONTENTSIZE_ERROR) return ret;
  396. /* check for overflow */
  397. if (totalDstSize + ret < totalDstSize) return ZSTD_CONTENTSIZE_ERROR;
  398. totalDstSize += ret;
  399. }
  400. { size_t const frameSrcSize = ZSTD_findFrameCompressedSize(src, srcSize);
  401. if (ZSTD_isError(frameSrcSize)) {
  402. return ZSTD_CONTENTSIZE_ERROR;
  403. }
  404. src = (const BYTE *)src + frameSrcSize;
  405. srcSize -= frameSrcSize;
  406. }
  407. } /* while (srcSize >= ZSTD_frameHeaderSize_prefix) */
  408. if (srcSize) return ZSTD_CONTENTSIZE_ERROR;
  409. return totalDstSize;
  410. }
  411. /** ZSTD_getDecompressedSize() :
  412. * compatible with legacy mode
  413. * @return : decompressed size if known, 0 otherwise
  414. note : 0 can mean any of the following :
  415. - frame content is empty
  416. - decompressed size field is not present in frame header
  417. - frame header unknown / not supported
  418. - frame header not complete (`srcSize` too small) */
  419. unsigned long long ZSTD_getDecompressedSize(const void* src, size_t srcSize)
  420. {
  421. unsigned long long const ret = ZSTD_getFrameContentSize(src, srcSize);
  422. ZSTD_STATIC_ASSERT(ZSTD_CONTENTSIZE_ERROR < ZSTD_CONTENTSIZE_UNKNOWN);
  423. return (ret >= ZSTD_CONTENTSIZE_ERROR) ? 0 : ret;
  424. }
  425. /** ZSTD_decodeFrameHeader() :
  426. * `headerSize` must be the size provided by ZSTD_frameHeaderSize().
  427. * @return : 0 if success, or an error code, which can be tested using ZSTD_isError() */
  428. static size_t ZSTD_decodeFrameHeader(ZSTD_DCtx* dctx, const void* src, size_t headerSize)
  429. {
  430. size_t const result = ZSTD_getFrameHeader_internal(&(dctx->fParams), src, headerSize, dctx->format);
  431. if (ZSTD_isError(result)) return result; /* invalid header */
  432. if (result>0) return ERROR(srcSize_wrong); /* headerSize too small */
  433. if (dctx->fParams.dictID && (dctx->dictID != dctx->fParams.dictID))
  434. return ERROR(dictionary_wrong);
  435. if (dctx->fParams.checksumFlag) XXH64_reset(&dctx->xxhState, 0);
  436. return 0;
  437. }
  438. /*-*************************************************************
  439. * Block decoding
  440. ***************************************************************/
  441. /*! ZSTD_getcBlockSize() :
  442. * Provides the size of compressed block from block header `src` */
  443. size_t ZSTD_getcBlockSize(const void* src, size_t srcSize,
  444. blockProperties_t* bpPtr)
  445. {
  446. if (srcSize < ZSTD_blockHeaderSize) return ERROR(srcSize_wrong);
  447. { U32 const cBlockHeader = MEM_readLE24(src);
  448. U32 const cSize = cBlockHeader >> 3;
  449. bpPtr->lastBlock = cBlockHeader & 1;
  450. bpPtr->blockType = (blockType_e)((cBlockHeader >> 1) & 3);
  451. bpPtr->origSize = cSize; /* only useful for RLE */
  452. if (bpPtr->blockType == bt_rle) return 1;
  453. if (bpPtr->blockType == bt_reserved) return ERROR(corruption_detected);
  454. return cSize;
  455. }
  456. }
  457. static size_t ZSTD_copyRawBlock(void* dst, size_t dstCapacity,
  458. const void* src, size_t srcSize)
  459. {
  460. if (srcSize > dstCapacity) return ERROR(dstSize_tooSmall);
  461. memcpy(dst, src, srcSize);
  462. return srcSize;
  463. }
  464. static size_t ZSTD_setRleBlock(void* dst, size_t dstCapacity,
  465. const void* src, size_t srcSize,
  466. size_t regenSize)
  467. {
  468. if (srcSize != 1) return ERROR(srcSize_wrong);
  469. if (regenSize > dstCapacity) return ERROR(dstSize_tooSmall);
  470. memset(dst, *(const BYTE*)src, regenSize);
  471. return regenSize;
  472. }
  473. /*! ZSTD_decodeLiteralsBlock() :
  474. * @return : nb of bytes read from src (< srcSize )
  475. * note : symbol not declared but exposed for fullbench */
  476. size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx,
  477. const void* src, size_t srcSize) /* note : srcSize < BLOCKSIZE */
  478. {
  479. if (srcSize < MIN_CBLOCK_SIZE) return ERROR(corruption_detected);
  480. { const BYTE* const istart = (const BYTE*) src;
  481. symbolEncodingType_e const litEncType = (symbolEncodingType_e)(istart[0] & 3);
  482. switch(litEncType)
  483. {
  484. case set_repeat:
  485. if (dctx->litEntropy==0) return ERROR(dictionary_corrupted);
  486. /* fall-through */
  487. case set_compressed:
  488. if (srcSize < 5) return ERROR(corruption_detected); /* srcSize >= MIN_CBLOCK_SIZE == 3; here we need up to 5 for case 3 */
  489. { size_t lhSize, litSize, litCSize;
  490. U32 singleStream=0;
  491. U32 const lhlCode = (istart[0] >> 2) & 3;
  492. U32 const lhc = MEM_readLE32(istart);
  493. switch(lhlCode)
  494. {
  495. case 0: case 1: default: /* note : default is impossible, since lhlCode into [0..3] */
  496. /* 2 - 2 - 10 - 10 */
  497. singleStream = !lhlCode;
  498. lhSize = 3;
  499. litSize = (lhc >> 4) & 0x3FF;
  500. litCSize = (lhc >> 14) & 0x3FF;
  501. break;
  502. case 2:
  503. /* 2 - 2 - 14 - 14 */
  504. lhSize = 4;
  505. litSize = (lhc >> 4) & 0x3FFF;
  506. litCSize = lhc >> 18;
  507. break;
  508. case 3:
  509. /* 2 - 2 - 18 - 18 */
  510. lhSize = 5;
  511. litSize = (lhc >> 4) & 0x3FFFF;
  512. litCSize = (lhc >> 22) + (istart[4] << 10);
  513. break;
  514. }
  515. if (litSize > ZSTD_BLOCKSIZE_MAX) return ERROR(corruption_detected);
  516. if (litCSize + lhSize > srcSize) return ERROR(corruption_detected);
  517. if (HUF_isError((litEncType==set_repeat) ?
  518. ( singleStream ?
  519. HUF_decompress1X_usingDTable_bmi2(dctx->litBuffer, litSize, istart+lhSize, litCSize, dctx->HUFptr, dctx->bmi2) :
  520. HUF_decompress4X_usingDTable_bmi2(dctx->litBuffer, litSize, istart+lhSize, litCSize, dctx->HUFptr, dctx->bmi2) ) :
  521. ( singleStream ?
  522. HUF_decompress1X2_DCtx_wksp_bmi2(dctx->entropy.hufTable, dctx->litBuffer, litSize, istart+lhSize, litCSize,
  523. dctx->entropy.workspace, sizeof(dctx->entropy.workspace), dctx->bmi2) :
  524. HUF_decompress4X_hufOnly_wksp_bmi2(dctx->entropy.hufTable, dctx->litBuffer, litSize, istart+lhSize, litCSize,
  525. dctx->entropy.workspace, sizeof(dctx->entropy.workspace), dctx->bmi2))))
  526. return ERROR(corruption_detected);
  527. dctx->litPtr = dctx->litBuffer;
  528. dctx->litSize = litSize;
  529. dctx->litEntropy = 1;
  530. if (litEncType==set_compressed) dctx->HUFptr = dctx->entropy.hufTable;
  531. memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH);
  532. return litCSize + lhSize;
  533. }
  534. case set_basic:
  535. { size_t litSize, lhSize;
  536. U32 const lhlCode = ((istart[0]) >> 2) & 3;
  537. switch(lhlCode)
  538. {
  539. case 0: case 2: default: /* note : default is impossible, since lhlCode into [0..3] */
  540. lhSize = 1;
  541. litSize = istart[0] >> 3;
  542. break;
  543. case 1:
  544. lhSize = 2;
  545. litSize = MEM_readLE16(istart) >> 4;
  546. break;
  547. case 3:
  548. lhSize = 3;
  549. litSize = MEM_readLE24(istart) >> 4;
  550. break;
  551. }
  552. if (lhSize+litSize+WILDCOPY_OVERLENGTH > srcSize) { /* risk reading beyond src buffer with wildcopy */
  553. if (litSize+lhSize > srcSize) return ERROR(corruption_detected);
  554. memcpy(dctx->litBuffer, istart+lhSize, litSize);
  555. dctx->litPtr = dctx->litBuffer;
  556. dctx->litSize = litSize;
  557. memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH);
  558. return lhSize+litSize;
  559. }
  560. /* direct reference into compressed stream */
  561. dctx->litPtr = istart+lhSize;
  562. dctx->litSize = litSize;
  563. return lhSize+litSize;
  564. }
  565. case set_rle:
  566. { U32 const lhlCode = ((istart[0]) >> 2) & 3;
  567. size_t litSize, lhSize;
  568. switch(lhlCode)
  569. {
  570. case 0: case 2: default: /* note : default is impossible, since lhlCode into [0..3] */
  571. lhSize = 1;
  572. litSize = istart[0] >> 3;
  573. break;
  574. case 1:
  575. lhSize = 2;
  576. litSize = MEM_readLE16(istart) >> 4;
  577. break;
  578. case 3:
  579. lhSize = 3;
  580. litSize = MEM_readLE24(istart) >> 4;
  581. if (srcSize<4) return ERROR(corruption_detected); /* srcSize >= MIN_CBLOCK_SIZE == 3; here we need lhSize+1 = 4 */
  582. break;
  583. }
  584. if (litSize > ZSTD_BLOCKSIZE_MAX) return ERROR(corruption_detected);
  585. memset(dctx->litBuffer, istart[lhSize], litSize + WILDCOPY_OVERLENGTH);
  586. dctx->litPtr = dctx->litBuffer;
  587. dctx->litSize = litSize;
  588. return lhSize+1;
  589. }
  590. default:
  591. return ERROR(corruption_detected); /* impossible */
  592. }
  593. }
  594. }
  595. /* Default FSE distribution tables.
  596. * These are pre-calculated FSE decoding tables using default distributions as defined in specification :
  597. * https://github.com/facebook/zstd/blob/master/doc/zstd_compression_format.md#default-distributions
  598. * They were generated programmatically with following method :
  599. * - start from default distributions, present in /lib/common/zstd_internal.h
  600. * - generate tables normally, using ZSTD_buildFSETable()
  601. * - printout the content of tables
  602. * - pretify output, report below, test with fuzzer to ensure it's correct */
  603. /* Default FSE distribution table for Literal Lengths */
  604. static const ZSTD_seqSymbol LL_defaultDTable[(1<<LL_DEFAULTNORMLOG)+1] = {
  605. { 1, 1, 1, LL_DEFAULTNORMLOG}, /* header : fastMode, tableLog */
  606. /* nextState, nbAddBits, nbBits, baseVal */
  607. { 0, 0, 4, 0}, { 16, 0, 4, 0},
  608. { 32, 0, 5, 1}, { 0, 0, 5, 3},
  609. { 0, 0, 5, 4}, { 0, 0, 5, 6},
  610. { 0, 0, 5, 7}, { 0, 0, 5, 9},
  611. { 0, 0, 5, 10}, { 0, 0, 5, 12},
  612. { 0, 0, 6, 14}, { 0, 1, 5, 16},
  613. { 0, 1, 5, 20}, { 0, 1, 5, 22},
  614. { 0, 2, 5, 28}, { 0, 3, 5, 32},
  615. { 0, 4, 5, 48}, { 32, 6, 5, 64},
  616. { 0, 7, 5, 128}, { 0, 8, 6, 256},
  617. { 0, 10, 6, 1024}, { 0, 12, 6, 4096},
  618. { 32, 0, 4, 0}, { 0, 0, 4, 1},
  619. { 0, 0, 5, 2}, { 32, 0, 5, 4},
  620. { 0, 0, 5, 5}, { 32, 0, 5, 7},
  621. { 0, 0, 5, 8}, { 32, 0, 5, 10},
  622. { 0, 0, 5, 11}, { 0, 0, 6, 13},
  623. { 32, 1, 5, 16}, { 0, 1, 5, 18},
  624. { 32, 1, 5, 22}, { 0, 2, 5, 24},
  625. { 32, 3, 5, 32}, { 0, 3, 5, 40},
  626. { 0, 6, 4, 64}, { 16, 6, 4, 64},
  627. { 32, 7, 5, 128}, { 0, 9, 6, 512},
  628. { 0, 11, 6, 2048}, { 48, 0, 4, 0},
  629. { 16, 0, 4, 1}, { 32, 0, 5, 2},
  630. { 32, 0, 5, 3}, { 32, 0, 5, 5},
  631. { 32, 0, 5, 6}, { 32, 0, 5, 8},
  632. { 32, 0, 5, 9}, { 32, 0, 5, 11},
  633. { 32, 0, 5, 12}, { 0, 0, 6, 15},
  634. { 32, 1, 5, 18}, { 32, 1, 5, 20},
  635. { 32, 2, 5, 24}, { 32, 2, 5, 28},
  636. { 32, 3, 5, 40}, { 32, 4, 5, 48},
  637. { 0, 16, 6,65536}, { 0, 15, 6,32768},
  638. { 0, 14, 6,16384}, { 0, 13, 6, 8192},
  639. }; /* LL_defaultDTable */
  640. /* Default FSE distribution table for Offset Codes */
  641. static const ZSTD_seqSymbol OF_defaultDTable[(1<<OF_DEFAULTNORMLOG)+1] = {
  642. { 1, 1, 1, OF_DEFAULTNORMLOG}, /* header : fastMode, tableLog */
  643. /* nextState, nbAddBits, nbBits, baseVal */
  644. { 0, 0, 5, 0}, { 0, 6, 4, 61},
  645. { 0, 9, 5, 509}, { 0, 15, 5,32765},
  646. { 0, 21, 5,2097149}, { 0, 3, 5, 5},
  647. { 0, 7, 4, 125}, { 0, 12, 5, 4093},
  648. { 0, 18, 5,262141}, { 0, 23, 5,8388605},
  649. { 0, 5, 5, 29}, { 0, 8, 4, 253},
  650. { 0, 14, 5,16381}, { 0, 20, 5,1048573},
  651. { 0, 2, 5, 1}, { 16, 7, 4, 125},
  652. { 0, 11, 5, 2045}, { 0, 17, 5,131069},
  653. { 0, 22, 5,4194301}, { 0, 4, 5, 13},
  654. { 16, 8, 4, 253}, { 0, 13, 5, 8189},
  655. { 0, 19, 5,524285}, { 0, 1, 5, 1},
  656. { 16, 6, 4, 61}, { 0, 10, 5, 1021},
  657. { 0, 16, 5,65533}, { 0, 28, 5,268435453},
  658. { 0, 27, 5,134217725}, { 0, 26, 5,67108861},
  659. { 0, 25, 5,33554429}, { 0, 24, 5,16777213},
  660. }; /* OF_defaultDTable */
  661. /* Default FSE distribution table for Match Lengths */
  662. static const ZSTD_seqSymbol ML_defaultDTable[(1<<ML_DEFAULTNORMLOG)+1] = {
  663. { 1, 1, 1, ML_DEFAULTNORMLOG}, /* header : fastMode, tableLog */
  664. /* nextState, nbAddBits, nbBits, baseVal */
  665. { 0, 0, 6, 3}, { 0, 0, 4, 4},
  666. { 32, 0, 5, 5}, { 0, 0, 5, 6},
  667. { 0, 0, 5, 8}, { 0, 0, 5, 9},
  668. { 0, 0, 5, 11}, { 0, 0, 6, 13},
  669. { 0, 0, 6, 16}, { 0, 0, 6, 19},
  670. { 0, 0, 6, 22}, { 0, 0, 6, 25},
  671. { 0, 0, 6, 28}, { 0, 0, 6, 31},
  672. { 0, 0, 6, 34}, { 0, 1, 6, 37},
  673. { 0, 1, 6, 41}, { 0, 2, 6, 47},
  674. { 0, 3, 6, 59}, { 0, 4, 6, 83},
  675. { 0, 7, 6, 131}, { 0, 9, 6, 515},
  676. { 16, 0, 4, 4}, { 0, 0, 4, 5},
  677. { 32, 0, 5, 6}, { 0, 0, 5, 7},
  678. { 32, 0, 5, 9}, { 0, 0, 5, 10},
  679. { 0, 0, 6, 12}, { 0, 0, 6, 15},
  680. { 0, 0, 6, 18}, { 0, 0, 6, 21},
  681. { 0, 0, 6, 24}, { 0, 0, 6, 27},
  682. { 0, 0, 6, 30}, { 0, 0, 6, 33},
  683. { 0, 1, 6, 35}, { 0, 1, 6, 39},
  684. { 0, 2, 6, 43}, { 0, 3, 6, 51},
  685. { 0, 4, 6, 67}, { 0, 5, 6, 99},
  686. { 0, 8, 6, 259}, { 32, 0, 4, 4},
  687. { 48, 0, 4, 4}, { 16, 0, 4, 5},
  688. { 32, 0, 5, 7}, { 32, 0, 5, 8},
  689. { 32, 0, 5, 10}, { 32, 0, 5, 11},
  690. { 0, 0, 6, 14}, { 0, 0, 6, 17},
  691. { 0, 0, 6, 20}, { 0, 0, 6, 23},
  692. { 0, 0, 6, 26}, { 0, 0, 6, 29},
  693. { 0, 0, 6, 32}, { 0, 16, 6,65539},
  694. { 0, 15, 6,32771}, { 0, 14, 6,16387},
  695. { 0, 13, 6, 8195}, { 0, 12, 6, 4099},
  696. { 0, 11, 6, 2051}, { 0, 10, 6, 1027},
  697. }; /* ML_defaultDTable */
  698. static void ZSTD_buildSeqTable_rle(ZSTD_seqSymbol* dt, U32 baseValue, U32 nbAddBits)
  699. {
  700. void* ptr = dt;
  701. ZSTD_seqSymbol_header* const DTableH = (ZSTD_seqSymbol_header*)ptr;
  702. ZSTD_seqSymbol* const cell = dt + 1;
  703. DTableH->tableLog = 0;
  704. DTableH->fastMode = 0;
  705. cell->nbBits = 0;
  706. cell->nextState = 0;
  707. assert(nbAddBits < 255);
  708. cell->nbAdditionalBits = (BYTE)nbAddBits;
  709. cell->baseValue = baseValue;
  710. }
  711. /* ZSTD_buildFSETable() :
  712. * generate FSE decoding table for one symbol (ll, ml or off) */
  713. static void
  714. ZSTD_buildFSETable(ZSTD_seqSymbol* dt,
  715. const short* normalizedCounter, unsigned maxSymbolValue,
  716. const U32* baseValue, const U32* nbAdditionalBits,
  717. unsigned tableLog)
  718. {
  719. ZSTD_seqSymbol* const tableDecode = dt+1;
  720. U16 symbolNext[MaxSeq+1];
  721. U32 const maxSV1 = maxSymbolValue + 1;
  722. U32 const tableSize = 1 << tableLog;
  723. U32 highThreshold = tableSize-1;
  724. /* Sanity Checks */
  725. assert(maxSymbolValue <= MaxSeq);
  726. assert(tableLog <= MaxFSELog);
  727. /* Init, lay down lowprob symbols */
  728. { ZSTD_seqSymbol_header DTableH;
  729. DTableH.tableLog = tableLog;
  730. DTableH.fastMode = 1;
  731. { S16 const largeLimit= (S16)(1 << (tableLog-1));
  732. U32 s;
  733. for (s=0; s<maxSV1; s++) {
  734. if (normalizedCounter[s]==-1) {
  735. tableDecode[highThreshold--].baseValue = s;
  736. symbolNext[s] = 1;
  737. } else {
  738. if (normalizedCounter[s] >= largeLimit) DTableH.fastMode=0;
  739. symbolNext[s] = normalizedCounter[s];
  740. } } }
  741. memcpy(dt, &DTableH, sizeof(DTableH));
  742. }
  743. /* Spread symbols */
  744. { U32 const tableMask = tableSize-1;
  745. U32 const step = FSE_TABLESTEP(tableSize);
  746. U32 s, position = 0;
  747. for (s=0; s<maxSV1; s++) {
  748. int i;
  749. for (i=0; i<normalizedCounter[s]; i++) {
  750. tableDecode[position].baseValue = s;
  751. position = (position + step) & tableMask;
  752. while (position > highThreshold) position = (position + step) & tableMask; /* lowprob area */
  753. } }
  754. assert(position == 0); /* position must reach all cells once, otherwise normalizedCounter is incorrect */
  755. }
  756. /* Build Decoding table */
  757. { U32 u;
  758. for (u=0; u<tableSize; u++) {
  759. U32 const symbol = tableDecode[u].baseValue;
  760. U32 const nextState = symbolNext[symbol]++;
  761. tableDecode[u].nbBits = (BYTE) (tableLog - BIT_highbit32(nextState) );
  762. tableDecode[u].nextState = (U16) ( (nextState << tableDecode[u].nbBits) - tableSize);
  763. assert(nbAdditionalBits[symbol] < 255);
  764. tableDecode[u].nbAdditionalBits = (BYTE)nbAdditionalBits[symbol];
  765. tableDecode[u].baseValue = baseValue[symbol];
  766. } }
  767. }
  768. /*! ZSTD_buildSeqTable() :
  769. * @return : nb bytes read from src,
  770. * or an error code if it fails */
  771. static size_t ZSTD_buildSeqTable(ZSTD_seqSymbol* DTableSpace, const ZSTD_seqSymbol** DTablePtr,
  772. symbolEncodingType_e type, U32 max, U32 maxLog,
  773. const void* src, size_t srcSize,
  774. const U32* baseValue, const U32* nbAdditionalBits,
  775. const ZSTD_seqSymbol* defaultTable, U32 flagRepeatTable)
  776. {
  777. switch(type)
  778. {
  779. case set_rle :
  780. if (!srcSize) return ERROR(srcSize_wrong);
  781. if ( (*(const BYTE*)src) > max) return ERROR(corruption_detected);
  782. { U32 const symbol = *(const BYTE*)src;
  783. U32 const baseline = baseValue[symbol];
  784. U32 const nbBits = nbAdditionalBits[symbol];
  785. ZSTD_buildSeqTable_rle(DTableSpace, baseline, nbBits);
  786. }
  787. *DTablePtr = DTableSpace;
  788. return 1;
  789. case set_basic :
  790. *DTablePtr = defaultTable;
  791. return 0;
  792. case set_repeat:
  793. if (!flagRepeatTable) return ERROR(corruption_detected);
  794. return 0;
  795. case set_compressed :
  796. { U32 tableLog;
  797. S16 norm[MaxSeq+1];
  798. size_t const headerSize = FSE_readNCount(norm, &max, &tableLog, src, srcSize);
  799. if (FSE_isError(headerSize)) return ERROR(corruption_detected);
  800. if (tableLog > maxLog) return ERROR(corruption_detected);
  801. ZSTD_buildFSETable(DTableSpace, norm, max, baseValue, nbAdditionalBits, tableLog);
  802. *DTablePtr = DTableSpace;
  803. return headerSize;
  804. }
  805. default : /* impossible */
  806. assert(0);
  807. return ERROR(GENERIC);
  808. }
  809. }
  810. static const U32 LL_base[MaxLL+1] = {
  811. 0, 1, 2, 3, 4, 5, 6, 7,
  812. 8, 9, 10, 11, 12, 13, 14, 15,
  813. 16, 18, 20, 22, 24, 28, 32, 40,
  814. 48, 64, 0x80, 0x100, 0x200, 0x400, 0x800, 0x1000,
  815. 0x2000, 0x4000, 0x8000, 0x10000 };
  816. static const U32 OF_base[MaxOff+1] = {
  817. 0, 1, 1, 5, 0xD, 0x1D, 0x3D, 0x7D,
  818. 0xFD, 0x1FD, 0x3FD, 0x7FD, 0xFFD, 0x1FFD, 0x3FFD, 0x7FFD,
  819. 0xFFFD, 0x1FFFD, 0x3FFFD, 0x7FFFD, 0xFFFFD, 0x1FFFFD, 0x3FFFFD, 0x7FFFFD,
  820. 0xFFFFFD, 0x1FFFFFD, 0x3FFFFFD, 0x7FFFFFD, 0xFFFFFFD, 0x1FFFFFFD, 0x3FFFFFFD, 0x7FFFFFFD };
  821. static const U32 OF_bits[MaxOff+1] = {
  822. 0, 1, 2, 3, 4, 5, 6, 7,
  823. 8, 9, 10, 11, 12, 13, 14, 15,
  824. 16, 17, 18, 19, 20, 21, 22, 23,
  825. 24, 25, 26, 27, 28, 29, 30, 31 };
  826. static const U32 ML_base[MaxML+1] = {
  827. 3, 4, 5, 6, 7, 8, 9, 10,
  828. 11, 12, 13, 14, 15, 16, 17, 18,
  829. 19, 20, 21, 22, 23, 24, 25, 26,
  830. 27, 28, 29, 30, 31, 32, 33, 34,
  831. 35, 37, 39, 41, 43, 47, 51, 59,
  832. 67, 83, 99, 0x83, 0x103, 0x203, 0x403, 0x803,
  833. 0x1003, 0x2003, 0x4003, 0x8003, 0x10003 };
  834. size_t ZSTD_decodeSeqHeaders(ZSTD_DCtx* dctx, int* nbSeqPtr,
  835. const void* src, size_t srcSize)
  836. {
  837. const BYTE* const istart = (const BYTE* const)src;
  838. const BYTE* const iend = istart + srcSize;
  839. const BYTE* ip = istart;
  840. DEBUGLOG(5, "ZSTD_decodeSeqHeaders");
  841. /* check */
  842. if (srcSize < MIN_SEQUENCES_SIZE) return ERROR(srcSize_wrong);
  843. /* SeqHead */
  844. { int nbSeq = *ip++;
  845. if (!nbSeq) { *nbSeqPtr=0; return 1; }
  846. if (nbSeq > 0x7F) {
  847. if (nbSeq == 0xFF) {
  848. if (ip+2 > iend) return ERROR(srcSize_wrong);
  849. nbSeq = MEM_readLE16(ip) + LONGNBSEQ, ip+=2;
  850. } else {
  851. if (ip >= iend) return ERROR(srcSize_wrong);
  852. nbSeq = ((nbSeq-0x80)<<8) + *ip++;
  853. }
  854. }
  855. *nbSeqPtr = nbSeq;
  856. }
  857. /* FSE table descriptors */
  858. if (ip+4 > iend) return ERROR(srcSize_wrong); /* minimum possible size */
  859. { symbolEncodingType_e const LLtype = (symbolEncodingType_e)(*ip >> 6);
  860. symbolEncodingType_e const OFtype = (symbolEncodingType_e)((*ip >> 4) & 3);
  861. symbolEncodingType_e const MLtype = (symbolEncodingType_e)((*ip >> 2) & 3);
  862. ip++;
  863. /* Build DTables */
  864. { size_t const llhSize = ZSTD_buildSeqTable(dctx->entropy.LLTable, &dctx->LLTptr,
  865. LLtype, MaxLL, LLFSELog,
  866. ip, iend-ip,
  867. LL_base, LL_bits,
  868. LL_defaultDTable, dctx->fseEntropy);
  869. if (ZSTD_isError(llhSize)) return ERROR(corruption_detected);
  870. ip += llhSize;
  871. }
  872. { size_t const ofhSize = ZSTD_buildSeqTable(dctx->entropy.OFTable, &dctx->OFTptr,
  873. OFtype, MaxOff, OffFSELog,
  874. ip, iend-ip,
  875. OF_base, OF_bits,
  876. OF_defaultDTable, dctx->fseEntropy);
  877. if (ZSTD_isError(ofhSize)) return ERROR(corruption_detected);
  878. ip += ofhSize;
  879. }
  880. { size_t const mlhSize = ZSTD_buildSeqTable(dctx->entropy.MLTable, &dctx->MLTptr,
  881. MLtype, MaxML, MLFSELog,
  882. ip, iend-ip,
  883. ML_base, ML_bits,
  884. ML_defaultDTable, dctx->fseEntropy);
  885. if (ZSTD_isError(mlhSize)) return ERROR(corruption_detected);
  886. ip += mlhSize;
  887. }
  888. }
  889. return ip-istart;
  890. }
  891. typedef struct {
  892. size_t litLength;
  893. size_t matchLength;
  894. size_t offset;
  895. const BYTE* match;
  896. } seq_t;
  897. typedef struct {
  898. size_t state;
  899. const ZSTD_seqSymbol* table;
  900. } ZSTD_fseState;
  901. typedef struct {
  902. BIT_DStream_t DStream;
  903. ZSTD_fseState stateLL;
  904. ZSTD_fseState stateOffb;
  905. ZSTD_fseState stateML;
  906. size_t prevOffset[ZSTD_REP_NUM];
  907. const BYTE* prefixStart;
  908. const BYTE* dictEnd;
  909. size_t pos;
  910. } seqState_t;
  911. FORCE_NOINLINE
  912. size_t ZSTD_execSequenceLast7(BYTE* op,
  913. BYTE* const oend, seq_t sequence,
  914. const BYTE** litPtr, const BYTE* const litLimit,
  915. const BYTE* const base, const BYTE* const vBase, const BYTE* const dictEnd)
  916. {
  917. BYTE* const oLitEnd = op + sequence.litLength;
  918. size_t const sequenceLength = sequence.litLength + sequence.matchLength;
  919. BYTE* const oMatchEnd = op + sequenceLength; /* risk : address space overflow (32-bits) */
  920. BYTE* const oend_w = oend - WILDCOPY_OVERLENGTH;
  921. const BYTE* const iLitEnd = *litPtr + sequence.litLength;
  922. const BYTE* match = oLitEnd - sequence.offset;
  923. /* check */
  924. if (oMatchEnd>oend) return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of WILDCOPY_OVERLENGTH from oend */
  925. if (iLitEnd > litLimit) return ERROR(corruption_detected); /* over-read beyond lit buffer */
  926. if (oLitEnd <= oend_w) return ERROR(GENERIC); /* Precondition */
  927. /* copy literals */
  928. if (op < oend_w) {
  929. ZSTD_wildcopy(op, *litPtr, oend_w - op);
  930. *litPtr += oend_w - op;
  931. op = oend_w;
  932. }
  933. while (op < oLitEnd) *op++ = *(*litPtr)++;
  934. /* copy Match */
  935. if (sequence.offset > (size_t)(oLitEnd - base)) {
  936. /* offset beyond prefix */
  937. if (sequence.offset > (size_t)(oLitEnd - vBase)) return ERROR(corruption_detected);
  938. match = dictEnd - (base-match);
  939. if (match + sequence.matchLength <= dictEnd) {
  940. memmove(oLitEnd, match, sequence.matchLength);
  941. return sequenceLength;
  942. }
  943. /* span extDict & currentPrefixSegment */
  944. { size_t const length1 = dictEnd - match;
  945. memmove(oLitEnd, match, length1);
  946. op = oLitEnd + length1;
  947. sequence.matchLength -= length1;
  948. match = base;
  949. } }
  950. while (op < oMatchEnd) *op++ = *match++;
  951. return sequenceLength;
  952. }
  953. HINT_INLINE
  954. size_t ZSTD_execSequence(BYTE* op,
  955. BYTE* const oend, seq_t sequence,
  956. const BYTE** litPtr, const BYTE* const litLimit,
  957. const BYTE* const base, const BYTE* const vBase, const BYTE* const dictEnd)
  958. {
  959. BYTE* const oLitEnd = op + sequence.litLength;
  960. size_t const sequenceLength = sequence.litLength + sequence.matchLength;
  961. BYTE* const oMatchEnd = op + sequenceLength; /* risk : address space overflow (32-bits) */
  962. BYTE* const oend_w = oend - WILDCOPY_OVERLENGTH;
  963. const BYTE* const iLitEnd = *litPtr + sequence.litLength;
  964. const BYTE* match = oLitEnd - sequence.offset;
  965. /* check */
  966. if (oMatchEnd>oend) return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of WILDCOPY_OVERLENGTH from oend */
  967. if (iLitEnd > litLimit) return ERROR(corruption_detected); /* over-read beyond lit buffer */
  968. if (oLitEnd>oend_w) return ZSTD_execSequenceLast7(op, oend, sequence, litPtr, litLimit, base, vBase, dictEnd);
  969. /* copy Literals */
  970. ZSTD_copy8(op, *litPtr);
  971. if (sequence.litLength > 8)
  972. ZSTD_wildcopy(op+8, (*litPtr)+8, sequence.litLength - 8); /* note : since oLitEnd <= oend-WILDCOPY_OVERLENGTH, no risk of overwrite beyond oend */
  973. op = oLitEnd;
  974. *litPtr = iLitEnd; /* update for next sequence */
  975. /* copy Match */
  976. if (sequence.offset > (size_t)(oLitEnd - base)) {
  977. /* offset beyond prefix -> go into extDict */
  978. if (sequence.offset > (size_t)(oLitEnd - vBase))
  979. return ERROR(corruption_detected);
  980. match = dictEnd + (match - base);
  981. if (match + sequence.matchLength <= dictEnd) {
  982. memmove(oLitEnd, match, sequence.matchLength);
  983. return sequenceLength;
  984. }
  985. /* span extDict & currentPrefixSegment */
  986. { size_t const length1 = dictEnd - match;
  987. memmove(oLitEnd, match, length1);
  988. op = oLitEnd + length1;
  989. sequence.matchLength -= length1;
  990. match = base;
  991. if (op > oend_w || sequence.matchLength < MINMATCH) {
  992. U32 i;
  993. for (i = 0; i < sequence.matchLength; ++i) op[i] = match[i];
  994. return sequenceLength;
  995. }
  996. } }
  997. /* Requirement: op <= oend_w && sequence.matchLength >= MINMATCH */
  998. /* match within prefix */
  999. if (sequence.offset < 8) {
  1000. /* close range match, overlap */
  1001. static const U32 dec32table[] = { 0, 1, 2, 1, 4, 4, 4, 4 }; /* added */
  1002. static const int dec64table[] = { 8, 8, 8, 7, 8, 9,10,11 }; /* subtracted */
  1003. int const sub2 = dec64table[sequence.offset];
  1004. op[0] = match[0];
  1005. op[1] = match[1];
  1006. op[2] = match[2];
  1007. op[3] = match[3];
  1008. match += dec32table[sequence.offset];
  1009. ZSTD_copy4(op+4, match);
  1010. match -= sub2;
  1011. } else {
  1012. ZSTD_copy8(op, match);
  1013. }
  1014. op += 8; match += 8;
  1015. if (oMatchEnd > oend-(16-MINMATCH)) {
  1016. if (op < oend_w) {
  1017. ZSTD_wildcopy(op, match, oend_w - op);
  1018. match += oend_w - op;
  1019. op = oend_w;
  1020. }
  1021. while (op < oMatchEnd) *op++ = *match++;
  1022. } else {
  1023. ZSTD_wildcopy(op, match, (ptrdiff_t)sequence.matchLength-8); /* works even if matchLength < 8 */
  1024. }
  1025. return sequenceLength;
  1026. }
  1027. HINT_INLINE
  1028. size_t ZSTD_execSequenceLong(BYTE* op,
  1029. BYTE* const oend, seq_t sequence,
  1030. const BYTE** litPtr, const BYTE* const litLimit,
  1031. const BYTE* const prefixStart, const BYTE* const dictStart, const BYTE* const dictEnd)
  1032. {
  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 = sequence.match;
  1039. /* check */
  1040. if (oMatchEnd > oend) return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of WILDCOPY_OVERLENGTH from oend */
  1041. if (iLitEnd > litLimit) return ERROR(corruption_detected); /* over-read beyond lit buffer */
  1042. if (oLitEnd > oend_w) return ZSTD_execSequenceLast7(op, oend, sequence, litPtr, litLimit, prefixStart, dictStart, dictEnd);
  1043. /* copy Literals */
  1044. ZSTD_copy8(op, *litPtr); /* note : op <= oLitEnd <= oend_w == oend - 8 */
  1045. if (sequence.litLength > 8)
  1046. ZSTD_wildcopy(op+8, (*litPtr)+8, sequence.litLength - 8); /* note : since oLitEnd <= oend-WILDCOPY_OVERLENGTH, no risk of overwrite beyond oend */
  1047. op = oLitEnd;
  1048. *litPtr = iLitEnd; /* update for next sequence */
  1049. /* copy Match */
  1050. if (sequence.offset > (size_t)(oLitEnd - prefixStart)) {
  1051. /* offset beyond prefix */
  1052. if (sequence.offset > (size_t)(oLitEnd - dictStart)) return ERROR(corruption_detected);
  1053. if (match + sequence.matchLength <= dictEnd) {
  1054. memmove(oLitEnd, match, sequence.matchLength);
  1055. return sequenceLength;
  1056. }
  1057. /* span extDict & currentPrefixSegment */
  1058. { size_t const length1 = dictEnd - match;
  1059. memmove(oLitEnd, match, length1);
  1060. op = oLitEnd + length1;
  1061. sequence.matchLength -= length1;
  1062. match = prefixStart;
  1063. if (op > oend_w || sequence.matchLength < MINMATCH) {
  1064. U32 i;
  1065. for (i = 0; i < sequence.matchLength; ++i) op[i] = match[i];
  1066. return sequenceLength;
  1067. }
  1068. } }
  1069. assert(op <= oend_w);
  1070. assert(sequence.matchLength >= MINMATCH);
  1071. /* match within prefix */
  1072. if (sequence.offset < 8) {
  1073. /* close range match, overlap */
  1074. static const U32 dec32table[] = { 0, 1, 2, 1, 4, 4, 4, 4 }; /* added */
  1075. static const int dec64table[] = { 8, 8, 8, 7, 8, 9,10,11 }; /* subtracted */
  1076. int const sub2 = dec64table[sequence.offset];
  1077. op[0] = match[0];
  1078. op[1] = match[1];
  1079. op[2] = match[2];
  1080. op[3] = match[3];
  1081. match += dec32table[sequence.offset];
  1082. ZSTD_copy4(op+4, match);
  1083. match -= sub2;
  1084. } else {
  1085. ZSTD_copy8(op, match);
  1086. }
  1087. op += 8; match += 8;
  1088. if (oMatchEnd > oend-(16-MINMATCH)) {
  1089. if (op < oend_w) {
  1090. ZSTD_wildcopy(op, match, oend_w - op);
  1091. match += oend_w - op;
  1092. op = oend_w;
  1093. }
  1094. while (op < oMatchEnd) *op++ = *match++;
  1095. } else {
  1096. ZSTD_wildcopy(op, match, (ptrdiff_t)sequence.matchLength-8); /* works even if matchLength < 8 */
  1097. }
  1098. return sequenceLength;
  1099. }
  1100. static void
  1101. ZSTD_initFseState(ZSTD_fseState* DStatePtr, BIT_DStream_t* bitD, const ZSTD_seqSymbol* dt)
  1102. {
  1103. const void* ptr = dt;
  1104. const ZSTD_seqSymbol_header* const DTableH = (const ZSTD_seqSymbol_header*)ptr;
  1105. DStatePtr->state = BIT_readBits(bitD, DTableH->tableLog);
  1106. DEBUGLOG(6, "ZSTD_initFseState : val=%u using %u bits",
  1107. (U32)DStatePtr->state, DTableH->tableLog);
  1108. BIT_reloadDStream(bitD);
  1109. DStatePtr->table = dt + 1;
  1110. }
  1111. FORCE_INLINE_TEMPLATE void
  1112. ZSTD_updateFseState(ZSTD_fseState* DStatePtr, BIT_DStream_t* bitD)
  1113. {
  1114. ZSTD_seqSymbol const DInfo = DStatePtr->table[DStatePtr->state];
  1115. U32 const nbBits = DInfo.nbBits;
  1116. size_t const lowBits = BIT_readBits(bitD, nbBits);
  1117. DStatePtr->state = DInfo.nextState + lowBits;
  1118. }
  1119. /* We need to add at most (ZSTD_WINDOWLOG_MAX_32 - 1) bits to read the maximum
  1120. * offset bits. But we can only read at most (STREAM_ACCUMULATOR_MIN_32 - 1)
  1121. * bits before reloading. This value is the maximum number of bytes we read
  1122. * after reloading when we are decoding long offets.
  1123. */
  1124. #define LONG_OFFSETS_MAX_EXTRA_BITS_32 \
  1125. (ZSTD_WINDOWLOG_MAX_32 > STREAM_ACCUMULATOR_MIN_32 \
  1126. ? ZSTD_WINDOWLOG_MAX_32 - STREAM_ACCUMULATOR_MIN_32 \
  1127. : 0)
  1128. typedef enum { ZSTD_lo_isRegularOffset, ZSTD_lo_isLongOffset=1 } ZSTD_longOffset_e;
  1129. FORCE_INLINE_TEMPLATE seq_t
  1130. ZSTD_decodeSequence(seqState_t* seqState, const ZSTD_longOffset_e longOffsets)
  1131. {
  1132. seq_t seq;
  1133. U32 const llBits = seqState->stateLL.table[seqState->stateLL.state].nbAdditionalBits;
  1134. U32 const mlBits = seqState->stateML.table[seqState->stateML.state].nbAdditionalBits;
  1135. U32 const ofBits = seqState->stateOffb.table[seqState->stateOffb.state].nbAdditionalBits;
  1136. U32 const totalBits = llBits+mlBits+ofBits;
  1137. U32 const llBase = seqState->stateLL.table[seqState->stateLL.state].baseValue;
  1138. U32 const mlBase = seqState->stateML.table[seqState->stateML.state].baseValue;
  1139. U32 const ofBase = seqState->stateOffb.table[seqState->stateOffb.state].baseValue;
  1140. /* sequence */
  1141. { size_t offset;
  1142. if (!ofBits)
  1143. offset = 0;
  1144. else {
  1145. ZSTD_STATIC_ASSERT(ZSTD_lo_isLongOffset == 1);
  1146. ZSTD_STATIC_ASSERT(LONG_OFFSETS_MAX_EXTRA_BITS_32 == 5);
  1147. assert(ofBits <= MaxOff);
  1148. if (MEM_32bits() && longOffsets && (ofBits >= STREAM_ACCUMULATOR_MIN_32)) {
  1149. U32 const extraBits = ofBits - MIN(ofBits, 32 - seqState->DStream.bitsConsumed);
  1150. offset = ofBase + (BIT_readBitsFast(&seqState->DStream, ofBits - extraBits) << extraBits);
  1151. BIT_reloadDStream(&seqState->DStream);
  1152. if (extraBits) offset += BIT_readBitsFast(&seqState->DStream, extraBits);
  1153. assert(extraBits <= LONG_OFFSETS_MAX_EXTRA_BITS_32); /* to avoid another reload */
  1154. } else {
  1155. offset = ofBase + BIT_readBitsFast(&seqState->DStream, ofBits/*>0*/); /* <= (ZSTD_WINDOWLOG_MAX-1) bits */
  1156. if (MEM_32bits()) BIT_reloadDStream(&seqState->DStream);
  1157. }
  1158. }
  1159. if (ofBits <= 1) {
  1160. offset += (llBase==0);
  1161. if (offset) {
  1162. size_t temp = (offset==3) ? seqState->prevOffset[0] - 1 : seqState->prevOffset[offset];
  1163. temp += !temp; /* 0 is not valid; input is corrupted; force offset to 1 */
  1164. if (offset != 1) seqState->prevOffset[2] = seqState->prevOffset[1];
  1165. seqState->prevOffset[1] = seqState->prevOffset[0];
  1166. seqState->prevOffset[0] = offset = temp;
  1167. } else { /* offset == 0 */
  1168. offset = seqState->prevOffset[0];
  1169. }
  1170. } else {
  1171. seqState->prevOffset[2] = seqState->prevOffset[1];
  1172. seqState->prevOffset[1] = seqState->prevOffset[0];
  1173. seqState->prevOffset[0] = offset;
  1174. }
  1175. seq.offset = offset;
  1176. }
  1177. seq.matchLength = mlBase
  1178. + ((mlBits>0) ? BIT_readBitsFast(&seqState->DStream, mlBits/*>0*/) : 0); /* <= 16 bits */
  1179. if (MEM_32bits() && (mlBits+llBits >= STREAM_ACCUMULATOR_MIN_32-LONG_OFFSETS_MAX_EXTRA_BITS_32))
  1180. BIT_reloadDStream(&seqState->DStream);
  1181. if (MEM_64bits() && (totalBits >= STREAM_ACCUMULATOR_MIN_64-(LLFSELog+MLFSELog+OffFSELog)))
  1182. BIT_reloadDStream(&seqState->DStream);
  1183. /* Ensure there are enough bits to read the rest of data in 64-bit mode. */
  1184. ZSTD_STATIC_ASSERT(16+LLFSELog+MLFSELog+OffFSELog < STREAM_ACCUMULATOR_MIN_64);
  1185. seq.litLength = llBase
  1186. + ((llBits>0) ? BIT_readBitsFast(&seqState->DStream, llBits/*>0*/) : 0); /* <= 16 bits */
  1187. if (MEM_32bits())
  1188. BIT_reloadDStream(&seqState->DStream);
  1189. DEBUGLOG(6, "seq: litL=%u, matchL=%u, offset=%u",
  1190. (U32)seq.litLength, (U32)seq.matchLength, (U32)seq.offset);
  1191. /* ANS state update */
  1192. ZSTD_updateFseState(&seqState->stateLL, &seqState->DStream); /* <= 9 bits */
  1193. ZSTD_updateFseState(&seqState->stateML, &seqState->DStream); /* <= 9 bits */
  1194. if (MEM_32bits()) BIT_reloadDStream(&seqState->DStream); /* <= 18 bits */
  1195. ZSTD_updateFseState(&seqState->stateOffb, &seqState->DStream); /* <= 8 bits */
  1196. return seq;
  1197. }
  1198. FORCE_INLINE_TEMPLATE size_t
  1199. ZSTD_decompressSequences_body( ZSTD_DCtx* dctx,
  1200. void* dst, size_t maxDstSize,
  1201. const void* seqStart, size_t seqSize, int nbSeq,
  1202. const ZSTD_longOffset_e isLongOffset)
  1203. {
  1204. const BYTE* ip = (const BYTE*)seqStart;
  1205. const BYTE* const iend = ip + seqSize;
  1206. BYTE* const ostart = (BYTE* const)dst;
  1207. BYTE* const oend = ostart + maxDstSize;
  1208. BYTE* op = ostart;
  1209. const BYTE* litPtr = dctx->litPtr;
  1210. const BYTE* const litEnd = litPtr + dctx->litSize;
  1211. const BYTE* const base = (const BYTE*) (dctx->base);
  1212. const BYTE* const vBase = (const BYTE*) (dctx->vBase);
  1213. const BYTE* const dictEnd = (const BYTE*) (dctx->dictEnd);
  1214. DEBUGLOG(5, "ZSTD_decompressSequences");
  1215. /* Regen sequences */
  1216. if (nbSeq) {
  1217. seqState_t seqState;
  1218. dctx->fseEntropy = 1;
  1219. { U32 i; for (i=0; i<ZSTD_REP_NUM; i++) seqState.prevOffset[i] = dctx->entropy.rep[i]; }
  1220. CHECK_E(BIT_initDStream(&seqState.DStream, ip, iend-ip), corruption_detected);
  1221. ZSTD_initFseState(&seqState.stateLL, &seqState.DStream, dctx->LLTptr);
  1222. ZSTD_initFseState(&seqState.stateOffb, &seqState.DStream, dctx->OFTptr);
  1223. ZSTD_initFseState(&seqState.stateML, &seqState.DStream, dctx->MLTptr);
  1224. for ( ; (BIT_reloadDStream(&(seqState.DStream)) <= BIT_DStream_completed) && nbSeq ; ) {
  1225. nbSeq--;
  1226. { seq_t const sequence = ZSTD_decodeSequence(&seqState, isLongOffset);
  1227. size_t const oneSeqSize = ZSTD_execSequence(op, oend, sequence, &litPtr, litEnd, base, vBase, dictEnd);
  1228. DEBUGLOG(6, "regenerated sequence size : %u", (U32)oneSeqSize);
  1229. if (ZSTD_isError(oneSeqSize)) return oneSeqSize;
  1230. op += oneSeqSize;
  1231. } }
  1232. /* check if reached exact end */
  1233. DEBUGLOG(5, "ZSTD_decompressSequences: after decode loop, remaining nbSeq : %i", nbSeq);
  1234. if (nbSeq) return ERROR(corruption_detected);
  1235. /* save reps for next block */
  1236. { U32 i; for (i=0; i<ZSTD_REP_NUM; i++) dctx->entropy.rep[i] = (U32)(seqState.prevOffset[i]); }
  1237. }
  1238. /* last literal segment */
  1239. { size_t const lastLLSize = litEnd - litPtr;
  1240. if (lastLLSize > (size_t)(oend-op)) return ERROR(dstSize_tooSmall);
  1241. memcpy(op, litPtr, lastLLSize);
  1242. op += lastLLSize;
  1243. }
  1244. return op-ostart;
  1245. }
  1246. static size_t
  1247. ZSTD_decompressSequences_default(ZSTD_DCtx* dctx,
  1248. void* dst, size_t maxDstSize,
  1249. const void* seqStart, size_t seqSize, int nbSeq,
  1250. const ZSTD_longOffset_e isLongOffset)
  1251. {
  1252. return ZSTD_decompressSequences_body(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
  1253. }
  1254. FORCE_INLINE_TEMPLATE seq_t
  1255. ZSTD_decodeSequenceLong(seqState_t* seqState, ZSTD_longOffset_e const longOffsets)
  1256. {
  1257. seq_t seq;
  1258. U32 const llBits = seqState->stateLL.table[seqState->stateLL.state].nbAdditionalBits;
  1259. U32 const mlBits = seqState->stateML.table[seqState->stateML.state].nbAdditionalBits;
  1260. U32 const ofBits = seqState->stateOffb.table[seqState->stateOffb.state].nbAdditionalBits;
  1261. U32 const totalBits = llBits+mlBits+ofBits;
  1262. U32 const llBase = seqState->stateLL.table[seqState->stateLL.state].baseValue;
  1263. U32 const mlBase = seqState->stateML.table[seqState->stateML.state].baseValue;
  1264. U32 const ofBase = seqState->stateOffb.table[seqState->stateOffb.state].baseValue;
  1265. /* sequence */
  1266. { size_t offset;
  1267. if (!ofBits)
  1268. offset = 0;
  1269. else {
  1270. ZSTD_STATIC_ASSERT(ZSTD_lo_isLongOffset == 1);
  1271. ZSTD_STATIC_ASSERT(LONG_OFFSETS_MAX_EXTRA_BITS_32 == 5);
  1272. assert(ofBits <= MaxOff);
  1273. if (MEM_32bits() && longOffsets) {
  1274. U32 const extraBits = ofBits - MIN(ofBits, STREAM_ACCUMULATOR_MIN_32-1);
  1275. offset = ofBase + (BIT_readBitsFast(&seqState->DStream, ofBits - extraBits) << extraBits);
  1276. if (MEM_32bits() || extraBits) BIT_reloadDStream(&seqState->DStream);
  1277. if (extraBits) offset += BIT_readBitsFast(&seqState->DStream, extraBits);
  1278. } else {
  1279. offset = ofBase + BIT_readBitsFast(&seqState->DStream, ofBits); /* <= (ZSTD_WINDOWLOG_MAX-1) bits */
  1280. if (MEM_32bits()) BIT_reloadDStream(&seqState->DStream);
  1281. }
  1282. }
  1283. if (ofBits <= 1) {
  1284. offset += (llBase==0);
  1285. if (offset) {
  1286. size_t temp = (offset==3) ? seqState->prevOffset[0] - 1 : seqState->prevOffset[offset];
  1287. temp += !temp; /* 0 is not valid; input is corrupted; force offset to 1 */
  1288. if (offset != 1) seqState->prevOffset[2] = seqState->prevOffset[1];
  1289. seqState->prevOffset[1] = seqState->prevOffset[0];
  1290. seqState->prevOffset[0] = offset = temp;
  1291. } else {
  1292. offset = seqState->prevOffset[0];
  1293. }
  1294. } else {
  1295. seqState->prevOffset[2] = seqState->prevOffset[1];
  1296. seqState->prevOffset[1] = seqState->prevOffset[0];
  1297. seqState->prevOffset[0] = offset;
  1298. }
  1299. seq.offset = offset;
  1300. }
  1301. seq.matchLength = mlBase + ((mlBits>0) ? BIT_readBitsFast(&seqState->DStream, mlBits) : 0); /* <= 16 bits */
  1302. if (MEM_32bits() && (mlBits+llBits >= STREAM_ACCUMULATOR_MIN_32-LONG_OFFSETS_MAX_EXTRA_BITS_32))
  1303. BIT_reloadDStream(&seqState->DStream);
  1304. if (MEM_64bits() && (totalBits >= STREAM_ACCUMULATOR_MIN_64-(LLFSELog+MLFSELog+OffFSELog)))
  1305. BIT_reloadDStream(&seqState->DStream);
  1306. /* Verify that there is enough bits to read the rest of the data in 64-bit mode. */
  1307. ZSTD_STATIC_ASSERT(16+LLFSELog+MLFSELog+OffFSELog < STREAM_ACCUMULATOR_MIN_64);
  1308. seq.litLength = llBase + ((llBits>0) ? BIT_readBitsFast(&seqState->DStream, llBits) : 0); /* <= 16 bits */
  1309. if (MEM_32bits())
  1310. BIT_reloadDStream(&seqState->DStream);
  1311. { size_t const pos = seqState->pos + seq.litLength;
  1312. const BYTE* const matchBase = (seq.offset > pos) ? seqState->dictEnd : seqState->prefixStart;
  1313. 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.
  1314. * No consequence though : no memory access will occur, overly large offset will be detected in ZSTD_execSequenceLong() */
  1315. seqState->pos = pos + seq.matchLength;
  1316. }
  1317. /* ANS state update */
  1318. ZSTD_updateFseState(&seqState->stateLL, &seqState->DStream); /* <= 9 bits */
  1319. ZSTD_updateFseState(&seqState->stateML, &seqState->DStream); /* <= 9 bits */
  1320. if (MEM_32bits()) BIT_reloadDStream(&seqState->DStream); /* <= 18 bits */
  1321. ZSTD_updateFseState(&seqState->stateOffb, &seqState->DStream); /* <= 8 bits */
  1322. return seq;
  1323. }
  1324. FORCE_INLINE_TEMPLATE size_t
  1325. ZSTD_decompressSequencesLong_body(
  1326. ZSTD_DCtx* dctx,
  1327. void* dst, size_t maxDstSize,
  1328. const void* seqStart, size_t seqSize, int nbSeq,
  1329. const ZSTD_longOffset_e isLongOffset)
  1330. {
  1331. const BYTE* ip = (const BYTE*)seqStart;
  1332. const BYTE* const iend = ip + seqSize;
  1333. BYTE* const ostart = (BYTE* const)dst;
  1334. BYTE* const oend = ostart + maxDstSize;
  1335. BYTE* op = ostart;
  1336. const BYTE* litPtr = dctx->litPtr;
  1337. const BYTE* const litEnd = litPtr + dctx->litSize;
  1338. const BYTE* const prefixStart = (const BYTE*) (dctx->base);
  1339. const BYTE* const dictStart = (const BYTE*) (dctx->vBase);
  1340. const BYTE* const dictEnd = (const BYTE*) (dctx->dictEnd);
  1341. /* Regen sequences */
  1342. if (nbSeq) {
  1343. #define STORED_SEQS 4
  1344. #define STOSEQ_MASK (STORED_SEQS-1)
  1345. #define ADVANCED_SEQS 4
  1346. seq_t sequences[STORED_SEQS];
  1347. int const seqAdvance = MIN(nbSeq, ADVANCED_SEQS);
  1348. seqState_t seqState;
  1349. int seqNb;
  1350. dctx->fseEntropy = 1;
  1351. { U32 i; for (i=0; i<ZSTD_REP_NUM; i++) seqState.prevOffset[i] = dctx->entropy.rep[i]; }
  1352. seqState.prefixStart = prefixStart;
  1353. seqState.pos = (size_t)(op-prefixStart);
  1354. seqState.dictEnd = dictEnd;
  1355. CHECK_E(BIT_initDStream(&seqState.DStream, ip, iend-ip), corruption_detected);
  1356. ZSTD_initFseState(&seqState.stateLL, &seqState.DStream, dctx->LLTptr);
  1357. ZSTD_initFseState(&seqState.stateOffb, &seqState.DStream, dctx->OFTptr);
  1358. ZSTD_initFseState(&seqState.stateML, &seqState.DStream, dctx->MLTptr);
  1359. /* prepare in advance */
  1360. for (seqNb=0; (BIT_reloadDStream(&seqState.DStream) <= BIT_DStream_completed) && (seqNb<seqAdvance); seqNb++) {
  1361. sequences[seqNb] = ZSTD_decodeSequenceLong(&seqState, isLongOffset);
  1362. }
  1363. if (seqNb<seqAdvance) return ERROR(corruption_detected);
  1364. /* decode and decompress */
  1365. for ( ; (BIT_reloadDStream(&(seqState.DStream)) <= BIT_DStream_completed) && (seqNb<nbSeq) ; seqNb++) {
  1366. seq_t const sequence = ZSTD_decodeSequenceLong(&seqState, isLongOffset);
  1367. size_t const oneSeqSize = ZSTD_execSequenceLong(op, oend, sequences[(seqNb-ADVANCED_SEQS) & STOSEQ_MASK], &litPtr, litEnd, prefixStart, dictStart, dictEnd);
  1368. if (ZSTD_isError(oneSeqSize)) return oneSeqSize;
  1369. PREFETCH(sequence.match); /* note : it's safe to invoke PREFETCH() on any memory address, including invalid ones */
  1370. sequences[seqNb&STOSEQ_MASK] = sequence;
  1371. op += oneSeqSize;
  1372. }
  1373. if (seqNb<nbSeq) return ERROR(corruption_detected);
  1374. /* finish queue */
  1375. seqNb -= seqAdvance;
  1376. for ( ; seqNb<nbSeq ; seqNb++) {
  1377. size_t const oneSeqSize = ZSTD_execSequenceLong(op, oend, sequences[seqNb&STOSEQ_MASK], &litPtr, litEnd, prefixStart, dictStart, dictEnd);
  1378. if (ZSTD_isError(oneSeqSize)) return oneSeqSize;
  1379. op += oneSeqSize;
  1380. }
  1381. /* save reps for next block */
  1382. { U32 i; for (i=0; i<ZSTD_REP_NUM; i++) dctx->entropy.rep[i] = (U32)(seqState.prevOffset[i]); }
  1383. #undef STORED_SEQS
  1384. #undef STOSEQ_MASK
  1385. #undef ADVANCED_SEQS
  1386. }
  1387. /* last literal segment */
  1388. { size_t const lastLLSize = litEnd - litPtr;
  1389. if (lastLLSize > (size_t)(oend-op)) return ERROR(dstSize_tooSmall);
  1390. memcpy(op, litPtr, lastLLSize);
  1391. op += lastLLSize;
  1392. }
  1393. return op-ostart;
  1394. }
  1395. static size_t
  1396. ZSTD_decompressSequencesLong_default(ZSTD_DCtx* dctx,
  1397. void* dst, size_t maxDstSize,
  1398. const void* seqStart, size_t seqSize, int nbSeq,
  1399. const ZSTD_longOffset_e isLongOffset)
  1400. {
  1401. return ZSTD_decompressSequencesLong_body(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
  1402. }
  1403. #if DYNAMIC_BMI2
  1404. static TARGET_ATTRIBUTE("bmi2") size_t
  1405. ZSTD_decompressSequences_bmi2(ZSTD_DCtx* dctx,
  1406. void* dst, size_t maxDstSize,
  1407. const void* seqStart, size_t seqSize, int nbSeq,
  1408. const ZSTD_longOffset_e isLongOffset)
  1409. {
  1410. return ZSTD_decompressSequences_body(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
  1411. }
  1412. static TARGET_ATTRIBUTE("bmi2") size_t
  1413. ZSTD_decompressSequencesLong_bmi2(ZSTD_DCtx* dctx,
  1414. void* dst, size_t maxDstSize,
  1415. const void* seqStart, size_t seqSize, int nbSeq,
  1416. const ZSTD_longOffset_e isLongOffset)
  1417. {
  1418. return ZSTD_decompressSequencesLong_body(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
  1419. }
  1420. #endif
  1421. typedef size_t (*ZSTD_decompressSequences_t)(
  1422. ZSTD_DCtx *dctx, void *dst, size_t maxDstSize,
  1423. const void *seqStart, size_t seqSize, int nbSeq,
  1424. const ZSTD_longOffset_e isLongOffset);
  1425. static size_t ZSTD_decompressSequences(ZSTD_DCtx* dctx, void* dst, size_t maxDstSize,
  1426. const void* seqStart, size_t seqSize, int nbSeq,
  1427. const ZSTD_longOffset_e isLongOffset)
  1428. {
  1429. DEBUGLOG(5, "ZSTD_decompressSequences");
  1430. #if DYNAMIC_BMI2
  1431. if (dctx->bmi2) {
  1432. return ZSTD_decompressSequences_bmi2(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
  1433. }
  1434. #endif
  1435. return ZSTD_decompressSequences_default(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
  1436. }
  1437. static size_t ZSTD_decompressSequencesLong(ZSTD_DCtx* dctx,
  1438. void* dst, size_t maxDstSize,
  1439. const void* seqStart, size_t seqSize, int nbSeq,
  1440. const ZSTD_longOffset_e isLongOffset)
  1441. {
  1442. DEBUGLOG(5, "ZSTD_decompressSequencesLong");
  1443. #if DYNAMIC_BMI2
  1444. if (dctx->bmi2) {
  1445. return ZSTD_decompressSequencesLong_bmi2(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
  1446. }
  1447. #endif
  1448. return ZSTD_decompressSequencesLong_default(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
  1449. }
  1450. /* ZSTD_getLongOffsetsShare() :
  1451. * condition : offTable must be valid
  1452. * @return : "share" of long offsets (arbitrarily defined as > (1<<23))
  1453. * compared to maximum possible of (1<<OffFSELog) */
  1454. static unsigned
  1455. ZSTD_getLongOffsetsShare(const ZSTD_seqSymbol* offTable)
  1456. {
  1457. const void* ptr = offTable;
  1458. U32 const tableLog = ((const ZSTD_seqSymbol_header*)ptr)[0].tableLog;
  1459. const ZSTD_seqSymbol* table = offTable + 1;
  1460. U32 const max = 1 << tableLog;
  1461. U32 u, total = 0;
  1462. DEBUGLOG(5, "ZSTD_getLongOffsetsShare: (tableLog=%u)", tableLog);
  1463. assert(max <= (1 << OffFSELog)); /* max not too large */
  1464. for (u=0; u<max; u++) {
  1465. if (table[u].nbAdditionalBits > 22) total += 1;
  1466. }
  1467. assert(tableLog <= OffFSELog);
  1468. total <<= (OffFSELog - tableLog); /* scale to OffFSELog */
  1469. return total;
  1470. }
  1471. static size_t ZSTD_decompressBlock_internal(ZSTD_DCtx* dctx,
  1472. void* dst, size_t dstCapacity,
  1473. const void* src, size_t srcSize, const int frame)
  1474. { /* blockType == blockCompressed */
  1475. const BYTE* ip = (const BYTE*)src;
  1476. /* isLongOffset must be true if there are long offsets.
  1477. * Offsets are long if they are larger than 2^STREAM_ACCUMULATOR_MIN.
  1478. * We don't expect that to be the case in 64-bit mode.
  1479. * In block mode, window size is not known, so we have to be conservative. (note: but it could be evaluated from current-lowLimit)
  1480. */
  1481. ZSTD_longOffset_e const isLongOffset = (ZSTD_longOffset_e)(MEM_32bits() && (!frame || dctx->fParams.windowSize > (1ULL << STREAM_ACCUMULATOR_MIN)));
  1482. DEBUGLOG(5, "ZSTD_decompressBlock_internal (size : %u)", (U32)srcSize);
  1483. if (srcSize >= ZSTD_BLOCKSIZE_MAX) return ERROR(srcSize_wrong);
  1484. /* Decode literals section */
  1485. { size_t const litCSize = ZSTD_decodeLiteralsBlock(dctx, src, srcSize);
  1486. DEBUGLOG(5, "ZSTD_decodeLiteralsBlock : %u", (U32)litCSize);
  1487. if (ZSTD_isError(litCSize)) return litCSize;
  1488. ip += litCSize;
  1489. srcSize -= litCSize;
  1490. }
  1491. /* Build Decoding Tables */
  1492. { int nbSeq;
  1493. size_t const seqHSize = ZSTD_decodeSeqHeaders(dctx, &nbSeq, ip, srcSize);
  1494. if (ZSTD_isError(seqHSize)) return seqHSize;
  1495. ip += seqHSize;
  1496. srcSize -= seqHSize;
  1497. if ( (!frame || dctx->fParams.windowSize > (1<<24))
  1498. && (nbSeq>0) ) { /* could probably use a larger nbSeq limit */
  1499. U32 const shareLongOffsets = ZSTD_getLongOffsetsShare(dctx->OFTptr);
  1500. U32 const minShare = MEM_64bits() ? 7 : 20; /* heuristic values, correspond to 2.73% and 7.81% */
  1501. if (shareLongOffsets >= minShare)
  1502. return ZSTD_decompressSequencesLong(dctx, dst, dstCapacity, ip, srcSize, nbSeq, isLongOffset);
  1503. }
  1504. return ZSTD_decompressSequences(dctx, dst, dstCapacity, ip, srcSize, nbSeq, isLongOffset);
  1505. }
  1506. }
  1507. static void ZSTD_checkContinuity(ZSTD_DCtx* dctx, const void* dst)
  1508. {
  1509. if (dst != dctx->previousDstEnd) { /* not contiguous */
  1510. dctx->dictEnd = dctx->previousDstEnd;
  1511. dctx->vBase = (const char*)dst - ((const char*)(dctx->previousDstEnd) - (const char*)(dctx->base));
  1512. dctx->base = dst;
  1513. dctx->previousDstEnd = dst;
  1514. }
  1515. }
  1516. size_t ZSTD_decompressBlock(ZSTD_DCtx* dctx,
  1517. void* dst, size_t dstCapacity,
  1518. const void* src, size_t srcSize)
  1519. {
  1520. size_t dSize;
  1521. ZSTD_checkContinuity(dctx, dst);
  1522. dSize = ZSTD_decompressBlock_internal(dctx, dst, dstCapacity, src, srcSize, /* frame */ 0);
  1523. dctx->previousDstEnd = (char*)dst + dSize;
  1524. return dSize;
  1525. }
  1526. /** ZSTD_insertBlock() :
  1527. insert `src` block into `dctx` history. Useful to track uncompressed blocks. */
  1528. ZSTDLIB_API size_t ZSTD_insertBlock(ZSTD_DCtx* dctx, const void* blockStart, size_t blockSize)
  1529. {
  1530. ZSTD_checkContinuity(dctx, blockStart);
  1531. dctx->previousDstEnd = (const char*)blockStart + blockSize;
  1532. return blockSize;
  1533. }
  1534. static size_t ZSTD_generateNxBytes(void* dst, size_t dstCapacity, BYTE byte, size_t length)
  1535. {
  1536. if (length > dstCapacity) return ERROR(dstSize_tooSmall);
  1537. memset(dst, byte, length);
  1538. return length;
  1539. }
  1540. /** ZSTD_findFrameCompressedSize() :
  1541. * compatible with legacy mode
  1542. * `src` must point to the start of a ZSTD frame, ZSTD legacy frame, or skippable frame
  1543. * `srcSize` must be at least as large as the frame contained
  1544. * @return : the compressed size of the frame starting at `src` */
  1545. size_t ZSTD_findFrameCompressedSize(const void *src, size_t srcSize)
  1546. {
  1547. #if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT >= 1)
  1548. if (ZSTD_isLegacy(src, srcSize))
  1549. return ZSTD_findFrameCompressedSizeLegacy(src, srcSize);
  1550. #endif
  1551. if ( (srcSize >= ZSTD_skippableHeaderSize)
  1552. && (MEM_readLE32(src) & 0xFFFFFFF0U) == ZSTD_MAGIC_SKIPPABLE_START ) {
  1553. return ZSTD_skippableHeaderSize + MEM_readLE32((const BYTE*)src + ZSTD_frameIdSize);
  1554. } else {
  1555. const BYTE* ip = (const BYTE*)src;
  1556. const BYTE* const ipstart = ip;
  1557. size_t remainingSize = srcSize;
  1558. ZSTD_frameHeader zfh;
  1559. /* Extract Frame Header */
  1560. { size_t const ret = ZSTD_getFrameHeader(&zfh, src, srcSize);
  1561. if (ZSTD_isError(ret)) return ret;
  1562. if (ret > 0) return ERROR(srcSize_wrong);
  1563. }
  1564. ip += zfh.headerSize;
  1565. remainingSize -= zfh.headerSize;
  1566. /* Loop on each block */
  1567. while (1) {
  1568. blockProperties_t blockProperties;
  1569. size_t const cBlockSize = ZSTD_getcBlockSize(ip, remainingSize, &blockProperties);
  1570. if (ZSTD_isError(cBlockSize)) return cBlockSize;
  1571. if (ZSTD_blockHeaderSize + cBlockSize > remainingSize)
  1572. return ERROR(srcSize_wrong);
  1573. ip += ZSTD_blockHeaderSize + cBlockSize;
  1574. remainingSize -= ZSTD_blockHeaderSize + cBlockSize;
  1575. if (blockProperties.lastBlock) break;
  1576. }
  1577. if (zfh.checksumFlag) { /* Final frame content checksum */
  1578. if (remainingSize < 4) return ERROR(srcSize_wrong);
  1579. ip += 4;
  1580. remainingSize -= 4;
  1581. }
  1582. return ip - ipstart;
  1583. }
  1584. }
  1585. /*! ZSTD_decompressFrame() :
  1586. * @dctx must be properly initialized */
  1587. static size_t ZSTD_decompressFrame(ZSTD_DCtx* dctx,
  1588. void* dst, size_t dstCapacity,
  1589. const void** srcPtr, size_t *srcSizePtr)
  1590. {
  1591. const BYTE* ip = (const BYTE*)(*srcPtr);
  1592. BYTE* const ostart = (BYTE* const)dst;
  1593. BYTE* const oend = ostart + dstCapacity;
  1594. BYTE* op = ostart;
  1595. size_t remainingSize = *srcSizePtr;
  1596. /* check */
  1597. if (remainingSize < ZSTD_frameHeaderSize_min+ZSTD_blockHeaderSize)
  1598. return ERROR(srcSize_wrong);
  1599. /* Frame Header */
  1600. { size_t const frameHeaderSize = ZSTD_frameHeaderSize(ip, ZSTD_frameHeaderSize_prefix);
  1601. if (ZSTD_isError(frameHeaderSize)) return frameHeaderSize;
  1602. if (remainingSize < frameHeaderSize+ZSTD_blockHeaderSize)
  1603. return ERROR(srcSize_wrong);
  1604. CHECK_F( ZSTD_decodeFrameHeader(dctx, ip, frameHeaderSize) );
  1605. ip += frameHeaderSize; remainingSize -= frameHeaderSize;
  1606. }
  1607. /* Loop on each block */
  1608. while (1) {
  1609. size_t decodedSize;
  1610. blockProperties_t blockProperties;
  1611. size_t const cBlockSize = ZSTD_getcBlockSize(ip, remainingSize, &blockProperties);
  1612. if (ZSTD_isError(cBlockSize)) return cBlockSize;
  1613. ip += ZSTD_blockHeaderSize;
  1614. remainingSize -= ZSTD_blockHeaderSize;
  1615. if (cBlockSize > remainingSize) return ERROR(srcSize_wrong);
  1616. switch(blockProperties.blockType)
  1617. {
  1618. case bt_compressed:
  1619. decodedSize = ZSTD_decompressBlock_internal(dctx, op, oend-op, ip, cBlockSize, /* frame */ 1);
  1620. break;
  1621. case bt_raw :
  1622. decodedSize = ZSTD_copyRawBlock(op, oend-op, ip, cBlockSize);
  1623. break;
  1624. case bt_rle :
  1625. decodedSize = ZSTD_generateNxBytes(op, oend-op, *ip, blockProperties.origSize);
  1626. break;
  1627. case bt_reserved :
  1628. default:
  1629. return ERROR(corruption_detected);
  1630. }
  1631. if (ZSTD_isError(decodedSize)) return decodedSize;
  1632. if (dctx->fParams.checksumFlag)
  1633. XXH64_update(&dctx->xxhState, op, decodedSize);
  1634. op += decodedSize;
  1635. ip += cBlockSize;
  1636. remainingSize -= cBlockSize;
  1637. if (blockProperties.lastBlock) break;
  1638. }
  1639. if (dctx->fParams.frameContentSize != ZSTD_CONTENTSIZE_UNKNOWN) {
  1640. if ((U64)(op-ostart) != dctx->fParams.frameContentSize) {
  1641. return ERROR(corruption_detected);
  1642. } }
  1643. if (dctx->fParams.checksumFlag) { /* Frame content checksum verification */
  1644. U32 const checkCalc = (U32)XXH64_digest(&dctx->xxhState);
  1645. U32 checkRead;
  1646. if (remainingSize<4) return ERROR(checksum_wrong);
  1647. checkRead = MEM_readLE32(ip);
  1648. if (checkRead != checkCalc) return ERROR(checksum_wrong);
  1649. ip += 4;
  1650. remainingSize -= 4;
  1651. }
  1652. /* Allow caller to get size read */
  1653. *srcPtr = ip;
  1654. *srcSizePtr = remainingSize;
  1655. return op-ostart;
  1656. }
  1657. static const void* ZSTD_DDictDictContent(const ZSTD_DDict* ddict);
  1658. static size_t ZSTD_DDictDictSize(const ZSTD_DDict* ddict);
  1659. static size_t ZSTD_decompressMultiFrame(ZSTD_DCtx* dctx,
  1660. void* dst, size_t dstCapacity,
  1661. const void* src, size_t srcSize,
  1662. const void* dict, size_t dictSize,
  1663. const ZSTD_DDict* ddict)
  1664. {
  1665. void* const dststart = dst;
  1666. assert(dict==NULL || ddict==NULL); /* either dict or ddict set, not both */
  1667. if (ddict) {
  1668. dict = ZSTD_DDictDictContent(ddict);
  1669. dictSize = ZSTD_DDictDictSize(ddict);
  1670. }
  1671. while (srcSize >= ZSTD_frameHeaderSize_prefix) {
  1672. U32 magicNumber;
  1673. #if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT >= 1)
  1674. if (ZSTD_isLegacy(src, srcSize)) {
  1675. size_t decodedSize;
  1676. size_t const frameSize = ZSTD_findFrameCompressedSizeLegacy(src, srcSize);
  1677. if (ZSTD_isError(frameSize)) return frameSize;
  1678. /* legacy support is not compatible with static dctx */
  1679. if (dctx->staticSize) return ERROR(memory_allocation);
  1680. decodedSize = ZSTD_decompressLegacy(dst, dstCapacity, src, frameSize, dict, dictSize);
  1681. dst = (BYTE*)dst + decodedSize;
  1682. dstCapacity -= decodedSize;
  1683. src = (const BYTE*)src + frameSize;
  1684. srcSize -= frameSize;
  1685. continue;
  1686. }
  1687. #endif
  1688. magicNumber = MEM_readLE32(src);
  1689. DEBUGLOG(4, "reading magic number %08X (expecting %08X)",
  1690. (U32)magicNumber, (U32)ZSTD_MAGICNUMBER);
  1691. if (magicNumber != ZSTD_MAGICNUMBER) {
  1692. if ((magicNumber & 0xFFFFFFF0U) == ZSTD_MAGIC_SKIPPABLE_START) {
  1693. size_t skippableSize;
  1694. if (srcSize < ZSTD_skippableHeaderSize)
  1695. return ERROR(srcSize_wrong);
  1696. skippableSize = MEM_readLE32((const BYTE*)src + ZSTD_frameIdSize)
  1697. + ZSTD_skippableHeaderSize;
  1698. if (srcSize < skippableSize) return ERROR(srcSize_wrong);
  1699. src = (const BYTE *)src + skippableSize;
  1700. srcSize -= skippableSize;
  1701. continue;
  1702. }
  1703. return ERROR(prefix_unknown);
  1704. }
  1705. if (ddict) {
  1706. /* we were called from ZSTD_decompress_usingDDict */
  1707. CHECK_F(ZSTD_decompressBegin_usingDDict(dctx, ddict));
  1708. } else {
  1709. /* this will initialize correctly with no dict if dict == NULL, so
  1710. * use this in all cases but ddict */
  1711. CHECK_F(ZSTD_decompressBegin_usingDict(dctx, dict, dictSize));
  1712. }
  1713. ZSTD_checkContinuity(dctx, dst);
  1714. { const size_t res = ZSTD_decompressFrame(dctx, dst, dstCapacity,
  1715. &src, &srcSize);
  1716. if (ZSTD_isError(res)) return res;
  1717. /* no need to bound check, ZSTD_decompressFrame already has */
  1718. dst = (BYTE*)dst + res;
  1719. dstCapacity -= res;
  1720. }
  1721. } /* while (srcSize >= ZSTD_frameHeaderSize_prefix) */
  1722. if (srcSize) return ERROR(srcSize_wrong); /* input not entirely consumed */
  1723. return (BYTE*)dst - (BYTE*)dststart;
  1724. }
  1725. size_t ZSTD_decompress_usingDict(ZSTD_DCtx* dctx,
  1726. void* dst, size_t dstCapacity,
  1727. const void* src, size_t srcSize,
  1728. const void* dict, size_t dictSize)
  1729. {
  1730. return ZSTD_decompressMultiFrame(dctx, dst, dstCapacity, src, srcSize, dict, dictSize, NULL);
  1731. }
  1732. size_t ZSTD_decompressDCtx(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize)
  1733. {
  1734. return ZSTD_decompress_usingDict(dctx, dst, dstCapacity, src, srcSize, NULL, 0);
  1735. }
  1736. size_t ZSTD_decompress(void* dst, size_t dstCapacity, const void* src, size_t srcSize)
  1737. {
  1738. #if defined(ZSTD_HEAPMODE) && (ZSTD_HEAPMODE>=1)
  1739. size_t regenSize;
  1740. ZSTD_DCtx* const dctx = ZSTD_createDCtx();
  1741. if (dctx==NULL) return ERROR(memory_allocation);
  1742. regenSize = ZSTD_decompressDCtx(dctx, dst, dstCapacity, src, srcSize);
  1743. ZSTD_freeDCtx(dctx);
  1744. return regenSize;
  1745. #else /* stack mode */
  1746. ZSTD_DCtx dctx;
  1747. return ZSTD_decompressDCtx(&dctx, dst, dstCapacity, src, srcSize);
  1748. #endif
  1749. }
  1750. /*-**************************************
  1751. * Advanced Streaming Decompression API
  1752. * Bufferless and synchronous
  1753. ****************************************/
  1754. size_t ZSTD_nextSrcSizeToDecompress(ZSTD_DCtx* dctx) { return dctx->expected; }
  1755. ZSTD_nextInputType_e ZSTD_nextInputType(ZSTD_DCtx* dctx) {
  1756. switch(dctx->stage)
  1757. {
  1758. default: /* should not happen */
  1759. assert(0);
  1760. case ZSTDds_getFrameHeaderSize:
  1761. case ZSTDds_decodeFrameHeader:
  1762. return ZSTDnit_frameHeader;
  1763. case ZSTDds_decodeBlockHeader:
  1764. return ZSTDnit_blockHeader;
  1765. case ZSTDds_decompressBlock:
  1766. return ZSTDnit_block;
  1767. case ZSTDds_decompressLastBlock:
  1768. return ZSTDnit_lastBlock;
  1769. case ZSTDds_checkChecksum:
  1770. return ZSTDnit_checksum;
  1771. case ZSTDds_decodeSkippableHeader:
  1772. case ZSTDds_skipFrame:
  1773. return ZSTDnit_skippableFrame;
  1774. }
  1775. }
  1776. static int ZSTD_isSkipFrame(ZSTD_DCtx* dctx) { return dctx->stage == ZSTDds_skipFrame; }
  1777. /** ZSTD_decompressContinue() :
  1778. * srcSize : must be the exact nb of bytes expected (see ZSTD_nextSrcSizeToDecompress())
  1779. * @return : nb of bytes generated into `dst` (necessarily <= `dstCapacity)
  1780. * or an error code, which can be tested using ZSTD_isError() */
  1781. size_t ZSTD_decompressContinue(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize)
  1782. {
  1783. DEBUGLOG(5, "ZSTD_decompressContinue (srcSize:%u)", (U32)srcSize);
  1784. /* Sanity check */
  1785. if (srcSize != dctx->expected) return ERROR(srcSize_wrong); /* not allowed */
  1786. if (dstCapacity) ZSTD_checkContinuity(dctx, dst);
  1787. switch (dctx->stage)
  1788. {
  1789. case ZSTDds_getFrameHeaderSize :
  1790. assert(src != NULL);
  1791. if (dctx->format == ZSTD_f_zstd1) { /* allows header */
  1792. assert(srcSize >= ZSTD_frameIdSize); /* to read skippable magic number */
  1793. if ((MEM_readLE32(src) & 0xFFFFFFF0U) == ZSTD_MAGIC_SKIPPABLE_START) { /* skippable frame */
  1794. memcpy(dctx->headerBuffer, src, srcSize);
  1795. dctx->expected = ZSTD_skippableHeaderSize - srcSize; /* remaining to load to get full skippable frame header */
  1796. dctx->stage = ZSTDds_decodeSkippableHeader;
  1797. return 0;
  1798. } }
  1799. dctx->headerSize = ZSTD_frameHeaderSize_internal(src, srcSize, dctx->format);
  1800. if (ZSTD_isError(dctx->headerSize)) return dctx->headerSize;
  1801. memcpy(dctx->headerBuffer, src, srcSize);
  1802. dctx->expected = dctx->headerSize - srcSize;
  1803. dctx->stage = ZSTDds_decodeFrameHeader;
  1804. return 0;
  1805. case ZSTDds_decodeFrameHeader:
  1806. assert(src != NULL);
  1807. memcpy(dctx->headerBuffer + (dctx->headerSize - srcSize), src, srcSize);
  1808. CHECK_F(ZSTD_decodeFrameHeader(dctx, dctx->headerBuffer, dctx->headerSize));
  1809. dctx->expected = ZSTD_blockHeaderSize;
  1810. dctx->stage = ZSTDds_decodeBlockHeader;
  1811. return 0;
  1812. case ZSTDds_decodeBlockHeader:
  1813. { blockProperties_t bp;
  1814. size_t const cBlockSize = ZSTD_getcBlockSize(src, ZSTD_blockHeaderSize, &bp);
  1815. if (ZSTD_isError(cBlockSize)) return cBlockSize;
  1816. dctx->expected = cBlockSize;
  1817. dctx->bType = bp.blockType;
  1818. dctx->rleSize = bp.origSize;
  1819. if (cBlockSize) {
  1820. dctx->stage = bp.lastBlock ? ZSTDds_decompressLastBlock : ZSTDds_decompressBlock;
  1821. return 0;
  1822. }
  1823. /* empty block */
  1824. if (bp.lastBlock) {
  1825. if (dctx->fParams.checksumFlag) {
  1826. dctx->expected = 4;
  1827. dctx->stage = ZSTDds_checkChecksum;
  1828. } else {
  1829. dctx->expected = 0; /* end of frame */
  1830. dctx->stage = ZSTDds_getFrameHeaderSize;
  1831. }
  1832. } else {
  1833. dctx->expected = ZSTD_blockHeaderSize; /* jump to next header */
  1834. dctx->stage = ZSTDds_decodeBlockHeader;
  1835. }
  1836. return 0;
  1837. }
  1838. case ZSTDds_decompressLastBlock:
  1839. case ZSTDds_decompressBlock:
  1840. DEBUGLOG(5, "ZSTD_decompressContinue: case ZSTDds_decompressBlock");
  1841. { size_t rSize;
  1842. switch(dctx->bType)
  1843. {
  1844. case bt_compressed:
  1845. DEBUGLOG(5, "ZSTD_decompressContinue: case bt_compressed");
  1846. rSize = ZSTD_decompressBlock_internal(dctx, dst, dstCapacity, src, srcSize, /* frame */ 1);
  1847. break;
  1848. case bt_raw :
  1849. rSize = ZSTD_copyRawBlock(dst, dstCapacity, src, srcSize);
  1850. break;
  1851. case bt_rle :
  1852. rSize = ZSTD_setRleBlock(dst, dstCapacity, src, srcSize, dctx->rleSize);
  1853. break;
  1854. case bt_reserved : /* should never happen */
  1855. default:
  1856. return ERROR(corruption_detected);
  1857. }
  1858. if (ZSTD_isError(rSize)) return rSize;
  1859. DEBUGLOG(5, "ZSTD_decompressContinue: decoded size from block : %u", (U32)rSize);
  1860. dctx->decodedSize += rSize;
  1861. if (dctx->fParams.checksumFlag) XXH64_update(&dctx->xxhState, dst, rSize);
  1862. if (dctx->stage == ZSTDds_decompressLastBlock) { /* end of frame */
  1863. DEBUGLOG(4, "ZSTD_decompressContinue: decoded size from frame : %u", (U32)dctx->decodedSize);
  1864. if (dctx->fParams.frameContentSize != ZSTD_CONTENTSIZE_UNKNOWN) {
  1865. if (dctx->decodedSize != dctx->fParams.frameContentSize) {
  1866. return ERROR(corruption_detected);
  1867. } }
  1868. if (dctx->fParams.checksumFlag) { /* another round for frame checksum */
  1869. dctx->expected = 4;
  1870. dctx->stage = ZSTDds_checkChecksum;
  1871. } else {
  1872. dctx->expected = 0; /* ends here */
  1873. dctx->stage = ZSTDds_getFrameHeaderSize;
  1874. }
  1875. } else {
  1876. dctx->stage = ZSTDds_decodeBlockHeader;
  1877. dctx->expected = ZSTD_blockHeaderSize;
  1878. dctx->previousDstEnd = (char*)dst + rSize;
  1879. }
  1880. return rSize;
  1881. }
  1882. case ZSTDds_checkChecksum:
  1883. assert(srcSize == 4); /* guaranteed by dctx->expected */
  1884. { U32 const h32 = (U32)XXH64_digest(&dctx->xxhState);
  1885. U32 const check32 = MEM_readLE32(src);
  1886. DEBUGLOG(4, "ZSTD_decompressContinue: checksum : calculated %08X :: %08X read", h32, check32);
  1887. if (check32 != h32) return ERROR(checksum_wrong);
  1888. dctx->expected = 0;
  1889. dctx->stage = ZSTDds_getFrameHeaderSize;
  1890. return 0;
  1891. }
  1892. case ZSTDds_decodeSkippableHeader:
  1893. assert(src != NULL);
  1894. assert(srcSize <= ZSTD_skippableHeaderSize);
  1895. memcpy(dctx->headerBuffer + (ZSTD_skippableHeaderSize - srcSize), src, srcSize); /* complete skippable header */
  1896. dctx->expected = MEM_readLE32(dctx->headerBuffer + ZSTD_frameIdSize); /* note : dctx->expected can grow seriously large, beyond local buffer size */
  1897. dctx->stage = ZSTDds_skipFrame;
  1898. return 0;
  1899. case ZSTDds_skipFrame:
  1900. dctx->expected = 0;
  1901. dctx->stage = ZSTDds_getFrameHeaderSize;
  1902. return 0;
  1903. default:
  1904. return ERROR(GENERIC); /* impossible */
  1905. }
  1906. }
  1907. static size_t ZSTD_refDictContent(ZSTD_DCtx* dctx, const void* dict, size_t dictSize)
  1908. {
  1909. dctx->dictEnd = dctx->previousDstEnd;
  1910. dctx->vBase = (const char*)dict - ((const char*)(dctx->previousDstEnd) - (const char*)(dctx->base));
  1911. dctx->base = dict;
  1912. dctx->previousDstEnd = (const char*)dict + dictSize;
  1913. return 0;
  1914. }
  1915. /* ZSTD_loadEntropy() :
  1916. * dict : must point at beginning of a valid zstd dictionary
  1917. * @return : size of entropy tables read */
  1918. static size_t ZSTD_loadEntropy(ZSTD_entropyDTables_t* entropy, const void* const dict, size_t const dictSize)
  1919. {
  1920. const BYTE* dictPtr = (const BYTE*)dict;
  1921. const BYTE* const dictEnd = dictPtr + dictSize;
  1922. if (dictSize <= 8) return ERROR(dictionary_corrupted);
  1923. dictPtr += 8; /* skip header = magic + dictID */
  1924. { size_t const hSize = HUF_readDTableX4_wksp(
  1925. entropy->hufTable, dictPtr, dictEnd - dictPtr,
  1926. entropy->workspace, sizeof(entropy->workspace));
  1927. if (HUF_isError(hSize)) return ERROR(dictionary_corrupted);
  1928. dictPtr += hSize;
  1929. }
  1930. { short offcodeNCount[MaxOff+1];
  1931. U32 offcodeMaxValue = MaxOff, offcodeLog;
  1932. size_t const offcodeHeaderSize = FSE_readNCount(offcodeNCount, &offcodeMaxValue, &offcodeLog, dictPtr, dictEnd-dictPtr);
  1933. if (FSE_isError(offcodeHeaderSize)) return ERROR(dictionary_corrupted);
  1934. if (offcodeMaxValue > MaxOff) return ERROR(dictionary_corrupted);
  1935. if (offcodeLog > OffFSELog) return ERROR(dictionary_corrupted);
  1936. ZSTD_buildFSETable(entropy->OFTable,
  1937. offcodeNCount, offcodeMaxValue,
  1938. OF_base, OF_bits,
  1939. offcodeLog);
  1940. dictPtr += offcodeHeaderSize;
  1941. }
  1942. { short matchlengthNCount[MaxML+1];
  1943. unsigned matchlengthMaxValue = MaxML, matchlengthLog;
  1944. size_t const matchlengthHeaderSize = FSE_readNCount(matchlengthNCount, &matchlengthMaxValue, &matchlengthLog, dictPtr, dictEnd-dictPtr);
  1945. if (FSE_isError(matchlengthHeaderSize)) return ERROR(dictionary_corrupted);
  1946. if (matchlengthMaxValue > MaxML) return ERROR(dictionary_corrupted);
  1947. if (matchlengthLog > MLFSELog) return ERROR(dictionary_corrupted);
  1948. ZSTD_buildFSETable(entropy->MLTable,
  1949. matchlengthNCount, matchlengthMaxValue,
  1950. ML_base, ML_bits,
  1951. matchlengthLog);
  1952. dictPtr += matchlengthHeaderSize;
  1953. }
  1954. { short litlengthNCount[MaxLL+1];
  1955. unsigned litlengthMaxValue = MaxLL, litlengthLog;
  1956. size_t const litlengthHeaderSize = FSE_readNCount(litlengthNCount, &litlengthMaxValue, &litlengthLog, dictPtr, dictEnd-dictPtr);
  1957. if (FSE_isError(litlengthHeaderSize)) return ERROR(dictionary_corrupted);
  1958. if (litlengthMaxValue > MaxLL) return ERROR(dictionary_corrupted);
  1959. if (litlengthLog > LLFSELog) return ERROR(dictionary_corrupted);
  1960. ZSTD_buildFSETable(entropy->LLTable,
  1961. litlengthNCount, litlengthMaxValue,
  1962. LL_base, LL_bits,
  1963. litlengthLog);
  1964. dictPtr += litlengthHeaderSize;
  1965. }
  1966. if (dictPtr+12 > dictEnd) return ERROR(dictionary_corrupted);
  1967. { int i;
  1968. size_t const dictContentSize = (size_t)(dictEnd - (dictPtr+12));
  1969. for (i=0; i<3; i++) {
  1970. U32 const rep = MEM_readLE32(dictPtr); dictPtr += 4;
  1971. if (rep==0 || rep >= dictContentSize) return ERROR(dictionary_corrupted);
  1972. entropy->rep[i] = rep;
  1973. } }
  1974. return dictPtr - (const BYTE*)dict;
  1975. }
  1976. static size_t ZSTD_decompress_insertDictionary(ZSTD_DCtx* dctx, const void* dict, size_t dictSize)
  1977. {
  1978. if (dictSize < 8) return ZSTD_refDictContent(dctx, dict, dictSize);
  1979. { U32 const magic = MEM_readLE32(dict);
  1980. if (magic != ZSTD_MAGIC_DICTIONARY) {
  1981. return ZSTD_refDictContent(dctx, dict, dictSize); /* pure content mode */
  1982. } }
  1983. dctx->dictID = MEM_readLE32((const char*)dict + ZSTD_frameIdSize);
  1984. /* load entropy tables */
  1985. { size_t const eSize = ZSTD_loadEntropy(&dctx->entropy, dict, dictSize);
  1986. if (ZSTD_isError(eSize)) return ERROR(dictionary_corrupted);
  1987. dict = (const char*)dict + eSize;
  1988. dictSize -= eSize;
  1989. }
  1990. dctx->litEntropy = dctx->fseEntropy = 1;
  1991. /* reference dictionary content */
  1992. return ZSTD_refDictContent(dctx, dict, dictSize);
  1993. }
  1994. /* Note : this function cannot fail */
  1995. size_t ZSTD_decompressBegin(ZSTD_DCtx* dctx)
  1996. {
  1997. assert(dctx != NULL);
  1998. dctx->expected = ZSTD_startingInputLength(dctx->format); /* dctx->format must be properly set */
  1999. dctx->stage = ZSTDds_getFrameHeaderSize;
  2000. dctx->decodedSize = 0;
  2001. dctx->previousDstEnd = NULL;
  2002. dctx->base = NULL;
  2003. dctx->vBase = NULL;
  2004. dctx->dictEnd = NULL;
  2005. dctx->entropy.hufTable[0] = (HUF_DTable)((HufLog)*0x1000001); /* cover both little and big endian */
  2006. dctx->litEntropy = dctx->fseEntropy = 0;
  2007. dctx->dictID = 0;
  2008. ZSTD_STATIC_ASSERT(sizeof(dctx->entropy.rep) == sizeof(repStartValue));
  2009. memcpy(dctx->entropy.rep, repStartValue, sizeof(repStartValue)); /* initial repcodes */
  2010. dctx->LLTptr = dctx->entropy.LLTable;
  2011. dctx->MLTptr = dctx->entropy.MLTable;
  2012. dctx->OFTptr = dctx->entropy.OFTable;
  2013. dctx->HUFptr = dctx->entropy.hufTable;
  2014. return 0;
  2015. }
  2016. size_t ZSTD_decompressBegin_usingDict(ZSTD_DCtx* dctx, const void* dict, size_t dictSize)
  2017. {
  2018. CHECK_F( ZSTD_decompressBegin(dctx) );
  2019. if (dict && dictSize)
  2020. CHECK_E(ZSTD_decompress_insertDictionary(dctx, dict, dictSize), dictionary_corrupted);
  2021. return 0;
  2022. }
  2023. /* ====== ZSTD_DDict ====== */
  2024. struct ZSTD_DDict_s {
  2025. void* dictBuffer;
  2026. const void* dictContent;
  2027. size_t dictSize;
  2028. ZSTD_entropyDTables_t entropy;
  2029. U32 dictID;
  2030. U32 entropyPresent;
  2031. ZSTD_customMem cMem;
  2032. }; /* typedef'd to ZSTD_DDict within "zstd.h" */
  2033. static const void* ZSTD_DDictDictContent(const ZSTD_DDict* ddict)
  2034. {
  2035. return ddict->dictContent;
  2036. }
  2037. static size_t ZSTD_DDictDictSize(const ZSTD_DDict* ddict)
  2038. {
  2039. return ddict->dictSize;
  2040. }
  2041. size_t ZSTD_decompressBegin_usingDDict(ZSTD_DCtx* dstDCtx, const ZSTD_DDict* ddict)
  2042. {
  2043. CHECK_F( ZSTD_decompressBegin(dstDCtx) );
  2044. if (ddict) { /* support begin on NULL */
  2045. dstDCtx->dictID = ddict->dictID;
  2046. dstDCtx->base = ddict->dictContent;
  2047. dstDCtx->vBase = ddict->dictContent;
  2048. dstDCtx->dictEnd = (const BYTE*)ddict->dictContent + ddict->dictSize;
  2049. dstDCtx->previousDstEnd = dstDCtx->dictEnd;
  2050. if (ddict->entropyPresent) {
  2051. dstDCtx->litEntropy = 1;
  2052. dstDCtx->fseEntropy = 1;
  2053. dstDCtx->LLTptr = ddict->entropy.LLTable;
  2054. dstDCtx->MLTptr = ddict->entropy.MLTable;
  2055. dstDCtx->OFTptr = ddict->entropy.OFTable;
  2056. dstDCtx->HUFptr = ddict->entropy.hufTable;
  2057. dstDCtx->entropy.rep[0] = ddict->entropy.rep[0];
  2058. dstDCtx->entropy.rep[1] = ddict->entropy.rep[1];
  2059. dstDCtx->entropy.rep[2] = ddict->entropy.rep[2];
  2060. } else {
  2061. dstDCtx->litEntropy = 0;
  2062. dstDCtx->fseEntropy = 0;
  2063. }
  2064. }
  2065. return 0;
  2066. }
  2067. static size_t ZSTD_loadEntropy_inDDict(ZSTD_DDict* ddict, ZSTD_dictContentType_e dictContentType)
  2068. {
  2069. ddict->dictID = 0;
  2070. ddict->entropyPresent = 0;
  2071. if (dictContentType == ZSTD_dct_rawContent) return 0;
  2072. if (ddict->dictSize < 8) {
  2073. if (dictContentType == ZSTD_dct_fullDict)
  2074. return ERROR(dictionary_corrupted); /* only accept specified dictionaries */
  2075. return 0; /* pure content mode */
  2076. }
  2077. { U32 const magic = MEM_readLE32(ddict->dictContent);
  2078. if (magic != ZSTD_MAGIC_DICTIONARY) {
  2079. if (dictContentType == ZSTD_dct_fullDict)
  2080. return ERROR(dictionary_corrupted); /* only accept specified dictionaries */
  2081. return 0; /* pure content mode */
  2082. }
  2083. }
  2084. ddict->dictID = MEM_readLE32((const char*)ddict->dictContent + ZSTD_frameIdSize);
  2085. /* load entropy tables */
  2086. CHECK_E( ZSTD_loadEntropy(&ddict->entropy, ddict->dictContent, ddict->dictSize), dictionary_corrupted );
  2087. ddict->entropyPresent = 1;
  2088. return 0;
  2089. }
  2090. static size_t ZSTD_initDDict_internal(ZSTD_DDict* ddict,
  2091. const void* dict, size_t dictSize,
  2092. ZSTD_dictLoadMethod_e dictLoadMethod,
  2093. ZSTD_dictContentType_e dictContentType)
  2094. {
  2095. if ((dictLoadMethod == ZSTD_dlm_byRef) || (!dict) || (!dictSize)) {
  2096. ddict->dictBuffer = NULL;
  2097. ddict->dictContent = dict;
  2098. } else {
  2099. void* const internalBuffer = ZSTD_malloc(dictSize, ddict->cMem);
  2100. ddict->dictBuffer = internalBuffer;
  2101. ddict->dictContent = internalBuffer;
  2102. if (!internalBuffer) return ERROR(memory_allocation);
  2103. memcpy(internalBuffer, dict, dictSize);
  2104. }
  2105. ddict->dictSize = dictSize;
  2106. ddict->entropy.hufTable[0] = (HUF_DTable)((HufLog)*0x1000001); /* cover both little and big endian */
  2107. /* parse dictionary content */
  2108. CHECK_F( ZSTD_loadEntropy_inDDict(ddict, dictContentType) );
  2109. return 0;
  2110. }
  2111. ZSTD_DDict* ZSTD_createDDict_advanced(const void* dict, size_t dictSize,
  2112. ZSTD_dictLoadMethod_e dictLoadMethod,
  2113. ZSTD_dictContentType_e dictContentType,
  2114. ZSTD_customMem customMem)
  2115. {
  2116. if (!customMem.customAlloc ^ !customMem.customFree) return NULL;
  2117. { ZSTD_DDict* const ddict = (ZSTD_DDict*) ZSTD_malloc(sizeof(ZSTD_DDict), customMem);
  2118. if (!ddict) return NULL;
  2119. ddict->cMem = customMem;
  2120. if (ZSTD_isError( ZSTD_initDDict_internal(ddict, dict, dictSize, dictLoadMethod, dictContentType) )) {
  2121. ZSTD_freeDDict(ddict);
  2122. return NULL;
  2123. }
  2124. return ddict;
  2125. }
  2126. }
  2127. /*! ZSTD_createDDict() :
  2128. * Create a digested dictionary, to start decompression without startup delay.
  2129. * `dict` content is copied inside DDict.
  2130. * Consequently, `dict` can be released after `ZSTD_DDict` creation */
  2131. ZSTD_DDict* ZSTD_createDDict(const void* dict, size_t dictSize)
  2132. {
  2133. ZSTD_customMem const allocator = { NULL, NULL, NULL };
  2134. return ZSTD_createDDict_advanced(dict, dictSize, ZSTD_dlm_byCopy, ZSTD_dct_auto, allocator);
  2135. }
  2136. /*! ZSTD_createDDict_byReference() :
  2137. * Create a digested dictionary, to start decompression without startup delay.
  2138. * Dictionary content is simply referenced, it will be accessed during decompression.
  2139. * Warning : dictBuffer must outlive DDict (DDict must be freed before dictBuffer) */
  2140. ZSTD_DDict* ZSTD_createDDict_byReference(const void* dictBuffer, size_t dictSize)
  2141. {
  2142. ZSTD_customMem const allocator = { NULL, NULL, NULL };
  2143. return ZSTD_createDDict_advanced(dictBuffer, dictSize, ZSTD_dlm_byRef, ZSTD_dct_auto, allocator);
  2144. }
  2145. const ZSTD_DDict* ZSTD_initStaticDDict(
  2146. void* workspace, size_t workspaceSize,
  2147. const void* dict, size_t dictSize,
  2148. ZSTD_dictLoadMethod_e dictLoadMethod,
  2149. ZSTD_dictContentType_e dictContentType)
  2150. {
  2151. size_t const neededSpace =
  2152. sizeof(ZSTD_DDict) + (dictLoadMethod == ZSTD_dlm_byRef ? 0 : dictSize);
  2153. ZSTD_DDict* const ddict = (ZSTD_DDict*)workspace;
  2154. assert(workspace != NULL);
  2155. assert(dict != NULL);
  2156. if ((size_t)workspace & 7) return NULL; /* 8-aligned */
  2157. if (workspaceSize < neededSpace) return NULL;
  2158. if (dictLoadMethod == ZSTD_dlm_byCopy) {
  2159. memcpy(ddict+1, dict, dictSize); /* local copy */
  2160. dict = ddict+1;
  2161. }
  2162. if (ZSTD_isError( ZSTD_initDDict_internal(ddict, dict, dictSize, ZSTD_dlm_byRef, dictContentType) ))
  2163. return NULL;
  2164. return ddict;
  2165. }
  2166. size_t ZSTD_freeDDict(ZSTD_DDict* ddict)
  2167. {
  2168. if (ddict==NULL) return 0; /* support free on NULL */
  2169. { ZSTD_customMem const cMem = ddict->cMem;
  2170. ZSTD_free(ddict->dictBuffer, cMem);
  2171. ZSTD_free(ddict, cMem);
  2172. return 0;
  2173. }
  2174. }
  2175. /*! ZSTD_estimateDDictSize() :
  2176. * Estimate amount of memory that will be needed to create a dictionary for decompression.
  2177. * Note : dictionary created by reference using ZSTD_dlm_byRef are smaller */
  2178. size_t ZSTD_estimateDDictSize(size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod)
  2179. {
  2180. return sizeof(ZSTD_DDict) + (dictLoadMethod == ZSTD_dlm_byRef ? 0 : dictSize);
  2181. }
  2182. size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict)
  2183. {
  2184. if (ddict==NULL) return 0; /* support sizeof on NULL */
  2185. return sizeof(*ddict) + (ddict->dictBuffer ? ddict->dictSize : 0) ;
  2186. }
  2187. /*! ZSTD_getDictID_fromDict() :
  2188. * Provides the dictID stored within dictionary.
  2189. * if @return == 0, the dictionary is not conformant with Zstandard specification.
  2190. * It can still be loaded, but as a content-only dictionary. */
  2191. unsigned ZSTD_getDictID_fromDict(const void* dict, size_t dictSize)
  2192. {
  2193. if (dictSize < 8) return 0;
  2194. if (MEM_readLE32(dict) != ZSTD_MAGIC_DICTIONARY) return 0;
  2195. return MEM_readLE32((const char*)dict + ZSTD_frameIdSize);
  2196. }
  2197. /*! ZSTD_getDictID_fromDDict() :
  2198. * Provides the dictID of the dictionary loaded into `ddict`.
  2199. * If @return == 0, the dictionary is not conformant to Zstandard specification, or empty.
  2200. * Non-conformant dictionaries can still be loaded, but as content-only dictionaries. */
  2201. unsigned ZSTD_getDictID_fromDDict(const ZSTD_DDict* ddict)
  2202. {
  2203. if (ddict==NULL) return 0;
  2204. return ZSTD_getDictID_fromDict(ddict->dictContent, ddict->dictSize);
  2205. }
  2206. /*! ZSTD_getDictID_fromFrame() :
  2207. * Provides the dictID required to decompresse frame stored within `src`.
  2208. * If @return == 0, the dictID could not be decoded.
  2209. * This could for one of the following reasons :
  2210. * - The frame does not require a dictionary (most common case).
  2211. * - The frame was built with dictID intentionally removed.
  2212. * Needed dictionary is a hidden information.
  2213. * Note : this use case also happens when using a non-conformant dictionary.
  2214. * - `srcSize` is too small, and as a result, frame header could not be decoded.
  2215. * Note : possible if `srcSize < ZSTD_FRAMEHEADERSIZE_MAX`.
  2216. * - This is not a Zstandard frame.
  2217. * When identifying the exact failure cause, it's possible to use
  2218. * ZSTD_getFrameHeader(), which will provide a more precise error code. */
  2219. unsigned ZSTD_getDictID_fromFrame(const void* src, size_t srcSize)
  2220. {
  2221. ZSTD_frameHeader zfp = { 0, 0, 0, ZSTD_frame, 0, 0, 0 };
  2222. size_t const hError = ZSTD_getFrameHeader(&zfp, src, srcSize);
  2223. if (ZSTD_isError(hError)) return 0;
  2224. return zfp.dictID;
  2225. }
  2226. /*! ZSTD_decompress_usingDDict() :
  2227. * Decompression using a pre-digested Dictionary
  2228. * Use dictionary without significant overhead. */
  2229. size_t ZSTD_decompress_usingDDict(ZSTD_DCtx* dctx,
  2230. void* dst, size_t dstCapacity,
  2231. const void* src, size_t srcSize,
  2232. const ZSTD_DDict* ddict)
  2233. {
  2234. /* pass content and size in case legacy frames are encountered */
  2235. return ZSTD_decompressMultiFrame(dctx, dst, dstCapacity, src, srcSize,
  2236. NULL, 0,
  2237. ddict);
  2238. }
  2239. /*=====================================
  2240. * Streaming decompression
  2241. *====================================*/
  2242. ZSTD_DStream* ZSTD_createDStream(void)
  2243. {
  2244. DEBUGLOG(3, "ZSTD_createDStream");
  2245. return ZSTD_createDStream_advanced(ZSTD_defaultCMem);
  2246. }
  2247. ZSTD_DStream* ZSTD_initStaticDStream(void *workspace, size_t workspaceSize)
  2248. {
  2249. return ZSTD_initStaticDCtx(workspace, workspaceSize);
  2250. }
  2251. ZSTD_DStream* ZSTD_createDStream_advanced(ZSTD_customMem customMem)
  2252. {
  2253. return ZSTD_createDCtx_advanced(customMem);
  2254. }
  2255. size_t ZSTD_freeDStream(ZSTD_DStream* zds)
  2256. {
  2257. return ZSTD_freeDCtx(zds);
  2258. }
  2259. /* *** Initialization *** */
  2260. size_t ZSTD_DStreamInSize(void) { return ZSTD_BLOCKSIZE_MAX + ZSTD_blockHeaderSize; }
  2261. size_t ZSTD_DStreamOutSize(void) { return ZSTD_BLOCKSIZE_MAX; }
  2262. size_t ZSTD_DCtx_loadDictionary_advanced(ZSTD_DCtx* dctx, const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_dictContentType_e dictContentType)
  2263. {
  2264. if (dctx->streamStage != zdss_init) return ERROR(stage_wrong);
  2265. ZSTD_freeDDict(dctx->ddictLocal);
  2266. if (dict && dictSize >= 8) {
  2267. dctx->ddictLocal = ZSTD_createDDict_advanced(dict, dictSize, dictLoadMethod, dictContentType, dctx->customMem);
  2268. if (dctx->ddictLocal == NULL) return ERROR(memory_allocation);
  2269. } else {
  2270. dctx->ddictLocal = NULL;
  2271. }
  2272. dctx->ddict = dctx->ddictLocal;
  2273. return 0;
  2274. }
  2275. size_t ZSTD_DCtx_loadDictionary_byReference(ZSTD_DCtx* dctx, const void* dict, size_t dictSize)
  2276. {
  2277. return ZSTD_DCtx_loadDictionary_advanced(dctx, dict, dictSize, ZSTD_dlm_byRef, ZSTD_dct_auto);
  2278. }
  2279. size_t ZSTD_DCtx_loadDictionary(ZSTD_DCtx* dctx, const void* dict, size_t dictSize)
  2280. {
  2281. return ZSTD_DCtx_loadDictionary_advanced(dctx, dict, dictSize, ZSTD_dlm_byCopy, ZSTD_dct_auto);
  2282. }
  2283. size_t ZSTD_DCtx_refPrefix_advanced(ZSTD_DCtx* dctx, const void* prefix, size_t prefixSize, ZSTD_dictContentType_e dictContentType)
  2284. {
  2285. return ZSTD_DCtx_loadDictionary_advanced(dctx, prefix, prefixSize, ZSTD_dlm_byRef, dictContentType);
  2286. }
  2287. size_t ZSTD_DCtx_refPrefix(ZSTD_DCtx* dctx, const void* prefix, size_t prefixSize)
  2288. {
  2289. return ZSTD_DCtx_refPrefix_advanced(dctx, prefix, prefixSize, ZSTD_dct_rawContent);
  2290. }
  2291. /* ZSTD_initDStream_usingDict() :
  2292. * return : expected size, aka ZSTD_frameHeaderSize_prefix.
  2293. * this function cannot fail */
  2294. size_t ZSTD_initDStream_usingDict(ZSTD_DStream* zds, const void* dict, size_t dictSize)
  2295. {
  2296. DEBUGLOG(4, "ZSTD_initDStream_usingDict");
  2297. zds->streamStage = zdss_init;
  2298. CHECK_F( ZSTD_DCtx_loadDictionary(zds, dict, dictSize) );
  2299. return ZSTD_frameHeaderSize_prefix;
  2300. }
  2301. /* note : this variant can't fail */
  2302. size_t ZSTD_initDStream(ZSTD_DStream* zds)
  2303. {
  2304. DEBUGLOG(4, "ZSTD_initDStream");
  2305. return ZSTD_initDStream_usingDict(zds, NULL, 0);
  2306. }
  2307. size_t ZSTD_DCtx_refDDict(ZSTD_DCtx* dctx, const ZSTD_DDict* ddict)
  2308. {
  2309. if (dctx->streamStage != zdss_init) return ERROR(stage_wrong);
  2310. dctx->ddict = ddict;
  2311. return 0;
  2312. }
  2313. /* ZSTD_initDStream_usingDDict() :
  2314. * ddict will just be referenced, and must outlive decompression session
  2315. * this function cannot fail */
  2316. size_t ZSTD_initDStream_usingDDict(ZSTD_DStream* dctx, const ZSTD_DDict* ddict)
  2317. {
  2318. size_t const initResult = ZSTD_initDStream(dctx);
  2319. dctx->ddict = ddict;
  2320. return initResult;
  2321. }
  2322. /* ZSTD_resetDStream() :
  2323. * return : expected size, aka ZSTD_frameHeaderSize_prefix.
  2324. * this function cannot fail */
  2325. size_t ZSTD_resetDStream(ZSTD_DStream* dctx)
  2326. {
  2327. DEBUGLOG(4, "ZSTD_resetDStream");
  2328. dctx->streamStage = zdss_loadHeader;
  2329. dctx->lhSize = dctx->inPos = dctx->outStart = dctx->outEnd = 0;
  2330. dctx->legacyVersion = 0;
  2331. dctx->hostageByte = 0;
  2332. return ZSTD_frameHeaderSize_prefix;
  2333. }
  2334. size_t ZSTD_setDStreamParameter(ZSTD_DStream* dctx,
  2335. ZSTD_DStreamParameter_e paramType, unsigned paramValue)
  2336. {
  2337. if (dctx->streamStage != zdss_init) return ERROR(stage_wrong);
  2338. switch(paramType)
  2339. {
  2340. default : return ERROR(parameter_unsupported);
  2341. case DStream_p_maxWindowSize :
  2342. DEBUGLOG(4, "setting maxWindowSize = %u KB", paramValue >> 10);
  2343. dctx->maxWindowSize = paramValue ? paramValue : (U32)(-1);
  2344. break;
  2345. }
  2346. return 0;
  2347. }
  2348. size_t ZSTD_DCtx_setMaxWindowSize(ZSTD_DCtx* dctx, size_t maxWindowSize)
  2349. {
  2350. if (dctx->streamStage != zdss_init) return ERROR(stage_wrong);
  2351. dctx->maxWindowSize = maxWindowSize;
  2352. return 0;
  2353. }
  2354. size_t ZSTD_DCtx_setFormat(ZSTD_DCtx* dctx, ZSTD_format_e format)
  2355. {
  2356. DEBUGLOG(4, "ZSTD_DCtx_setFormat : %u", (unsigned)format);
  2357. if (dctx->streamStage != zdss_init) return ERROR(stage_wrong);
  2358. dctx->format = format;
  2359. return 0;
  2360. }
  2361. size_t ZSTD_sizeof_DStream(const ZSTD_DStream* dctx)
  2362. {
  2363. return ZSTD_sizeof_DCtx(dctx);
  2364. }
  2365. size_t ZSTD_decodingBufferSize_min(unsigned long long windowSize, unsigned long long frameContentSize)
  2366. {
  2367. size_t const blockSize = (size_t) MIN(windowSize, ZSTD_BLOCKSIZE_MAX);
  2368. unsigned long long const neededRBSize = windowSize + blockSize + (WILDCOPY_OVERLENGTH * 2);
  2369. unsigned long long const neededSize = MIN(frameContentSize, neededRBSize);
  2370. size_t const minRBSize = (size_t) neededSize;
  2371. if ((unsigned long long)minRBSize != neededSize) return ERROR(frameParameter_windowTooLarge);
  2372. return minRBSize;
  2373. }
  2374. size_t ZSTD_estimateDStreamSize(size_t windowSize)
  2375. {
  2376. size_t const blockSize = MIN(windowSize, ZSTD_BLOCKSIZE_MAX);
  2377. size_t const inBuffSize = blockSize; /* no block can be larger */
  2378. size_t const outBuffSize = ZSTD_decodingBufferSize_min(windowSize, ZSTD_CONTENTSIZE_UNKNOWN);
  2379. return ZSTD_estimateDCtxSize() + inBuffSize + outBuffSize;
  2380. }
  2381. size_t ZSTD_estimateDStreamSize_fromFrame(const void* src, size_t srcSize)
  2382. {
  2383. U32 const windowSizeMax = 1U << ZSTD_WINDOWLOG_MAX; /* note : should be user-selectable */
  2384. ZSTD_frameHeader zfh;
  2385. size_t const err = ZSTD_getFrameHeader(&zfh, src, srcSize);
  2386. if (ZSTD_isError(err)) return err;
  2387. if (err>0) return ERROR(srcSize_wrong);
  2388. if (zfh.windowSize > windowSizeMax)
  2389. return ERROR(frameParameter_windowTooLarge);
  2390. return ZSTD_estimateDStreamSize((size_t)zfh.windowSize);
  2391. }
  2392. /* ***** Decompression ***** */
  2393. MEM_STATIC size_t ZSTD_limitCopy(void* dst, size_t dstCapacity, const void* src, size_t srcSize)
  2394. {
  2395. size_t const length = MIN(dstCapacity, srcSize);
  2396. memcpy(dst, src, length);
  2397. return length;
  2398. }
  2399. size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inBuffer* input)
  2400. {
  2401. const char* const istart = (const char*)(input->src) + input->pos;
  2402. const char* const iend = (const char*)(input->src) + input->size;
  2403. const char* ip = istart;
  2404. char* const ostart = (char*)(output->dst) + output->pos;
  2405. char* const oend = (char*)(output->dst) + output->size;
  2406. char* op = ostart;
  2407. U32 someMoreWork = 1;
  2408. DEBUGLOG(5, "ZSTD_decompressStream");
  2409. if (input->pos > input->size) { /* forbidden */
  2410. DEBUGLOG(5, "in: pos: %u vs size: %u",
  2411. (U32)input->pos, (U32)input->size);
  2412. return ERROR(srcSize_wrong);
  2413. }
  2414. if (output->pos > output->size) { /* forbidden */
  2415. DEBUGLOG(5, "out: pos: %u vs size: %u",
  2416. (U32)output->pos, (U32)output->size);
  2417. return ERROR(dstSize_tooSmall);
  2418. }
  2419. DEBUGLOG(5, "input size : %u", (U32)(input->size - input->pos));
  2420. while (someMoreWork) {
  2421. switch(zds->streamStage)
  2422. {
  2423. case zdss_init :
  2424. DEBUGLOG(5, "stage zdss_init => transparent reset ");
  2425. ZSTD_resetDStream(zds); /* transparent reset on starting decoding a new frame */
  2426. /* fall-through */
  2427. case zdss_loadHeader :
  2428. DEBUGLOG(5, "stage zdss_loadHeader (srcSize : %u)", (U32)(iend - ip));
  2429. #if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT>=1)
  2430. if (zds->legacyVersion) {
  2431. /* legacy support is incompatible with static dctx */
  2432. if (zds->staticSize) return ERROR(memory_allocation);
  2433. { size_t const hint = ZSTD_decompressLegacyStream(zds->legacyContext, zds->legacyVersion, output, input);
  2434. if (hint==0) zds->streamStage = zdss_init;
  2435. return hint;
  2436. } }
  2437. #endif
  2438. { size_t const hSize = ZSTD_getFrameHeader_internal(&zds->fParams, zds->headerBuffer, zds->lhSize, zds->format);
  2439. DEBUGLOG(5, "header size : %u", (U32)hSize);
  2440. if (ZSTD_isError(hSize)) {
  2441. #if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT>=1)
  2442. U32 const legacyVersion = ZSTD_isLegacy(istart, iend-istart);
  2443. if (legacyVersion) {
  2444. const void* const dict = zds->ddict ? zds->ddict->dictContent : NULL;
  2445. size_t const dictSize = zds->ddict ? zds->ddict->dictSize : 0;
  2446. DEBUGLOG(5, "ZSTD_decompressStream: detected legacy version v0.%u", legacyVersion);
  2447. /* legacy support is incompatible with static dctx */
  2448. if (zds->staticSize) return ERROR(memory_allocation);
  2449. CHECK_F(ZSTD_initLegacyStream(&zds->legacyContext,
  2450. zds->previousLegacyVersion, legacyVersion,
  2451. dict, dictSize));
  2452. zds->legacyVersion = zds->previousLegacyVersion = legacyVersion;
  2453. { size_t const hint = ZSTD_decompressLegacyStream(zds->legacyContext, legacyVersion, output, input);
  2454. if (hint==0) zds->streamStage = zdss_init; /* or stay in stage zdss_loadHeader */
  2455. return hint;
  2456. } }
  2457. #endif
  2458. return hSize; /* error */
  2459. }
  2460. if (hSize != 0) { /* need more input */
  2461. size_t const toLoad = hSize - zds->lhSize; /* if hSize!=0, hSize > zds->lhSize */
  2462. size_t const remainingInput = (size_t)(iend-ip);
  2463. assert(iend >= ip);
  2464. if (toLoad > remainingInput) { /* not enough input to load full header */
  2465. if (remainingInput > 0) {
  2466. memcpy(zds->headerBuffer + zds->lhSize, ip, remainingInput);
  2467. zds->lhSize += remainingInput;
  2468. }
  2469. input->pos = input->size;
  2470. return (MAX(ZSTD_frameHeaderSize_min, hSize) - zds->lhSize) + ZSTD_blockHeaderSize; /* remaining header bytes + next block header */
  2471. }
  2472. assert(ip != NULL);
  2473. memcpy(zds->headerBuffer + zds->lhSize, ip, toLoad); zds->lhSize = hSize; ip += toLoad;
  2474. break;
  2475. } }
  2476. /* check for single-pass mode opportunity */
  2477. if (zds->fParams.frameContentSize && zds->fParams.windowSize /* skippable frame if == 0 */
  2478. && (U64)(size_t)(oend-op) >= zds->fParams.frameContentSize) {
  2479. size_t const cSize = ZSTD_findFrameCompressedSize(istart, iend-istart);
  2480. if (cSize <= (size_t)(iend-istart)) {
  2481. /* shortcut : using single-pass mode */
  2482. size_t const decompressedSize = ZSTD_decompress_usingDDict(zds, op, oend-op, istart, cSize, zds->ddict);
  2483. if (ZSTD_isError(decompressedSize)) return decompressedSize;
  2484. DEBUGLOG(4, "shortcut to single-pass ZSTD_decompress_usingDDict()")
  2485. ip = istart + cSize;
  2486. op += decompressedSize;
  2487. zds->expected = 0;
  2488. zds->streamStage = zdss_init;
  2489. someMoreWork = 0;
  2490. break;
  2491. } }
  2492. /* Consume header (see ZSTDds_decodeFrameHeader) */
  2493. DEBUGLOG(4, "Consume header");
  2494. CHECK_F(ZSTD_decompressBegin_usingDDict(zds, zds->ddict));
  2495. if ((MEM_readLE32(zds->headerBuffer) & 0xFFFFFFF0U) == ZSTD_MAGIC_SKIPPABLE_START) { /* skippable frame */
  2496. zds->expected = MEM_readLE32(zds->headerBuffer + ZSTD_frameIdSize);
  2497. zds->stage = ZSTDds_skipFrame;
  2498. } else {
  2499. CHECK_F(ZSTD_decodeFrameHeader(zds, zds->headerBuffer, zds->lhSize));
  2500. zds->expected = ZSTD_blockHeaderSize;
  2501. zds->stage = ZSTDds_decodeBlockHeader;
  2502. }
  2503. /* control buffer memory usage */
  2504. DEBUGLOG(4, "Control max memory usage (%u KB <= max %u KB)",
  2505. (U32)(zds->fParams.windowSize >>10),
  2506. (U32)(zds->maxWindowSize >> 10) );
  2507. zds->fParams.windowSize = MAX(zds->fParams.windowSize, 1U << ZSTD_WINDOWLOG_ABSOLUTEMIN);
  2508. if (zds->fParams.windowSize > zds->maxWindowSize) return ERROR(frameParameter_windowTooLarge);
  2509. /* Adapt buffer sizes to frame header instructions */
  2510. { size_t const neededInBuffSize = MAX(zds->fParams.blockSizeMax, 4 /* frame checksum */);
  2511. size_t const neededOutBuffSize = ZSTD_decodingBufferSize_min(zds->fParams.windowSize, zds->fParams.frameContentSize);
  2512. if ((zds->inBuffSize < neededInBuffSize) || (zds->outBuffSize < neededOutBuffSize)) {
  2513. size_t const bufferSize = neededInBuffSize + neededOutBuffSize;
  2514. DEBUGLOG(4, "inBuff : from %u to %u",
  2515. (U32)zds->inBuffSize, (U32)neededInBuffSize);
  2516. DEBUGLOG(4, "outBuff : from %u to %u",
  2517. (U32)zds->outBuffSize, (U32)neededOutBuffSize);
  2518. if (zds->staticSize) { /* static DCtx */
  2519. DEBUGLOG(4, "staticSize : %u", (U32)zds->staticSize);
  2520. assert(zds->staticSize >= sizeof(ZSTD_DCtx)); /* controlled at init */
  2521. if (bufferSize > zds->staticSize - sizeof(ZSTD_DCtx))
  2522. return ERROR(memory_allocation);
  2523. } else {
  2524. ZSTD_free(zds->inBuff, zds->customMem);
  2525. zds->inBuffSize = 0;
  2526. zds->outBuffSize = 0;
  2527. zds->inBuff = (char*)ZSTD_malloc(bufferSize, zds->customMem);
  2528. if (zds->inBuff == NULL) return ERROR(memory_allocation);
  2529. }
  2530. zds->inBuffSize = neededInBuffSize;
  2531. zds->outBuff = zds->inBuff + zds->inBuffSize;
  2532. zds->outBuffSize = neededOutBuffSize;
  2533. } }
  2534. zds->streamStage = zdss_read;
  2535. /* fall-through */
  2536. case zdss_read:
  2537. DEBUGLOG(5, "stage zdss_read");
  2538. { size_t const neededInSize = ZSTD_nextSrcSizeToDecompress(zds);
  2539. DEBUGLOG(5, "neededInSize = %u", (U32)neededInSize);
  2540. if (neededInSize==0) { /* end of frame */
  2541. zds->streamStage = zdss_init;
  2542. someMoreWork = 0;
  2543. break;
  2544. }
  2545. if ((size_t)(iend-ip) >= neededInSize) { /* decode directly from src */
  2546. int const isSkipFrame = ZSTD_isSkipFrame(zds);
  2547. size_t const decodedSize = ZSTD_decompressContinue(zds,
  2548. zds->outBuff + zds->outStart, (isSkipFrame ? 0 : zds->outBuffSize - zds->outStart),
  2549. ip, neededInSize);
  2550. if (ZSTD_isError(decodedSize)) return decodedSize;
  2551. ip += neededInSize;
  2552. if (!decodedSize && !isSkipFrame) break; /* this was just a header */
  2553. zds->outEnd = zds->outStart + decodedSize;
  2554. zds->streamStage = zdss_flush;
  2555. break;
  2556. } }
  2557. if (ip==iend) { someMoreWork = 0; break; } /* no more input */
  2558. zds->streamStage = zdss_load;
  2559. /* fall-through */
  2560. case zdss_load:
  2561. { size_t const neededInSize = ZSTD_nextSrcSizeToDecompress(zds);
  2562. size_t const toLoad = neededInSize - zds->inPos;
  2563. int const isSkipFrame = ZSTD_isSkipFrame(zds);
  2564. size_t loadedSize;
  2565. if (isSkipFrame) {
  2566. loadedSize = MIN(toLoad, (size_t)(iend-ip));
  2567. } else {
  2568. if (toLoad > zds->inBuffSize - zds->inPos) return ERROR(corruption_detected); /* should never happen */
  2569. loadedSize = ZSTD_limitCopy(zds->inBuff + zds->inPos, toLoad, ip, iend-ip);
  2570. }
  2571. ip += loadedSize;
  2572. zds->inPos += loadedSize;
  2573. if (loadedSize < toLoad) { someMoreWork = 0; break; } /* not enough input, wait for more */
  2574. /* decode loaded input */
  2575. { size_t const decodedSize = ZSTD_decompressContinue(zds,
  2576. zds->outBuff + zds->outStart, zds->outBuffSize - zds->outStart,
  2577. zds->inBuff, neededInSize);
  2578. if (ZSTD_isError(decodedSize)) return decodedSize;
  2579. zds->inPos = 0; /* input is consumed */
  2580. if (!decodedSize && !isSkipFrame) { zds->streamStage = zdss_read; break; } /* this was just a header */
  2581. zds->outEnd = zds->outStart + decodedSize;
  2582. } }
  2583. zds->streamStage = zdss_flush;
  2584. /* fall-through */
  2585. case zdss_flush:
  2586. { size_t const toFlushSize = zds->outEnd - zds->outStart;
  2587. size_t const flushedSize = ZSTD_limitCopy(op, oend-op, zds->outBuff + zds->outStart, toFlushSize);
  2588. op += flushedSize;
  2589. zds->outStart += flushedSize;
  2590. if (flushedSize == toFlushSize) { /* flush completed */
  2591. zds->streamStage = zdss_read;
  2592. if ( (zds->outBuffSize < zds->fParams.frameContentSize)
  2593. && (zds->outStart + zds->fParams.blockSizeMax > zds->outBuffSize) ) {
  2594. DEBUGLOG(5, "restart filling outBuff from beginning (left:%i, needed:%u)",
  2595. (int)(zds->outBuffSize - zds->outStart),
  2596. (U32)zds->fParams.blockSizeMax);
  2597. zds->outStart = zds->outEnd = 0;
  2598. }
  2599. break;
  2600. } }
  2601. /* cannot complete flush */
  2602. someMoreWork = 0;
  2603. break;
  2604. default: return ERROR(GENERIC); /* impossible */
  2605. } }
  2606. /* result */
  2607. input->pos += (size_t)(ip-istart);
  2608. output->pos += (size_t)(op-ostart);
  2609. { size_t nextSrcSizeHint = ZSTD_nextSrcSizeToDecompress(zds);
  2610. if (!nextSrcSizeHint) { /* frame fully decoded */
  2611. if (zds->outEnd == zds->outStart) { /* output fully flushed */
  2612. if (zds->hostageByte) {
  2613. if (input->pos >= input->size) {
  2614. /* can't release hostage (not present) */
  2615. zds->streamStage = zdss_read;
  2616. return 1;
  2617. }
  2618. input->pos++; /* release hostage */
  2619. } /* zds->hostageByte */
  2620. return 0;
  2621. } /* zds->outEnd == zds->outStart */
  2622. if (!zds->hostageByte) { /* output not fully flushed; keep last byte as hostage; will be released when all output is flushed */
  2623. input->pos--; /* note : pos > 0, otherwise, impossible to finish reading last block */
  2624. zds->hostageByte=1;
  2625. }
  2626. return 1;
  2627. } /* nextSrcSizeHint==0 */
  2628. nextSrcSizeHint += ZSTD_blockHeaderSize * (ZSTD_nextInputType(zds) == ZSTDnit_block); /* preload header of next block */
  2629. assert(zds->inPos <= nextSrcSizeHint);
  2630. nextSrcSizeHint -= zds->inPos; /* part already loaded*/
  2631. return nextSrcSizeHint;
  2632. }
  2633. }
  2634. size_t ZSTD_decompress_generic(ZSTD_DCtx* dctx, ZSTD_outBuffer* output, ZSTD_inBuffer* input)
  2635. {
  2636. return ZSTD_decompressStream(dctx, output, input);
  2637. }
  2638. size_t ZSTD_decompress_generic_simpleArgs (
  2639. ZSTD_DCtx* dctx,
  2640. void* dst, size_t dstCapacity, size_t* dstPos,
  2641. const void* src, size_t srcSize, size_t* srcPos)
  2642. {
  2643. ZSTD_outBuffer output = { dst, dstCapacity, *dstPos };
  2644. ZSTD_inBuffer input = { src, srcSize, *srcPos };
  2645. /* ZSTD_compress_generic() will check validity of dstPos and srcPos */
  2646. size_t const cErr = ZSTD_decompress_generic(dctx, &output, &input);
  2647. *dstPos = output.pos;
  2648. *srcPos = input.pos;
  2649. return cErr;
  2650. }
  2651. void ZSTD_DCtx_reset(ZSTD_DCtx* dctx)
  2652. {
  2653. (void)ZSTD_initDStream(dctx);
  2654. dctx->format = ZSTD_f_zstd1;
  2655. dctx->maxWindowSize = ZSTD_MAXWINDOWSIZE_DEFAULT;
  2656. }