zstd-ruby 1.3.8.0 → 1.4.5.0
Sign up to get free protection for your applications and to get access to all the features.
- 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 @@ ZSTDv01_decompress() : decompress ZSTD frames compliant with v0.1.x format
|
|
35
35
|
size_t ZSTDv01_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
|
+
ZSTDv01_findFrameSizeInfoLegacy() : get the source length and decompressed bound of a ZSTD frame compliant with v0.1.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 ZSTDv01_findFrameSizeInfoLegacy(const void *src, size_t srcSize,
|
49
|
+
size_t* cSize, unsigned long long* dBound);
|
45
50
|
|
46
51
|
/**
|
47
52
|
ZSTDv01_isError() : tells if the result of ZSTDv01_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
|
#include <stddef.h> /* size_t, ptrdiff_t */
|
13
13
|
#include "zstd_v02.h"
|
14
|
-
#include "error_private.h"
|
14
|
+
#include "../common/error_private.h"
|
15
15
|
|
16
16
|
|
17
17
|
/******************************************
|
@@ -189,7 +189,7 @@ MEM_STATIC void MEM_write16(void* memPtr, U16 value)
|
|
189
189
|
memcpy(memPtr, &value, sizeof(value));
|
190
190
|
}
|
191
191
|
|
192
|
-
#endif
|
192
|
+
#endif /* MEM_FORCE_MEMORY_ACCESS */
|
193
193
|
|
194
194
|
|
195
195
|
MEM_STATIC U16 MEM_readLE16(const void* memPtr)
|
@@ -217,6 +217,11 @@ MEM_STATIC void MEM_writeLE16(void* memPtr, U16 val)
|
|
217
217
|
}
|
218
218
|
}
|
219
219
|
|
220
|
+
MEM_STATIC U32 MEM_readLE24(const void* memPtr)
|
221
|
+
{
|
222
|
+
return MEM_readLE16(memPtr) + (((const BYTE*)memPtr)[2] << 16);
|
223
|
+
}
|
224
|
+
|
220
225
|
MEM_STATIC U32 MEM_readLE32(const void* memPtr)
|
221
226
|
{
|
222
227
|
if (MEM_isLittleEndian())
|
@@ -348,7 +353,7 @@ MEM_STATIC unsigned BIT_highbit32 (U32 val)
|
|
348
353
|
_BitScanReverse ( &r, val );
|
349
354
|
return (unsigned) r;
|
350
355
|
# elif defined(__GNUC__) && (__GNUC__ >= 3) /* Use GCC Intrinsic */
|
351
|
-
return
|
356
|
+
return __builtin_clz (val) ^ 31;
|
352
357
|
# else /* Software version */
|
353
358
|
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 };
|
354
359
|
U32 v = val;
|
@@ -2728,6 +2733,8 @@ static size_t HUF_decompress (void* dst, size_t dstSize, const void* cSrc, size_
|
|
2728
2733
|
#define LITERAL_NOENTROPY 63
|
2729
2734
|
#define COMMAND_NOENTROPY 7 /* to remove */
|
2730
2735
|
|
2736
|
+
#define ZSTD_CONTENTSIZE_ERROR (0ULL - 2)
|
2737
|
+
|
2731
2738
|
static const size_t ZSTD_blockHeaderSize = 3;
|
2732
2739
|
static const size_t ZSTD_frameHeaderSize = 4;
|
2733
2740
|
|
@@ -2829,7 +2836,9 @@ static size_t ZSTD_getcBlockSize(const void* src, size_t srcSize, blockPropertie
|
|
2829
2836
|
static size_t ZSTD_copyUncompressedBlock(void* dst, size_t maxDstSize, const void* src, size_t srcSize)
|
2830
2837
|
{
|
2831
2838
|
if (srcSize > maxDstSize) return ERROR(dstSize_tooSmall);
|
2832
|
-
|
2839
|
+
if (srcSize > 0) {
|
2840
|
+
memcpy(dst, src, srcSize);
|
2841
|
+
}
|
2833
2842
|
return srcSize;
|
2834
2843
|
}
|
2835
2844
|
|
@@ -2882,6 +2891,7 @@ static size_t ZSTD_decodeLiteralsBlock(void* ctx,
|
|
2882
2891
|
const size_t litSize = (MEM_readLE32(istart) & 0xFFFFFF) >> 2; /* no buffer issue : srcSize >= MIN_CBLOCK_SIZE */
|
2883
2892
|
if (litSize > srcSize-11) /* risk of reading too far with wildcopy */
|
2884
2893
|
{
|
2894
|
+
if (litSize > BLOCKSIZE) return ERROR(corruption_detected);
|
2885
2895
|
if (litSize > srcSize-3) return ERROR(corruption_detected);
|
2886
2896
|
memcpy(dctx->litBuffer, istart, litSize);
|
2887
2897
|
dctx->litPtr = dctx->litBuffer;
|
@@ -3041,11 +3051,11 @@ static void ZSTD_decodeSequence(seq_t* seq, seqState_t* seqState)
|
|
3041
3051
|
seqState->prevOffset = seq->offset;
|
3042
3052
|
if (litLength == MaxLL)
|
3043
3053
|
{
|
3044
|
-
U32 add = *dumps
|
3054
|
+
const U32 add = dumps<de ? *dumps++ : 0;
|
3045
3055
|
if (add < 255) litLength += add;
|
3046
|
-
else
|
3056
|
+
else if (dumps + 3 <= de)
|
3047
3057
|
{
|
3048
|
-
litLength =
|
3058
|
+
litLength = MEM_readLE24(dumps);
|
3049
3059
|
dumps += 3;
|
3050
3060
|
}
|
3051
3061
|
if (dumps >= de) dumps = de-1; /* late correction, to avoid read overflow (data is now corrupted anyway) */
|
@@ -3071,11 +3081,11 @@ static void ZSTD_decodeSequence(seq_t* seq, seqState_t* seqState)
|
|
3071
3081
|
matchLength = FSE_decodeSymbol(&(seqState->stateML), &(seqState->DStream));
|
3072
3082
|
if (matchLength == MaxML)
|
3073
3083
|
{
|
3074
|
-
U32 add = *dumps
|
3084
|
+
const U32 add = dumps<de ? *dumps++ : 0;
|
3075
3085
|
if (add < 255) matchLength += add;
|
3076
|
-
else
|
3086
|
+
else if (dumps + 3 <= de)
|
3077
3087
|
{
|
3078
|
-
matchLength =
|
3088
|
+
matchLength = MEM_readLE24(dumps);
|
3079
3089
|
dumps += 3;
|
3080
3090
|
}
|
3081
3091
|
if (dumps >= de) dumps = de-1; /* late correction, to avoid read overflow (data is now corrupted anyway) */
|
@@ -3096,7 +3106,7 @@ static size_t ZSTD_execSequence(BYTE* op,
|
|
3096
3106
|
BYTE* const base, BYTE* const oend)
|
3097
3107
|
{
|
3098
3108
|
static const int dec32table[] = {0, 1, 2, 1, 4, 4, 4, 4}; /* added */
|
3099
|
-
static const int dec64table[] = {8, 8, 8, 7, 8, 9,10,11}; /*
|
3109
|
+
static const int dec64table[] = {8, 8, 8, 7, 8, 9,10,11}; /* subtracted */
|
3100
3110
|
const BYTE* const ostart = op;
|
3101
3111
|
BYTE* const oLitEnd = op + sequence.litLength;
|
3102
3112
|
BYTE* const oMatchEnd = op + sequence.litLength + sequence.matchLength; /* risk : address space overflow (32-bits) */
|
@@ -3221,8 +3231,10 @@ static size_t ZSTD_decompressSequences(
|
|
3221
3231
|
size_t lastLLSize = litEnd - litPtr;
|
3222
3232
|
if (litPtr > litEnd) return ERROR(corruption_detected);
|
3223
3233
|
if (op+lastLLSize > oend) return ERROR(dstSize_tooSmall);
|
3224
|
-
if (
|
3225
|
-
|
3234
|
+
if (lastLLSize > 0) {
|
3235
|
+
if (op != litPtr) memmove(op, litPtr, lastLLSize);
|
3236
|
+
op += lastLLSize;
|
3237
|
+
}
|
3226
3238
|
}
|
3227
3239
|
}
|
3228
3240
|
|
@@ -3312,37 +3324,59 @@ static size_t ZSTD_decompress(void* dst, size_t maxDstSize, const void* src, siz
|
|
3312
3324
|
return ZSTD_decompressDCtx(&ctx, dst, maxDstSize, src, srcSize);
|
3313
3325
|
}
|
3314
3326
|
|
3315
|
-
|
3327
|
+
/* ZSTD_errorFrameSizeInfoLegacy() :
|
3328
|
+
assumes `cSize` and `dBound` are _not_ NULL */
|
3329
|
+
static void ZSTD_errorFrameSizeInfoLegacy(size_t* cSize, unsigned long long* dBound, size_t ret)
|
3316
3330
|
{
|
3331
|
+
*cSize = ret;
|
3332
|
+
*dBound = ZSTD_CONTENTSIZE_ERROR;
|
3333
|
+
}
|
3317
3334
|
|
3335
|
+
void ZSTDv02_findFrameSizeInfoLegacy(const void *src, size_t srcSize, size_t* cSize, unsigned long long* dBound)
|
3336
|
+
{
|
3318
3337
|
const BYTE* ip = (const BYTE*)src;
|
3319
3338
|
size_t remainingSize = srcSize;
|
3339
|
+
size_t nbBlocks = 0;
|
3320
3340
|
U32 magicNumber;
|
3321
3341
|
blockProperties_t blockProperties;
|
3322
3342
|
|
3323
3343
|
/* Frame Header */
|
3324
|
-
if (srcSize < ZSTD_frameHeaderSize+ZSTD_blockHeaderSize)
|
3344
|
+
if (srcSize < ZSTD_frameHeaderSize+ZSTD_blockHeaderSize) {
|
3345
|
+
ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(srcSize_wrong));
|
3346
|
+
return;
|
3347
|
+
}
|
3325
3348
|
magicNumber = MEM_readLE32(src);
|
3326
|
-
if (magicNumber != ZSTD_magicNumber)
|
3349
|
+
if (magicNumber != ZSTD_magicNumber) {
|
3350
|
+
ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(prefix_unknown));
|
3351
|
+
return;
|
3352
|
+
}
|
3327
3353
|
ip += ZSTD_frameHeaderSize; remainingSize -= ZSTD_frameHeaderSize;
|
3328
3354
|
|
3329
3355
|
/* Loop on each block */
|
3330
3356
|
while (1)
|
3331
3357
|
{
|
3332
3358
|
size_t cBlockSize = ZSTD_getcBlockSize(ip, remainingSize, &blockProperties);
|
3333
|
-
if (ZSTD_isError(cBlockSize))
|
3359
|
+
if (ZSTD_isError(cBlockSize)) {
|
3360
|
+
ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, cBlockSize);
|
3361
|
+
return;
|
3362
|
+
}
|
3334
3363
|
|
3335
3364
|
ip += ZSTD_blockHeaderSize;
|
3336
3365
|
remainingSize -= ZSTD_blockHeaderSize;
|
3337
|
-
if (cBlockSize > remainingSize)
|
3366
|
+
if (cBlockSize > remainingSize) {
|
3367
|
+
ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(srcSize_wrong));
|
3368
|
+
return;
|
3369
|
+
}
|
3338
3370
|
|
3339
3371
|
if (cBlockSize == 0) break; /* bt_end */
|
3340
3372
|
|
3341
3373
|
ip += cBlockSize;
|
3342
3374
|
remainingSize -= cBlockSize;
|
3375
|
+
nbBlocks++;
|
3343
3376
|
}
|
3344
3377
|
|
3345
|
-
|
3378
|
+
*cSize = ip - (const BYTE*)src;
|
3379
|
+
*dBound = nbBlocks * BLOCKSIZE;
|
3346
3380
|
}
|
3347
3381
|
|
3348
3382
|
/*******************************
|
@@ -3458,11 +3492,6 @@ size_t ZSTDv02_decompress( void* dst, size_t maxOriginalSize,
|
|
3458
3492
|
return ZSTD_decompress(dst, maxOriginalSize, src, compressedSize);
|
3459
3493
|
}
|
3460
3494
|
|
3461
|
-
size_t ZSTDv02_findFrameCompressedSize(const void *src, size_t compressedSize)
|
3462
|
-
{
|
3463
|
-
return ZSTD_findFrameCompressedSize(src, compressedSize);
|
3464
|
-
}
|
3465
|
-
|
3466
3495
|
ZSTDv02_Dctx* ZSTDv02_createDCtx(void)
|
3467
3496
|
{
|
3468
3497
|
return (ZSTDv02_Dctx*)ZSTD_createDCtx();
|
@@ -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 @@ ZSTDv02_decompress() : decompress ZSTD frames compliant with v0.2.x format
|
|
35
35
|
size_t ZSTDv02_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
|
+
ZSTDv02_findFrameSizeInfoLegacy() : get the source length and decompressed bound of a ZSTD frame compliant with v0.2.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 ZSTDv02_findFrameSizeInfoLegacy(const void *src, size_t srcSize,
|
49
|
+
size_t* cSize, unsigned long long* dBound);
|
45
50
|
|
46
51
|
/**
|
47
52
|
ZSTDv02_isError() : tells if the result of ZSTDv02_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
|
#include <stddef.h> /* size_t, ptrdiff_t */
|
13
13
|
#include "zstd_v03.h"
|
14
|
-
#include "error_private.h"
|
14
|
+
#include "../common/error_private.h"
|
15
15
|
|
16
16
|
|
17
17
|
/******************************************
|
@@ -191,7 +191,7 @@ MEM_STATIC void MEM_write16(void* memPtr, U16 value)
|
|
191
191
|
}
|
192
192
|
|
193
193
|
|
194
|
-
#endif
|
194
|
+
#endif /* MEM_FORCE_MEMORY_ACCESS */
|
195
195
|
|
196
196
|
|
197
197
|
MEM_STATIC U16 MEM_readLE16(const void* memPtr)
|
@@ -219,6 +219,11 @@ MEM_STATIC void MEM_writeLE16(void* memPtr, U16 val)
|
|
219
219
|
}
|
220
220
|
}
|
221
221
|
|
222
|
+
MEM_STATIC U32 MEM_readLE24(const void* memPtr)
|
223
|
+
{
|
224
|
+
return MEM_readLE16(memPtr) + (((const BYTE*)memPtr)[2] << 16);
|
225
|
+
}
|
226
|
+
|
222
227
|
MEM_STATIC U32 MEM_readLE32(const void* memPtr)
|
223
228
|
{
|
224
229
|
if (MEM_isLittleEndian())
|
@@ -351,7 +356,7 @@ MEM_STATIC unsigned BIT_highbit32 (U32 val)
|
|
351
356
|
_BitScanReverse ( &r, val );
|
352
357
|
return (unsigned) r;
|
353
358
|
# elif defined(__GNUC__) && (__GNUC__ >= 3) /* Use GCC Intrinsic */
|
354
|
-
return
|
359
|
+
return __builtin_clz (val) ^ 31;
|
355
360
|
# else /* Software version */
|
356
361
|
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 };
|
357
362
|
U32 v = val;
|
@@ -2369,6 +2374,8 @@ static size_t HUF_decompress (void* dst, size_t dstSize, const void* cSrc, size_
|
|
2369
2374
|
#define LITERAL_NOENTROPY 63
|
2370
2375
|
#define COMMAND_NOENTROPY 7 /* to remove */
|
2371
2376
|
|
2377
|
+
#define ZSTD_CONTENTSIZE_ERROR (0ULL - 2)
|
2378
|
+
|
2372
2379
|
static const size_t ZSTD_blockHeaderSize = 3;
|
2373
2380
|
static const size_t ZSTD_frameHeaderSize = 4;
|
2374
2381
|
|
@@ -2470,7 +2477,9 @@ static size_t ZSTD_getcBlockSize(const void* src, size_t srcSize, blockPropertie
|
|
2470
2477
|
static size_t ZSTD_copyUncompressedBlock(void* dst, size_t maxDstSize, const void* src, size_t srcSize)
|
2471
2478
|
{
|
2472
2479
|
if (srcSize > maxDstSize) return ERROR(dstSize_tooSmall);
|
2473
|
-
|
2480
|
+
if (srcSize > 0) {
|
2481
|
+
memcpy(dst, src, srcSize);
|
2482
|
+
}
|
2474
2483
|
return srcSize;
|
2475
2484
|
}
|
2476
2485
|
|
@@ -2523,6 +2532,7 @@ static size_t ZSTD_decodeLiteralsBlock(void* ctx,
|
|
2523
2532
|
const size_t litSize = (MEM_readLE32(istart) & 0xFFFFFF) >> 2; /* no buffer issue : srcSize >= MIN_CBLOCK_SIZE */
|
2524
2533
|
if (litSize > srcSize-11) /* risk of reading too far with wildcopy */
|
2525
2534
|
{
|
2535
|
+
if (litSize > BLOCKSIZE) return ERROR(corruption_detected);
|
2526
2536
|
if (litSize > srcSize-3) return ERROR(corruption_detected);
|
2527
2537
|
memcpy(dctx->litBuffer, istart, litSize);
|
2528
2538
|
dctx->litPtr = dctx->litBuffer;
|
@@ -2682,11 +2692,11 @@ static void ZSTD_decodeSequence(seq_t* seq, seqState_t* seqState)
|
|
2682
2692
|
seqState->prevOffset = seq->offset;
|
2683
2693
|
if (litLength == MaxLL)
|
2684
2694
|
{
|
2685
|
-
U32 add = *dumps
|
2695
|
+
const U32 add = dumps<de ? *dumps++ : 0;
|
2686
2696
|
if (add < 255) litLength += add;
|
2687
|
-
else
|
2697
|
+
else if (dumps + 3 <= de)
|
2688
2698
|
{
|
2689
|
-
litLength =
|
2699
|
+
litLength = MEM_readLE24(dumps);
|
2690
2700
|
dumps += 3;
|
2691
2701
|
}
|
2692
2702
|
if (dumps >= de) dumps = de-1; /* late correction, to avoid read overflow (data is now corrupted anyway) */
|
@@ -2712,11 +2722,11 @@ static void ZSTD_decodeSequence(seq_t* seq, seqState_t* seqState)
|
|
2712
2722
|
matchLength = FSE_decodeSymbol(&(seqState->stateML), &(seqState->DStream));
|
2713
2723
|
if (matchLength == MaxML)
|
2714
2724
|
{
|
2715
|
-
U32 add = *dumps
|
2725
|
+
const U32 add = dumps<de ? *dumps++ : 0;
|
2716
2726
|
if (add < 255) matchLength += add;
|
2717
|
-
else
|
2727
|
+
else if (dumps + 3 <= de)
|
2718
2728
|
{
|
2719
|
-
matchLength =
|
2729
|
+
matchLength = MEM_readLE24(dumps);
|
2720
2730
|
dumps += 3;
|
2721
2731
|
}
|
2722
2732
|
if (dumps >= de) dumps = de-1; /* late correction, to avoid read overflow (data is now corrupted anyway) */
|
@@ -2737,7 +2747,7 @@ static size_t ZSTD_execSequence(BYTE* op,
|
|
2737
2747
|
BYTE* const base, BYTE* const oend)
|
2738
2748
|
{
|
2739
2749
|
static const int dec32table[] = {0, 1, 2, 1, 4, 4, 4, 4}; /* added */
|
2740
|
-
static const int dec64table[] = {8, 8, 8, 7, 8, 9,10,11}; /*
|
2750
|
+
static const int dec64table[] = {8, 8, 8, 7, 8, 9,10,11}; /* subtracted */
|
2741
2751
|
const BYTE* const ostart = op;
|
2742
2752
|
BYTE* const oLitEnd = op + sequence.litLength;
|
2743
2753
|
BYTE* const oMatchEnd = op + sequence.litLength + sequence.matchLength; /* risk : address space overflow (32-bits) */
|
@@ -2862,8 +2872,10 @@ static size_t ZSTD_decompressSequences(
|
|
2862
2872
|
size_t lastLLSize = litEnd - litPtr;
|
2863
2873
|
if (litPtr > litEnd) return ERROR(corruption_detected);
|
2864
2874
|
if (op+lastLLSize > oend) return ERROR(dstSize_tooSmall);
|
2865
|
-
if (
|
2866
|
-
|
2875
|
+
if (lastLLSize > 0) {
|
2876
|
+
if (op != litPtr) memmove(op, litPtr, lastLLSize);
|
2877
|
+
op += lastLLSize;
|
2878
|
+
}
|
2867
2879
|
}
|
2868
2880
|
}
|
2869
2881
|
|
@@ -2953,36 +2965,59 @@ static size_t ZSTD_decompress(void* dst, size_t maxDstSize, const void* src, siz
|
|
2953
2965
|
return ZSTD_decompressDCtx(&ctx, dst, maxDstSize, src, srcSize);
|
2954
2966
|
}
|
2955
2967
|
|
2956
|
-
|
2968
|
+
/* ZSTD_errorFrameSizeInfoLegacy() :
|
2969
|
+
assumes `cSize` and `dBound` are _not_ NULL */
|
2970
|
+
MEM_STATIC void ZSTD_errorFrameSizeInfoLegacy(size_t* cSize, unsigned long long* dBound, size_t ret)
|
2971
|
+
{
|
2972
|
+
*cSize = ret;
|
2973
|
+
*dBound = ZSTD_CONTENTSIZE_ERROR;
|
2974
|
+
}
|
2975
|
+
|
2976
|
+
void ZSTDv03_findFrameSizeInfoLegacy(const void *src, size_t srcSize, size_t* cSize, unsigned long long* dBound)
|
2957
2977
|
{
|
2958
2978
|
const BYTE* ip = (const BYTE*)src;
|
2959
2979
|
size_t remainingSize = srcSize;
|
2980
|
+
size_t nbBlocks = 0;
|
2960
2981
|
U32 magicNumber;
|
2961
2982
|
blockProperties_t blockProperties;
|
2962
2983
|
|
2963
2984
|
/* Frame Header */
|
2964
|
-
if (srcSize < ZSTD_frameHeaderSize+ZSTD_blockHeaderSize)
|
2985
|
+
if (srcSize < ZSTD_frameHeaderSize+ZSTD_blockHeaderSize) {
|
2986
|
+
ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(srcSize_wrong));
|
2987
|
+
return;
|
2988
|
+
}
|
2965
2989
|
magicNumber = MEM_readLE32(src);
|
2966
|
-
if (magicNumber != ZSTD_magicNumber)
|
2990
|
+
if (magicNumber != ZSTD_magicNumber) {
|
2991
|
+
ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(prefix_unknown));
|
2992
|
+
return;
|
2993
|
+
}
|
2967
2994
|
ip += ZSTD_frameHeaderSize; remainingSize -= ZSTD_frameHeaderSize;
|
2968
2995
|
|
2969
2996
|
/* Loop on each block */
|
2970
2997
|
while (1)
|
2971
2998
|
{
|
2972
2999
|
size_t cBlockSize = ZSTD_getcBlockSize(ip, remainingSize, &blockProperties);
|
2973
|
-
if (ZSTD_isError(cBlockSize))
|
3000
|
+
if (ZSTD_isError(cBlockSize)) {
|
3001
|
+
ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, cBlockSize);
|
3002
|
+
return;
|
3003
|
+
}
|
2974
3004
|
|
2975
3005
|
ip += ZSTD_blockHeaderSize;
|
2976
3006
|
remainingSize -= ZSTD_blockHeaderSize;
|
2977
|
-
if (cBlockSize > remainingSize)
|
3007
|
+
if (cBlockSize > remainingSize) {
|
3008
|
+
ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(srcSize_wrong));
|
3009
|
+
return;
|
3010
|
+
}
|
2978
3011
|
|
2979
3012
|
if (cBlockSize == 0) break; /* bt_end */
|
2980
3013
|
|
2981
3014
|
ip += cBlockSize;
|
2982
3015
|
remainingSize -= cBlockSize;
|
3016
|
+
nbBlocks++;
|
2983
3017
|
}
|
2984
3018
|
|
2985
|
-
|
3019
|
+
*cSize = ip - (const BYTE*)src;
|
3020
|
+
*dBound = nbBlocks * BLOCKSIZE;
|
2986
3021
|
}
|
2987
3022
|
|
2988
3023
|
|
@@ -3099,11 +3134,6 @@ size_t ZSTDv03_decompress( void* dst, size_t maxOriginalSize,
|
|
3099
3134
|
return ZSTD_decompress(dst, maxOriginalSize, src, compressedSize);
|
3100
3135
|
}
|
3101
3136
|
|
3102
|
-
size_t ZSTDv03_findFrameCompressedSize(const void* src, size_t srcSize)
|
3103
|
-
{
|
3104
|
-
return ZSTD_findFrameCompressedSize(src, srcSize);
|
3105
|
-
}
|
3106
|
-
|
3107
3137
|
ZSTDv03_Dctx* ZSTDv03_createDCtx(void)
|
3108
3138
|
{
|
3109
3139
|
return (ZSTDv03_Dctx*)ZSTD_createDCtx();
|