Coverage Report

Created: 2026-10-13 06:38

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/barebox/lib/zstd/decompress.c
Line
Count
Source
1
/**
2
 * Copyright (c) 2016-present, Yann Collet, Facebook, Inc.
3
 * All rights reserved.
4
 *
5
 * This source code is licensed under the BSD-style license found in the
6
 * LICENSE file in the root directory of https://github.com/facebook/zstd.
7
 * An additional grant of patent rights can be found in the PATENTS file in the
8
 * same directory.
9
 *
10
 * This program is free software; you can redistribute it and/or modify it under
11
 * the terms of the GNU General Public License version 2 as published by the
12
 * Free Software Foundation. This program is dual-licensed; you may select
13
 * either version 2 of the GNU General Public License ("GPL") or BSD license
14
 * ("BSD").
15
 */
16
17
/* ***************************************************************
18
*  Tuning parameters
19
*****************************************************************/
20
/*!
21
*  MAXWINDOWSIZE_DEFAULT :
22
*  maximum window size accepted by DStream, by default.
23
*  Frames requiring more memory will be rejected.
24
*/
25
#ifndef ZSTD_MAXWINDOWSIZE_DEFAULT
26
9.69k
#define ZSTD_MAXWINDOWSIZE_DEFAULT ((1 << ZSTD_WINDOWLOG_MAX) + 1) /* defined within zstd.h */
27
#endif
28
29
/*-*******************************************************
30
*  Dependencies
31
*********************************************************/
32
#include "fse.h"
33
#include "huf.h"
34
#include "mem.h" /* low level memory routines */
35
#include "zstd_internal.h"
36
#include <linux/kernel.h>
37
#include <module.h>
38
#include <linux/string.h> /* memcpy, memmove, memset */
39
40
4.77M
#define ZSTD_PREFETCH(ptr) __builtin_prefetch(ptr, 0, 0)
41
42
/*-*************************************
43
*  Macros
44
***************************************/
45
6.19M
#define ZSTD_isError ERR_isError /* for inlining */
46
23.7k
#define FSE_isError ERR_isError
47
5.29k
#define HUF_isError ERR_isError
48
49
/*_*******************************************************
50
*  Memory operations
51
**********************************************************/
52
4.86M
static void ZSTD_copy4(void *dst, const void *src) { memcpy(dst, src, 4); }
53
54
/*-*************************************************************
55
*   Context management
56
***************************************************************/
57
typedef enum {
58
  ZSTDds_getFrameHeaderSize,
59
  ZSTDds_decodeFrameHeader,
60
  ZSTDds_decodeBlockHeader,
61
  ZSTDds_decompressBlock,
62
  ZSTDds_decompressLastBlock,
63
  ZSTDds_checkChecksum,
64
  ZSTDds_decodeSkippableHeader,
65
  ZSTDds_skipFrame
66
} ZSTD_dStage;
67
68
typedef struct {
69
  FSE_DTable LLTable[FSE_DTABLE_SIZE_U32(LLFSELog)];
70
  FSE_DTable OFTable[FSE_DTABLE_SIZE_U32(OffFSELog)];
71
  FSE_DTable MLTable[FSE_DTABLE_SIZE_U32(MLFSELog)];
72
  HUF_DTable hufTable[HUF_DTABLE_SIZE(HufLog)]; /* can accommodate HUF_decompress4X */
73
  U64 workspace[HUF_DECOMPRESS_WORKSPACE_SIZE_U32 / 2];
74
  U32 rep[ZSTD_REP_NUM];
75
} ZSTD_entropyTables_t;
76
77
struct ZSTD_DCtx_s {
78
  const FSE_DTable *LLTptr;
79
  const FSE_DTable *MLTptr;
80
  const FSE_DTable *OFTptr;
81
  const HUF_DTable *HUFptr;
82
  ZSTD_entropyTables_t entropy;
83
  const void *previousDstEnd; /* detect continuity */
84
  const void *base;    /* start of curr segment */
85
  const void *vBase;    /* virtual start of previous segment if it was just before curr one */
86
  const void *dictEnd;  /* end of previous segment */
87
  size_t expected;
88
  ZSTD_frameParams fParams;
89
  blockType_e bType; /* used in ZSTD_decompressContinue(), to transfer blockType between header decoding and block decoding stages */
90
  ZSTD_dStage stage;
91
  U32 litEntropy;
92
  U32 fseEntropy;
93
  struct xxh64_state xxhState;
94
  size_t headerSize;
95
  U32 dictID;
96
  const BYTE *litPtr;
97
  ZSTD_customMem customMem;
98
  size_t litSize;
99
  size_t rleSize;
100
  BYTE litBuffer[ZSTD_BLOCKSIZE_ABSOLUTEMAX + WILDCOPY_OVERLENGTH];
101
  BYTE headerBuffer[ZSTD_FRAMEHEADERSIZE_MAX];
102
}; /* typedef'd to ZSTD_DCtx within "zstd.h" */
103
104
9.69k
size_t ZSTD_DCtxWorkspaceBound(void) { return ZSTD_ALIGN(sizeof(ZSTD_stack)) + ZSTD_ALIGN(sizeof(ZSTD_DCtx)); }
105
106
size_t ZSTD_decompressBegin(ZSTD_DCtx *dctx)
107
19.3k
{
108
19.3k
  dctx->expected = ZSTD_frameHeaderSize_prefix;
109
19.3k
  dctx->stage = ZSTDds_getFrameHeaderSize;
110
19.3k
  dctx->previousDstEnd = NULL;
111
19.3k
  dctx->base = NULL;
112
19.3k
  dctx->vBase = NULL;
113
19.3k
  dctx->dictEnd = NULL;
114
19.3k
  dctx->entropy.hufTable[0] = (HUF_DTable)((HufLog)*0x1000001); /* cover both little and big endian */
115
19.3k
  dctx->litEntropy = dctx->fseEntropy = 0;
116
19.3k
  dctx->dictID = 0;
117
19.3k
  ZSTD_STATIC_ASSERT(sizeof(dctx->entropy.rep) == sizeof(repStartValue));
118
19.3k
  memcpy(dctx->entropy.rep, repStartValue, sizeof(repStartValue)); /* initial repcodes */
119
19.3k
  dctx->LLTptr = dctx->entropy.LLTable;
120
19.3k
  dctx->MLTptr = dctx->entropy.MLTable;
121
19.3k
  dctx->OFTptr = dctx->entropy.OFTable;
122
19.3k
  dctx->HUFptr = dctx->entropy.hufTable;
123
19.3k
  return 0;
124
19.3k
}
125
126
static ZSTD_DCtx *ZSTD_createDCtx_advanced(ZSTD_customMem customMem)
127
9.69k
{
128
9.69k
  ZSTD_DCtx *dctx;
129
130
9.69k
  if (!customMem.customAlloc || !customMem.customFree)
131
0
    return NULL;
132
133
9.69k
  dctx = (ZSTD_DCtx *)ZSTD_malloc(sizeof(ZSTD_DCtx), customMem);
134
9.69k
  if (!dctx)
135
0
    return NULL;
136
9.69k
  memcpy(&dctx->customMem, &customMem, sizeof(customMem));
137
9.69k
  ZSTD_decompressBegin(dctx);
138
9.69k
  return dctx;
139
9.69k
}
140
141
ZSTD_DCtx *ZSTD_initDCtx(void *workspace, size_t workspaceSize)
142
0
{
143
0
  ZSTD_customMem const stackMem = ZSTD_initStack(workspace, workspaceSize);
144
0
  return ZSTD_createDCtx_advanced(stackMem);
145
0
}
146
147
size_t ZSTD_freeDCtx(ZSTD_DCtx *dctx)
148
0
{
149
0
  if (dctx == NULL)
150
0
    return 0; /* support free on NULL */
151
0
  ZSTD_free(dctx, dctx->customMem);
152
0
  return 0; /* reserved as a potential error code in the future */
153
0
}
154
155
void ZSTD_copyDCtx(ZSTD_DCtx *dstDCtx, const ZSTD_DCtx *srcDCtx)
156
0
{
157
0
  size_t const workSpaceSize = (ZSTD_BLOCKSIZE_ABSOLUTEMAX + WILDCOPY_OVERLENGTH) + ZSTD_frameHeaderSize_max;
158
0
  memcpy(dstDCtx, srcDCtx, sizeof(ZSTD_DCtx) - workSpaceSize); /* no need to copy workspace */
159
0
}
160
161
static void ZSTD_refDDict(ZSTD_DCtx *dstDCtx, const ZSTD_DDict *ddict);
162
163
/*-*************************************************************
164
*   Decompression section
165
***************************************************************/
166
167
/*! ZSTD_isFrame() :
168
 *  Tells if the content of `buffer` starts with a valid Frame Identifier.
169
 *  Note : Frame Identifier is 4 bytes. If `size < 4`, @return will always be 0.
170
 *  Note 2 : Legacy Frame Identifiers are considered valid only if Legacy Support is enabled.
171
 *  Note 3 : Skippable Frame Identifiers are considered valid. */
172
unsigned ZSTD_isFrame(const void *buffer, size_t size)
173
0
{
174
0
  if (size < 4)
175
0
    return 0;
176
0
  {
177
0
    U32 const magic = ZSTD_readLE32(buffer);
178
0
    if (magic == ZSTD_MAGICNUMBER)
179
0
      return 1;
180
0
    if ((magic & 0xFFFFFFF0U) == ZSTD_MAGIC_SKIPPABLE_START)
181
0
      return 1;
182
0
  }
183
0
  return 0;
184
0
}
185
186
/** ZSTD_frameHeaderSize() :
187
*   srcSize must be >= ZSTD_frameHeaderSize_prefix.
188
*   @return : size of the Frame Header */
189
static size_t ZSTD_frameHeaderSize(const void *src, size_t srcSize)
190
51.9k
{
191
51.9k
  if (srcSize < ZSTD_frameHeaderSize_prefix)
192
0
    return ERROR(srcSize_wrong);
193
51.9k
  {
194
51.9k
    BYTE const fhd = ((const BYTE *)src)[4];
195
51.9k
    U32 const dictID = fhd & 3;
196
51.9k
    U32 const singleSegment = (fhd >> 5) & 1;
197
51.9k
    U32 const fcsId = fhd >> 6;
198
51.9k
    return ZSTD_frameHeaderSize_prefix + !singleSegment + ZSTD_did_fieldSize[dictID] + ZSTD_fcs_fieldSize[fcsId] + (singleSegment && !fcsId);
199
51.9k
  }
200
51.9k
}
201
202
/** ZSTD_getFrameParams() :
203
*   decode Frame Header, or require larger `srcSize`.
204
*   @return : 0, `fparamsPtr` is correctly filled,
205
*            >0, `srcSize` is too small, result is expected `srcSize`,
206
*             or an error code, which can be tested using ZSTD_isError() */
207
size_t ZSTD_getFrameParams(ZSTD_frameParams *fparamsPtr, const void *src, size_t srcSize)
208
50.2k
{
209
50.2k
  const BYTE *ip = (const BYTE *)src;
210
211
50.2k
  if (srcSize < ZSTD_frameHeaderSize_prefix)
212
9.69k
    return ZSTD_frameHeaderSize_prefix;
213
40.5k
  if (ZSTD_readLE32(src) != ZSTD_MAGICNUMBER) {
214
0
    if ((ZSTD_readLE32(src) & 0xFFFFFFF0U) == ZSTD_MAGIC_SKIPPABLE_START) {
215
0
      if (srcSize < ZSTD_skippableHeaderSize)
216
0
        return ZSTD_skippableHeaderSize; /* magic number + skippable frame length */
217
0
      memset(fparamsPtr, 0, sizeof(*fparamsPtr));
218
0
      fparamsPtr->frameContentSize = ZSTD_readLE32((const char *)src + 4);
219
0
      fparamsPtr->windowSize = 0; /* windowSize==0 means a frame is skippable */
220
0
      return 0;
221
0
    }
222
0
    return ERROR(prefix_unknown);
223
0
  }
224
225
  /* ensure there is enough `srcSize` to fully read/decode frame header */
226
40.5k
  {
227
40.5k
    size_t const fhsize = ZSTD_frameHeaderSize(src, srcSize);
228
40.5k
    if (srcSize < fhsize)
229
9.70k
      return fhsize;
230
40.5k
  }
231
232
30.8k
  {
233
30.8k
    BYTE const fhdByte = ip[4];
234
30.8k
    size_t pos = 5;
235
30.8k
    U32 const dictIDSizeCode = fhdByte & 3;
236
30.8k
    U32 const checksumFlag = (fhdByte >> 2) & 1;
237
30.8k
    U32 const singleSegment = (fhdByte >> 5) & 1;
238
30.8k
    U32 const fcsID = fhdByte >> 6;
239
30.8k
    U32 const windowSizeMax = 1U << ZSTD_WINDOWLOG_MAX;
240
30.8k
    U32 windowSize = 0;
241
30.8k
    U32 dictID = 0;
242
30.8k
    U64 frameContentSize = 0;
243
30.8k
    if ((fhdByte & 0x08) != 0)
244
15
      return ERROR(frameParameter_unsupported); /* reserved bits, which must be zero */
245
30.8k
    if (!singleSegment) {
246
27.0k
      BYTE const wlByte = ip[pos++];
247
27.0k
      U32 const windowLog = (wlByte >> 3) + ZSTD_WINDOWLOG_ABSOLUTEMIN;
248
27.0k
      if (windowLog > ZSTD_WINDOWLOG_MAX)
249
11
        return ERROR(frameParameter_windowTooLarge); /* avoids issue with 1 << windowLog */
250
27.0k
      windowSize = (1U << windowLog);
251
27.0k
      windowSize += (windowSize >> 3) * (wlByte & 7);
252
27.0k
    }
253
254
30.8k
    switch (dictIDSizeCode) {
255
0
    default: /* impossible */
256
19.1k
    case 0: break;
257
3.81k
    case 1:
258
3.81k
      dictID = ip[pos];
259
3.81k
      pos++;
260
3.81k
      break;
261
731
    case 2:
262
731
      dictID = ZSTD_readLE16(ip + pos);
263
731
      pos += 2;
264
731
      break;
265
7.13k
    case 3:
266
7.13k
      dictID = ZSTD_readLE32(ip + pos);
267
7.13k
      pos += 4;
268
7.13k
      break;
269
30.8k
    }
270
30.8k
    switch (fcsID) {
271
0
    default: /* impossible */
272
23.9k
    case 0:
273
23.9k
      if (singleSegment)
274
1.50k
        frameContentSize = ip[pos];
275
23.9k
      break;
276
4.17k
    case 1: frameContentSize = ZSTD_readLE16(ip + pos) + 256; break;
277
1.58k
    case 2: frameContentSize = ZSTD_readLE32(ip + pos); break;
278
1.14k
    case 3: frameContentSize = ZSTD_readLE64(ip + pos); break;
279
30.8k
    }
280
30.8k
    if (!windowSize)
281
3.75k
      windowSize = (U32)frameContentSize;
282
30.8k
    if (windowSize > windowSizeMax)
283
46
      return ERROR(frameParameter_windowTooLarge);
284
30.7k
    fparamsPtr->frameContentSize = frameContentSize;
285
30.7k
    fparamsPtr->windowSize = windowSize;
286
30.7k
    fparamsPtr->dictID = dictID;
287
30.7k
    fparamsPtr->checksumFlag = checksumFlag;
288
30.7k
  }
289
0
  return 0;
290
30.8k
}
291
292
/** ZSTD_getFrameContentSize() :
293
*   compatible with legacy mode
294
*   @return : decompressed size of the single frame pointed to be `src` if known, otherwise
295
*             - ZSTD_CONTENTSIZE_UNKNOWN if the size cannot be determined
296
*             - ZSTD_CONTENTSIZE_ERROR if an error occurred (e.g. invalid magic number, srcSize too small) */
297
unsigned long long ZSTD_getFrameContentSize(const void *src, size_t srcSize)
298
0
{
299
0
  {
300
0
    ZSTD_frameParams fParams;
301
0
    if (ZSTD_getFrameParams(&fParams, src, srcSize) != 0)
302
0
      return ZSTD_CONTENTSIZE_ERROR;
303
0
    if (fParams.windowSize == 0) {
304
      /* Either skippable or empty frame, size == 0 either way */
305
0
      return 0;
306
0
    } else if (fParams.frameContentSize != 0) {
307
0
      return fParams.frameContentSize;
308
0
    } else {
309
0
      return ZSTD_CONTENTSIZE_UNKNOWN;
310
0
    }
311
0
  }
312
0
}
313
314
/** ZSTD_findDecompressedSize() :
315
 *  compatible with legacy mode
316
 *  `srcSize` must be the exact length of some number of ZSTD compressed and/or
317
 *      skippable frames
318
 *  @return : decompressed size of the frames contained */
