zstd-ruby 1.3.8.0 → 1.4.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +6 -5
- data/README.md +1 -1
- data/ext/zstdruby/libzstd/Makefile +133 -61
- data/ext/zstdruby/libzstd/README.md +51 -18
- data/ext/zstdruby/libzstd/common/bitstream.h +38 -39
- data/ext/zstdruby/libzstd/common/compiler.h +41 -6
- data/ext/zstdruby/libzstd/common/cpu.h +1 -1
- data/ext/zstdruby/libzstd/common/debug.c +11 -31
- data/ext/zstdruby/libzstd/common/debug.h +11 -31
- data/ext/zstdruby/libzstd/common/entropy_common.c +13 -33
- data/ext/zstdruby/libzstd/common/error_private.c +2 -1
- data/ext/zstdruby/libzstd/common/error_private.h +6 -2
- data/ext/zstdruby/libzstd/common/fse.h +13 -33
- data/ext/zstdruby/libzstd/common/fse_decompress.c +12 -35
- data/ext/zstdruby/libzstd/common/huf.h +15 -33
- data/ext/zstdruby/libzstd/common/mem.h +75 -2
- data/ext/zstdruby/libzstd/common/pool.c +8 -4
- data/ext/zstdruby/libzstd/common/pool.h +2 -2
- data/ext/zstdruby/libzstd/common/threading.c +52 -6
- data/ext/zstdruby/libzstd/common/threading.h +36 -4
- data/ext/zstdruby/libzstd/common/xxhash.c +25 -37
- data/ext/zstdruby/libzstd/common/xxhash.h +11 -31
- data/ext/zstdruby/libzstd/common/zstd_common.c +1 -1
- data/ext/zstdruby/libzstd/common/zstd_errors.h +2 -1
- data/ext/zstdruby/libzstd/common/zstd_internal.h +203 -22
- data/ext/zstdruby/libzstd/compress/fse_compress.c +19 -42
- data/ext/zstdruby/libzstd/compress/hist.c +15 -35
- data/ext/zstdruby/libzstd/compress/hist.h +12 -32
- data/ext/zstdruby/libzstd/compress/huf_compress.c +92 -92
- data/ext/zstdruby/libzstd/compress/zstd_compress.c +1460 -1472
- data/ext/zstdruby/libzstd/compress/zstd_compress_internal.h +330 -65
- data/ext/zstdruby/libzstd/compress/zstd_compress_literals.c +158 -0
- data/ext/zstdruby/libzstd/compress/zstd_compress_literals.h +29 -0
- data/ext/zstdruby/libzstd/compress/zstd_compress_sequences.c +419 -0
- data/ext/zstdruby/libzstd/compress/zstd_compress_sequences.h +54 -0
- data/ext/zstdruby/libzstd/compress/zstd_compress_superblock.c +845 -0
- data/ext/zstdruby/libzstd/compress/zstd_compress_superblock.h +32 -0
- data/ext/zstdruby/libzstd/compress/zstd_cwksp.h +525 -0
- data/ext/zstdruby/libzstd/compress/zstd_double_fast.c +65 -43
- data/ext/zstdruby/libzstd/compress/zstd_double_fast.h +2 -2
- data/ext/zstdruby/libzstd/compress/zstd_fast.c +264 -159
- data/ext/zstdruby/libzstd/compress/zstd_fast.h +2 -2
- data/ext/zstdruby/libzstd/compress/zstd_lazy.c +74 -42
- data/ext/zstdruby/libzstd/compress/zstd_lazy.h +2 -2
- data/ext/zstdruby/libzstd/compress/zstd_ldm.c +33 -11
- data/ext/zstdruby/libzstd/compress/zstd_ldm.h +7 -2
- data/ext/zstdruby/libzstd/compress/zstd_opt.c +108 -125
- data/ext/zstdruby/libzstd/compress/zstd_opt.h +1 -1
- data/ext/zstdruby/libzstd/compress/zstdmt_compress.c +129 -93
- data/ext/zstdruby/libzstd/compress/zstdmt_compress.h +46 -28
- data/ext/zstdruby/libzstd/decompress/huf_decompress.c +76 -60
- data/ext/zstdruby/libzstd/decompress/zstd_ddict.c +14 -10
- data/ext/zstdruby/libzstd/decompress/zstd_ddict.h +2 -2
- data/ext/zstdruby/libzstd/decompress/zstd_decompress.c +471 -258
- data/ext/zstdruby/libzstd/decompress/zstd_decompress_block.c +471 -346
- data/ext/zstdruby/libzstd/decompress/zstd_decompress_block.h +3 -3
- data/ext/zstdruby/libzstd/decompress/zstd_decompress_internal.h +25 -4
- data/ext/zstdruby/libzstd/deprecated/zbuff.h +9 -8
- data/ext/zstdruby/libzstd/deprecated/zbuff_common.c +2 -2
- data/ext/zstdruby/libzstd/deprecated/zbuff_compress.c +1 -1
- data/ext/zstdruby/libzstd/deprecated/zbuff_decompress.c +1 -1
- data/ext/zstdruby/libzstd/dictBuilder/cover.c +220 -65
- data/ext/zstdruby/libzstd/dictBuilder/cover.h +81 -7
- data/ext/zstdruby/libzstd/dictBuilder/fastcover.c +85 -56
- data/ext/zstdruby/libzstd/dictBuilder/zdict.c +43 -19
- data/ext/zstdruby/libzstd/dictBuilder/zdict.h +73 -35
- data/ext/zstdruby/libzstd/dll/example/Makefile +2 -1
- data/ext/zstdruby/libzstd/dll/example/build_package.bat +3 -2
- data/ext/zstdruby/libzstd/legacy/zstd_legacy.h +49 -15
- data/ext/zstdruby/libzstd/legacy/zstd_v01.c +142 -117
- data/ext/zstdruby/libzstd/legacy/zstd_v01.h +13 -8
- data/ext/zstdruby/libzstd/legacy/zstd_v02.c +54 -25
- data/ext/zstdruby/libzstd/legacy/zstd_v02.h +13 -8
- data/ext/zstdruby/libzstd/legacy/zstd_v03.c +55 -25
- data/ext/zstdruby/libzstd/legacy/zstd_v03.h +13 -8
- data/ext/zstdruby/libzstd/legacy/zstd_v04.c +62 -29
- data/ext/zstdruby/libzstd/legacy/zstd_v04.h +13 -8
- data/ext/zstdruby/libzstd/legacy/zstd_v05.c +145 -109
- data/ext/zstdruby/libzstd/legacy/zstd_v05.h +14 -9
- data/ext/zstdruby/libzstd/legacy/zstd_v06.c +56 -26
- data/ext/zstdruby/libzstd/legacy/zstd_v06.h +11 -6
- data/ext/zstdruby/libzstd/legacy/zstd_v07.c +65 -28
- data/ext/zstdruby/libzstd/legacy/zstd_v07.h +11 -6
- data/ext/zstdruby/libzstd/libzstd.pc.in +3 -2
- data/ext/zstdruby/libzstd/zstd.h +921 -597
- data/lib/zstd-ruby/version.rb +1 -1
- data/zstd-ruby.gemspec +2 -2
- metadata +19 -14
- data/ext/zstdruby/libzstd/dll/libzstd.def +0 -87
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* Copyright (c) 2016-
|
|
2
|
+
* Copyright (c) 2016-2020, Yann Collet, Facebook, Inc.
|
|
3
3
|
* All rights reserved.
|
|
4
4
|
*
|
|
5
5
|
* This source code is licensed under both the BSD-style license (found in the
|
|
@@ -35,13 +35,18 @@ ZSTDv03_decompress() : decompress ZSTD frames compliant with v0.3.x format
|
|
|
35
35
|
size_t ZSTDv03_decompress( void* dst, size_t maxOriginalSize,
|
|
36
36
|
const void* src, size_t compressedSize);
|
|
37
37
|
|
|
38
|
-
/**
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
38
|
+
/**
|
|
39
|
+
ZSTDv03_findFrameSizeInfoLegacy() : get the source length and decompressed bound of a ZSTD frame compliant with v0.3.x format
|
|
40
|
+
srcSize : The size of the 'src' buffer, at least as large as the frame pointed to by 'src'
|
|
41
|
+
cSize (output parameter) : the number of bytes that would be read to decompress this frame
|
|
42
|
+
or an error code if it fails (which can be tested using ZSTDv01_isError())
|
|
43
|
+
dBound (output parameter) : an upper-bound for the decompressed size of the data in the frame
|
|
44
|
+
or ZSTD_CONTENTSIZE_ERROR if an error occurs
|
|
45
|
+
|
|
46
|
+
note : assumes `cSize` and `dBound` are _not_ NULL.
|
|
47
|
+
*/
|
|
48
|
+
void ZSTDv03_findFrameSizeInfoLegacy(const void *src, size_t srcSize,
|
|
49
|
+
size_t* cSize, unsigned long long* dBound);
|
|
45
50
|
|
|
46
51
|
/**
|
|
47
52
|
ZSTDv03_isError() : tells if the result of ZSTDv03_decompress() is an error
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* Copyright (c) 2016-
|
|
2
|
+
* Copyright (c) 2016-2020, Yann Collet, Facebook, Inc.
|
|
3
3
|
* All rights reserved.
|
|
4
4
|
*
|
|
5
5
|
* This source code is licensed under both the BSD-style license (found in the
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
#include <string.h> /* memcpy */
|
|
17
17
|
|
|
18
18
|
#include "zstd_v04.h"
|
|
19
|
-
#include "error_private.h"
|
|
19
|
+
#include "../common/error_private.h"
|
|
20
20
|
|
|
21
21
|
|
|
22
22
|
/* ******************************************************************
|
|
@@ -161,7 +161,7 @@ MEM_STATIC void MEM_write16(void* memPtr, U16 value)
|
|
|
161
161
|
memcpy(memPtr, &value, sizeof(value));
|
|
162
162
|
}
|
|
163
163
|
|
|
164
|
-
#endif
|
|
164
|
+
#endif /* MEM_FORCE_MEMORY_ACCESS */
|
|
165
165
|
|
|
166
166
|
|
|
167
167
|
MEM_STATIC U16 MEM_readLE16(const void* memPtr)
|
|
@@ -189,6 +189,11 @@ MEM_STATIC void MEM_writeLE16(void* memPtr, U16 val)
|
|
|
189
189
|
}
|
|
190
190
|
}
|
|
191
191
|
|
|
192
|
+
MEM_STATIC U32 MEM_readLE24(const void* memPtr)
|
|
193
|
+
{
|
|
194
|
+
return MEM_readLE16(memPtr) + (((const BYTE*)memPtr)[2] << 16);
|
|
195
|
+
}
|
|
196
|
+
|
|
192
197
|
MEM_STATIC U32 MEM_readLE32(const void* memPtr)
|
|
193
198
|
{
|
|
194
199
|
if (MEM_isLittleEndian())
|
|
@@ -373,6 +378,8 @@ static const size_t ZSTD_frameHeaderSize_min = 5;
|
|
|
373
378
|
#define MIN_SEQUENCES_SIZE (2 /*seqNb*/ + 2 /*dumps*/ + 3 /*seqTables*/ + 1 /*bitStream*/)
|
|
374
379
|
#define MIN_CBLOCK_SIZE (3 /*litCSize*/ + MIN_SEQUENCES_SIZE)
|
|
375
380
|
|
|
381
|
+
#define ZSTD_CONTENTSIZE_ERROR (0ULL - 2)
|
|
382
|
+
|
|
376
383
|
typedef enum { bt_compressed, bt_raw, bt_rle, bt_end } blockType_t;
|
|
377
384
|
|
|
378
385
|
|
|
@@ -620,7 +627,7 @@ MEM_STATIC unsigned BIT_highbit32 (U32 val)
|
|
|
620
627
|
_BitScanReverse ( &r, val );
|
|
621
628
|
return (unsigned) r;
|
|
622
629
|
# elif defined(__GNUC__) && (__GNUC__ >= 3) /* Use GCC Intrinsic */
|
|
623
|
-
return
|
|
630
|
+
return __builtin_clz (val) ^ 31;
|
|
624
631
|
# else /* Software version */
|
|
625
632
|
static const unsigned DeBruijnClz[32] = { 0, 9, 1, 10, 13, 21, 2, 29, 11, 14, 16, 18, 22, 25, 3, 30, 8, 12, 20, 28, 15, 17, 24, 7, 19, 27, 23, 6, 26, 5, 4, 31 };
|
|
626
633
|
U32 v = val;
|
|
@@ -2596,7 +2603,9 @@ static size_t ZSTD_getcBlockSize(const void* src, size_t srcSize, blockPropertie
|
|
|
2596
2603
|
static size_t ZSTD_copyRawBlock(void* dst, size_t maxDstSize, const void* src, size_t srcSize)
|
|
2597
2604
|
{
|
|
2598
2605
|
if (srcSize > maxDstSize) return ERROR(dstSize_tooSmall);
|
|
2599
|
-
|
|
2606
|
+
if (srcSize > 0) {
|
|
2607
|
+
memcpy(dst, src, srcSize);
|
|
2608
|
+
}
|
|
2600
2609
|
return srcSize;
|
|
2601
2610
|
}
|
|
2602
2611
|
|
|
@@ -2648,6 +2657,7 @@ static size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx,
|
|
|
2648
2657
|
const size_t litSize = (MEM_readLE32(istart) & 0xFFFFFF) >> 2; /* no buffer issue : srcSize >= MIN_CBLOCK_SIZE */
|
|
2649
2658
|
if (litSize > srcSize-11) /* risk of reading too far with wildcopy */
|
|
2650
2659
|
{
|
|
2660
|
+
if (litSize > BLOCKSIZE) return ERROR(corruption_detected);
|
|
2651
2661
|
if (litSize > srcSize-3) return ERROR(corruption_detected);
|
|
2652
2662
|
memcpy(dctx->litBuffer, istart, litSize);
|
|
2653
2663
|
dctx->litPtr = dctx->litBuffer;
|
|
@@ -2806,13 +2816,12 @@ static void ZSTD_decodeSequence(seq_t* seq, seqState_t* seqState)
|
|
|
2806
2816
|
litLength = FSE_decodeSymbol(&(seqState->stateLL), &(seqState->DStream));
|
|
2807
2817
|
prevOffset = litLength ? seq->offset : seqState->prevOffset;
|
|
2808
2818
|
if (litLength == MaxLL) {
|
|
2809
|
-
U32 add = *dumps
|
|
2819
|
+
const U32 add = dumps<de ? *dumps++ : 0;
|
|
2810
2820
|
if (add < 255) litLength += add;
|
|
2811
|
-
else {
|
|
2812
|
-
litLength =
|
|
2821
|
+
else if (dumps + 3 <= de) {
|
|
2822
|
+
litLength = MEM_readLE24(dumps);
|
|
2813
2823
|
dumps += 3;
|
|
2814
2824
|
}
|
|
2815
|
-
if (dumps > de) { litLength = MaxLL+255; } /* late correction, to avoid using uninitialized memory */
|
|
2816
2825
|
if (dumps >= de) { dumps = de-1; } /* late correction, to avoid read overflow (data is now corrupted anyway) */
|
|
2817
2826
|
}
|
|
2818
2827
|
|
|
@@ -2835,13 +2844,12 @@ static void ZSTD_decodeSequence(seq_t* seq, seqState_t* seqState)
|
|
|
2835
2844
|
/* MatchLength */
|
|
2836
2845
|
matchLength = FSE_decodeSymbol(&(seqState->stateML), &(seqState->DStream));
|
|
2837
2846
|
if (matchLength == MaxML) {
|
|
2838
|
-
U32 add = *dumps
|
|
2847
|
+
const U32 add = dumps<de ? *dumps++ : 0;
|
|
2839
2848
|
if (add < 255) matchLength += add;
|
|
2840
|
-
else {
|
|
2841
|
-
matchLength =
|
|
2849
|
+
else if (dumps + 3 <= de){
|
|
2850
|
+
matchLength = MEM_readLE24(dumps);
|
|
2842
2851
|
dumps += 3;
|
|
2843
2852
|
}
|
|
2844
|
-
if (dumps > de) { matchLength = MaxML+255; } /* late correction, to avoid using uninitialized memory */
|
|
2845
2853
|
if (dumps >= de) { dumps = de-1; } /* late correction, to avoid read overflow (data is now corrupted anyway) */
|
|
2846
2854
|
}
|
|
2847
2855
|
matchLength += MINMATCH;
|
|
@@ -2860,7 +2868,7 @@ static size_t ZSTD_execSequence(BYTE* op,
|
|
|
2860
2868
|
const BYTE* const base, const BYTE* const vBase, const BYTE* const dictEnd)
|
|
2861
2869
|
{
|
|
2862
2870
|
static const int dec32table[] = { 0, 1, 2, 1, 4, 4, 4, 4 }; /* added */
|
|
2863
|
-
static const int dec64table[] = { 8, 8, 8, 7, 8, 9,10,11 }; /*
|
|
2871
|
+
static const int dec64table[] = { 8, 8, 8, 7, 8, 9,10,11 }; /* subtracted */
|
|
2864
2872
|
BYTE* const oLitEnd = op + sequence.litLength;
|
|
2865
2873
|
const size_t sequenceLength = sequence.litLength + sequence.matchLength;
|
|
2866
2874
|
BYTE* const oMatchEnd = op + sequenceLength; /* risk : address space overflow (32-bits) */
|
|
@@ -3002,8 +3010,10 @@ static size_t ZSTD_decompressSequences(
|
|
|
3002
3010
|
size_t lastLLSize = litEnd - litPtr;
|
|
3003
3011
|
if (litPtr > litEnd) return ERROR(corruption_detected);
|
|
3004
3012
|
if (op+lastLLSize > oend) return ERROR(dstSize_tooSmall);
|
|
3005
|
-
if (
|
|
3006
|
-
|
|
3013
|
+
if (lastLLSize > 0) {
|
|
3014
|
+
if (op != litPtr) memcpy(op, litPtr, lastLLSize);
|
|
3015
|
+
op += lastLLSize;
|
|
3016
|
+
}
|
|
3007
3017
|
}
|
|
3008
3018
|
}
|
|
3009
3019
|
|
|
@@ -3029,9 +3039,12 @@ static size_t ZSTD_decompressBlock_internal(ZSTD_DCtx* dctx,
|
|
|
3029
3039
|
{
|
|
3030
3040
|
/* blockType == blockCompressed */
|
|
3031
3041
|
const BYTE* ip = (const BYTE*)src;
|
|
3042
|
+
size_t litCSize;
|
|
3043
|
+
|
|
3044
|
+
if (srcSize > BLOCKSIZE) return ERROR(corruption_detected);
|
|
3032
3045
|
|
|
3033
3046
|
/* Decode literals sub-block */
|
|
3034
|
-
|
|
3047
|
+
litCSize = ZSTD_decodeLiteralsBlock(dctx, src, srcSize);
|
|
3035
3048
|
if (ZSTD_isError(litCSize)) return litCSize;
|
|
3036
3049
|
ip += litCSize;
|
|
3037
3050
|
srcSize -= litCSize;
|
|
@@ -3119,34 +3132,57 @@ static size_t ZSTD_decompress_usingDict(ZSTD_DCtx* ctx,
|
|
|
3119
3132
|
return op-ostart;
|
|
3120
3133
|
}
|
|
3121
3134
|
|
|
3122
|
-
|
|
3135
|
+
/* ZSTD_errorFrameSizeInfoLegacy() :
|
|
3136
|
+
assumes `cSize` and `dBound` are _not_ NULL */
|
|
3137
|
+
static void ZSTD_errorFrameSizeInfoLegacy(size_t* cSize, unsigned long long* dBound, size_t ret)
|
|
3138
|
+
{
|
|
3139
|
+
*cSize = ret;
|
|
3140
|
+
*dBound = ZSTD_CONTENTSIZE_ERROR;
|
|
3141
|
+
}
|
|
3142
|
+
|
|
3143
|
+
void ZSTDv04_findFrameSizeInfoLegacy(const void *src, size_t srcSize, size_t* cSize, unsigned long long* dBound)
|
|
3123
3144
|
{
|
|
3124
3145
|
const BYTE* ip = (const BYTE*)src;
|
|
3125
3146
|
size_t remainingSize = srcSize;
|
|
3147
|
+
size_t nbBlocks = 0;
|
|
3126
3148
|
blockProperties_t blockProperties;
|
|
3127
3149
|
|
|
3128
3150
|
/* Frame Header */
|
|
3129
|
-
if (srcSize < ZSTD_frameHeaderSize_min)
|
|
3130
|
-
|
|
3151
|
+
if (srcSize < ZSTD_frameHeaderSize_min) {
|
|
3152
|
+
ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(srcSize_wrong));
|
|
3153
|
+
return;
|
|
3154
|
+
}
|
|
3155
|
+
if (MEM_readLE32(src) != ZSTD_MAGICNUMBER) {
|
|
3156
|
+
ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(prefix_unknown));
|
|
3157
|
+
return;
|
|
3158
|
+
}
|
|
3131
3159
|
ip += ZSTD_frameHeaderSize_min; remainingSize -= ZSTD_frameHeaderSize_min;
|
|
3132
3160
|
|
|
3133
3161
|
/* Loop on each block */
|
|
3134
3162
|
while (1)
|
|
3135
3163
|
{
|
|
3136
3164
|
size_t cBlockSize = ZSTD_getcBlockSize(ip, remainingSize, &blockProperties);
|
|
3137
|
-
if (ZSTD_isError(cBlockSize))
|
|
3165
|
+
if (ZSTD_isError(cBlockSize)) {
|
|
3166
|
+
ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, cBlockSize);
|
|
3167
|
+
return;
|
|
3168
|
+
}
|
|
3138
3169
|
|
|
3139
3170
|
ip += ZSTD_blockHeaderSize;
|
|
3140
3171
|
remainingSize -= ZSTD_blockHeaderSize;
|
|
3141
|
-
if (cBlockSize > remainingSize)
|
|
3172
|
+
if (cBlockSize > remainingSize) {
|
|
3173
|
+
ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(srcSize_wrong));
|
|
3174
|
+
return;
|
|
3175
|
+
}
|
|
3142
3176
|
|
|
3143
3177
|
if (cBlockSize == 0) break; /* bt_end */
|
|
3144
3178
|
|
|
3145
3179
|
ip += cBlockSize;
|
|
3146
3180
|
remainingSize -= cBlockSize;
|
|
3181
|
+
nbBlocks++;
|
|
3147
3182
|
}
|
|
3148
3183
|
|
|
3149
|
-
|
|
3184
|
+
*cSize = ip - (const BYTE*)src;
|
|
3185
|
+
*dBound = nbBlocks * BLOCKSIZE;
|
|
3150
3186
|
}
|
|
3151
3187
|
|
|
3152
3188
|
/* ******************************
|
|
@@ -3375,7 +3411,9 @@ static size_t ZBUFF_decompressWithDictionary(ZBUFF_DCtx* zbc, const void* src, s
|
|
|
3375
3411
|
static size_t ZBUFF_limitCopy(void* dst, size_t maxDstSize, const void* src, size_t srcSize)
|
|
3376
3412
|
{
|
|
3377
3413
|
size_t length = MIN(maxDstSize, srcSize);
|
|
3378
|
-
|
|
3414
|
+
if (length > 0) {
|
|
3415
|
+
memcpy(dst, src, length);
|
|
3416
|
+
}
|
|
3379
3417
|
return length;
|
|
3380
3418
|
}
|
|
3381
3419
|
|
|
@@ -3578,11 +3616,6 @@ size_t ZSTDv04_decompress(void* dst, size_t maxDstSize, const void* src, size_t
|
|
|
3578
3616
|
#endif
|
|
3579
3617
|
}
|
|
3580
3618
|
|
|
3581
|
-
size_t ZSTDv04_findFrameCompressedSize(const void* src, size_t srcSize)
|
|
3582
|
-
{
|
|
3583
|
-
return ZSTD_findFrameCompressedSize(src, srcSize);
|
|
3584
|
-
}
|
|
3585
|
-
|
|
3586
3619
|
size_t ZSTDv04_resetDCtx(ZSTDv04_Dctx* dctx) { return ZSTD_resetDCtx(dctx); }
|
|
3587
3620
|
|
|
3588
3621
|
size_t ZSTDv04_nextSrcSizeToDecompress(ZSTDv04_Dctx* dctx)
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* Copyright (c) 2016-
|
|
2
|
+
* Copyright (c) 2016-2020, Yann Collet, Facebook, Inc.
|
|
3
3
|
* All rights reserved.
|
|
4
4
|
*
|
|
5
5
|
* This source code is licensed under both the BSD-style license (found in the
|
|
@@ -35,13 +35,18 @@ ZSTDv04_decompress() : decompress ZSTD frames compliant with v0.4.x format
|
|
|
35
35
|
size_t ZSTDv04_decompress( void* dst, size_t maxOriginalSize,
|
|
36
36
|
const void* src, size_t compressedSize);
|
|
37
37
|
|
|
38
|
-
/**
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
38
|
+
/**
|
|
39
|
+
ZSTDv04_findFrameSizeInfoLegacy() : get the source length and decompressed bound of a ZSTD frame compliant with v0.4.x format
|
|
40
|
+
srcSize : The size of the 'src' buffer, at least as large as the frame pointed to by 'src'
|
|
41
|
+
cSize (output parameter) : the number of bytes that would be read to decompress this frame
|
|
42
|
+
or an error code if it fails (which can be tested using ZSTDv01_isError())
|
|
43
|
+
dBound (output parameter) : an upper-bound for the decompressed size of the data in the frame
|
|
44
|
+
or ZSTD_CONTENTSIZE_ERROR if an error occurs
|
|
45
|
+
|
|
46
|
+
note : assumes `cSize` and `dBound` are _not_ NULL.
|
|
47
|
+
*/
|
|
48
|
+
void ZSTDv04_findFrameSizeInfoLegacy(const void *src, size_t srcSize,
|
|
49
|
+
size_t* cSize, unsigned long long* dBound);
|
|
45
50
|
|
|
46
51
|
/**
|
|
47
52
|
ZSTDv04_isError() : tells if the result of ZSTDv04_decompress() is an error
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* Copyright (c) 2016-
|
|
2
|
+
* Copyright (c) 2016-2020, Yann Collet, Facebook, Inc.
|
|
3
3
|
* All rights reserved.
|
|
4
4
|
*
|
|
5
5
|
* This source code is licensed under both the BSD-style license (found in the
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
|
|
12
12
|
/*- Dependencies -*/
|
|
13
13
|
#include "zstd_v05.h"
|
|
14
|
-
#include "error_private.h"
|
|
14
|
+
#include "../common/error_private.h"
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
/* ******************************************************************
|
|
@@ -491,6 +491,8 @@ static const size_t ZSTDv05_frameHeaderSize_min = 5;
|
|
|
491
491
|
|
|
492
492
|
#define WILDCOPY_OVERLENGTH 8
|
|
493
493
|
|
|
494
|
+
#define ZSTD_CONTENTSIZE_ERROR (0ULL - 2)
|
|
495
|
+
|
|
494
496
|
typedef enum { bt_compressed, bt_raw, bt_rle, bt_end } blockType_t;
|
|
495
497
|
|
|
496
498
|
|
|
@@ -754,7 +756,7 @@ MEM_STATIC unsigned BITv05_highbit32 (U32 val)
|
|
|
754
756
|
_BitScanReverse ( &r, val );
|
|
755
757
|
return (unsigned) r;
|
|
756
758
|
# elif defined(__GNUC__) && (__GNUC__ >= 3) /* Use GCC Intrinsic */
|
|
757
|
-
return
|
|
759
|
+
return __builtin_clz (val) ^ 31;
|
|
758
760
|
# else /* Software version */
|
|
759
761
|
static const unsigned DeBruijnClz[32] = { 0, 9, 1, 10, 13, 21, 2, 29, 11, 14, 16, 18, 22, 25, 3, 30, 8, 12, 20, 28, 15, 17, 24, 7, 19, 27, 23, 6, 26, 5, 4, 31 };
|
|
760
762
|
U32 v = val;
|
|
@@ -1802,7 +1804,7 @@ static size_t HUFv05_readStats(BYTE* huffWeight, size_t hwSize, U32* rankStats,
|
|
|
1802
1804
|
|
|
1803
1805
|
if (!srcSize) return ERROR(srcSize_wrong);
|
|
1804
1806
|
iSize = ip[0];
|
|
1805
|
-
|
|
1807
|
+
/* memset(huffWeight, 0, hwSize); */ /* is not necessary, even though some analyzer complain ... */
|
|
1806
1808
|
|
|
1807
1809
|
if (iSize >= 128) { /* special header */
|
|
1808
1810
|
if (iSize >= (242)) { /* RLE */
|
|
@@ -1877,7 +1879,7 @@ size_t HUFv05_readDTableX2 (U16* DTable, const void* src, size_t srcSize)
|
|
|
1877
1879
|
HUFv05_DEltX2* const dt = (HUFv05_DEltX2*)dtPtr;
|
|
1878
1880
|
|
|
1879
1881
|
HUFv05_STATIC_ASSERT(sizeof(HUFv05_DEltX2) == sizeof(U16)); /* if compilation fails here, assertion is false */
|
|
1880
|
-
|
|
1882
|
+
/* memset(huffWeight, 0, sizeof(huffWeight)); */ /* is not necessary, even though some analyzer complain ... */
|
|
1881
1883
|
|
|
1882
1884
|
iSize = HUFv05_readStats(huffWeight, HUFv05_MAX_SYMBOL_VALUE + 1, rankVal, &nbSymbols, &tableLog, src, srcSize);
|
|
1883
1885
|
if (HUFv05_isError(iSize)) return iSize;
|
|
@@ -1996,91 +1998,92 @@ size_t HUFv05_decompress4X2_usingDTable(
|
|
|
1996
1998
|
const void* cSrc, size_t cSrcSize,
|
|
1997
1999
|
const U16* DTable)
|
|
1998
2000
|
{
|
|
1999
|
-
const BYTE* const istart = (const BYTE*) cSrc;
|
|
2000
|
-
BYTE* const ostart = (BYTE*) dst;
|
|
2001
|
-
BYTE* const oend = ostart + dstSize;
|
|
2002
|
-
const void* const dtPtr = DTable;
|
|
2003
|
-
const HUFv05_DEltX2* const dt = ((const HUFv05_DEltX2*)dtPtr) +1;
|
|
2004
|
-
const U32 dtLog = DTable[0];
|
|
2005
|
-
size_t errorCode;
|
|
2006
|
-
|
|
2007
|
-
/* Init */
|
|
2008
|
-
BITv05_DStream_t bitD1;
|
|
2009
|
-
BITv05_DStream_t bitD2;
|
|
2010
|
-
BITv05_DStream_t bitD3;
|
|
2011
|
-
BITv05_DStream_t bitD4;
|
|
2012
|
-
const size_t length1 = MEM_readLE16(istart);
|
|
2013
|
-
const size_t length2 = MEM_readLE16(istart+2);
|
|
2014
|
-
const size_t length3 = MEM_readLE16(istart+4);
|
|
2015
|
-
size_t length4;
|
|
2016
|
-
const BYTE* const istart1 = istart + 6; /* jumpTable */
|
|
2017
|
-
const BYTE* const istart2 = istart1 + length1;
|
|
2018
|
-
const BYTE* const istart3 = istart2 + length2;
|
|
2019
|
-
const BYTE* const istart4 = istart3 + length3;
|
|
2020
|
-
const size_t segmentSize = (dstSize+3) / 4;
|
|
2021
|
-
BYTE* const opStart2 = ostart + segmentSize;
|
|
2022
|
-
BYTE* const opStart3 = opStart2 + segmentSize;
|
|
2023
|
-
BYTE* const opStart4 = opStart3 + segmentSize;
|
|
2024
|
-
BYTE* op1 = ostart;
|
|
2025
|
-
BYTE* op2 = opStart2;
|
|
2026
|
-
BYTE* op3 = opStart3;
|
|
2027
|
-
BYTE* op4 = opStart4;
|
|
2028
|
-
U32 endSignal;
|
|
2029
|
-
|
|
2030
2001
|
/* Check */
|
|
2031
2002
|
if (cSrcSize < 10) return ERROR(corruption_detected); /* strict minimum : jump table + 1 byte per stream */
|
|
2003
|
+
{
|
|
2004
|
+
const BYTE* const istart = (const BYTE*) cSrc;
|
|
2005
|
+
BYTE* const ostart = (BYTE*) dst;
|
|
2006
|
+
BYTE* const oend = ostart + dstSize;
|
|
2007
|
+
const void* const dtPtr = DTable;
|
|
2008
|
+
const HUFv05_DEltX2* const dt = ((const HUFv05_DEltX2*)dtPtr) +1;
|
|
2009
|
+
const U32 dtLog = DTable[0];
|
|
2010
|
+
size_t errorCode;
|
|
2032
2011
|
|
|
2033
|
-
|
|
2034
|
-
|
|
2035
|
-
|
|
2036
|
-
|
|
2037
|
-
|
|
2038
|
-
|
|
2039
|
-
|
|
2040
|
-
|
|
2041
|
-
|
|
2042
|
-
|
|
2012
|
+
/* Init */
|
|
2013
|
+
BITv05_DStream_t bitD1;
|
|
2014
|
+
BITv05_DStream_t bitD2;
|
|
2015
|
+
BITv05_DStream_t bitD3;
|
|
2016
|
+
BITv05_DStream_t bitD4;
|
|
2017
|
+
const size_t length1 = MEM_readLE16(istart);
|
|
2018
|
+
const size_t length2 = MEM_readLE16(istart+2);
|
|
2019
|
+
const size_t length3 = MEM_readLE16(istart+4);
|
|
2020
|
+
size_t length4;
|
|
2021
|
+
const BYTE* const istart1 = istart + 6; /* jumpTable */
|
|
2022
|
+
const BYTE* const istart2 = istart1 + length1;
|
|
2023
|
+
const BYTE* const istart3 = istart2 + length2;
|
|
2024
|
+
const BYTE* const istart4 = istart3 + length3;
|
|
2025
|
+
const size_t segmentSize = (dstSize+3) / 4;
|
|
2026
|
+
BYTE* const opStart2 = ostart + segmentSize;
|
|
2027
|
+
BYTE* const opStart3 = opStart2 + segmentSize;
|
|
2028
|
+
BYTE* const opStart4 = opStart3 + segmentSize;
|
|
2029
|
+
BYTE* op1 = ostart;
|
|
2030
|
+
BYTE* op2 = opStart2;
|
|
2031
|
+
BYTE* op3 = opStart3;
|
|
2032
|
+
BYTE* op4 = opStart4;
|
|
2033
|
+
U32 endSignal;
|
|
2034
|
+
|
|
2035
|
+
length4 = cSrcSize - (length1 + length2 + length3 + 6);
|
|
2036
|
+
if (length4 > cSrcSize) return ERROR(corruption_detected); /* overflow */
|
|
2037
|
+
errorCode = BITv05_initDStream(&bitD1, istart1, length1);
|
|
2038
|
+
if (HUFv05_isError(errorCode)) return errorCode;
|
|
2039
|
+
errorCode = BITv05_initDStream(&bitD2, istart2, length2);
|
|
2040
|
+
if (HUFv05_isError(errorCode)) return errorCode;
|
|
2041
|
+
errorCode = BITv05_initDStream(&bitD3, istart3, length3);
|
|
2042
|
+
if (HUFv05_isError(errorCode)) return errorCode;
|
|
2043
|
+
errorCode = BITv05_initDStream(&bitD4, istart4, length4);
|
|
2044
|
+
if (HUFv05_isError(errorCode)) return errorCode;
|
|
2043
2045
|
|
|
2044
|
-
|
|
2045
|
-
endSignal = BITv05_reloadDStream(&bitD1) | BITv05_reloadDStream(&bitD2) | BITv05_reloadDStream(&bitD3) | BITv05_reloadDStream(&bitD4);
|
|
2046
|
-
for ( ; (endSignal==BITv05_DStream_unfinished) && (op4<(oend-7)) ; ) {
|
|
2047
|
-
HUFv05_DECODE_SYMBOLX2_2(op1, &bitD1);
|
|
2048
|
-
HUFv05_DECODE_SYMBOLX2_2(op2, &bitD2);
|
|
2049
|
-
HUFv05_DECODE_SYMBOLX2_2(op3, &bitD3);
|
|
2050
|
-
HUFv05_DECODE_SYMBOLX2_2(op4, &bitD4);
|
|
2051
|
-
HUFv05_DECODE_SYMBOLX2_1(op1, &bitD1);
|
|
2052
|
-
HUFv05_DECODE_SYMBOLX2_1(op2, &bitD2);
|
|
2053
|
-
HUFv05_DECODE_SYMBOLX2_1(op3, &bitD3);
|
|
2054
|
-
HUFv05_DECODE_SYMBOLX2_1(op4, &bitD4);
|
|
2055
|
-
HUFv05_DECODE_SYMBOLX2_2(op1, &bitD1);
|
|
2056
|
-
HUFv05_DECODE_SYMBOLX2_2(op2, &bitD2);
|
|
2057
|
-
HUFv05_DECODE_SYMBOLX2_2(op3, &bitD3);
|
|
2058
|
-
HUFv05_DECODE_SYMBOLX2_2(op4, &bitD4);
|
|
2059
|
-
HUFv05_DECODE_SYMBOLX2_0(op1, &bitD1);
|
|
2060
|
-
HUFv05_DECODE_SYMBOLX2_0(op2, &bitD2);
|
|
2061
|
-
HUFv05_DECODE_SYMBOLX2_0(op3, &bitD3);
|
|
2062
|
-
HUFv05_DECODE_SYMBOLX2_0(op4, &bitD4);
|
|
2046
|
+
/* 16-32 symbols per loop (4-8 symbols per stream) */
|
|
2063
2047
|
endSignal = BITv05_reloadDStream(&bitD1) | BITv05_reloadDStream(&bitD2) | BITv05_reloadDStream(&bitD3) | BITv05_reloadDStream(&bitD4);
|
|
2064
|
-
|
|
2048
|
+
for ( ; (endSignal==BITv05_DStream_unfinished) && (op4<(oend-7)) ; ) {
|
|
2049
|
+
HUFv05_DECODE_SYMBOLX2_2(op1, &bitD1);
|
|
2050
|
+
HUFv05_DECODE_SYMBOLX2_2(op2, &bitD2);
|
|
2051
|
+
HUFv05_DECODE_SYMBOLX2_2(op3, &bitD3);
|
|
2052
|
+
HUFv05_DECODE_SYMBOLX2_2(op4, &bitD4);
|
|
2053
|
+
HUFv05_DECODE_SYMBOLX2_1(op1, &bitD1);
|
|
2054
|
+
HUFv05_DECODE_SYMBOLX2_1(op2, &bitD2);
|
|
2055
|
+
HUFv05_DECODE_SYMBOLX2_1(op3, &bitD3);
|
|
2056
|
+
HUFv05_DECODE_SYMBOLX2_1(op4, &bitD4);
|
|
2057
|
+
HUFv05_DECODE_SYMBOLX2_2(op1, &bitD1);
|
|
2058
|
+
HUFv05_DECODE_SYMBOLX2_2(op2, &bitD2);
|
|
2059
|
+
HUFv05_DECODE_SYMBOLX2_2(op3, &bitD3);
|
|
2060
|
+
HUFv05_DECODE_SYMBOLX2_2(op4, &bitD4);
|
|
2061
|
+
HUFv05_DECODE_SYMBOLX2_0(op1, &bitD1);
|
|
2062
|
+
HUFv05_DECODE_SYMBOLX2_0(op2, &bitD2);
|
|
2063
|
+
HUFv05_DECODE_SYMBOLX2_0(op3, &bitD3);
|
|
2064
|
+
HUFv05_DECODE_SYMBOLX2_0(op4, &bitD4);
|
|
2065
|
+
endSignal = BITv05_reloadDStream(&bitD1) | BITv05_reloadDStream(&bitD2) | BITv05_reloadDStream(&bitD3) | BITv05_reloadDStream(&bitD4);
|
|
2066
|
+
}
|
|
2065
2067
|
|
|
2066
|
-
|
|
2067
|
-
|
|
2068
|
-
|
|
2069
|
-
|
|
2070
|
-
|
|
2068
|
+
/* check corruption */
|
|
2069
|
+
if (op1 > opStart2) return ERROR(corruption_detected);
|
|
2070
|
+
if (op2 > opStart3) return ERROR(corruption_detected);
|
|
2071
|
+
if (op3 > opStart4) return ERROR(corruption_detected);
|
|
2072
|
+
/* note : op4 supposed already verified within main loop */
|
|
2071
2073
|
|
|
2072
|
-
|
|
2073
|
-
|
|
2074
|
-
|
|
2075
|
-
|
|
2076
|
-
|
|
2074
|
+
/* finish bitStreams one by one */
|
|
2075
|
+
HUFv05_decodeStreamX2(op1, &bitD1, opStart2, dt, dtLog);
|
|
2076
|
+
HUFv05_decodeStreamX2(op2, &bitD2, opStart3, dt, dtLog);
|
|
2077
|
+
HUFv05_decodeStreamX2(op3, &bitD3, opStart4, dt, dtLog);
|
|
2078
|
+
HUFv05_decodeStreamX2(op4, &bitD4, oend, dt, dtLog);
|
|
2077
2079
|
|
|
2078
|
-
|
|
2079
|
-
|
|
2080
|
-
|
|
2080
|
+
/* check */
|
|
2081
|
+
endSignal = BITv05_endOfDStream(&bitD1) & BITv05_endOfDStream(&bitD2) & BITv05_endOfDStream(&bitD3) & BITv05_endOfDStream(&bitD4);
|
|
2082
|
+
if (!endSignal) return ERROR(corruption_detected);
|
|
2081
2083
|
|
|
2082
|
-
|
|
2083
|
-
|
|
2084
|
+
/* decoded size */
|
|
2085
|
+
return dstSize;
|
|
2086
|
+
}
|
|
2084
2087
|
}
|
|
2085
2088
|
|
|
2086
2089
|
|
|
@@ -2207,7 +2210,7 @@ size_t HUFv05_readDTableX4 (unsigned* DTable, const void* src, size_t srcSize)
|
|
|
2207
2210
|
|
|
2208
2211
|
HUFv05_STATIC_ASSERT(sizeof(HUFv05_DEltX4) == sizeof(unsigned)); /* if compilation fails here, assertion is false */
|
|
2209
2212
|
if (memLog > HUFv05_ABSOLUTEMAX_TABLELOG) return ERROR(tableLog_tooLarge);
|
|
2210
|
-
|
|
2213
|
+
/* memset(weightList, 0, sizeof(weightList)); */ /* is not necessary, even though some analyzer complain ... */
|
|
2211
2214
|
|
|
2212
2215
|
iSize = HUFv05_readStats(weightList, HUFv05_MAX_SYMBOL_VALUE + 1, rankStats, &nbSymbols, &tableLog, src, srcSize);
|
|
2213
2216
|
if (HUFv05_isError(iSize)) return iSize;
|
|
@@ -2536,9 +2539,9 @@ size_t HUFv05_decompress (void* dst, size_t dstSize, const void* cSrc, size_t cS
|
|
|
2536
2539
|
|
|
2537
2540
|
return decompress[algoNb](dst, dstSize, cSrc, cSrcSize);
|
|
2538
2541
|
|
|
2539
|
-
|
|
2540
|
-
|
|
2541
|
-
|
|
2542
|
+
/* return HUFv05_decompress4X2(dst, dstSize, cSrc, cSrcSize); */ /* multi-streams single-symbol decoding */
|
|
2543
|
+
/* return HUFv05_decompress4X4(dst, dstSize, cSrc, cSrcSize); */ /* multi-streams double-symbols decoding */
|
|
2544
|
+
/* return HUFv05_decompress4X6(dst, dstSize, cSrc, cSrcSize); */ /* multi-streams quad-symbols decoding */
|
|
2542
2545
|
}
|
|
2543
2546
|
/*
|
|
2544
2547
|
zstd - standard compression library
|
|
@@ -3148,14 +3151,17 @@ static void ZSTDv05_decodeSequence(seq_t* seq, seqState_t* seqState)
|
|
|
3148
3151
|
litLength = FSEv05_peakSymbol(&(seqState->stateLL));
|
|
3149
3152
|
prevOffset = litLength ? seq->offset : seqState->prevOffset;
|
|
3150
3153
|
if (litLength == MaxLL) {
|
|
3151
|
-
U32 add = *dumps++;
|
|
3154
|
+
const U32 add = *dumps++;
|
|
3152
3155
|
if (add < 255) litLength += add;
|
|
3153
|
-
else {
|
|
3154
|
-
litLength =
|
|
3155
|
-
|
|
3156
|
-
|
|
3156
|
+
else if (dumps + 2 <= de) {
|
|
3157
|
+
litLength = MEM_readLE16(dumps);
|
|
3158
|
+
dumps += 2;
|
|
3159
|
+
if ((litLength & 1) && dumps < de) {
|
|
3160
|
+
litLength += *dumps << 16;
|
|
3161
|
+
dumps += 1;
|
|
3162
|
+
}
|
|
3163
|
+
litLength>>=1;
|
|
3157
3164
|
}
|
|
3158
|
-
if (dumps > de) { litLength = MaxLL+255; } /* late correction, to avoid using uninitialized memory */
|
|
3159
3165
|
if (dumps >= de) { dumps = de-1; } /* late correction, to avoid read overflow (data is now corrupted anyway) */
|
|
3160
3166
|
}
|
|
3161
3167
|
|
|
@@ -3182,14 +3188,17 @@ static void ZSTDv05_decodeSequence(seq_t* seq, seqState_t* seqState)
|
|
|
3182
3188
|
/* MatchLength */
|
|
3183
3189
|
matchLength = FSEv05_decodeSymbol(&(seqState->stateML), &(seqState->DStream));
|
|
3184
3190
|
if (matchLength == MaxML) {
|
|
3185
|
-
U32 add = *dumps
|
|
3191
|
+
const U32 add = dumps<de ? *dumps++ : 0;
|
|
3186
3192
|
if (add < 255) matchLength += add;
|
|
3187
|
-
else {
|
|
3188
|
-
matchLength =
|
|
3189
|
-
|
|
3190
|
-
|
|
3193
|
+
else if (dumps + 2 <= de) {
|
|
3194
|
+
matchLength = MEM_readLE16(dumps);
|
|
3195
|
+
dumps += 2;
|
|
3196
|
+
if ((matchLength & 1) && dumps < de) {
|
|
3197
|
+
matchLength += *dumps << 16;
|
|
3198
|
+
dumps += 1;
|
|
3199
|
+
}
|
|
3200
|
+
matchLength >>= 1;
|
|
3191
3201
|
}
|
|
3192
|
-
if (dumps > de) { matchLength = MaxML+255; } /* late correction, to avoid using uninitialized memory */
|
|
3193
3202
|
if (dumps >= de) { dumps = de-1; } /* late correction, to avoid read overflow (data is now corrupted anyway) */
|
|
3194
3203
|
}
|
|
3195
3204
|
matchLength += MINMATCH;
|
|
@@ -3217,7 +3226,7 @@ static size_t ZSTDv05_execSequence(BYTE* op,
|
|
|
3217
3226
|
const BYTE* const base, const BYTE* const vBase, const BYTE* const dictEnd)
|
|
3218
3227
|
{
|
|
3219
3228
|
static const int dec32table[] = { 0, 1, 2, 1, 4, 4, 4, 4 }; /* added */
|
|
3220
|
-
static const int dec64table[] = { 8, 8, 8, 7, 8, 9,10,11 }; /*
|
|
3229
|
+
static const int dec64table[] = { 8, 8, 8, 7, 8, 9,10,11 }; /* subtracted */
|
|
3221
3230
|
BYTE* const oLitEnd = op + sequence.litLength;
|
|
3222
3231
|
const size_t sequenceLength = sequence.litLength + sequence.matchLength;
|
|
3223
3232
|
BYTE* const oMatchEnd = op + sequenceLength; /* risk : address space overflow (32-bits) */
|
|
@@ -3353,8 +3362,10 @@ static size_t ZSTDv05_decompressSequences(
|
|
|
3353
3362
|
size_t lastLLSize = litEnd - litPtr;
|
|
3354
3363
|
if (litPtr > litEnd) return ERROR(corruption_detected); /* too many literals already used */
|
|
3355
3364
|
if (op+lastLLSize > oend) return ERROR(dstSize_tooSmall);
|
|
3356
|
-
|
|
3357
|
-
|
|
3365
|
+
if (lastLLSize > 0) {
|
|
3366
|
+
memcpy(op, litPtr, lastLLSize);
|
|
3367
|
+
op += lastLLSize;
|
|
3368
|
+
}
|
|
3358
3369
|
}
|
|
3359
3370
|
|
|
3360
3371
|
return op-ostart;
|
|
@@ -3508,34 +3519,57 @@ size_t ZSTDv05_decompress(void* dst, size_t maxDstSize, const void* src, size_t
|
|
|
3508
3519
|
#endif
|
|
3509
3520
|
}
|
|
3510
3521
|
|
|
3511
|
-
|
|
3522
|
+
/* ZSTD_errorFrameSizeInfoLegacy() :
|
|
3523
|
+
assumes `cSize` and `dBound` are _not_ NULL */
|
|
3524
|
+
static void ZSTD_errorFrameSizeInfoLegacy(size_t* cSize, unsigned long long* dBound, size_t ret)
|
|
3525
|
+
{
|
|
3526
|
+
*cSize = ret;
|
|
3527
|
+
*dBound = ZSTD_CONTENTSIZE_ERROR;
|
|
3528
|
+
}
|
|
3529
|
+
|
|
3530
|
+
void ZSTDv05_findFrameSizeInfoLegacy(const void *src, size_t srcSize, size_t* cSize, unsigned long long* dBound)
|
|
3512
3531
|
{
|
|
3513
3532
|
const BYTE* ip = (const BYTE*)src;
|
|
3514
3533
|
size_t remainingSize = srcSize;
|
|
3534
|
+
size_t nbBlocks = 0;
|
|
3515
3535
|
blockProperties_t blockProperties;
|
|
3516
3536
|
|
|
3517
3537
|
/* Frame Header */
|
|
3518
|
-
if (srcSize < ZSTDv05_frameHeaderSize_min)
|
|
3519
|
-
|
|
3538
|
+
if (srcSize < ZSTDv05_frameHeaderSize_min) {
|
|
3539
|
+
ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(srcSize_wrong));
|
|
3540
|
+
return;
|
|
3541
|
+
}
|
|
3542
|
+
if (MEM_readLE32(src) != ZSTDv05_MAGICNUMBER) {
|
|
3543
|
+
ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(prefix_unknown));
|
|
3544
|
+
return;
|
|
3545
|
+
}
|
|
3520
3546
|
ip += ZSTDv05_frameHeaderSize_min; remainingSize -= ZSTDv05_frameHeaderSize_min;
|
|
3521
3547
|
|
|
3522
3548
|
/* Loop on each block */
|
|
3523
3549
|
while (1)
|
|
3524
3550
|
{
|
|
3525
3551
|
size_t cBlockSize = ZSTDv05_getcBlockSize(ip, remainingSize, &blockProperties);
|
|
3526
|
-
if (ZSTDv05_isError(cBlockSize))
|
|
3552
|
+
if (ZSTDv05_isError(cBlockSize)) {
|
|
3553
|
+
ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, cBlockSize);
|
|
3554
|
+
return;
|
|
3555
|
+
}
|
|
3527
3556
|
|
|
3528
3557
|
ip += ZSTDv05_blockHeaderSize;
|
|
3529
3558
|
remainingSize -= ZSTDv05_blockHeaderSize;
|
|
3530
|
-
if (cBlockSize > remainingSize)
|
|
3559
|
+
if (cBlockSize > remainingSize) {
|
|
3560
|
+
ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(srcSize_wrong));
|
|
3561
|
+
return;
|
|
3562
|
+
}
|
|
3531
3563
|
|
|
3532
3564
|
if (cBlockSize == 0) break; /* bt_end */
|
|
3533
3565
|
|
|
3534
3566
|
ip += cBlockSize;
|
|
3535
3567
|
remainingSize -= cBlockSize;
|
|
3568
|
+
nbBlocks++;
|
|
3536
3569
|
}
|
|
3537
3570
|
|
|
3538
|
-
|
|
3571
|
+
*cSize = ip - (const BYTE*)src;
|
|
3572
|
+
*dBound = nbBlocks * BLOCKSIZE;
|
|
3539
3573
|
}
|
|
3540
3574
|
|
|
3541
3575
|
/* ******************************
|
|
@@ -3759,7 +3793,9 @@ static size_t ZBUFFv05_blockHeaderSize = 3;
|
|
|
3759
3793
|
static size_t ZBUFFv05_limitCopy(void* dst, size_t maxDstSize, const void* src, size_t srcSize)
|
|
3760
3794
|
{
|
|
3761
3795
|
size_t length = MIN(maxDstSize, srcSize);
|
|
3762
|
-
|
|
3796
|
+
if (length > 0) {
|
|
3797
|
+
memcpy(dst, src, length);
|
|
3798
|
+
}
|
|
3763
3799
|
return length;
|
|
3764
3800
|
}
|
|
3765
3801
|
|
|
@@ -3896,7 +3932,7 @@ size_t ZBUFFv05_decompressContinue(ZBUFFv05_DCtx* zbc, void* dst, size_t* maxDst
|
|
|
3896
3932
|
*maxDstSizePtr = 0;
|
|
3897
3933
|
return headerSize - zbc->hPos;
|
|
3898
3934
|
}
|
|
3899
|
-
|
|
3935
|
+
/* zbc->stage = ZBUFFv05ds_decodeHeader; break; */ /* useless : stage follows */
|
|
3900
3936
|
}
|
|
3901
3937
|
/* fall-through */
|
|
3902
3938
|
case ZBUFFv05ds_decodeHeader:
|
|
@@ -3969,7 +4005,7 @@ size_t ZBUFFv05_decompressContinue(ZBUFFv05_DCtx* zbc, void* dst, size_t* maxDst
|
|
|
3969
4005
|
if (!decodedSize) { zbc->stage = ZBUFFv05ds_read; break; } /* this was just a header */
|
|
3970
4006
|
zbc->outEnd = zbc->outStart + decodedSize;
|
|
3971
4007
|
zbc->stage = ZBUFFv05ds_flush;
|
|
3972
|
-
|
|
4008
|
+
/* break; */ /* ZBUFFv05ds_flush follows */
|
|
3973
4009
|
}
|
|
3974
4010
|
}
|
|
3975
4011
|
/* fall-through */
|