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