319
unsigned long long ZSTD_findDecompressedSize(const void *src, size_t srcSize)
320
0
{
321
0
  {
322
0
    unsigned long long totalDstSize = 0;
323
0
    while (srcSize >= ZSTD_frameHeaderSize_prefix) {
324
0
      const U32 magicNumber = ZSTD_readLE32(src);
325
326
0
      if ((magicNumber & 0xFFFFFFF0U) == ZSTD_MAGIC_SKIPPABLE_START) {
327
0
        size_t skippableSize;
328
0
        if (srcSize < ZSTD_skippableHeaderSize)
329
0
          return ERROR(srcSize_wrong);
330
0
        skippableSize = ZSTD_readLE32((const BYTE *)src + 4) + ZSTD_skippableHeaderSize;
331
0
        if (srcSize < skippableSize) {
332
0
          return ZSTD_CONTENTSIZE_ERROR;
333
0
        }
334
335
0
        src = (const BYTE *)src + skippableSize;
336
0
        srcSize -= skippableSize;
337
0
        continue;
338
0
      }
339
340
0
      {
341
0
        unsigned long long const ret = ZSTD_getFrameContentSize(src, srcSize);
342
0
        if (ret >= ZSTD_CONTENTSIZE_ERROR)
343
0
          return ret;
344
345
        /* check for overflow */
346
0
        if (totalDstSize + ret < totalDstSize)
347
0
          return ZSTD_CONTENTSIZE_ERROR;
348
0
        totalDstSize += ret;
349
0
      }
350
0
      {
351
0
        size_t const frameSrcSize = ZSTD_findFrameCompressedSize(src, srcSize);
352
0
        if (ZSTD_isError(frameSrcSize)) {
353
0
          return ZSTD_CONTENTSIZE_ERROR;
354
0
        }
355
356
0
        src = (const BYTE *)src + frameSrcSize;
357
0
        srcSize -= frameSrcSize;
358
0
      }
359
0
    }
360
361
0
    if (srcSize) {
362
0
      return ZSTD_CONTENTSIZE_ERROR;
363
0
    }
364
365
0
    return totalDstSize;
366
0
  }
367
0
}
368
369
/** ZSTD_decodeFrameHeader() :
370
*   `headerSize` must be the size provided by ZSTD_frameHeaderSize().
371
*   @return : 0 if success, or an error code, which can be tested using ZSTD_isError() */
372
static size_t ZSTD_decodeFrameHeader(ZSTD_DCtx *dctx, const void *src, size_t headerSize)
373
9.69k
{
374
9.69k
  size_t const result = ZSTD_getFrameParams(&(dctx->fParams), src, headerSize);
375
9.69k
  if (ZSTD_isError(result))
376
0
    return result; /* invalid header */
377
9.69k
  if (result > 0)
378
0
    return ERROR(srcSize_wrong); /* headerSize too small */
379
9.69k
  if (dctx->fParams.dictID && (dctx->dictID != dctx->fParams.dictID))
380
419
    return ERROR(dictionary_wrong);
381
9.27k
  if (dctx->fParams.checksumFlag)
382
2.29k
    xxh64_reset(&dctx->xxhState, 0);
383
9.27k
  return 0;
384
9.69k
}
385
386
typedef struct {
387
  blockType_e blockType;
388
  U32 lastBlock;
389
  U32 origSize;
390
} blockProperties_t;
391
392
/*! ZSTD_getcBlockSize() :
393
*   Provides the size of compressed block from block header `src` */
394
static size_t ZSTD_getcBlockSize(const void *src, size_t srcSize, blockProperties_t *bpPtr)
395
685k
{
396
685k
  if (srcSize < ZSTD_blockHeaderSize)
397
91
    return ERROR(srcSize_wrong);
398
685k
  {
399
685k
    U32 const cBlockHeader = ZSTD_readLE24(src);
400
685k
    U32 const cSize = cBlockHeader >> 3;
401
685k
    bpPtr->lastBlock = cBlockHeader & 1;
402
685k
    bpPtr->blockType = (blockType_e)((cBlockHeader >> 1) & 3);
403
685k
    bpPtr->origSize = cSize; /* only useful for RLE */
404
685k
    if (bpPtr->blockType == bt_rle)
405
29.5k
      return 1;
406
655k
    if (bpPtr->blockType == bt_reserved)
407
212
      return ERROR(corruption_detected);
408
655k
    return cSize;
409
655k
  }
410
655k
}
411
412
static size_t ZSTD_copyRawBlock(void *dst, size_t dstCapacity, const void *src, size_t srcSize)
413
178k
{
414
178k
  if (srcSize > dstCapacity)
415
57
    return ERROR(dstSize_tooSmall);
416
178k
  memcpy(dst, src, srcSize);
417
178k
  return srcSize;
418
178k
}
419
420
static size_t ZSTD_setRleBlock(void *dst, size_t dstCapacity, const void *src, size_t srcSize, size_t regenSize)
421
26.4k
{
422
26.4k
  if (srcSize != 1)
423
0
    return ERROR(srcSize_wrong);
424
26.4k
  if (regenSize > dstCapacity)
425
86
    return ERROR(dstSize_tooSmall);
426
26.3k
  memset(dst, *(const BYTE *)src, regenSize);
427
26.3k
  return regenSize;
428
26.4k
}
429
430
/*! ZSTD_decodeLiteralsBlock() :
431
  @return : nb of bytes read from src (< srcSize ) */
432
static size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx *dctx, const void *src, size_t srcSize) /* note : srcSize < BLOCKSIZE */
433
30.9k
{
434
30.9k
  if (srcSize < MIN_CBLOCK_SIZE)
435
21
    return ERROR(corruption_detected);
436
437
30.9k
  {
438
30.9k
    const BYTE *const istart = (const BYTE *)src;
439
30.9k
    symbolEncodingType_e const litEncType = (symbolEncodingType_e)(istart[0] & 3);
440
441
30.9k
    switch (litEncType) {
442
17
    case set_repeat:
443
17
      if (dctx->litEntropy == 0)
444
13
        return ERROR(dictionary_corrupted);
445
    /* fall-through */
446
5.40k
    case set_compressed:
447
5.40k
      if (srcSize < 5)
448
13
        return ERROR(corruption_detected); /* srcSize >= MIN_CBLOCK_SIZE == 3; here we need up to 5 for case 3 */
449
5.39k
      {
450
5.39k
        size_t lhSize, litSize, litCSize;
451
5.39k
        U32 singleStream = 0;
452
5.39k
        U32 const lhlCode = (istart[0] >> 2) & 3;
453
5.39k
        U32 const lhc = ZSTD_readLE32(istart);
454
5.39k
        switch (lhlCode) {
455
2.06k
        case 0:
456
2.76k
        case 1:
457
2.76k
        default: /* note : default is impossible, since lhlCode into [0..3] */
458
          /* 2 - 2 - 10 - 10 */
459
2.76k
          singleStream = !lhlCode;
460
2.76k
          lhSize = 3;
461
2.76k
          litSize = (lhc >> 4) & 0x3FF;
462
2.76k
          litCSize = (lhc >> 14) & 0x3FF;
463
2.76k
          break;
464
2.05k
        case 2:
465
          /* 2 - 2 - 14 - 14 */
466
2.05k
          lhSize = 4;
467
2.05k
          litSize = (lhc >> 4) & 0x3FFF;
468
2.05k
          litCSize = lhc >> 18;
469
2.05k
          break;
470
573
        case 3:
471
          /* 2 - 2 - 18 - 18 */
472
573
          lhSize = 5;
473
573
          litSize = (lhc >> 4) & 0x3FFFF;
474
573
          litCSize = (lhc >> 22) + (istart[4] << 10);
475
573
          break;
476
5.39k
        }
477
5.39k
        if (litSize > ZSTD_BLOCKSIZE_ABSOLUTEMAX)
478
13
          return ERROR(corruption_detected);
479
5.38k
        if (litCSize + lhSize > srcSize)
480
81
          return ERROR(corruption_detected);
481
482
5.29k
        if (HUF_isError(
483
5.29k
          (litEncType == set_repeat)
484
5.29k
              ? (singleStream ? HUF_decompress1X_usingDTable(dctx->litBuffer, litSize, istart + lhSize, litCSize, dctx->HUFptr)
485
3
                  : HUF_decompress4X_usingDTable(dctx->litBuffer, litSize, istart + lhSize, litCSize, dctx->HUFptr))
486
5.29k
              : (singleStream
487
5.29k
               ? HUF_decompress1X2_DCtx_wksp(dctx->entropy.hufTable, dctx->litBuffer, litSize, istart + lhSize, litCSize,
488
2.04k
                     dctx->entropy.workspace, sizeof(dctx->entropy.workspace))
489
5.29k
               : HUF_decompress4X_hufOnly_wksp(dctx->entropy.hufTable, dctx->litBuffer, litSize, istart + lhSize, litCSize,
490
3.25k
                       dctx->entropy.workspace, sizeof(dctx->entropy.workspace)))))
491
4.17k
          return ERROR(corruption_detected);
492
493
1.12k
        dctx->litPtr = dctx->litBuffer;
494
1.12k
        dctx->litSize = litSize;
495
1.12k
        dctx->litEntropy = 1;
496
1.12k
        if (litEncType == set_compressed)
497
1.12k
          dctx->HUFptr = dctx->entropy.hufTable;
498
1.12k
        memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH);
499
1.12k
        return litCSize + lhSize;
500
5.29k
      }
501
502
13.0k
    case set_basic: {
503
13.0k
      size_t litSize, lhSize;
504
13.0k
      U32 const lhlCode = ((istart[0]) >> 2) & 3;
505
13.0k
      switch (lhlCode) {
506
12.5k
      case 0:
507
12.7k
      case 2:
508
12.7k
      default: /* note : default is impossible, since lhlCode into [0..3] */
509
12.7k
        lhSize = 1;
510
12.7k
        litSize = istart[0] >> 3;
511
12.7k
        break;
512
174
      case 1:
513
174
        lhSize = 2;
514
174
        litSize = ZSTD_readLE16(istart) >> 4;
515
174
        break;
516
165
      case 3:
517
165
        lhSize = 3;
518
165
        litSize = ZSTD_readLE24(istart) >> 4;
519
165
        break;
520
13.0k
      }
521
522
13.0k
      if (lhSize + litSize + WILDCOPY_OVERLENGTH > srcSize) { /* risk reading beyond src buffer with wildcopy */
523
966
        if (litSize + lhSize > srcSize)
524
110
          return ERROR(corruption_detected);
525
856
        memcpy(dctx->litBuffer, istart + lhSize, litSize);
526
856
        dctx->litPtr = dctx->litBuffer;
527
856
        dctx->litSize = litSize;
528
856
        memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH);
529
856
        return lhSize + litSize;
530
966
      }
531
      /* direct reference into compressed stream */
532
12.1k
      dctx->litPtr = istart + lhSize;
533
12.1k
      dctx->litSize = litSize;
534
12.1k
      return lhSize + litSize;
535
13.0k
    }
536
537
12.4k
    case set_rle: {
538
12.4k
      U32 const lhlCode = ((istart[0]) >> 2) & 3;
539
12.4k
      size_t litSize, lhSize;
540
12.4k
      switch (lhlCode) {
541
462
      case 0:
542
702
      case 2:
543
702
      default: /* note : default is impossible, since lhlCode into [0..3] */
544
702
        lhSize = 1;
545
702
        litSize = istart[0] >> 3;
546
702
        break;
547
7.75k
      case 1:
548
7.75k
        lhSize = 2;
549
7.75k
        litSize = ZSTD_readLE16(istart) >> 4;
550
7.75k
        break;
551
4.00k
      case 3:
552
4.00k
        lhSize = 3;
553
4.00k
        litSize = ZSTD_readLE24(istart) >> 4;
554
4.00k
        if (srcSize < 4)
555
11
          return ERROR(corruption_detected); /* srcSize >= MIN_CBLOCK_SIZE == 3; here we need lhSize+1 = 4 */
556
3.99k
        break;
557
12.4k
      }
558
12.4k
      if (litSize > ZSTD_BLOCKSIZE_ABSOLUTEMAX)
559
28
        return ERROR(corruption_detected);
560
12.4k
      memset(dctx->litBuffer, istart[lhSize], litSize + WILDCOPY_OVERLENGTH);
561
12.4k
      dctx->litPtr = dctx->litBuffer;
562
12.4k
      dctx->litSize = litSize;
563
12.4k
      return lhSize + 1;
564
12.4k
    }
565
0
    default:
566
0
      return ERROR(corruption_detected); /* impossible */
567
30.9k
    }
568
30.9k
  }
569
30.9k
}
570
571
typedef union {
572
  FSE_decode_t realData;
573
  U32 alignedBy4;
574
} FSE_decode_t4;
575
576
static const FSE_decode_t4 LL_defaultDTable[(1 << LL_DEFAULTNORMLOG) + 1] = {
577
    {{LL_DEFAULTNORMLOG, 1, 1}}, /* header : tableLog, fastMode, fastMode */
578
    {{0, 0, 4}},     /* 0 : base, symbol, bits */
579
    {{16, 0, 4}},
580
    {{32, 1, 5}},
581
    {{0, 3, 5}},
582
    {{0, 4, 5}},
583
    {{0, 6, 5}},
584
    {{0, 7, 5}},
585
    {{0, 9, 5}},
586
    {{0, 10, 5}},
587
    {{0, 12, 5}},
588
    {{0, 14, 6}},
589
    {{0, 16, 5}},
590
    {{0, 18, 5}},
591
    {{0, 19, 5}},
592
    {{0, 21, 5}},
593
    {{0, 22, 5}},
594
    {{0, 24, 5}},
595
    {{32, 25, 5}},
596
    {{0, 26, 5}},
597
    {{0, 27, 6}},
598
    {{0, 29, 6}},
599
    {{0, 31, 6}},
600
    {{32, 0, 4}},
601
    {{0, 1, 4}},
602
    {{0, 2, 5}},
603
    {{32, 4, 5}},
604
    {{0, 5, 5}},
605
    {{32, 7, 5}},
606
    {{0, 8, 5}},
607
    {{32, 10, 5}},
608
    {{0, 11, 5}},
609
    {{0, 13, 6}},
610
    {{32, 16, 5}},
611
    {{0, 17, 5}},
612
    {{32, 19, 5}},
613
    {{0, 20, 5}},
614
    {{32, 22, 5}},
615
    {{0, 23, 5}},
616
    {{0, 25, 4}},
617
    {{16, 25, 4}},
618
    {{32, 26, 5}},
619
    {{0, 28, 6}},
620
    {{0, 30, 6}},
621
    {{48, 0, 4}},
622
    {{16, 1, 4}},
623
    {{32, 2, 5}},
624
    {{32, 3, 5}},
625
    {{32, 5, 5}},
626
    {{32, 6, 5}},
627
    {{32, 8, 5}},
628
    {{32, 9, 5}},
629
    {{32, 11, 5}},
630
    {{32, 12, 5}},
631
    {{0, 15, 6}},
632
    {{32, 17, 5}},
633
    {{32, 18, 5}},
634
    {{32, 20, 5}},
635
    {{32, 21, 5}},
636
    {{32, 23, 5}},
637
    {{32, 24, 5}},
638
    {{0, 35, 6}},
639
    {{0, 34, 6}},
640
    {{0, 33, 6}},
641
    {{0, 32, 6}},
642
}; /* LL_defaultDTable */
643
644
static const FSE_decode_t4 ML_defaultDTable[(1 << ML_DEFAULTNORMLOG) + 1] = {
645
    {{ML_DEFAULTNORMLOG, 1, 1}}, /* header : tableLog, fastMode, fastMode */
646
    {{0, 0, 6}},     /* 0 : base, symbol, bits */
647
    {{0, 1, 4}},
648
    {{32, 2, 5}},
649
    {{0, 3, 5}},
650
    {{0, 5, 5}},
651
    {{0, 6, 5}},
652
    {{0, 8, 5}},
653
    {{0, 10, 6}},
654
    {{0, 13, 6}},
655
    {{0, 16, 6}},
656
    {{0, 19, 6}},
657
    {{0, 22, 6}},
658
    {{0, 25, 6}},
659
    {{0, 28, 6}},
660
    {{0, 31, 6}},
661
    {{0, 33, 6}},
662
    {{0, 35, 6}},
663
    {{0, 37, 6}},
664
    {{0, 39, 6}},
665
    {{0, 41, 6}},
666
    {{0, 43, 6}},
667
    {{0, 45, 6}},
668
    {{16, 1, 4}},
669
    {{0, 2, 4}},
670
    {{32, 3, 5}},
671
    {{0, 4, 5}},
672
    {{32, 6, 5}},
673
    {{0, 7, 5}},
674
    {{0, 9, 6}},
675
    {{0, 12, 6}},
676
    {{0, 15, 6}},
677
    {{0, 18, 6}},
678
    {{0, 21, 6}},
679
    {{0, 24, 6}},
680
    {{0, 27, 6}},
681
    {{0, 30, 6}},
682
    {{0, 32, 6}},
683
    {{0, 34, 6}},
684
    {{0, 36, 6}},
685
    {{0, 38, 6}},
686
    {{0, 40, 6}},
687
    {{0, 42, 6}},
688
    {{0, 44, 6}},
689
    {{32, 1, 4}},
690
    {{48, 1, 4}},
691
    {{16, 2, 4}},
692
    {{32, 4, 5}},
693
    {{32, 5, 5}},
694
    {{32, 7, 5}},
695
    {{32, 8, 5}},
696
    {{0, 11, 6}},
697
    {{0, 14, 6}},
698
    {{0, 17, 6}},
699
    {{0, 20, 6}},
700
    {{0, 23, 6}},
701
    {{0, 26, 6}},
702
    {{0, 29, 6}},
703
    {{0, 52, 6}},
704
    {{0, 51, 6}},
705
    {{0, 50, 6}},
706
    {{0, 49, 6}},
707
    {{0, 48, 6}},
708
    {{0, 47, 6}},
709
    {{0, 46, 6}},
710
}; /* ML_defaultDTable */
711
712
static const FSE_decode_t4 OF_defaultDTable[(1 << OF_DEFAULTNORMLOG) + 1] = {
713
    {{OF_DEFAULTNORMLOG, 1, 1}}, /* header : tableLog, fastMode, fastMode */
714
    {{0, 0, 5}},     /* 0 : base, symbol, bits */
715
    {{0, 6, 4}},
716
    {{0, 9, 5}},
717
    {{0, 15, 5}},
718
    {{0, 21, 5}},
719
    {{0, 3, 5}},
720
    {{0, 7, 4}},
721
    {{0, 12, 5}},
722
    {{0, 18, 5}},
723
    {{0, 23, 5}},
724
    {{0, 5, 5}},
725
    {{0, 8, 4}},
726
    {{0, 14, 5}},
727
    {{0, 20, 5}},
728
    {{0, 2, 5}},
729
    {{16, 7, 4}},
730
    {{0, 11, 5}},
731
    {{0, 17, 5}},
732
    {{0, 22, 5}},
733
    {{0, 4, 5}},
734
    {{16, 8, 4}},
735
    {{0, 13, 5}},
736
    {{0, 19, 5}},
737
    {{0, 1, 5}},
738
    {{16, 6, 4}},
739
    {{0, 10, 5}},
740
    {{0, 16, 5}},
741
    {{0, 28, 5}},
742
    {{0, 27, 5}},
743
    {{0, 26, 5}},
744
    {{0, 25, 5}},
745
    {{0, 24, 5}},
746
}; /* OF_defaultDTable */
747
748
/*! ZSTD_buildSeqTable() :
749
  @return : nb bytes read from src,
750
        or an error code if it fails, testable with ZSTD_isError()
751
*/
752
static size_t ZSTD_buildSeqTable(FSE_DTable *DTableSpace, const FSE_DTable **DTablePtr, symbolEncodingType_e type, U32 max, U32 maxLog, const void *src,
753
         size_t srcSize, const FSE_decode_t4 *defaultTable, U32 flagRepeatTable, void *workspace, size_t workspaceSize)
754
65.6k
{
755
65.6k
  const void *const tmpPtr = defaultTable; /* bypass strict aliasing */
756
65.6k
  switch (type) {
757
15.9k
  case set_rle:
758
15.9k
    if (!srcSize)
759
34
      return ERROR(srcSize_wrong);
760
15.9k
    if ((*(const BYTE *)src) > max)
761
61
      return ERROR(corruption_detected);
762
15.8k
    FSE_buildDTable_rle(DTableSpace, *(const BYTE *)src);
763
15.8k
    *DTablePtr = DTableSpace;
764
15.8k
    return 1;
765
22.9k
  case set_basic: *DTablePtr = (const FSE_DTable *)tmpPtr; return 0;
766
3.03k
  case set_repeat:
767
3.03k
    if (!flagRepeatTable)
768
65
      return ERROR(corruption_detected);
769
2.96k
    return 0;
770
0
  default: /* impossible */
771
23.7k
  case set_compressed: {
772
23.7k
    U32 tableLog;
773
23.7k
    S16 *norm = (S16 *)workspace;
774
23.7k
    size_t const spaceUsed32 = ALIGN(sizeof(S16) * (MaxSeq + 1), sizeof(U32)) >> 2;
775
776
23.7k
    if ((spaceUsed32 << 2) > workspaceSize)
777
0
      return ERROR(GENERIC);
778
23.7k
    workspace = (U32 *)workspace + spaceUsed32;
779
23.7k
    workspaceSize -= (spaceUsed32 << 2);
780
23.7k
    {
781
23.7k
      size_t const headerSize = FSE_readNCount(norm, &max, &tableLog, src, srcSize);
782
23.7k
      if (FSE_isError(headerSize))
783
199
        return ERROR(corruption_detected);
784
23.5k
      if (tableLog > maxLog)
785
71
        return ERROR(corruption_detected);
786
23.4k
      FSE_buildDTable_wksp(DTableSpace, norm, max, tableLog, workspace, workspaceSize);
787
23.4k
      *DTablePtr = DTableSpace;
788
23.4k
      return headerSize;
789
23.5k
    }
790
23.5k
  }
791
65.6k
  }
792
65.6k
}
793
794
static size_t ZSTD_decodeSeqHeaders(ZSTD_DCtx *dctx, int *nbSeqPtr, const void *src, size_t srcSize)
795
26.5k
{
796
26.5k
  const BYTE *const istart = (const BYTE *const)src;
797
26.5k
  const BYTE *const iend = istart + srcSize;
798
26.5k
  const BYTE *ip = istart;
799
800
  /* check */
801
26.5k
  if (srcSize < MIN_SEQUENCES_SIZE)
802
17
    return ERROR(srcSize_wrong);
803
804
  /* SeqHead */
805
26.4k
  {
806
26.4k
    int nbSeq = *ip++;
807
26.4k
    if (!nbSeq) {
808
4.36k
      *nbSeqPtr = 0;
809
4.36k
      return 1;
810
4.36k
    }
811
22.1k
    if (nbSeq > 0x7F) {
812
1.08k
      if (nbSeq == 0xFF) {
813
334
        if (ip + 2 > iend)
814
14
          return ERROR(srcSize_wrong);
815
320
        nbSeq = ZSTD_readLE16(ip) + LONGNBSEQ, ip += 2;
816
754
      } else {
817
754
        if (ip >= iend)
818
35
          return ERROR(srcSize_wrong);
819
719
        nbSeq = ((nbSeq - 0x80) << 8) + *ip++;
820
719
      }
821
1.08k
    }
822
22.0k
    *nbSeqPtr = nbSeq;
823
22.0k
  }
824
825
  /* FSE table descriptors */
826
22.0k
  if (ip + 4 > iend)
827
64
    return ERROR(srcSize_wrong); /* minimum possible size */
828
22.0k
  {
829
22.0k
    symbolEncodingType_e const LLtype = (symbolEncodingType_e)(*ip >> 6);
830
22.0k
    symbolEncodingType_e const OFtype = (symbolEncodingType_e)((*ip >> 4) & 3);
831
22.0k
    symbolEncodingType_e const MLtype = (symbolEncodingType_e)((*ip >> 2) & 3);
832
22.0k
    ip++;
833
834
    /* Build DTables */
835
22.0k
    {
836
22.0k
      size_t const llhSize = ZSTD_buildSeqTable(dctx->entropy.LLTable, &dctx->LLTptr, LLtype, MaxLL, LLFSELog, ip, iend - ip,
837
22.0k
                  LL_defaultDTable, dctx->fseEntropy, dctx->entropy.workspace, sizeof(dctx->entropy.workspace));
838
22.0k
      if (ZSTD_isError(llhSize))
839
115
        return ERROR(corruption_detected);
840
21.9k
      ip += llhSize;
841
21.9k
    }
842
0
    {
843
21.9k
      size_t const ofhSize = ZSTD_buildSeqTable(dctx->entropy.OFTable, &dctx->OFTptr, OFtype, MaxOff, OffFSELog, ip, iend - ip,
844
21.9k
                  OF_defaultDTable, dctx->fseEntropy, dctx->entropy.workspace, sizeof(dctx->entropy.workspace));
845
21.9k
      if (ZSTD_isError(ofhSize))
846
156
        return ERROR(corruption_detected);
847
21.7k
      ip += ofhSize;
848
21.7k
    }
849
0
    {
850
21.7k
      size_t const mlhSize = ZSTD_buildSeqTable(dctx->entropy.MLTable, &dctx->MLTptr, MLtype, MaxML, MLFSELog, ip, iend - ip,
851
21.7k
                  ML_defaultDTable, dctx->fseEntropy, dctx->entropy.workspace, sizeof(dctx->entropy.workspace));
852
21.7k
      if (ZSTD_isError(mlhSize))
853
159
        return ERROR(corruption_detected);
854
21.5k
      ip += mlhSize;
855
21.5k
    }
856
21.5k
  }
857
858
0
  return ip - istart;
859
21.7k
}
860
861
typedef struct {
862
  size_t litLength;
863
  size_t matchLength;
864
  size_t offset;
865
  const BYTE *match;
866
} seq_t;
867
868
typedef struct {
869
  BIT_DStream_t DStream;
870
  FSE_DState_t stateLL;
871
  FSE_DState_t stateOffb;
872
  FSE_DState_t stateML;
873
  size_t prevOffset[ZSTD_REP_NUM];
874
  const BYTE *base;
875
  size_t pos;
876
  uPtrDiff gotoDict;
877
} seqState_t;
878
879
FORCE_NOINLINE
880
size_t ZSTD_execSequenceLast7(BYTE *op, BYTE *const oend, seq_t sequence, const BYTE **litPtr, const BYTE *const litLimit, const BYTE *const base,
881
            const BYTE *const vBase, const BYTE *const dictEnd)
882
260
{
883
260
  BYTE *const oLitEnd = op + sequence.litLength;
884
260
  size_t const sequenceLength = sequence.litLength + sequence.matchLength;
885
260
  BYTE *const oMatchEnd = op + sequenceLength; /* risk : address space overflow (32-bits) */
886
260
  BYTE *const oend_w = oend - WILDCOPY_OVERLENGTH;
887
260
  const BYTE *const iLitEnd = *litPtr + sequence.litLength;
888
260
  const BYTE *match = oLitEnd - sequence.offset;
889
890
  /* check */
891
260
  if (oMatchEnd > oend)
892
0
    return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of WILDCOPY_OVERLENGTH from oend */
893
260
  if (iLitEnd > litLimit)
894
0
    return ERROR(corruption_detected); /* over-read beyond lit buffer */
895
260
  if (oLitEnd <= oend_w)
896
0
    return ERROR(GENERIC); /* Precondition */
897
898
  /* copy literals */
899
260
  if (op < oend_w) {
900
77
    ZSTD_wildcopy(op, *litPtr, oend_w - op);
901
77
    *litPtr += oend_w - op;
902
77
    op = oend_w;
903
77
  }
904
470
  while (op < oLitEnd)
905
210
    *op++ = *(*litPtr)++;
906
907
  /* copy Match */
908
260
  if (sequence.offset > (size_t)(oLitEnd - base)) {
909
    /* offset beyond prefix */
910
84
    if (sequence.offset > (size_t)(oLitEnd - vBase))
911
76
      return ERROR(corruption_detected);
912
8
    match = dictEnd - (base - match);
913
8
    if (match + sequence.matchLength <= dictEnd) {
914
7
      memmove(oLitEnd, match, sequence.matchLength);
915
7
      return sequenceLength;
916
7
    }
917
    /* span extDict & currPrefixSegment */
918
1
    {
919
1
      size_t const length1 = dictEnd - match;
920
1
      memmove(oLitEnd, match, length1);
921
1
      op = oLitEnd + length1;
922
1
      sequence.matchLength -= length1;
923
1
      match = base;
924
1
    }
925
1
  }
926
803
  while (op < oMatchEnd)
927
626
    *op++ = *match++;
928
177
  return sequenceLength;
929
260
}
930
931
static seq_t ZSTD_decodeSequence(seqState_t *seqState)
932
113k
{
933
113k
  seq_t seq;
934
935
113k
  U32 const llCode = FSE_peekSymbol(&seqState->stateLL);
936
113k
  U32 const mlCode = FSE_peekSymbol(&seqState->stateML);
937
113k
  U32 const ofCode = FSE_peekSymbol(&seqState->stateOffb); /* <= maxOff, by table construction */
938
939
113k
  U32 const llBits = LL_bits[llCode];
940
113k
  U32 const mlBits = ML_bits[mlCode];
941
113k
  U32 const ofBits = ofCode;
942
113k
  U32 const totalBits = llBits + mlBits + ofBits;
943
944
113k
  static const U32 LL_base[MaxLL + 1] = {0,  1,  2,  3,  4,  5,  6,  7,  8,    9,     10,    11,    12,    13,     14,     15,     16,     18,
945
113k
                 20, 22, 24, 28, 32, 40, 48, 64, 0x80, 0x100, 0x200, 0x400, 0x800, 0x1000, 0x2000, 0x4000, 0x8000, 0x10000};
946
947
113k
  static const U32 ML_base[MaxML + 1] = {3,  4,  5,  6,  7,  8,  9,  10,   11,    12,    13,    14,    15,     16,     17,     18,     19,     20,
948
113k
                 21, 22, 23, 24, 25, 26, 27, 28,   29,    30,    31,    32,    33,     34,     35,     37,     39,     41,
949
113k
                 43, 47, 51, 59, 67, 83, 99, 0x83, 0x103, 0x203, 0x403, 0x803, 0x1003, 0x2003, 0x4003, 0x8003, 0x10003};
950
951
113k
  static const U32 OF_base[MaxOff + 1] = {0,       1, 1,  5,  0xD,      0x1D,      0x3D,      0x7D,      0xFD,     0x1FD,
952
113k
            0x3FD,   0x7FD,    0xFFD,    0x1FFD,   0x3FFD,   0x7FFD,    0xFFFD,    0x1FFFD,   0x3FFFD,  0x7FFFD,
953
113k
            0xFFFFD, 0x1FFFFD, 0x3FFFFD, 0x7FFFFD, 0xFFFFFD, 0x1FFFFFD, 0x3FFFFFD, 0x7FFFFFD, 0xFFFFFFD};
954
955
  /* sequence */
956
113k
  {
957
113k
    size_t offset;
958
113k
    if (!ofCode)
959
73.7k
      offset = 0;
960
39.3k
    else {
961
39.3k
      offset = OF_base[ofCode] + BIT_readBitsFast(&seqState->DStream, ofBits); /* <=  (ZSTD_WINDOWLOG_MAX-1) bits */
962
39.3k
      if (ZSTD_32bits())
963
0
        BIT_reloadDStream(&seqState->DStream);
964
39.3k
    }
965
966
113k
    if (ofCode <= 1) {
967
101k
      offset += (llCode == 0);
968
101k
      if (offset) {
969
55.5k
        size_t temp = (offset == 3) ? seqState->prevOffset[0] - 1 : seqState->prevOffset[offset];
970
55.5k
        temp += !temp; /* 0 is not valid; input is corrupted; force offset to 1 */
971
55.5k
        if (offset != 1)
972
26.6k
          seqState->prevOffset[2] = seqState->prevOffset[1];
973
55.5k
        seqState->prevOffset[1] = seqState->prevOffset[0];
974
55.5k
        seqState->prevOffset[0] = offset = temp;
975
55.5k
      } else {
976
46.1k
        offset = seqState->prevOffset[0];
977
46.1k
      }
978
101k
    } else {
979
11.3k
      seqState->prevOffset[2] = seqState->prevOffset[1];
980
11.3k
      seqState->prevOffset[1] = seqState->prevOffset[0];
981
11.3k
      seqState->prevOffset[0] = offset;
982
11.3k
    }
983
113k
    seq.offset = offset;
984
113k
  }
985
986
113k
  seq.matchLength = ML_base[mlCode] + ((mlCode > 31) ? BIT_readBitsFast(&seqState->DStream, mlBits) : 0); /* <=  16 bits */
987
113k
  if (ZSTD_32bits() && (mlBits + llBits > 24))
988
0
    BIT_reloadDStream(&seqState->DStream);
989
990
113k
  seq.litLength = LL_base[llCode] + ((llCode > 15) ? BIT_readBitsFast(&seqState->DStream, llBits) : 0); /* <=  16 bits */
991
113k
  if (ZSTD_32bits() || (totalBits > 64 - 7 - (LLFSELog + MLFSELog + OffFSELog)))
992
491
    BIT_reloadDStream(&seqState->DStream);
993
994
  /* ANS state update */
995
113k
  FSE_updateState(&seqState->stateLL, &seqState->DStream); /* <=  9 bits */
996
113k
  FSE_updateState(&seqState->stateML, &seqState->DStream); /* <=  9 bits */
997
113k
  if (ZSTD_32bits())
998
0
    BIT_reloadDStream(&seqState->DStream);      /* <= 18 bits */
999
113k
  FSE_updateState(&seqState->stateOffb, &seqState->DStream); /* <=  8 bits */
1000
1001
113k
  seq.match = NULL;
1002
1003
113k
  return seq;
1004
113k
}
1005
1006
FORCE_INLINE
1007
size_t ZSTD_execSequence(BYTE *op, BYTE *const oend, seq_t sequence, const BYTE **litPtr, const BYTE *const litLimit, const BYTE *const base,
1008
       const BYTE *const vBase, const BYTE *const dictEnd)
1009
113k
{
1010
113k
  BYTE *const oLitEnd = op + sequence.litLength;
1011
113k
  size_t const sequenceLength = sequence.litLength + sequence.matchLength;
1012
113k
  BYTE *const oMatchEnd = op + sequenceLength; /* risk : address space overflow (32-bits) */
1013
113k
  BYTE *const oend_w = oend - WILDCOPY_OVERLENGTH;
1014
113k
  const BYTE *const iLitEnd = *litPtr + sequence.litLength;
1015
113k
  const BYTE *match = oLitEnd - sequence.offset;
1016
1017
  /* check */
1018
113k
  if (oMatchEnd > oend)
1019
255
    return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of WILDCOPY_OVERLENGTH from oend */
1020
112k
  if (iLitEnd > litLimit)
1021
167
    return ERROR(corruption_detected); /* over-read beyond lit buffer */
1022
112k
  if (oLitEnd > oend_w)
1023
251
    return ZSTD_execSequenceLast7(op, oend, sequence, litPtr, litLimit, base, vBase, dictEnd);
1024
1025
  /* copy Literals */
1026
112k
  ZSTD_copy8(op, *litPtr);
1027
112k
  if (sequence.litLength > 8)
1028
8.08k
    ZSTD_wildcopy(op + 8, (*litPtr) + 8,
1029
8.08k
            sequence.litLength - 8); /* note : since oLitEnd <= oend-WILDCOPY_OVERLENGTH, no risk of overwrite beyond oend */
1030
112k
  op = oLitEnd;
1031
112k
  *litPtr = iLitEnd; /* update for next sequence */
1032
1033
  /* copy Match */
1034
112k
  if (sequence.offset > (size_t)(oLitEnd - base)) {
1035
    /* offset beyond prefix */
1036
7.68k
    if (sequence.offset > (size_t)(oLitEnd - vBase))
1037
202
      return ERROR(corruption_detected);
1038
7.48k
    match = dictEnd + (match - base);
1039
7.48k
    if (match + sequence.matchLength <= dictEnd) {
1040
4.46k
      memmove(oLitEnd, match, sequence.matchLength);
1041
4.46k
      return sequenceLength;
1042
4.46k
    }
1043
    /* span extDict & currPrefixSegment */
1044
3.01k
    {
1045
3.01k
      size_t const length1 = dictEnd - match;
1046
3.01k
      memmove(oLitEnd, match, length1);
1047
3.01k
      op = oLitEnd + length1;
1048
3.01k
      sequence.matchLength -= length1;
1049
3.01k
      match = base;
1050
3.01k
      if (op > oend_w || sequence.matchLength < MINMATCH) {
1051
752
        U32 i;
1052
1.87k
        for (i = 0; i < sequence.matchLength; ++i)
1053
1.11k
          op[i] = match[i];
1054
752
        return sequenceLength;
1055
752
      }
1056
3.01k
    }
1057
3.01k
  }
1058
  /* Requirement: op <= oend_w && sequence.matchLength >= MINMATCH */
1059
1060
  /* match within prefix */
1061
106k
  if (sequence.offset < 8) {
1062
    /* close range match, overlap */
1063
92.8k
    static const U32 dec32table[] = {0, 1, 2, 1, 4, 4, 4, 4};   /* added */
1064
92.8k
    static const int dec64table[] = {8, 8, 8, 7, 8, 9, 10, 11}; /* subtracted */
1065
92.8k
    int const sub2 = dec64table[sequence.offset];
1066
92.8k
    op[0] = match[0];
1067
92.8k
    op[1] = match[1];
1068
92.8k
    op[2] = match[2];
1069
92.8k
    op[3] = match[3];
1070
92.8k
    match += dec32table[sequence.offset];
1071
92.8k
    ZSTD_copy4(op + 4, match);
1072
92.8k
    match -= sub2;
1073
92.8k
  } else {
1074
14.1k
    ZSTD_copy8(op, match);
1075
14.1k
  }
1076
106k
  op += 8;
1077
106k
  match += 8;
1078
1079
106k
  if (oMatchEnd > oend - (16 - MINMATCH)) {
1080
2.48k
    if (op < oend_w) {
1081
2.25k
      ZSTD_wildcopy(op, match, oend_w - op);
1082
2.25k
      match += oend_w - op;
1083
2.25k
      op = oend_w;
1084
2.25k
    }
1085
8.82k
    while (op < oMatchEnd)
1086
6.33k
      *op++ = *match++;
1087
104k
  } else {
1088
104k
    ZSTD_wildcopy(op, match, (ptrdiff_t)sequence.matchLength - 8); /* works even if matchLength < 8 */
1089
104k
  }
1090
106k
  return sequenceLength;
1091
112k
}
1092
1093
static size_t ZSTD_decompressSequences(ZSTD_DCtx *dctx, void *dst, size_t maxDstSize, const void *seqStart, size_t seqSize)
1094
15.9k
{
1095
15.9k
  const BYTE *ip = (const BYTE *)seqStart;
1096
15.9k
  const BYTE *const iend = ip + seqSize;
1097
15.9k
  BYTE *const ostart = (BYTE * const)dst;
1098
15.9k
  BYTE *const oend = ostart + maxDstSize;
1099
15.9k
  BYTE *op = ostart;
1100
15.9k
  const BYTE *litPtr = dctx->litPtr;
1101
15.9k
  const BYTE *const litEnd = litPtr + dctx->litSize;
1102
15.9k
  const BYTE *const base = (const BYTE *)(dctx->base);
1103
15.9k
  const BYTE *const vBase = (const BYTE *)(dctx->vBase);
1104
15.9k
  const BYTE *const dictEnd = (const BYTE *)(dctx->dictEnd);
1105
15.9k
  int nbSeq;
1106
1107
  /* Build Decoding Tables */
1108
15.9k
  {
1109
15.9k
    size_t const seqHSize = ZSTD_decodeSeqHeaders(dctx, &nbSeq, ip, seqSize);
1110
15.9k
    if (ZSTD_isError(seqHSize))
1111
346
      return seqHSize;
1112
15.5k
    ip += seqHSize;
1113
15.5k
  }
1114
1115
  /* Regen sequences */
1116
15.5k
  if (nbSeq) {
1117
12.4k
    seqState_t seqState;
1118
12.4k
    dctx->fseEntropy = 1;
1119
12.4k
    {
1120
12.4k
      U32 i;
1121
49.6k
      for (i = 0; i < ZSTD_REP_NUM; i++)
1122
37.2k
        seqState.prevOffset[i] = dctx->entropy.rep[i];
1123
12.4k
    }
1124
12.4k
    CHECK_E(BIT_initDStream(&seqState.DStream, ip, iend - ip), corruption_detected);
1125
12.1k
    FSE_initDState(&seqState.stateLL, &seqState.DStream, dctx->LLTptr);
1126
12.1k
    FSE_initDState(&seqState.stateOffb, &seqState.DStream, dctx->OFTptr);
1127
12.1k
    FSE_initDState(&seqState.stateML, &seqState.DStream, dctx->MLTptr);
1128
1129
124k
    for (; (BIT_reloadDStream(&(seqState.DStream)) <= BIT_DStream_completed) && nbSeq;) {
1130
113k
      nbSeq--;
1131
113k
      {
1132
113k
        seq_t const sequence = ZSTD_decodeSequence(&seqState);
1133
113k
        size_t const oneSeqSize = ZSTD_execSequence(op, oend, sequence, &litPtr, litEnd, base, vBase, dictEnd);
1134
113k
        if (ZSTD_isError(oneSeqSize))
1135
700
          return oneSeqSize;
1136
112k
        op += oneSeqSize;
1137
112k
      }
1138
112k
    }
1139
1140
    /* check if reached exact end */
1141
11.4k
    if (nbSeq)
1142
239
      return ERROR(corruption_detected);
1143
    /* save reps for next block */
1144
11.2k
    {
1145
11.2k
      U32 i;
1146
45.0k
      for (i = 0; i < ZSTD_REP_NUM; i++)
1147
33.7k
        dctx->entropy.rep[i] = (U32)(seqState.prevOffset[i]);
1148
11.2k
    }
1149
11.2k
  }
1150
1151
  /* last literal segment */
1152
14.4k
  {
1153
14.4k
    size_t const lastLLSize = litEnd - litPtr;
1154
14.4k
    if (lastLLSize > (size_t)(oend - op))
1155
53
      return ERROR(dstSize_tooSmall);
1156
14.3k
    memcpy(op, litPtr, lastLLSize);
1157
14.3k
    op += lastLLSize;
1158
14.3k
  }
1159
1160
0
  return op - ostart;
1161
14.4k
}
1162
1163
FORCE_INLINE seq_t ZSTD_decodeSequenceLong_generic(seqState_t *seqState, int const longOffsets)
1164
4.79M
{
1165
4.79M
  seq_t seq;
1166
1167
4.79M
  U32 const llCode = FSE_peekSymbol(&seqState->stateLL);
1168
4.79M
  U32 const mlCode = FSE_peekSymbol(&seqState->stateML);
1169
4.79M
  U32 const ofCode = FSE_peekSymbol(&seqState->stateOffb); /* <= maxOff, by table construction */
1170
1171
4.79M
  U32 const llBits = LL_bits[llCode];
1172
4.79M
  U32 const mlBits = ML_bits[mlCode];
1173
4.79M
  U32 const ofBits = ofCode;
1174
4.79M
  U32 const totalBits = llBits + mlBits + ofBits;
1175
1176
4.79M
  static const U32 LL_base[MaxLL + 1] = {0,  1,  2,  3,  4,  5,  6,  7,  8,    9,     10,    11,    12,    13,     14,     15,     16,     18,
1177
4.79M
                 20, 22, 24, 28, 32, 40, 48, 64, 0x80, 0x100, 0x200, 0x400, 0x800, 0x1000, 0x2000, 0x4000, 0x8000, 0x10000};
1178
1179
4.79M
  static const U32 ML_base[MaxML + 1] = {3,  4,  5,  6,  7,  8,  9,  10,   11,    12,    13,    14,    15,     16,     17,     18,     19,     20,
1180
4.79M
                 21, 22, 23, 24, 25, 26, 27, 28,   29,    30,    31,    32,    33,     34,     35,     37,     39,     41,
1181
4.79M
                 43, 47, 51, 59, 67, 83, 99, 0x83, 0x103, 0x203, 0x403, 0x803, 0x1003, 0x2003, 0x4003, 0x8003, 0x10003};
1182
1183
4.79M
  static const U32 OF_base[MaxOff + 1] = {0,       1, 1,  5,  0xD,      0x1D,      0x3D,      0x7D,      0xFD,     0x1FD,
1184
4.79M
            0x3FD,   0x7FD,    0xFFD,    0x1FFD,   0x3FFD,   0x7FFD,    0xFFFD,    0x1FFFD,   0x3FFFD,  0x7FFFD,
1185
4.79M
            0xFFFFD, 0x1FFFFD, 0x3FFFFD, 0x7FFFFD, 0xFFFFFD, 0x1FFFFFD, 0x3FFFFFD, 0x7FFFFFD, 0xFFFFFFD};
1186
1187
  /* sequence */
1188
4.79M
  {
1189
4.79M
    size_t offset;
1190
4.79M
    if (!ofCode)
1191
4.76M
      offset = 0;
1192
35.9k
    else {
1193
35.9k
      if (longOffsets) {
1194
0
        int const extraBits = ofBits - MIN(ofBits, STREAM_ACCUMULATOR_MIN);
1195
0
        offset = OF_base[ofCode] + (BIT_readBitsFast(&seqState->DStream, ofBits - extraBits) << extraBits);
1196
0
        if (ZSTD_32bits() || extraBits)
1197
0
          BIT_reloadDStream(&seqState->DStream);
1198
0
        if (extraBits)
1199
0
          offset += BIT_readBitsFast(&seqState->DStream, extraBits);
1200
35.9k
      } else {
1201
35.9k
        offset = OF_base[ofCode] + BIT_readBitsFast(&seqState->DStream, ofBits); /* <=  (ZSTD_WINDOWLOG_MAX-1) bits */
1202
35.9k
        if (ZSTD_32bits())
1203
0
          BIT_reloadDStream(&seqState->DStream);
1204
35.9k
      }
1205
35.9k
    }
1206
1207
4.79M
    if (ofCode <= 1) {
1208
4.78M
      offset += (llCode == 0);
1209
4.78M
      if (offset) {
1210
4.76M
        size_t temp = (offset == 3) ? seqState->prevOffset[0] - 1 : seqState->prevOffset[offset];
1211
4.76M
        temp += !temp; /* 0 is not valid; input is corrupted; force offset to 1 */
1212
4.76M
        if (offset != 1)
1213
18.1k
          seqState->prevOffset[2] = seqState->prevOffset[1];
1214
4.76M
        seqState->prevOffset[1] = seqState->prevOffset[0];
1215
4.76M
        seqState->prevOffset[0] = offset = temp;
1216
4.76M
      } else {
1217
17.1k
        offset = seqState->prevOffset[0];
1218
17.1k
      }
1219
4.78M
    } else {
1220
15.4k
      seqState->prevOffset[2] = seqState->prevOffset[1];
1221
15.4k
      seqState->prevOffset[1] = seqState->prevOffset[0];
1222
15.4k
      seqState->prevOffset[0] = offset;
1223
15.4k
    }
1224
4.79M
    seq.offset = offset;
1225
4.79M
  }
1226
1227
4.79M
  seq.matchLength = ML_base[mlCode] + ((mlCode > 31) ? BIT_readBitsFast(&seqState->DStream, mlBits) : 0); /* <=  16 bits */
1228
4.79M
  if (ZSTD_32bits() && (mlBits + llBits > 24))
1229
0
    BIT_reloadDStream(&seqState->DStream);
1230
1231
4.79M
  seq.litLength = LL_base[llCode] + ((llCode > 15) ? BIT_readBitsFast(&seqState->DStream, llBits) : 0); /* <=  16 bits */
1232
4.79M
  if (ZSTD_32bits() || (totalBits > 64 - 7 - (LLFSELog + MLFSELog + OffFSELog)))
1233
1.03k
    BIT_reloadDStream(&seqState->DStream);
1234
1235
4.79M
  {
1236
4.79M
    size_t const pos = seqState->pos + seq.litLength;
1237
4.79M
    seq.match = seqState->base + pos - seq.offset; /* single memory segment */
1238
4.79M
    if (seq.offset > pos)
1239
2.34k
      seq.match += seqState->gotoDict; /* separate memory segment */
1240
4.79M
    seqState->pos = pos + seq.matchLength;
1241
4.79M
  }
1242
1243
  /* ANS state update */
1244
4.79M
  FSE_updateState(&seqState->stateLL, &seqState->DStream); /* <=  9 bits */
1245
4.79M
  FSE_updateState(&seqState->stateML, &seqState->DStream); /* <=  9 bits */
1246
4.79M
  if (ZSTD_32bits())
1247
0
    BIT_reloadDStream(&seqState->DStream);      /* <= 18 bits */
1248
4.79M
  FSE_updateState(&seqState->stateOffb, &seqState->DStream); /* <=  8 bits */
1249
1250
4.79M
  return seq;
1251
4.79M
}
1252
1253
static seq_t ZSTD_decodeSequenceLong(seqState_t *seqState, unsigned const windowSize)
1254
4.79M
{
1255
4.79M
  if (ZSTD_highbit32(windowSize) > STREAM_ACCUMULATOR_MIN) {
1256
0
    return ZSTD_decodeSequenceLong_generic(seqState, 1);
1257
4.79M
  } else {
1258
4.79M
    return ZSTD_decodeSequenceLong_generic(seqState, 0);
1259
4.79M
  }
1260
4.79M
}
1261
1262
FORCE_INLINE
1263
size_t ZSTD_execSequenceLong(BYTE *op, BYTE *const oend, seq_t sequence, const BYTE **litPtr, const BYTE *const litLimit, const BYTE *const base,
1264
           const BYTE *const vBase, const BYTE *const dictEnd)
1265
4.79M
{
1266
4.79M
  BYTE *const oLitEnd = op + sequence.litLength;
1267
4.79M
  size_t const sequenceLength = sequence.litLength + sequence.matchLength;
1268
4.79M
  BYTE *const oMatchEnd = op + sequenceLength; /* risk : address space overflow (32-bits) */
1269
4.79M
  BYTE *const oend_w = oend - WILDCOPY_OVERLENGTH;
1270
4.79M
  const BYTE *const iLitEnd = *litPtr + sequence.litLength;
1271
4.79M
  const BYTE *match = sequence.match;
1272
1273
  /* check */
1274
4.79M
  if (oMatchEnd > oend)
1275
52
    return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of WILDCOPY_OVERLENGTH from oend */
1276
4.79M
  if (iLitEnd > litLimit)
1277
137
    return ERROR(corruption_detected); /* over-read beyond lit buffer */
1278
4.79M
  if (oLitEnd > oend_w)
1279
9
    return ZSTD_execSequenceLast7(op, oend, sequence, litPtr, litLimit, base, vBase, dictEnd);
1280
1281
  /* copy Literals */
1282
4.79M
  ZSTD_copy8(op, *litPtr);
1283
4.79M
  if (sequence.litLength > 8)
1284
14.3k
    ZSTD_wildcopy(op + 8, (*litPtr) + 8,
1285
14.3k
            sequence.litLength - 8); /* note : since oLitEnd <= oend-WILDCOPY_OVERLENGTH, no risk of overwrite beyond oend */
1286
4.79M
  op = oLitEnd;
1287
4.79M
  *litPtr = iLitEnd; /* update for next sequence */
1288
1289
  /* copy Match */
1290
4.79M
  if (sequence.offset > (size_t)(oLitEnd - base)) {
1291
    /* offset beyond prefix */
1292
1.47k
    if (sequence.offset > (size_t)(oLitEnd - vBase))
1293
274
      return ERROR(corruption_detected);
1294
1.19k
    if (match + sequence.matchLength <= dictEnd) {
1295
1.10k
      memmove(oLitEnd, match, sequence.matchLength);
1296
1.10k
      return sequenceLength;
1297
1.10k
    }
1298
    /* span extDict & currPrefixSegment */
1299
94
    {
1300
94
      size_t const length1 = dictEnd - match;
1301
94
      memmove(oLitEnd, match, length1);
1302
94
      op = oLitEnd + length1;
1303
94
      sequence.matchLength -= length1;
1304
94
      match = base;
1305
94
      if (op > oend_w || sequence.matchLength < MINMATCH) {
1306
33
        U32 i;
1307
86
        for (i = 0; i < sequence.matchLength; ++i)
1308
53
          op[i] = match[i];
1309
33
        return sequenceLength;
1310
33
      }
1311
94
    }
1312
94
  }
1313
  /* Requirement: op <= oend_w && sequence.matchLength >= MINMATCH */
1314
1315
  /* match within prefix */
1316
4.79M
  if (sequence.offset < 8) {
1317
    /* close range match, overlap */
1318
4.76M
    static const U32 dec32table[] = {0, 1, 2, 1, 4, 4, 4, 4};   /* added */
1319
4.76M
    static const int dec64table[] = {8, 8, 8, 7, 8, 9, 10, 11}; /* subtracted */
1320
4.76M
    int const sub2 = dec64table[sequence.offset];
1321
4.76M
    op[0] = match[0];
1322
4.76M
    op[1] = match[1];
1323
4.76M
    op[2] = match[2];
1324
4.76M
    op[3] = match[3];
1325
4.76M
    match += dec32table[sequence.offset];
1326
4.76M
    ZSTD_copy4(op + 4, match);
1327
4.76M
    match -= sub2;
1328
4.76M
  } else {
1329
24.6k
    ZSTD_copy8(op, match);
1330
24.6k
  }
1331
4.79M
  op += 8;
1332
4.79M
  match += 8;
1333
1334
4.79M
  if (oMatchEnd > oend - (16 - MINMATCH)) {
1335
73
    if (op < oend_w) {
1336
53
      ZSTD_wildcopy(op, match, oend_w - op);
1337
53
      match += oend_w - op;
1338
53
      op = oend_w;
1339
53
    }
1340
274
    while (op < oMatchEnd)
1341
201
      *op++ = *match++;
1342
4.79M
  } else {
1343
4.79M
    ZSTD_wildcopy(op, match, (ptrdiff_t)sequence.matchLength - 8); /* works even if matchLength < 8 */
1344
4.79M
  }
1345
4.79M
  return sequenceLength;
1346
4.79M
}
1347
1348
static size_t ZSTD_decompressSequencesLong(ZSTD_DCtx *dctx, void *dst, size_t maxDstSize, const void *seqStart, size_t seqSize)
1349
10.5k
{
1350
10.5k
  const BYTE *ip = (const BYTE *)seqStart;
1351
10.5k
  const BYTE *const iend = ip + seqSize;
1352
10.5k
  BYTE *const ostart = (BYTE * const)dst;
1353
10.5k
  BYTE *const oend = ostart + maxDstSize;
1354
10.5k
  BYTE *op = ostart;
1355
10.5k
  const BYTE *litPtr = dctx->litPtr;
1356
10.5k
  const BYTE *const litEnd = litPtr + dctx->litSize;
1357
10.5k
  const BYTE *const base = (const BYTE *)(dctx->base);
1358
10.5k
  const BYTE *const vBase = (const BYTE *)(dctx->vBase);
1359
10.5k
  const BYTE *const dictEnd = (const BYTE *)(dctx->dictEnd);
1360
10.5k
  unsigned const windowSize = dctx->fParams.windowSize;
1361
10.5k
  int nbSeq;
1362
1363
  /* Build Decoding Tables */
1364
10.5k
  {
1365
10.5k
    size_t const seqHSize = ZSTD_decodeSeqHeaders(dctx, &nbSeq, ip, seqSize);
1366
10.5k
    if (ZSTD_isError(seqHSize))
1367
214
      return seqHSize;
1368
10.3k
    ip += seqHSize;
1369
10.3k
  }
1370
1371
  /* Regen sequences */
1372
10.3k
  if (nbSeq) {
1373
9.56M
#define STORED_SEQS 4
1374
9.56M
#define STOSEQ_MASK (STORED_SEQS - 1)
1375
4.77M
#define ADVANCED_SEQS 4
1376
9.08k
    seq_t *sequences = (seq_t *)dctx->entropy.workspace;
1377
9.08k
    int const seqAdvance = MIN(nbSeq, ADVANCED_SEQS);
1378
9.08k
    seqState_t seqState;
1379
9.08k
    int seqNb;
1380
9.08k
    ZSTD_STATIC_ASSERT(sizeof(dctx->entropy.workspace) >= sizeof(seq_t) * STORED_SEQS);
1381
9.08k
    dctx->fseEntropy = 1;
1382
9.08k
    {
1383
9.08k
      U32 i;
1384
36.3k
      for (i = 0; i < ZSTD_REP_NUM; i++)
1385
27.2k
        seqState.prevOffset[i] = dctx->entropy.rep[i];
1386
9.08k
    }
1387
9.08k
    seqState.base = base;
1388
9.08k
    seqState.pos = (size_t)(op - base);
1389
9.08k
    seqState.gotoDict = (uPtrDiff)dictEnd - (uPtrDiff)base; /* cast to avoid undefined behaviour */
1390
9.08k
    CHECK_E(BIT_initDStream(&seqState.DStream, ip, iend - ip), corruption_detected);
1391
8.88k
    FSE_initDState(&seqState.stateLL, &seqState.DStream, dctx->LLTptr);
1392
8.88k
    FSE_initDState(&seqState.stateOffb, &seqState.DStream, dctx->OFTptr);
1393
8.88k
    FSE_initDState(&seqState.stateML, &seqState.DStream, dctx->MLTptr);
1394
1395
    /* prepare in advance */
1396
29.8k
    for (seqNb = 0; (BIT_reloadDStream(&seqState.DStream) <= BIT_DStream_completed) && seqNb < seqAdvance; seqNb++) {
1397
21.0k
      sequences[seqNb] = ZSTD_decodeSequenceLong(&seqState, windowSize);
1398
21.0k
    }
1399
8.88k
    if (seqNb < seqAdvance)
1400
152
      return ERROR(corruption_detected);
1401
1402
    /* decode and decompress */
1403
4.78M
    for (; (BIT_reloadDStream(&(seqState.DStream)) <= BIT_DStream_completed) && seqNb < nbSeq; seqNb++) {
1404
4.77M
      seq_t const sequence = ZSTD_decodeSequenceLong(&seqState, windowSize);
1405
4.77M
      size_t const oneSeqSize =
1406
4.77M
          ZSTD_execSequenceLong(op, oend, sequences[(seqNb - ADVANCED_SEQS) & STOSEQ_MASK], &litPtr, litEnd, base, vBase, dictEnd);
1407
4.77M
      if (ZSTD_isError(oneSeqSize))
1408
255
        return oneSeqSize;
1409
4.77M
      ZSTD_PREFETCH(sequence.match);
1410
4.77M
      sequences[seqNb & STOSEQ_MASK] = sequence;
1411
4.77M
      op += oneSeqSize;
1412
4.77M
    }
1413
8.47k
    if (seqNb < nbSeq)
1414
228
      return ERROR(corruption_detected);
1415
1416
    /* finish queue */
1417
8.24k
    seqNb -= seqAdvance;
1418
26.7k
    for (; seqNb < nbSeq; seqNb++) {
1419
18.7k
      size_t const oneSeqSize = ZSTD_execSequenceLong(op, oend, sequences[seqNb & STOSEQ_MASK], &litPtr, litEnd, base, vBase, dictEnd);
1420
18.7k
      if (ZSTD_isError(oneSeqSize))
1421
208
        return oneSeqSize;
1422
18.5k
      op += oneSeqSize;
1423
18.5k
    }
1424
1425
    /* save reps for next block */
1426
8.04k
    {
1427
8.04k
      U32 i;
1428
32.1k
      for (i = 0; i < ZSTD_REP_NUM; i++)
1429
24.1k
        dctx->entropy.rep[i] = (U32)(seqState.prevOffset[i]);
1430
8.04k
    }
1431
8.04k
  }
1432
1433
  /* last literal segment */
1434
9.33k
  {
1435
9.33k
    size_t const lastLLSize = litEnd - litPtr;
1436
9.33k
    if (lastLLSize > (size_t)(oend - op))
1437
12
      return ERROR(dstSize_tooSmall);
1438
9.32k
    memcpy(op, litPtr, lastLLSize);
1439
9.32k
    op += lastLLSize;
1440
9.32k
  }
1441
1442
0
  return op - ostart;
1443
9.33k
}
1444
1445
static size_t ZSTD_decompressBlock_internal(ZSTD_DCtx *dctx, void *dst, size_t dstCapacity, const void *src, size_t srcSize)
1446
30.9k
{ /* blockType == blockCompressed */
1447
30.9k
  const BYTE *ip = (const BYTE *)src;
1448
1449
30.9k
  if (srcSize >= ZSTD_BLOCKSIZE_ABSOLUTEMAX)
1450
1
    return ERROR(srcSize_wrong);
1451
1452
  /* Decode literals section */
1453
30.9k
  {
1454
30.9k
    size_t const litCSize = ZSTD_decodeLiteralsBlock(dctx, src, srcSize);
1455
30.9k
    if (ZSTD_isError(litCSize))
1456
4.46k
      return litCSize;
1457
26.5k
    ip += litCSize;
1458
26.5k
    srcSize -= litCSize;
1459
26.5k
  }
1460
26.5k
  if (sizeof(size_t) > 4) /* do not enable prefetching on 32-bits x86, as it's performance detrimental */
1461
        /* likely because of register pressure */
1462
        /* if that's the correct cause, then 32-bits ARM should be affected differently */
1463
        /* it would be good to test this on ARM real hardware, to see if prefetch version improves speed */
1464
26.5k
    if (dctx->fParams.windowSize > (1 << 23))
1465
10.5k
      return ZSTD_decompressSequencesLong(dctx, dst, dstCapacity, ip, srcSize);
1466
15.9k
  return ZSTD_decompressSequences(dctx, dst, dstCapacity, ip, srcSize);
1467
26.5k
}
1468
1469
static void ZSTD_checkContinuity(ZSTD_DCtx *dctx, const void *dst)
1470
187k
{
1471
187k
  if (dst != dctx->previousDstEnd) { /* not contiguous */
1472
15.9k
    dctx->dictEnd = dctx->previousDstEnd;
1473
15.9k
    dctx->vBase = (const char *)dst - ((const char *)(dctx->previousDstEnd) - (const char *)(dctx->base));
1474
15.9k
    dctx->base = dst;
1475
15.9k
    dctx->previousDstEnd = dst;
1476
15.9k
  }
1477
187k
}
1478
1479
size_t ZSTD_decompressBlock(ZSTD_DCtx *dctx, void *dst, size_t dstCapacity, const void *src, size_t srcSize)
1480
0
{
1481
0
  size_t dSize;
1482
0
  ZSTD_checkContinuity(dctx, dst);
1483
0
  dSize = ZSTD_decompressBlock_internal(dctx, dst, dstCapacity, src, srcSize);
1484
0
  dctx->previousDstEnd = (char *)dst + dSize;
1485
0
  return dSize;
1486
0
}
1487
1488
/** ZSTD_insertBlock() :
1489
  insert `src` block into `dctx` history. Useful to track uncompressed blocks. */
1490
size_t ZSTD_insertBlock(ZSTD_DCtx *dctx, const void *blockStart, size_t blockSize)
1491
0
{
1492
0
  ZSTD_checkContinuity(dctx, blockStart);
1493
0
  dctx->previousDstEnd = (const char *)blockStart + blockSize;
1494
0
  return blockSize;
1495
0
}
1496
1497
static size_t ZSTD_generateNxBytes(void *dst, size_t dstCapacity, BYTE byte, size_t length)
1498
1.09k
{
1499
1.09k
  if (length > dstCapacity)
1500
44
    return ERROR(dstSize_tooSmall);
1501
1.05k
  memset(dst, byte, length);
1502
1.05k
  return length;
1503
1.09k
}
1504
1505
/** ZSTD_findFrameCompressedSize() :
1506
 *  compatible with legacy mode
1507
 *  `src` must point to the start of a ZSTD frame, ZSTD legacy frame, or skippable frame
1508
 *  `srcSize` must be at least as large as the frame contained
1509
 *  @return : the compressed size of the frame starting at `src` */
1510
size_t ZSTD_findFrameCompressedSize(const void *src, size_t srcSize)
1511
1.67k
{
1512
1.67k
  if (srcSize >= ZSTD_skippableHeaderSize && (ZSTD_readLE32(src) & 0xFFFFFFF0U) == ZSTD_MAGIC_SKIPPABLE_START) {
1513
0
    return ZSTD_skippableHeaderSize + ZSTD_readLE32((const BYTE *)src + 4);
1514
1.67k
  } else {
1515
1.67k
    const BYTE *ip = (const BYTE *)src;
1516
1.67k
    const BYTE *const ipstart = ip;
1517
1.67k
    size_t remainingSize = srcSize;
1518
1.67k
    ZSTD_frameParams fParams;
1519
1520
1.67k
    size_t const headerSize = ZSTD_frameHeaderSize(ip, remainingSize);
1521
1.67k
    if (ZSTD_isError(headerSize))
1522
0
      return headerSize;
1523
1524
    /* Frame Header */
1525
1.67k
    {
1526
1.67k
      size_t const ret = ZSTD_getFrameParams(&fParams, ip, remainingSize);
1527
1.67k
      if (ZSTD_isError(ret))
1528
0
        return ret;
1529
1.67k
      if (ret > 0)
1530
0
        return ERROR(srcSize_wrong);
1531
1.67k
    }
1532
1533
1.67k
    ip += headerSize;
1534
1.67k
    remainingSize -= headerSize;
1535
1536
    /* Loop on each block */
1537
387k
    while (1) {
1538
387k
      blockProperties_t blockProperties;
1539
387k
      size_t const cBlockSize = ZSTD_getcBlockSize(ip, remainingSize, &blockProperties);
1540
387k
      if (ZSTD_isError(cBlockSize))
1541
186
        return cBlockSize;
1542
1543
387k
      if (ZSTD_blockHeaderSize + cBlockSize > remainingSize)
1544
221
        return ERROR(srcSize_wrong);
1545
1546
386k
      ip += ZSTD_blockHeaderSize + cBlockSize;
1547
386k
      remainingSize -= ZSTD_blockHeaderSize + cBlockSize;
1548
1549
386k
      if (blockProperties.lastBlock)
1550
1.26k
        break;
1551
386k
    }
1552
1553
1.26k
    if (fParams.checksumFlag) { /* Frame content checksum */
1554
278
      if (remainingSize < 4)
1555
32
        return ERROR(srcSize_wrong);
1556
246
      ip += 4;
1557
246
      remainingSize -= 4;
1558
246
    }
1559
1560
1.23k
    return ip - ipstart;
1561
1.26k
  }
1562
1.67k
}
1563
1564
/*! ZSTD_decompressFrame() :
1565
*   @dctx must be properly initialized */
1566
static size_t ZSTD_decompressFrame(ZSTD_DCtx *dctx, void *dst, size_t dstCapacity, const void **srcPtr, size_t *srcSizePtr)
1567
1.23k
{
1568
1.23k
  const BYTE *ip = (const BYTE *)(*srcPtr);
1569
1.23k
  BYTE *const ostart = (BYTE * const)dst;
1570
1.23k
  BYTE *const oend = ostart + dstCapacity;
1571
1.23k
  BYTE *op = ostart;
1572
1.23k
  size_t remainingSize = *srcSizePtr;
1573
1574
  /* check */
1575
1.23k
  if (remainingSize < ZSTD_frameHeaderSize_min + ZSTD_blockHeaderSize)
1576
0
    return ERROR(srcSize_wrong);
1577
1578
  /* Frame Header */
1579
1.23k
  {
1580
1.23k
    size_t const frameHeaderSize = ZSTD_frameHeaderSize(ip, ZSTD_frameHeaderSize_prefix);
1581
1.23k
    if (ZSTD_isError(frameHeaderSize))
1582
0
      return frameHeaderSize;
1583
1.23k
    if (remainingSize < frameHeaderSize + ZSTD_blockHeaderSize)
1584
0
      return ERROR(srcSize_wrong);
1585
1.23k
    CHECK_F(ZSTD_decodeFrameHeader(dctx, ip, frameHeaderSize));
1586
1.10k
    ip += frameHeaderSize;
1587
1.10k
    remainingSize -= frameHeaderSize;
1588
1.10k
  }
1589
1590
  /* Loop on each block */
1591
174k
  while (1) {
1592
174k
    size_t decodedSize;
1593
174k
    blockProperties_t blockProperties;
1594
174k
    size_t const cBlockSize = ZSTD_getcBlockSize(ip, remainingSize, &blockProperties);
1595
174k
    if (ZSTD_isError(cBlockSize))
1596
0
      return cBlockSize;
1597
1598
174k
    ip += ZSTD_blockHeaderSize;
1599
174k
    remainingSize -= ZSTD_blockHeaderSize;
1600
174k
    if (cBlockSize > remainingSize)
1601
0
      return ERROR(srcSize_wrong);
1602
1603
174k
    switch (blockProperties.blockType) {
1604
1.24k
    case bt_compressed: decodedSize = ZSTD_decompressBlock_internal(dctx, op, oend - op, ip, cBlockSize); break;
1605
172k
    case bt_raw: decodedSize = ZSTD_copyRawBlock(op, oend - op, ip, cBlockSize); break;
1606
1.09k
    case bt_rle: decodedSize = ZSTD_generateNxBytes(op, oend - op, *ip, blockProperties.origSize); break;
1607
0
    case bt_reserved:
1608
0
    default: return ERROR(corruption_detected);
1609
174k
    }
1610
1611
174k
    if (ZSTD_isError(decodedSize))
1612
809
      return decodedSize;
1613
173k
    if (dctx->fParams.checksumFlag)
1614
13.7k
      xxh64_update(&dctx->xxhState, op, decodedSize);
1615
173k
    op += decodedSize;
1616
173k
    ip += cBlockSize;
1617
173k
    remainingSize -= cBlockSize;
1618
173k
    if (blockProperties.lastBlock)
1619
296
      break;
1620
173k
  }
1621
1622
296
  if (dctx->fParams.checksumFlag) { /* Frame content checksum verification */
1623
175
    U32 const checkCalc = (U32)xxh64_digest(&dctx->xxhState);
1624
175
    U32 checkRead;
1625
175
    if (remainingSize < 4)
1626
0
      return ERROR(checksum_wrong);
1627
175
    checkRead = ZSTD_readLE32(ip);
1628
175
    if (checkRead != checkCalc)
1629
173
      return ERROR(checksum_wrong);
1630
2
    ip += 4;
1631
2
    remainingSize -= 4;
1632
2
  }
1633
1634
  /* Allow caller to get size read */
1635
123
  *srcPtr = ip;
1636
123
  *srcSizePtr = remainingSize;
1637
123
  return op - ostart;
1638
296
}
1639
1640
static const void *ZSTD_DDictDictContent(const ZSTD_DDict *ddict);
1641
static size_t ZSTD_DDictDictSize(const ZSTD_DDict *ddict);
1642
1643
static size_t ZSTD_decompressMultiFrame(ZSTD_DCtx *dctx, void *dst, size_t dstCapacity, const void *src, size_t srcSize, const void *dict, size_t dictSize,
1644
          const ZSTD_DDict *ddict)
1645
1.23k
{
1646
1.23k
  void *const dststart = dst;
1647
1648
1.23k
  if (ddict) {
1649
0
    if (dict) {
1650
      /* programmer error, these two cases should be mutually exclusive */
1651
0
      return ERROR(GENERIC);
1652
0
    }
1653
1654
0
    dict = ZSTD_DDictDictContent(ddict);
1655
0
    dictSize = ZSTD_DDictDictSize(ddict);
1656
0
  }
1657
1658
1.35k
  while (srcSize >= ZSTD_frameHeaderSize_prefix) {
1659
1.23k
    U32 magicNumber;
1660
1661
1.23k
    magicNumber = ZSTD_readLE32(src);
1662
1.23k
    if (magicNumber != ZSTD_MAGICNUMBER) {
1663
0
      if ((magicNumber & 0xFFFFFFF0U) == ZSTD_MAGIC_SKIPPABLE_START) {
1664
0
        size_t skippableSize;
1665
0
        if (srcSize < ZSTD_skippableHeaderSize)
1666
0
          return ERROR(srcSize_wrong);
1667
0
        skippableSize = ZSTD_readLE32((const BYTE *)src + 4) + ZSTD_skippableHeaderSize;
1668
0
        if (srcSize < skippableSize) {
1669
0
          return ERROR(srcSize_wrong);
1670
0
        }
1671
1672
0
        src = (const BYTE *)src + skippableSize;
1673
0
        srcSize -= skippableSize;
1674
0
        continue;
1675
0
      } else {
1676
0
        return ERROR(prefix_unknown);
1677
0
      }
1678
0
    }
1679
1680
1.23k
    if (ddict) {
1681
      /* we were called from ZSTD_decompress_usingDDict */
1682
0
      ZSTD_refDDict(dctx, ddict);
1683
1.23k
    } else {
1684
      /* this will initialize correctly with no dict if dict == NULL, so
1685
       * use this in all cases but ddict */
1686
1.23k
      CHECK_F(ZSTD_decompressBegin_usingDict(dctx, dict, dictSize));
1687
1.23k
    }
1688
1.23k
    ZSTD_checkContinuity(dctx, dst);
1689
1690
1.23k
    {
1691
1.23k
      const size_t res = ZSTD_decompressFrame(dctx, dst, dstCapacity, &src, &srcSize);
1692
1.23k
      if (ZSTD_isError(res))
1693
1.11k
        return res;
1694
      /* don't need to bounds check this, ZSTD_decompressFrame will have
1695
       * already */
1696
123
      dst = (BYTE *)dst + res;
1697
123
      dstCapacity -= res;
1698
123
    }
1699
123
  }
1700
1701
123
  if (srcSize)
1702
0
    return ERROR(srcSize_wrong); /* input not entirely consumed */
1703
1704
123
  return (BYTE *)dst - (BYTE *)dststart;
1705
123
}
1706
1707
size_t ZSTD_decompress_usingDict(ZSTD_DCtx *dctx, void *dst, size_t dstCapacity, const void *src, size_t srcSize, const void *dict, size_t dictSize)
1708
0
{
1709
0
  return ZSTD_decompressMultiFrame(dctx, dst, dstCapacity, src, srcSize, dict, dictSize, NULL);
1710
0
}
1711
1712
size_t ZSTD_decompressDCtx(ZSTD_DCtx *dctx, void *dst, size_t dstCapacity, const void *src, size_t srcSize)
1713
0
{
1714
0
  return ZSTD_decompress_usingDict(dctx, dst, dstCapacity, src, srcSize, NULL, 0);
1715
0
}
1716
1717
/*-**************************************
1718
*   Advanced Streaming Decompression API
1719
*   Bufferless and synchronous
1720
****************************************/
1721
237k
size_t ZSTD_nextSrcSizeToDecompress(ZSTD_DCtx *dctx) { return dctx->expected; }
1722
1723
ZSTD_nextInputType_e ZSTD_nextInputType(ZSTD_DCtx *dctx)
1724
31.5k
{
1725
31.5k
  switch (dctx->stage) {
1726
0
  default: /* should not happen */
1727
0
  case ZSTDds_getFrameHeaderSize:
1728
0
  case ZSTDds_decodeFrameHeader: return ZSTDnit_frameHeader;
1729
30.3k
  case ZSTDds_decodeBlockHeader: return ZSTDnit_blockHeader;
1730
150
  case ZSTDds_decompressBlock: return ZSTDnit_block;
1731
76
  case ZSTDds_decompressLastBlock: return ZSTDnit_lastBlock;
1732
1.00k
  case ZSTDds_checkChecksum: return ZSTDnit_checksum;
1733
0
  case ZSTDds_decodeSkippableHeader:
1734
0
  case ZSTDds_skipFrame: return ZSTDnit_skippableFrame;
1735
31.5k
  }
1736
31.5k
}
1737
1738
186k
int ZSTD_isSkipFrame(ZSTD_DCtx *dctx) { return dctx->stage == ZSTDds_skipFrame; } /* for zbuff */
1739
1740
/** ZSTD_decompressContinue() :
1741
*   @return : nb of bytes generated into `dst` (necessarily <= `dstCapacity)
1742
*             or an error code, which can be tested using ZSTD_isError() */
1743
size_t ZSTD_decompressContinue(ZSTD_DCtx *dctx, void *dst, size_t dstCapacity, const void *src, size_t srcSize)
1744
203k
{
1745
  /* Sanity check */
1746
203k
  if (srcSize != dctx->expected)
1747
0
    return ERROR(srcSize_wrong);
1748
203k
  if (dstCapacity)
1749
186k
    ZSTD_checkContinuity(dctx, dst);
1750
1751
203k
  switch (dctx->stage) {
1752
8.46k
  case ZSTDds_getFrameHeaderSize:
1753
8.46k
    if (srcSize != ZSTD_frameHeaderSize_prefix)
1754
0
      return ERROR(srcSize_wrong);          /* impossible */
1755
8.46k
    if ((ZSTD_readLE32(src) & 0xFFFFFFF0U) == ZSTD_MAGIC_SKIPPABLE_START) { /* skippable frame */
1756
0
      memcpy(dctx->headerBuffer, src, ZSTD_frameHeaderSize_prefix);
1757
0
      dctx->expected = ZSTD_skippableHeaderSize - ZSTD_frameHeaderSize_prefix; /* magic number + skippable frame length */
1758
0
      dctx->stage = ZSTDds_decodeSkippableHeader;
1759
0
      return 0;
1760
0
    }
1761
8.46k
    dctx->headerSize = ZSTD_frameHeaderSize(src, ZSTD_frameHeaderSize_prefix);
1762
8.46k
    if (ZSTD_isError(dctx->headerSize))
1763
0
      return dctx->headerSize;
1764
8.46k
    memcpy(dctx->headerBuffer, src, ZSTD_frameHeaderSize_prefix);
1765
8.46k
    if (dctx->headerSize > ZSTD_frameHeaderSize_prefix) {
1766
8.46k
      dctx->expected = dctx->headerSize - ZSTD_frameHeaderSize_prefix;
1767
8.46k
      dctx->stage = ZSTDds_decodeFrameHeader;
1768
8.46k
      return 0;
1769
8.46k
    }
1770
0
    dctx->expected = 0; /* not necessary to copy more */
1771
1772
8.46k
  case ZSTDds_decodeFrameHeader:
1773
8.46k
    memcpy(dctx->headerBuffer + ZSTD_frameHeaderSize_prefix, src, dctx->expected);
1774
8.46k
    CHECK_F(ZSTD_decodeFrameHeader(dctx, dctx->headerBuffer, dctx->headerSize));
1775
8.17k
    dctx->expected = ZSTD_blockHeaderSize;
1776
8.17k
    dctx->stage = ZSTDds_decodeBlockHeader;
1777
8.17k
    return 0;
1778
1779
123k
  case ZSTDds_decodeBlockHeader: {
1780
123k
    blockProperties_t bp;
1781
123k
    size_t const cBlockSize = ZSTD_getcBlockSize(src, ZSTD_blockHeaderSize, &bp);
1782
123k
    if (ZSTD_isError(cBlockSize))
1783
117
      return cBlockSize;
1784
123k
    dctx->expected = cBlockSize;
1785
123k
    dctx->bType = bp.blockType;
1786
123k
    dctx->rleSize = bp.origSize;
1787
123k
    if (cBlockSize) {
1788
62.8k
      dctx->stage = bp.lastBlock ? ZSTDds_decompressLastBlock : ZSTDds_decompressBlock;
1789
62.8k
      return 0;
1790
62.8k
    }
1791
    /* empty block */
1792
60.6k
    if (bp.lastBlock) {
1793
22
      if (dctx->fParams.checksumFlag) {
1794
16
        dctx->expected = 4;
1795
16
        dctx->stage = ZSTDds_checkChecksum;
1796
16
      } else {
1797
6
        dctx->expected = 0; /* end of frame */
1798
6
        dctx->stage = ZSTDds_getFrameHeaderSize;
1799
6
      }
1800
60.6k
    } else {
1801
60.6k
      dctx->expected = 3; /* go directly to next header */
1802
60.6k
      dctx->stage = ZSTDds_decodeBlockHeader;
1803
60.6k
    }
1804
60.6k
    return 0;
1805
123k
  }
1806
2.29k
  case ZSTDds_decompressLastBlock:
1807
62.3k
  case ZSTDds_decompressBlock: {
1808
62.3k
    size_t rSize;
1809
62.3k
    switch (dctx->bType) {
1810
29.7k
    case bt_compressed: rSize = ZSTD_decompressBlock_internal(dctx, dst, dstCapacity, src, srcSize); break;
1811
6.18k
    case bt_raw: rSize = ZSTD_copyRawBlock(dst, dstCapacity, src, srcSize); break;
1812
26.4k
    case bt_rle: rSize = ZSTD_setRleBlock(dst, dstCapacity, src, srcSize, dctx->rleSize); break;
1813
0
    case bt_reserved: /* should never happen */
1814
0
    default: return ERROR(corruption_detected);
1815
62.3k
    }
1816
62.3k
    if (ZSTD_isError(rSize))
1817
6.67k
      return rSize;
1818
55.6k
    if (dctx->fParams.checksumFlag)
1819
24.4k
      xxh64_update(&dctx->xxhState, dst, rSize);
1820
1821
55.6k
    if (dctx->stage == ZSTDds_decompressLastBlock) { /* end of frame */
1822
398
      if (dctx->fParams.checksumFlag) { /* another round for frame checksum */
1823
253
        dctx->expected = 4;
1824
253
        dctx->stage = ZSTDds_checkChecksum;
1825
253
      } else {
1826
145
        dctx->expected = 0; /* ends here */
1827
145
        dctx->stage = ZSTDds_getFrameHeaderSize;
1828
145
      }
1829
55.3k
    } else {
1830
55.3k
      dctx->stage = ZSTDds_decodeBlockHeader;
1831
55.3k
      dctx->expected = ZSTD_blockHeaderSize;
1832
55.3k
      dctx->previousDstEnd = (char *)dst + rSize;
1833
55.3k
    }
1834
55.6k
    return rSize;
1835
62.3k
  }
1836
202
  case ZSTDds_checkChecksum: {
1837
202
    U32 const h32 = (U32)xxh64_digest(&dctx->xxhState);
1838
202
    U32 const check32 = ZSTD_readLE32(src); /* srcSize == 4, guaranteed by dctx->expected */
1839
202
    if (check32 != h32)
1840
200
      return ERROR(checksum_wrong);
1841
2
    dctx->expected = 0;
1842
2
    dctx->stage = ZSTDds_getFrameHeaderSize;
1843
2
    return 0;
1844
202
  }
1845
0
  case ZSTDds_decodeSkippableHeader: {
1846
0
    memcpy(dctx->headerBuffer + ZSTD_frameHeaderSize_prefix, src, dctx->expected);
1847
0
    dctx->expected = ZSTD_readLE32(dctx->headerBuffer + 4);
1848
0
    dctx->stage = ZSTDds_skipFrame;
1849
0
    return 0;
1850
202
  }
1851
0
  case ZSTDds_skipFrame: {
1852
0
    dctx->expected = 0;
1853
0
    dctx->stage = ZSTDds_getFrameHeaderSize;
1854
0
    return 0;
1855
202
  }
1856
0
  default:
1857
0
    return ERROR(GENERIC); /* impossible */
1858
203k
  }
1859
203k
}
1860
1861
static size_t ZSTD_refDictContent(ZSTD_DCtx *dctx, const void *dict, size_t dictSize)
1862
0
{
1863
0
  dctx->dictEnd = dctx->previousDstEnd;
1864
0
  dctx->vBase = (const char *)dict - ((const char *)(dctx->previousDstEnd) - (const char *)(dctx->base));
1865
0
  dctx->base = dict;
1866
0
  dctx->previousDstEnd = (const char *)dict + dictSize;
1867
0
  return 0;
1868
0
}
1869
1870
/* ZSTD_loadEntropy() :
1871
 * dict : must point at beginning of a valid zstd dictionary
1872
 * @return : size of entropy tables read */
1873
static size_t ZSTD_loadEntropy(ZSTD_entropyTables_t *entropy, const void *const dict, size_t const dictSize)
1874
0
{
1875
0
  const BYTE *dictPtr = (const BYTE *)dict;
1876
0
  const BYTE *const dictEnd = dictPtr + dictSize;
1877
1878
0
  if (dictSize <= 8)
1879
0
    return ERROR(dictionary_corrupted);
1880
0
  dictPtr += 8; /* skip header = magic + dictID */
1881
1882
0
  {
1883
0
    size_t const hSize = HUF_readDTableX4_wksp(entropy->hufTable, dictPtr, dictEnd - dictPtr, entropy->workspace, sizeof(entropy->workspace));
1884
0
    if (HUF_isError(hSize))
1885
0
      return ERROR(dictionary_corrupted);
1886
0
    dictPtr += hSize;
1887
0
  }
1888
1889
0
  {
1890
0
    short offcodeNCount[MaxOff + 1];
1891
0
    U32 offcodeMaxValue = MaxOff, offcodeLog;
1892
0
    size_t const offcodeHeaderSize = FSE_readNCount(offcodeNCount, &offcodeMaxValue, &offcodeLog, dictPtr, dictEnd - dictPtr);
1893
0
    if (FSE_isError(offcodeHeaderSize))
1894
0
      return ERROR(dictionary_corrupted);
1895
0
    if (offcodeLog > OffFSELog)
1896
0
      return ERROR(dictionary_corrupted);
1897
0
    CHECK_E(FSE_buildDTable_wksp(entropy->OFTable, offcodeNCount, offcodeMaxValue, offcodeLog, entropy->workspace, sizeof(entropy->workspace)), dictionary_corrupted);
1898
0
    dictPtr += offcodeHeaderSize;
1899
0
  }
1900
1901
0
  {
1902
0
    short matchlengthNCount[MaxML + 1];
1903
0
    unsigned matchlengthMaxValue = MaxML, matchlengthLog;
1904
0
    size_t const matchlengthHeaderSize = FSE_readNCount(matchlengthNCount, &matchlengthMaxValue, &matchlengthLog, dictPtr, dictEnd - dictPtr);
1905
0
    if (FSE_isError(matchlengthHeaderSize))
1906
0
      return ERROR(dictionary_corrupted);
1907
0
    if (matchlengthLog > MLFSELog)
1908
0
      return ERROR(dictionary_corrupted);
1909
0
    CHECK_E(FSE_buildDTable_wksp(entropy->MLTable, matchlengthNCount, matchlengthMaxValue, matchlengthLog, entropy->workspace, sizeof(entropy->workspace)), dictionary_corrupted);
1910
0
    dictPtr += matchlengthHeaderSize;
1911
0
  }
1912
1913
0
  {
1914
0
    short litlengthNCount[MaxLL + 1];
1915
0
    unsigned litlengthMaxValue = MaxLL, litlengthLog;
1916
0
    size_t const litlengthHeaderSize = FSE_readNCount(litlengthNCount, &litlengthMaxValue, &litlengthLog, dictPtr, dictEnd - dictPtr);
1917
0
    if (FSE_isError(litlengthHeaderSize))
1918
0
      return ERROR(dictionary_corrupted);
1919
0
    if (litlengthLog > LLFSELog)
1920
0
      return ERROR(dictionary_corrupted);
1921
0
    CHECK_E(FSE_buildDTable_wksp(entropy->LLTable, litlengthNCount, litlengthMaxValue, litlengthLog, entropy->workspace, sizeof(entropy->workspace)), dictionary_corrupted);
1922
0
    dictPtr += litlengthHeaderSize;
1923
0
  }
1924
1925
0
  if (dictPtr + 12 > dictEnd)
1926
0
    return ERROR(dictionary_corrupted);
1927
0
  {
1928
0
    int i;
1929
0
    size_t const dictContentSize = (size_t)(dictEnd - (dictPtr + 12));
1930
0
    for (i = 0; i < 3; i++) {
1931
0
      U32 const rep = ZSTD_readLE32(dictPtr);
1932
0
      dictPtr += 4;
1933
0
      if (rep == 0 || rep >= dictContentSize)
1934
0
        return ERROR(dictionary_corrupted);
1935
0
      entropy->rep[i] = rep;
1936
0
    }
1937
0
  }
1938
1939
0
  return dictPtr - (const BYTE *)dict;
1940
0
}
1941
1942
static size_t ZSTD_decompress_insertDictionary(ZSTD_DCtx *dctx, const void *dict, size_t dictSize)
1943
0
{
1944
0
  if (dictSize < 8)
1945
0
    return ZSTD_refDictContent(dctx, dict, dictSize);
1946
0
  {
1947
0
    U32 const magic = ZSTD_readLE32(dict);
1948
0
    if (magic != ZSTD_DICT_MAGIC) {
1949
0
      return ZSTD_refDictContent(dctx, dict, dictSize); /* pure content mode */
1950
0
    }
1951
0
  }
1952
0
  dctx->dictID = ZSTD_readLE32((const char *)dict + 4);
1953
1954
  /* load entropy tables */
1955
0
  {
1956
0
    size_t const eSize = ZSTD_loadEntropy(&dctx->entropy, dict, dictSize);
1957
0
    if (ZSTD_isError(eSize))
1958
0
      return ERROR(dictionary_corrupted);
1959
0
    dict = (const char *)dict + eSize;
1960
0
    dictSize -= eSize;
1961
0
  }
1962
0
  dctx->litEntropy = dctx->fseEntropy = 1;
1963
1964
  /* reference dictionary content */
1965
0
  return ZSTD_refDictContent(dctx, dict, dictSize);
1966
0
}
1967
1968
size_t ZSTD_decompressBegin_usingDict(ZSTD_DCtx *dctx, const void *dict, size_t dictSize)
1969
1.23k
{
1970
1.23k
  CHECK_F(ZSTD_decompressBegin(dctx));
1971
1.23k
  if (dict && dictSize)
1972
1.23k
    CHECK_E(ZSTD_decompress_insertDictionary(dctx, dict, dictSize), dictionary_corrupted);
1973
1.23k
  return 0;
1974
1.23k
}
1975
1976
/* ======   ZSTD_DDict   ====== */
1977
1978
struct ZSTD_DDict_s {
1979
  void *dictBuffer;
1980
  const void *dictContent;
1981
  size_t dictSize;
1982
  ZSTD_entropyTables_t entropy;
1983
  U32 dictID;
1984
  U32 entropyPresent;
1985
  ZSTD_customMem cMem;
1986
}; /* typedef'd to ZSTD_DDict within "zstd.h" */
1987
1988
0
size_t ZSTD_DDictWorkspaceBound(void) { return ZSTD_ALIGN(sizeof(ZSTD_stack)) + ZSTD_ALIGN(sizeof(ZSTD_DDict)); }
1989
1990
0
static const void *ZSTD_DDictDictContent(const ZSTD_DDict *ddict) { return ddict->dictContent; }
1991
1992
0
static size_t ZSTD_DDictDictSize(const ZSTD_DDict *ddict) { return ddict->dictSize; }
1993
1994
static void ZSTD_refDDict(ZSTD_DCtx *dstDCtx, const ZSTD_DDict *ddict)
1995
8.46k
{
1996
8.46k
  ZSTD_decompressBegin(dstDCtx); /* init */
1997
8.46k
  if (ddict) {          /* support refDDict on NULL */
1998
0
    dstDCtx->dictID = ddict->dictID;
1999
0
    dstDCtx->base = ddict->dictContent;
2000
0
    dstDCtx->vBase = ddict->dictContent;
2001
0
    dstDCtx->dictEnd = (const BYTE *)ddict->dictContent + ddict->dictSize;
2002
0
    dstDCtx->previousDstEnd = dstDCtx->dictEnd;
2003
0
    if (ddict->entropyPresent) {
2004
0
      dstDCtx->litEntropy = 1;
2005
0
      dstDCtx->fseEntropy = 1;
2006
0
      dstDCtx->LLTptr = ddict->entropy.LLTable;
2007
0
      dstDCtx->MLTptr = ddict->entropy.MLTable;
2008
0
      dstDCtx->OFTptr = ddict->entropy.OFTable;
2009
0
      dstDCtx->HUFptr = ddict->entropy.hufTable;
2010
0
      dstDCtx->entropy.rep[0] = ddict->entropy.rep[0];
2011
0
      dstDCtx->entropy.rep[1] = ddict->entropy.rep[1];
2012
0
      dstDCtx->entropy.rep[2] = ddict->entropy.rep[2];
2013
0
    } else {
2014
0
      dstDCtx->litEntropy = 0;
2015
0
      dstDCtx->fseEntropy = 0;
2016
0
    }
2017
0
  }
2018
8.46k
}
2019
2020
static size_t ZSTD_loadEntropy_inDDict(ZSTD_DDict *ddict)
2021
0
{
2022
0
  ddict->dictID = 0;
2023
0
  ddict->entropyPresent = 0;
2024
0
  if (ddict->dictSize < 8)
2025
0
    return 0;
2026
0
  {
2027
0
    U32 const magic = ZSTD_readLE32(ddict->dictContent);
2028
0
    if (magic != ZSTD_DICT_MAGIC)
2029
0
      return 0; /* pure content mode */
2030
0
  }
2031
0
  ddict->dictID = ZSTD_readLE32((const char *)ddict->dictContent + 4);
2032
2033
  /* load entropy tables */
2034
0
  CHECK_E(ZSTD_loadEntropy(&ddict->entropy, ddict->dictContent, ddict->dictSize), dictionary_corrupted);
2035
0
  ddict->entropyPresent = 1;
2036
0
  return 0;
2037
0
}
2038
2039
static ZSTD_DDict *ZSTD_createDDict_advanced(const void *dict, size_t dictSize, unsigned byReference, ZSTD_customMem customMem)
2040
0
{
2041
0
  if (!customMem.customAlloc || !customMem.customFree)
2042
0
    return NULL;
2043
2044
0
  {
2045
0
    ZSTD_DDict *const ddict = (ZSTD_DDict *)ZSTD_malloc(sizeof(ZSTD_DDict), customMem);
2046
0
    if (!ddict)
2047
0
      return NULL;
2048
0
    ddict->cMem = customMem;
2049
2050
0
    if ((byReference) || (!dict) || (!dictSize)) {
2051
0
      ddict->dictBuffer = NULL;
2052
0
      ddict->dictContent = dict;
2053
0
    } else {
2054
0
      void *const internalBuffer = ZSTD_malloc(dictSize, customMem);
2055
0
      if (!internalBuffer) {
2056
0
        ZSTD_freeDDict(ddict);
2057
0
        return NULL;
2058
0
      }
2059
0
      memcpy(internalBuffer, dict, dictSize);
2060
0
      ddict->dictBuffer = internalBuffer;
2061
0
      ddict->dictContent = internalBuffer;
2062
0
    }
2063
0
    ddict->dictSize = dictSize;
2064
0
    ddict->entropy.hufTable[0] = (HUF_DTable)((HufLog)*0x1000001); /* cover both little and big endian */
2065
    /* parse dictionary content */
2066
0
    {
2067
0
      size_t const errorCode = ZSTD_loadEntropy_inDDict(ddict);
2068
0
      if (ZSTD_isError(errorCode)) {
2069
0
        ZSTD_freeDDict(ddict);
2070
0
        return NULL;
2071
0
      }
2072
0
    }
2073
2074
0
    return ddict;
2075
0
  }
2076
0
}
2077
2078
/*! ZSTD_initDDict() :
2079
*   Create a digested dictionary, to start decompression without startup delay.
2080
*   `dict` content is copied inside DDict.
2081
*   Consequently, `dict` can be released after `ZSTD_DDict` creation */
2082
ZSTD_DDict *ZSTD_initDDict(const void *dict, size_t dictSize, void *workspace, size_t workspaceSize)
2083
0
{
2084
0
  ZSTD_customMem const stackMem = ZSTD_initStack(workspace, workspaceSize);
2085
0
  return ZSTD_createDDict_advanced(dict, dictSize, 1, stackMem);
2086
0
}
2087
2088
size_t ZSTD_freeDDict(ZSTD_DDict *ddict)
2089
9.69k
{
2090
9.69k
  if (ddict == NULL)
2091
9.69k
    return 0; /* support free on NULL */
2092
0
  {
2093
0
    ZSTD_customMem const cMem = ddict->cMem;
2094
0
    ZSTD_free(ddict->dictBuffer, cMem);
2095
0
    ZSTD_free(ddict, cMem);
2096
0
    return 0;
2097
9.69k
  }
2098
9.69k
}
2099
2100
/*! ZSTD_getDictID_fromDict() :
2101
 *  Provides the dictID stored within dictionary.
2102
 *  if @return == 0, the dictionary is not conformant with Zstandard specification.
2103
 *  It can still be loaded, but as a content-only dictionary. */
2104
unsigned ZSTD_getDictID_fromDict(const void *dict, size_t dictSize)
2105
0
{
2106
0
  if (dictSize < 8)
2107
0
    return 0;
2108
0
  if (ZSTD_readLE32(dict) != ZSTD_DICT_MAGIC)
2109
0
    return 0;
2110
0
  return ZSTD_readLE32((const char *)dict + 4);
2111
0
}
2112
2113
/*! ZSTD_getDictID_fromDDict() :
2114
 *  Provides the dictID of the dictionary loaded into `ddict`.
2115
 *  If @return == 0, the dictionary is not conformant to Zstandard specification, or empty.
2116
 *  Non-conformant dictionaries can still be loaded, but as content-only dictionaries. */
2117
unsigned ZSTD_getDictID_fromDDict(const ZSTD_DDict *ddict)
2118
0
{
2119
0
  if (ddict == NULL)
2120
0
    return 0;
2121
0
  return ZSTD_getDictID_fromDict(ddict->dictContent, ddict->dictSize);
2122
0
}
2123
2124
/*! ZSTD_getDictID_fromFrame() :
2125
 *  Provides the dictID required to decompressed the frame stored within `src`.
2126
 *  If @return == 0, the dictID could not be decoded.
2127
 *  This could for one of the following reasons :
2128
 *  - The frame does not require a dictionary to be decoded (most common case).
2129
 *  - The frame was built with dictID intentionally removed. Whatever dictionary is necessary is a hidden information.
2130
 *    Note : this use case also happens when using a non-conformant dictionary.
2131
 *  - `srcSize` is too small, and as a result, the frame header could not be decoded (only possible if `srcSize < ZSTD_FRAMEHEADERSIZE_MAX`).
2132
 *  - This is not a Zstandard frame.
2133
 *  When identifying the exact failure cause, it's possible to used ZSTD_getFrameParams(), which will provide a more precise error code. */
2134
unsigned ZSTD_getDictID_fromFrame(const void *src, size_t srcSize)
2135
0
{
2136
0
  ZSTD_frameParams zfp = {0, 0, 0, 0};
2137
0
  size_t const hError = ZSTD_getFrameParams(&zfp, src, srcSize);
2138
0
  if (ZSTD_isError(hError))
2139
0
    return 0;
2140
0
  return zfp.dictID;
2141
0
}
2142
2143
/*! ZSTD_decompress_usingDDict() :
2144
*   Decompression using a pre-digested Dictionary
2145
*   Use dictionary without significant overhead. */
2146
size_t ZSTD_decompress_usingDDict(ZSTD_DCtx *dctx, void *dst, size_t dstCapacity, const void *src, size_t srcSize, const ZSTD_DDict *ddict)
2147
1.23k
{
2148
  /* pass content and size in case legacy frames are encountered */
2149
1.23k
  return ZSTD_decompressMultiFrame(dctx, dst, dstCapacity, src, srcSize, NULL, 0, ddict);
2150
1.23k
}
2151
2152
/*=====================================
2153
*   Streaming decompression
2154
*====================================*/
2155
2156
typedef enum { zdss_init, zdss_loadHeader, zdss_read, zdss_load, zdss_flush } ZSTD_dStreamStage;
2157
2158
/* *** Resource management *** */
2159
struct ZSTD_DStream_s {
2160
  ZSTD_DCtx *dctx;
2161
  ZSTD_DDict *ddictLocal;
2162
  const ZSTD_DDict *ddict;
2163
  ZSTD_frameParams fParams;
2164
  ZSTD_dStreamStage stage;
2165
  char *inBuff;
2166
  size_t inBuffSize;
2167
  size_t inPos;
2168
  size_t maxWindowSize;
2169
  char *outBuff;
2170
  size_t outBuffSize;
2171
  size_t outStart;
2172
  size_t outEnd;
2173
  size_t blockSize;
2174
  BYTE headerBuffer[ZSTD_FRAMEHEADERSIZE_MAX]; /* tmp buffer to store frame header */
2175
  size_t lhSize;
2176
  ZSTD_customMem customMem;
2177
  void *legacyContext;
2178
  U32 previousLegacyVersion;
2179
  U32 legacyVersion;
2180
  U32 hostageByte;
2181
}; /* typedef'd to ZSTD_DStream within "zstd.h" */
2182
2183
size_t ZSTD_DStreamWorkspaceBound(size_t maxWindowSize)
2184
9.69k
{
2185
9.69k
  size_t const blockSize = MIN(maxWindowSize, ZSTD_BLOCKSIZE_ABSOLUTEMAX);
2186
9.69k
  size_t const inBuffSize = blockSize;
2187
9.69k
  size_t const outBuffSize = maxWindowSize + blockSize + WILDCOPY_OVERLENGTH * 2;
2188
9.69k
  return ZSTD_DCtxWorkspaceBound() + ZSTD_ALIGN(sizeof(ZSTD_DStream)) + ZSTD_ALIGN(inBuffSize) + ZSTD_ALIGN(outBuffSize);
2189
9.69k
}
2190
2191
static ZSTD_DStream *ZSTD_createDStream_advanced(ZSTD_customMem customMem)
2192
9.69k
{
2193
9.69k
  ZSTD_DStream *zds;
2194
2195
9.69k
  if (!customMem.customAlloc || !customMem.customFree)
2196
0
    return NULL;
2197
2198
9.69k
  zds = (ZSTD_DStream *)ZSTD_malloc(sizeof(ZSTD_DStream), customMem);
2199
9.69k
  if (zds == NULL)
2200
0
    return NULL;
2201
9.69k
  memset(zds, 0, sizeof(ZSTD_DStream));
2202
9.69k
  memcpy(&zds->customMem, &customMem, sizeof(ZSTD_customMem));
2203
9.69k
  zds->dctx = ZSTD_createDCtx_advanced(customMem);
2204
9.69k
  if (zds->dctx == NULL) {
2205
0
    ZSTD_freeDStream(zds);
2206
0
    return NULL;
2207
0
  }
2208
9.69k
  zds->stage = zdss_init;
2209
9.69k
  zds->maxWindowSize = ZSTD_MAXWINDOWSIZE_DEFAULT;
2210
9.69k
  return zds;
2211
9.69k
}
2212
2213
ZSTD_DStream *ZSTD_initDStream(size_t maxWindowSize, void *workspace, size_t workspaceSize)
2214
9.69k
{
2215
9.69k
  ZSTD_customMem const stackMem = ZSTD_initStack(workspace, workspaceSize);
2216
9.69k
  ZSTD_DStream *zds = ZSTD_createDStream_advanced(stackMem);
2217
9.69k
  if (!zds) {
2218
0
    return NULL;
2219
0
  }
2220
2221
9.69k
  zds->maxWindowSize = maxWindowSize;
2222
9.69k
  zds->stage = zdss_loadHeader;
2223
9.69k
  zds->lhSize = zds->inPos = zds->outStart = zds->outEnd = 0;
2224
9.69k
  ZSTD_freeDDict(zds->ddictLocal);
2225
9.69k
  zds->ddictLocal = NULL;
2226
9.69k
  zds->ddict = zds->ddictLocal;
2227
9.69k
  zds->legacyVersion = 0;
2228
9.69k
  zds->hostageByte = 0;
2229
2230
9.69k
  {
2231
9.69k
    size_t const blockSize = MIN(zds->maxWindowSize, ZSTD_BLOCKSIZE_ABSOLUTEMAX);
2232
9.69k
    size_t const neededOutSize = zds->maxWindowSize + blockSize + WILDCOPY_OVERLENGTH * 2;
2233
2234
9.69k
    zds->inBuff = (char *)ZSTD_malloc(blockSize, zds->customMem);
2235
9.69k
    zds->inBuffSize = blockSize;
2236
9.69k
    zds->outBuff = (char *)ZSTD_malloc(neededOutSize, zds->customMem);
2237
9.69k
    zds->outBuffSize = neededOutSize;
2238
9.69k
    if (zds->inBuff == NULL || zds->outBuff == NULL) {
2239
0
      ZSTD_freeDStream(zds);
2240
0
      return NULL;
2241
0
    }
2242
9.69k
  }
2243
9.69k
  return zds;
2244
9.69k
}
2245
2246
ZSTD_DStream *ZSTD_initDStream_usingDDict(size_t maxWindowSize, const ZSTD_DDict *ddict, void *workspace, size_t workspaceSize)
2247
0
{
2248
0
  ZSTD_DStream *zds = ZSTD_initDStream(maxWindowSize, workspace, workspaceSize);
2249
0
  if (zds) {
2250
0
    zds->ddict = ddict;
2251
0
  }
2252
0
  return zds;
2253
0
}
2254
2255
size_t ZSTD_freeDStream(ZSTD_DStream *zds)
2256
0
{
2257
0
  if (zds == NULL)
2258
0
    return 0; /* support free on null */
2259
0
  {
2260
0
    ZSTD_customMem const cMem = zds->customMem;
2261
0
    ZSTD_freeDCtx(zds->dctx);
2262
0
    zds->dctx = NULL;
2263
0
    ZSTD_freeDDict(zds->ddictLocal);
2264
0
    zds->ddictLocal = NULL;
2265
0
    ZSTD_free(zds->inBuff, cMem);
2266
0
    zds->inBuff = NULL;
2267
0
    ZSTD_free(zds->outBuff, cMem);
2268
0
    zds->outBuff = NULL;
2269
0
    ZSTD_free(zds, cMem);
2270
0
    return 0;
2271
0
  }
2272
0
}
2273
2274
/* *** Initialization *** */
2275
2276
0
size_t ZSTD_DStreamInSize(void) { return ZSTD_BLOCKSIZE_ABSOLUTEMAX + ZSTD_blockHeaderSize; }
2277
0
size_t ZSTD_DStreamOutSize(void) { return ZSTD_BLOCKSIZE_ABSOLUTEMAX; }
2278
2279
size_t ZSTD_resetDStream(ZSTD_DStream *zds)
2280
0
{
2281
0
  zds->stage = zdss_loadHeader;
2282
0
  zds->lhSize = zds->inPos = zds->outStart = zds->outEnd = 0;
2283
0
  zds->legacyVersion = 0;
2284
0
  zds->hostageByte = 0;
2285
0
  return ZSTD_frameHeaderSize_prefix;
2286
0
}
2287
2288
/* *****   Decompression   ***** */
2289
2290
ZSTD_STATIC size_t ZSTD_limitCopy(void *dst, size_t dstCapacity, const void *src, size_t srcSize)
2291
84.8k
{
2292
84.8k
  size_t const length = MIN(dstCapacity, srcSize);
2293
84.8k
  memcpy(dst, src, length);
2294
84.8k
  return length;
2295
84.8k
}
2296
2297
size_t ZSTD_decompressStream(ZSTD_DStream *zds, ZSTD_outBuffer *output, ZSTD_inBuffer *input)
2298
41.2k
{
2299
41.2k
  const char *const istart = (const char *)(input->src) + input->pos;
2300
41.2k
  const char *const iend = (const char *)(input->src) + input->size;
2301
41.2k
  const char *ip = istart;
2302
41.2k
  char *const ostart = (char *)(output->dst) + output->pos;
2303
41.2k
  char *const oend = (char *)(output->dst) + output->size;
2304
41.2k
  char *op = ostart;
2305
41.2k
  U32 someMoreWork = 1;
2306
2307
325k
  while (someMoreWork) {
2308
292k
    switch (zds->stage) {
2309
0
    case zdss_init:
2310
0
      ZSTD_resetDStream(zds); /* transparent reset on starting decoding a new frame */
2311
            /* fall-through */
2312
2313
29.0k
    case zdss_loadHeader: {
2314
29.0k
      size_t const hSize = ZSTD_getFrameParams(&zds->fParams, zds->headerBuffer, zds->lhSize);
2315
29.0k
      if (ZSTD_isError(hSize))
2316
0
        return hSize;
2317
29.0k
      if (hSize != 0) {          /* need more input */
2318
19.3k
        size_t const toLoad = hSize - zds->lhSize; /* if hSize!=0, hSize > zds->lhSize */
2319
19.3k
        if (toLoad > (size_t)(iend - ip)) { /* not enough input to load full header */
2320
0
          memcpy(zds->headerBuffer + zds->lhSize, ip, iend - ip);
2321
0
          zds->lhSize += iend - ip;
2322
0
          input->pos = input->size;
2323
0
          return (MAX(ZSTD_frameHeaderSize_min, hSize) - zds->lhSize) +
2324
0
                 ZSTD_blockHeaderSize; /* remaining header bytes + next block header */
2325
0
        }
2326
19.3k
        memcpy(zds->headerBuffer + zds->lhSize, ip, toLoad);
2327
19.3k
        zds->lhSize = hSize;
2328
19.3k
        ip += toLoad;
2329
19.3k
        break;
2330
19.3k
      }
2331
2332
      /* check for single-pass mode opportunity */
2333
9.69k
      if (zds->fParams.frameContentSize && zds->fParams.windowSize /* skippable frame if == 0 */
2334
2.20k
          && (U64)(size_t)(oend - op) >= zds->fParams.frameContentSize) {
2335
1.67k
        size_t const cSize = ZSTD_findFrameCompressedSize(istart, iend - istart);
2336
1.67k
        if (cSize <= (size_t)(iend - istart)) {
2337
1.23k
          size_t const decompressedSize = ZSTD_decompress_usingDDict(zds->dctx, op, oend - op, istart, cSize, zds->ddict);
2338
1.23k
          if (ZSTD_isError(decompressedSize))
2339
1.11k
            return decompressedSize;
2340
123
          ip = istart + cSize;
2341
123
          op += decompressedSize;
2342
123
          zds->dctx->expected = 0;
2343
123
          zds->stage = zdss_init;
2344
123
          someMoreWork = 0;
2345
123
          break;
2346
1.23k
        }
2347
1.67k
      }
2348
2349
      /* Consume header */
2350
8.46k
      ZSTD_refDDict(zds->dctx, zds->ddict);
2351
8.46k
      {
2352
8.46k
        size_t const h1Size = ZSTD_nextSrcSizeToDecompress(zds->dctx); /* == ZSTD_frameHeaderSize_prefix */
2353
8.46k
        CHECK_F(ZSTD_decompressContinue(zds->dctx, NULL, 0, zds->headerBuffer, h1Size));
2354
8.46k
        {
2355
8.46k
          size_t const h2Size = ZSTD_nextSrcSizeToDecompress(zds->dctx);
2356
8.46k
          CHECK_F(ZSTD_decompressContinue(zds->dctx, NULL, 0, zds->headerBuffer + h1Size, h2Size));
2357
8.17k
        }
2358
8.17k
      }
2359
2360
8.17k
      zds->fParams.windowSize = MAX(zds->fParams.windowSize, 1U << ZSTD_WINDOWLOG_ABSOLUTEMIN);
2361
8.17k
      if (zds->fParams.windowSize > zds->maxWindowSize)
2362
72
        return ERROR(frameParameter_windowTooLarge);
2363
2364
      /* Buffers are preallocated, but double check */
2365
8.10k
      {
2366
8.10k
        size_t const blockSize = MIN(zds->maxWindowSize, ZSTD_BLOCKSIZE_ABSOLUTEMAX);
2367
8.10k
        size_t const neededOutSize = zds->maxWindowSize + blockSize + WILDCOPY_OVERLENGTH * 2;
2368
8.10k
        if (zds->inBuffSize < blockSize) {
2369
0
          return ERROR(GENERIC);
2370
0
        }
2371
8.10k
        if (zds->outBuffSize < neededOutSize) {
2372
0
          return ERROR(GENERIC);
2373
0
        }
2374
8.10k
        zds->blockSize = blockSize;
2375
8.10k
      }
2376
0
      zds->stage = zdss_read;
2377
8.10k
    }
2378
    /* pass-through */
2379
2380
187k
    case zdss_read: {
2381
187k
      size_t const neededInSize = ZSTD_nextSrcSizeToDecompress(zds->dctx);
2382
187k
      if (neededInSize == 0) { /* end of frame */
2383
153
        zds->stage = zdss_init;
2384
153
        someMoreWork = 0;
2385
153
        break;
2386
153
      }
2387
187k
      if ((size_t)(iend - ip) >= neededInSize) { /* decode directly from src */
2388
186k
        const int isSkipFrame = ZSTD_isSkipFrame(zds->dctx);
2389
186k
        size_t const decodedSize = ZSTD_decompressContinue(zds->dctx, zds->outBuff + zds->outStart,
2390
186k
                       (isSkipFrame ? 0 : zds->outBuffSize - zds->outStart), ip, neededInSize);
2391
186k
        if (ZSTD_isError(decodedSize))
2392
6.99k
          return decodedSize;
2393
179k
        ip += neededInSize;
2394
179k
        if (!decodedSize && !isSkipFrame)
2395
126k
          break; /* this was just a header */
2396
52.9k
        zds->outEnd = zds->outStart + decodedSize;
2397
52.9k
        zds->stage = zdss_flush;
2398
52.9k
        break;
2399
179k
      }
2400
937
      if (ip == iend) {
2401
318
        someMoreWork = 0;
2402
318
        break;
2403
318
      } /* no more input */
2404
619
      zds->stage = zdss_load;
2405
      /* pass-through */
2406
619
    }
2407
2408
619
    case zdss_load: {
2409
619
      size_t const neededInSize = ZSTD_nextSrcSizeToDecompress(zds->dctx);
2410
619
      size_t const toLoad = neededInSize - zds->inPos; /* should always be <= remaining space within inBuff */
2411
619
      size_t loadedSize;
2412
619
      if (toLoad > zds->inBuffSize - zds->inPos)
2413
212
        return ERROR(corruption_detected); /* should never happen */
2414
407
      loadedSize = ZSTD_limitCopy(zds->inBuff + zds->inPos, toLoad, ip, iend - ip);
2415
407
      ip += loadedSize;
2416
407
      zds->inPos += loadedSize;
2417
407
      if (loadedSize < toLoad) {
2418
407
        someMoreWork = 0;
2419
407
        break;
2420
407
      } /* not enough input, wait for more */
2421
2422
      /* decode loaded input */
2423
0
      {
2424
0
        const int isSkipFrame = ZSTD_isSkipFrame(zds->dctx);
2425
0
        size_t const decodedSize = ZSTD_decompressContinue(zds->dctx, zds->outBuff + zds->outStart, zds->outBuffSize - zds->outStart,
2426
0
                       zds->inBuff, neededInSize);
2427
0
        if (ZSTD_isError(decodedSize))
2428
0
          return decodedSize;
2429
0
        zds->inPos = 0; /* input is consumed */
2430
0
        if (!decodedSize && !isSkipFrame) {
2431
0
          zds->stage = zdss_read;
2432
0
          break;
2433
0
        } /* this was just a header */
2434
0
        zds->outEnd = zds->outStart + decodedSize;
2435
0
        zds->stage = zdss_flush;
2436
        /* pass-through */
2437
0
      }
2438
0
    }
2439
2440
84.4k
    case zdss_flush: {
2441
84.4k
      size_t const toFlushSize = zds->outEnd - zds->outStart;
2442
84.4k
      size_t const flushedSize = ZSTD_limitCopy(op, oend - op, zds->outBuff + zds->outStart, toFlushSize);
2443
84.4k
      op += flushedSize;
2444
84.4k
      zds->outStart += flushedSize;
2445
84.4k
      if (flushedSize == toFlushSize) { /* flush completed */
2446
52.9k
        zds->stage = zdss_read;
2447
52.9k
        if (zds->outStart + zds->blockSize > zds->outBuffSize)
2448
6.54k
          zds->outStart = zds->outEnd = 0;
2449
52.9k
        break;
2450
52.9k
      }
2451
      /* cannot complete flush */
2452
31.5k
      someMoreWork = 0;
2453
31.5k
      break;
2454
84.4k
    }
2455
0
    default:
2456
0
      return ERROR(GENERIC); /* impossible */
2457
292k
    }
2458
292k
  }
2459
2460
  /* result */
2461
32.5k
  input->pos += (size_t)(ip - istart);
2462
32.5k
  output->pos += (size_t)(op - ostart);
2463
32.5k
  {
2464
32.5k
    size_t nextSrcSizeHint = ZSTD_nextSrcSizeToDecompress(zds->dctx);
2465
32.5k
    if (!nextSrcSizeHint) {         /* frame fully decoded */
2466
974
      if (zds->outEnd == zds->outStart) { /* output fully flushed */
2467
276
        if (zds->hostageByte) {
2468
86
          if (input->pos >= input->size) {
2469
0
            zds->stage = zdss_read;
2470
0
            return 1;
2471
0
          }       /* can't release hostage (not present) */
2472
86
          input->pos++; /* release hostage */
2473
86
        }
2474
276
        return 0;
2475
276
      }
2476
698
      if (!zds->hostageByte) { /* output not fully flushed; keep last byte as hostage; will be released when all output is flushed */
2477
86
        input->pos--;    /* note : pos > 0, otherwise, impossible to finish reading last block */
2478
86
        zds->hostageByte = 1;
2479
86
      }
2480
698
      return 1;
2481
974
    }
2482
31.5k
    nextSrcSizeHint += ZSTD_blockHeaderSize * (ZSTD_nextInputType(zds->dctx) == ZSTDnit_block); /* preload header of next block */
2483
31.5k
    if (zds->inPos > nextSrcSizeHint)
2484
0
      return ERROR(GENERIC); /* should never happen */
2485
31.5k
    nextSrcSizeHint -= zds->inPos; /* already loaded*/
2486
31.5k
    return nextSrcSizeHint;
2487
31.5k
  }
2488
31.5k
}
2489
2490
EXPORT_SYMBOL(ZSTD_DCtxWorkspaceBound);
2491
EXPORT_SYMBOL(ZSTD_initDCtx);
2492
EXPORT_SYMBOL(ZSTD_decompressDCtx);
2493
EXPORT_SYMBOL(ZSTD_decompress_usingDict);
2494
2495
EXPORT_SYMBOL(ZSTD_DDictWorkspaceBound);
2496
EXPORT_SYMBOL(ZSTD_initDDict);
2497
EXPORT_SYMBOL(ZSTD_decompress_usingDDict);
2498
2499
EXPORT_SYMBOL(ZSTD_DStreamWorkspaceBound);
2500
EXPORT_SYMBOL(ZSTD_initDStream);
2501
EXPORT_SYMBOL(ZSTD_initDStream_usingDDict);
2502
EXPORT_SYMBOL(ZSTD_resetDStream);
2503
EXPORT_SYMBOL(ZSTD_decompressStream);
2504
EXPORT_SYMBOL(ZSTD_DStreamInSize);
2505
EXPORT_SYMBOL(ZSTD_DStreamOutSize);
2506
2507
EXPORT_SYMBOL(ZSTD_findFrameCompressedSize);
2508
EXPORT_SYMBOL(ZSTD_getFrameContentSize);
2509
EXPORT_SYMBOL(ZSTD_findDecompressedSize);
2510
2511
EXPORT_SYMBOL(ZSTD_isFrame);
2512
EXPORT_SYMBOL(ZSTD_getDictID_fromDict);
2513
EXPORT_SYMBOL(ZSTD_getDictID_fromDDict);
2514
EXPORT_SYMBOL(ZSTD_getDictID_fromFrame);
2515
2516
EXPORT_SYMBOL(ZSTD_getFrameParams);
2517
EXPORT_SYMBOL(ZSTD_decompressBegin);
2518
EXPORT_SYMBOL(ZSTD_decompressBegin_usingDict);
2519
EXPORT_SYMBOL(ZSTD_copyDCtx);
2520
EXPORT_SYMBOL(ZSTD_nextSrcSizeToDecompress);
2521
EXPORT_SYMBOL(ZSTD_decompressContinue);
2522
EXPORT_SYMBOL(ZSTD_nextInputType);
2523
2524
EXPORT_SYMBOL(ZSTD_decompressBlock);
2525
EXPORT_SYMBOL(ZSTD_insertBlock);
2526
2527
MODULE_LICENSE("Dual BSD/GPL");
2528
MODULE_DESCRIPTION("Zstd Decompressor");