extzstd 0.3 → 0.3.1
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/HISTORY.ja.md +8 -0
- data/README.md +1 -1
- data/contrib/zstd/CHANGELOG +94 -0
- data/contrib/zstd/CONTRIBUTING.md +351 -1
- data/contrib/zstd/Makefile +32 -10
- data/contrib/zstd/README.md +33 -10
- data/contrib/zstd/TESTING.md +2 -2
- data/contrib/zstd/appveyor.yml +42 -4
- data/contrib/zstd/lib/Makefile +128 -60
- data/contrib/zstd/lib/README.md +47 -16
- data/contrib/zstd/lib/common/bitstream.h +38 -39
- data/contrib/zstd/lib/common/compiler.h +40 -5
- data/contrib/zstd/lib/common/cpu.h +1 -1
- data/contrib/zstd/lib/common/debug.c +11 -31
- data/contrib/zstd/lib/common/debug.h +11 -31
- data/contrib/zstd/lib/common/entropy_common.c +13 -33
- data/contrib/zstd/lib/common/error_private.c +2 -1
- data/contrib/zstd/lib/common/error_private.h +6 -2
- data/contrib/zstd/lib/common/fse.h +12 -32
- data/contrib/zstd/lib/common/fse_decompress.c +12 -35
- data/contrib/zstd/lib/common/huf.h +15 -33
- data/contrib/zstd/lib/common/mem.h +75 -2
- data/contrib/zstd/lib/common/pool.c +8 -4
- data/contrib/zstd/lib/common/pool.h +2 -2
- data/contrib/zstd/lib/common/threading.c +50 -4
- data/contrib/zstd/lib/common/threading.h +36 -4
- data/contrib/zstd/lib/common/xxhash.c +23 -35
- data/contrib/zstd/lib/common/xxhash.h +11 -31
- data/contrib/zstd/lib/common/zstd_common.c +1 -1
- data/contrib/zstd/lib/common/zstd_errors.h +2 -1
- data/contrib/zstd/lib/common/zstd_internal.h +154 -26
- data/contrib/zstd/lib/compress/fse_compress.c +17 -40
- data/contrib/zstd/lib/compress/hist.c +15 -35
- data/contrib/zstd/lib/compress/hist.h +12 -32
- data/contrib/zstd/lib/compress/huf_compress.c +92 -92
- data/contrib/zstd/lib/compress/zstd_compress.c +1191 -1330
- data/contrib/zstd/lib/compress/zstd_compress_internal.h +317 -55
- data/contrib/zstd/lib/compress/zstd_compress_literals.c +158 -0
- data/contrib/zstd/lib/compress/zstd_compress_literals.h +29 -0
- data/contrib/zstd/lib/compress/zstd_compress_sequences.c +419 -0
- data/contrib/zstd/lib/compress/zstd_compress_sequences.h +54 -0
- data/contrib/zstd/lib/compress/zstd_compress_superblock.c +845 -0
- data/contrib/zstd/lib/compress/zstd_compress_superblock.h +32 -0
- data/contrib/zstd/lib/compress/zstd_cwksp.h +525 -0
- data/contrib/zstd/lib/compress/zstd_double_fast.c +65 -43
- data/contrib/zstd/lib/compress/zstd_double_fast.h +2 -2
- data/contrib/zstd/lib/compress/zstd_fast.c +92 -66
- data/contrib/zstd/lib/compress/zstd_fast.h +2 -2
- data/contrib/zstd/lib/compress/zstd_lazy.c +74 -42
- data/contrib/zstd/lib/compress/zstd_lazy.h +1 -1
- data/contrib/zstd/lib/compress/zstd_ldm.c +32 -10
- data/contrib/zstd/lib/compress/zstd_ldm.h +7 -2
- data/contrib/zstd/lib/compress/zstd_opt.c +81 -114
- data/contrib/zstd/lib/compress/zstd_opt.h +1 -1
- data/contrib/zstd/lib/compress/zstdmt_compress.c +95 -51
- data/contrib/zstd/lib/compress/zstdmt_compress.h +3 -2
- data/contrib/zstd/lib/decompress/huf_decompress.c +76 -60
- data/contrib/zstd/lib/decompress/zstd_ddict.c +12 -8
- data/contrib/zstd/lib/decompress/zstd_ddict.h +2 -2
- data/contrib/zstd/lib/decompress/zstd_decompress.c +292 -172
- data/contrib/zstd/lib/decompress/zstd_decompress_block.c +459 -338
- data/contrib/zstd/lib/decompress/zstd_decompress_block.h +3 -3
- data/contrib/zstd/lib/decompress/zstd_decompress_internal.h +18 -4
- data/contrib/zstd/lib/deprecated/zbuff.h +9 -8
- data/contrib/zstd/lib/deprecated/zbuff_common.c +2 -2
- data/contrib/zstd/lib/deprecated/zbuff_compress.c +1 -1
- data/contrib/zstd/lib/deprecated/zbuff_decompress.c +1 -1
- data/contrib/zstd/lib/dictBuilder/cover.c +164 -54
- data/contrib/zstd/lib/dictBuilder/cover.h +52 -7
- data/contrib/zstd/lib/dictBuilder/fastcover.c +60 -43
- data/contrib/zstd/lib/dictBuilder/zdict.c +43 -19
- data/contrib/zstd/lib/dictBuilder/zdict.h +56 -28
- data/contrib/zstd/lib/legacy/zstd_legacy.h +8 -4
- data/contrib/zstd/lib/legacy/zstd_v01.c +110 -110
- data/contrib/zstd/lib/legacy/zstd_v01.h +1 -1
- data/contrib/zstd/lib/legacy/zstd_v02.c +23 -13
- data/contrib/zstd/lib/legacy/zstd_v02.h +1 -1
- data/contrib/zstd/lib/legacy/zstd_v03.c +23 -13
- data/contrib/zstd/lib/legacy/zstd_v03.h +1 -1
- data/contrib/zstd/lib/legacy/zstd_v04.c +30 -17
- data/contrib/zstd/lib/legacy/zstd_v04.h +1 -1
- data/contrib/zstd/lib/legacy/zstd_v05.c +113 -102
- data/contrib/zstd/lib/legacy/zstd_v05.h +2 -2
- data/contrib/zstd/lib/legacy/zstd_v06.c +20 -18
- data/contrib/zstd/lib/legacy/zstd_v06.h +1 -1
- data/contrib/zstd/lib/legacy/zstd_v07.c +25 -19
- data/contrib/zstd/lib/legacy/zstd_v07.h +1 -1
- data/contrib/zstd/lib/libzstd.pc.in +3 -2
- data/contrib/zstd/lib/zstd.h +265 -88
- data/ext/extzstd.h +1 -1
- data/ext/libzstd_conf.h +8 -0
- data/ext/zstd_common.c +1 -3
- data/ext/zstd_compress.c +3 -3
- data/ext/zstd_decompress.c +1 -5
- data/ext/zstd_dictbuilder.c +2 -3
- data/ext/zstd_dictbuilder_fastcover.c +1 -3
- data/ext/zstd_legacy_v01.c +2 -0
- data/ext/zstd_legacy_v02.c +2 -0
- data/ext/zstd_legacy_v03.c +2 -0
- data/ext/zstd_legacy_v04.c +2 -0
- data/ext/zstd_legacy_v05.c +2 -0
- data/ext/zstd_legacy_v06.c +2 -0
- data/ext/zstd_legacy_v07.c +2 -0
- data/lib/extzstd.rb +18 -10
- data/lib/extzstd/version.rb +1 -1
- metadata +15 -6
|
@@ -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;
|
|
@@ -2831,7 +2836,9 @@ static size_t ZSTD_getcBlockSize(const void* src, size_t srcSize, blockPropertie
|
|
|
2831
2836
|
static size_t ZSTD_copyUncompressedBlock(void* dst, size_t maxDstSize, const void* src, size_t srcSize)
|
|
2832
2837
|
{
|
|
2833
2838
|
if (srcSize > maxDstSize) return ERROR(dstSize_tooSmall);
|
|
2834
|
-
|
|
2839
|
+
if (srcSize > 0) {
|
|
2840
|
+
memcpy(dst, src, srcSize);
|
|
2841
|
+
}
|
|
2835
2842
|
return srcSize;
|
|
2836
2843
|
}
|
|
2837
2844
|
|
|
@@ -2884,6 +2891,7 @@ static size_t ZSTD_decodeLiteralsBlock(void* ctx,
|
|
|
2884
2891
|
const size_t litSize = (MEM_readLE32(istart) & 0xFFFFFF) >> 2; /* no buffer issue : srcSize >= MIN_CBLOCK_SIZE */
|
|
2885
2892
|
if (litSize > srcSize-11) /* risk of reading too far with wildcopy */
|
|
2886
2893
|
{
|
|
2894
|
+
if (litSize > BLOCKSIZE) return ERROR(corruption_detected);
|
|
2887
2895
|
if (litSize > srcSize-3) return ERROR(corruption_detected);
|
|
2888
2896
|
memcpy(dctx->litBuffer, istart, litSize);
|
|
2889
2897
|
dctx->litPtr = dctx->litBuffer;
|
|
@@ -3043,11 +3051,11 @@ static void ZSTD_decodeSequence(seq_t* seq, seqState_t* seqState)
|
|
|
3043
3051
|
seqState->prevOffset = seq->offset;
|
|
3044
3052
|
if (litLength == MaxLL)
|
|
3045
3053
|
{
|
|
3046
|
-
U32 add = *dumps
|
|
3054
|
+
const U32 add = dumps<de ? *dumps++ : 0;
|
|
3047
3055
|
if (add < 255) litLength += add;
|
|
3048
|
-
else
|
|
3056
|
+
else if (dumps + 3 <= de)
|
|
3049
3057
|
{
|
|
3050
|
-
litLength =
|
|
3058
|
+
litLength = MEM_readLE24(dumps);
|
|
3051
3059
|
dumps += 3;
|
|
3052
3060
|
}
|
|
3053
3061
|
if (dumps >= de) dumps = de-1; /* late correction, to avoid read overflow (data is now corrupted anyway) */
|
|
@@ -3073,11 +3081,11 @@ static void ZSTD_decodeSequence(seq_t* seq, seqState_t* seqState)
|
|
|
3073
3081
|
matchLength = FSE_decodeSymbol(&(seqState->stateML), &(seqState->DStream));
|
|
3074
3082
|
if (matchLength == MaxML)
|
|
3075
3083
|
{
|
|
3076
|
-
U32 add = *dumps
|
|
3084
|
+
const U32 add = dumps<de ? *dumps++ : 0;
|
|
3077
3085
|
if (add < 255) matchLength += add;
|
|
3078
|
-
else
|
|
3086
|
+
else if (dumps + 3 <= de)
|
|
3079
3087
|
{
|
|
3080
|
-
matchLength =
|
|
3088
|
+
matchLength = MEM_readLE24(dumps);
|
|
3081
3089
|
dumps += 3;
|
|
3082
3090
|
}
|
|
3083
3091
|
if (dumps >= de) dumps = de-1; /* late correction, to avoid read overflow (data is now corrupted anyway) */
|
|
@@ -3223,8 +3231,10 @@ static size_t ZSTD_decompressSequences(
|
|
|
3223
3231
|
size_t lastLLSize = litEnd - litPtr;
|
|
3224
3232
|
if (litPtr > litEnd) return ERROR(corruption_detected);
|
|
3225
3233
|
if (op+lastLLSize > oend) return ERROR(dstSize_tooSmall);
|
|
3226
|
-
if (
|
|
3227
|
-
|
|
3234
|
+
if (lastLLSize > 0) {
|
|
3235
|
+
if (op != litPtr) memmove(op, litPtr, lastLLSize);
|
|
3236
|
+
op += lastLLSize;
|
|
3237
|
+
}
|
|
3228
3238
|
}
|
|
3229
3239
|
}
|
|
3230
3240
|
|
|
@@ -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;
|
|
@@ -2472,7 +2477,9 @@ static size_t ZSTD_getcBlockSize(const void* src, size_t srcSize, blockPropertie
|
|
|
2472
2477
|
static size_t ZSTD_copyUncompressedBlock(void* dst, size_t maxDstSize, const void* src, size_t srcSize)
|
|
2473
2478
|
{
|
|
2474
2479
|
if (srcSize > maxDstSize) return ERROR(dstSize_tooSmall);
|
|
2475
|
-
|
|
2480
|
+
if (srcSize > 0) {
|
|
2481
|
+
memcpy(dst, src, srcSize);
|
|
2482
|
+
}
|
|
2476
2483
|
return srcSize;
|
|
2477
2484
|
}
|
|
2478
2485
|
|
|
@@ -2525,6 +2532,7 @@ static size_t ZSTD_decodeLiteralsBlock(void* ctx,
|
|
|
2525
2532
|
const size_t litSize = (MEM_readLE32(istart) & 0xFFFFFF) >> 2; /* no buffer issue : srcSize >= MIN_CBLOCK_SIZE */
|
|
2526
2533
|
if (litSize > srcSize-11) /* risk of reading too far with wildcopy */
|
|
2527
2534
|
{
|
|
2535
|
+
if (litSize > BLOCKSIZE) return ERROR(corruption_detected);
|
|
2528
2536
|
if (litSize > srcSize-3) return ERROR(corruption_detected);
|
|
2529
2537
|
memcpy(dctx->litBuffer, istart, litSize);
|
|
2530
2538
|
dctx->litPtr = dctx->litBuffer;
|
|
@@ -2684,11 +2692,11 @@ static void ZSTD_decodeSequence(seq_t* seq, seqState_t* seqState)
|
|
|
2684
2692
|
seqState->prevOffset = seq->offset;
|
|
2685
2693
|
if (litLength == MaxLL)
|
|
2686
2694
|
{
|
|
2687
|
-
U32 add = *dumps
|
|
2695
|
+
const U32 add = dumps<de ? *dumps++ : 0;
|
|
2688
2696
|
if (add < 255) litLength += add;
|
|
2689
|
-
else
|
|
2697
|
+
else if (dumps + 3 <= de)
|
|
2690
2698
|
{
|
|
2691
|
-
litLength =
|
|
2699
|
+
litLength = MEM_readLE24(dumps);
|
|
2692
2700
|
dumps += 3;
|
|
2693
2701
|
}
|
|
2694
2702
|
if (dumps >= de) dumps = de-1; /* late correction, to avoid read overflow (data is now corrupted anyway) */
|
|
@@ -2714,11 +2722,11 @@ static void ZSTD_decodeSequence(seq_t* seq, seqState_t* seqState)
|
|
|
2714
2722
|
matchLength = FSE_decodeSymbol(&(seqState->stateML), &(seqState->DStream));
|
|
2715
2723
|
if (matchLength == MaxML)
|
|
2716
2724
|
{
|
|
2717
|
-
U32 add = *dumps
|
|
2725
|
+
const U32 add = dumps<de ? *dumps++ : 0;
|
|
2718
2726
|
if (add < 255) matchLength += add;
|
|
2719
|
-
else
|
|
2727
|
+
else if (dumps + 3 <= de)
|
|
2720
2728
|
{
|
|
2721
|
-
matchLength =
|
|
2729
|
+
matchLength = MEM_readLE24(dumps);
|
|
2722
2730
|
dumps += 3;
|
|
2723
2731
|
}
|
|
2724
2732
|
if (dumps >= de) dumps = de-1; /* late correction, to avoid read overflow (data is now corrupted anyway) */
|
|
@@ -2864,8 +2872,10 @@ static size_t ZSTD_decompressSequences(
|
|
|
2864
2872
|
size_t lastLLSize = litEnd - litPtr;
|
|
2865
2873
|
if (litPtr > litEnd) return ERROR(corruption_detected);
|
|
2866
2874
|
if (op+lastLLSize > oend) return ERROR(dstSize_tooSmall);
|
|
2867
|
-
if (
|
|
2868
|
-
|
|
2875
|
+
if (lastLLSize > 0) {
|
|
2876
|
+
if (op != litPtr) memmove(op, litPtr, lastLLSize);
|
|
2877
|
+
op += lastLLSize;
|
|
2878
|
+
}
|
|
2869
2879
|
}
|
|
2870
2880
|
}
|
|
2871
2881
|
|
|
@@ -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())
|
|
@@ -622,7 +627,7 @@ MEM_STATIC unsigned BIT_highbit32 (U32 val)
|
|
|
622
627
|
_BitScanReverse ( &r, val );
|
|
623
628
|
return (unsigned) r;
|
|
624
629
|
# elif defined(__GNUC__) && (__GNUC__ >= 3) /* Use GCC Intrinsic */
|
|
625
|
-
return
|
|
630
|
+
return __builtin_clz (val) ^ 31;
|
|
626
631
|
# else /* Software version */
|
|
627
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 };
|
|
628
633
|
U32 v = val;
|
|
@@ -2598,7 +2603,9 @@ static size_t ZSTD_getcBlockSize(const void* src, size_t srcSize, blockPropertie
|
|
|
2598
2603
|
static size_t ZSTD_copyRawBlock(void* dst, size_t maxDstSize, const void* src, size_t srcSize)
|
|
2599
2604
|
{
|
|
2600
2605
|
if (srcSize > maxDstSize) return ERROR(dstSize_tooSmall);
|
|
2601
|
-
|
|
2606
|
+
if (srcSize > 0) {
|
|
2607
|
+
memcpy(dst, src, srcSize);
|
|
2608
|
+
}
|
|
2602
2609
|
return srcSize;
|
|
2603
2610
|
}
|
|
2604
2611
|
|
|
@@ -2650,6 +2657,7 @@ static size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx,
|
|
|
2650
2657
|
const size_t litSize = (MEM_readLE32(istart) & 0xFFFFFF) >> 2; /* no buffer issue : srcSize >= MIN_CBLOCK_SIZE */
|
|
2651
2658
|
if (litSize > srcSize-11) /* risk of reading too far with wildcopy */
|
|
2652
2659
|
{
|
|
2660
|
+
if (litSize > BLOCKSIZE) return ERROR(corruption_detected);
|
|
2653
2661
|
if (litSize > srcSize-3) return ERROR(corruption_detected);
|
|
2654
2662
|
memcpy(dctx->litBuffer, istart, litSize);
|
|
2655
2663
|
dctx->litPtr = dctx->litBuffer;
|
|
@@ -2808,13 +2816,12 @@ static void ZSTD_decodeSequence(seq_t* seq, seqState_t* seqState)
|
|
|
2808
2816
|
litLength = FSE_decodeSymbol(&(seqState->stateLL), &(seqState->DStream));
|
|
2809
2817
|
prevOffset = litLength ? seq->offset : seqState->prevOffset;
|
|
2810
2818
|
if (litLength == MaxLL) {
|
|
2811
|
-
U32 add = *dumps
|
|
2819
|
+
const U32 add = dumps<de ? *dumps++ : 0;
|
|
2812
2820
|
if (add < 255) litLength += add;
|
|
2813
|
-
else {
|
|
2814
|
-
litLength =
|
|
2821
|
+
else if (dumps + 3 <= de) {
|
|
2822
|
+
litLength = MEM_readLE24(dumps);
|
|
2815
2823
|
dumps += 3;
|
|
2816
2824
|
}
|
|
2817
|
-
if (dumps > de) { litLength = MaxLL+255; } /* late correction, to avoid using uninitialized memory */
|
|
2818
2825
|
if (dumps >= de) { dumps = de-1; } /* late correction, to avoid read overflow (data is now corrupted anyway) */
|
|
2819
2826
|
}
|
|
2820
2827
|
|
|
@@ -2837,13 +2844,12 @@ static void ZSTD_decodeSequence(seq_t* seq, seqState_t* seqState)
|
|
|
2837
2844
|
/* MatchLength */
|
|
2838
2845
|
matchLength = FSE_decodeSymbol(&(seqState->stateML), &(seqState->DStream));
|
|
2839
2846
|
if (matchLength == MaxML) {
|
|
2840
|
-
U32 add = *dumps
|
|
2847
|
+
const U32 add = dumps<de ? *dumps++ : 0;
|
|
2841
2848
|
if (add < 255) matchLength += add;
|
|
2842
|
-
else {
|
|
2843
|
-
matchLength =
|
|
2849
|
+
else if (dumps + 3 <= de){
|
|
2850
|
+
matchLength = MEM_readLE24(dumps);
|
|
2844
2851
|
dumps += 3;
|
|
2845
2852
|
}
|
|
2846
|
-
if (dumps > de) { matchLength = MaxML+255; } /* late correction, to avoid using uninitialized memory */
|
|
2847
2853
|
if (dumps >= de) { dumps = de-1; } /* late correction, to avoid read overflow (data is now corrupted anyway) */
|
|
2848
2854
|
}
|
|
2849
2855
|
matchLength += MINMATCH;
|
|
@@ -3004,8 +3010,10 @@ static size_t ZSTD_decompressSequences(
|
|
|
3004
3010
|
size_t lastLLSize = litEnd - litPtr;
|
|
3005
3011
|
if (litPtr > litEnd) return ERROR(corruption_detected);
|
|
3006
3012
|
if (op+lastLLSize > oend) return ERROR(dstSize_tooSmall);
|
|
3007
|
-
if (
|
|
3008
|
-
|
|
3013
|
+
if (lastLLSize > 0) {
|
|
3014
|
+
if (op != litPtr) memcpy(op, litPtr, lastLLSize);
|
|
3015
|
+
op += lastLLSize;
|
|
3016
|
+
}
|
|
3009
3017
|
}
|
|
3010
3018
|
}
|
|
3011
3019
|
|
|
@@ -3031,9 +3039,12 @@ static size_t ZSTD_decompressBlock_internal(ZSTD_DCtx* dctx,
|
|
|
3031
3039
|
{
|
|
3032
3040
|
/* blockType == blockCompressed */
|
|
3033
3041
|
const BYTE* ip = (const BYTE*)src;
|
|
3042
|
+
size_t litCSize;
|
|
3043
|
+
|
|
3044
|
+
if (srcSize > BLOCKSIZE) return ERROR(corruption_detected);
|
|
3034
3045
|
|
|
3035
3046
|
/* Decode literals sub-block */
|
|
3036
|
-
|
|
3047
|
+
litCSize = ZSTD_decodeLiteralsBlock(dctx, src, srcSize);
|
|
3037
3048
|
if (ZSTD_isError(litCSize)) return litCSize;
|
|
3038
3049
|
ip += litCSize;
|
|
3039
3050
|
srcSize -= litCSize;
|
|
@@ -3400,7 +3411,9 @@ static size_t ZBUFF_decompressWithDictionary(ZBUFF_DCtx* zbc, const void* src, s
|
|
|
3400
3411
|
static size_t ZBUFF_limitCopy(void* dst, size_t maxDstSize, const void* src, size_t srcSize)
|
|
3401
3412
|
{
|
|
3402
3413
|
size_t length = MIN(maxDstSize, srcSize);
|
|
3403
|
-
|
|
3414
|
+
if (length > 0) {
|
|
3415
|
+
memcpy(dst, src, length);
|
|
3416
|
+
}
|
|
3404
3417
|
return length;
|
|
3405
3418
|
}
|
|
3406
3419
|
|
|
@@ -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
|
/* ******************************************************************
|
|
@@ -756,7 +756,7 @@ MEM_STATIC unsigned BITv05_highbit32 (U32 val)
|
|
|
756
756
|
_BitScanReverse ( &r, val );
|
|
757
757
|
return (unsigned) r;
|
|
758
758
|
# elif defined(__GNUC__) && (__GNUC__ >= 3) /* Use GCC Intrinsic */
|
|
759
|
-
return
|
|
759
|
+
return __builtin_clz (val) ^ 31;
|
|
760
760
|
# else /* Software version */
|
|
761
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 };
|
|
762
762
|
U32 v = val;
|
|
@@ -1804,7 +1804,7 @@ static size_t HUFv05_readStats(BYTE* huffWeight, size_t hwSize, U32* rankStats,
|
|
|
1804
1804
|
|
|
1805
1805
|
if (!srcSize) return ERROR(srcSize_wrong);
|
|
1806
1806
|
iSize = ip[0];
|
|
1807
|
-
|
|
1807
|
+
/* memset(huffWeight, 0, hwSize); */ /* is not necessary, even though some analyzer complain ... */
|
|
1808
1808
|
|
|
1809
1809
|
if (iSize >= 128) { /* special header */
|
|
1810
1810
|
if (iSize >= (242)) { /* RLE */
|
|
@@ -1879,7 +1879,7 @@ size_t HUFv05_readDTableX2 (U16* DTable, const void* src, size_t srcSize)
|
|
|
1879
1879
|
HUFv05_DEltX2* const dt = (HUFv05_DEltX2*)dtPtr;
|
|
1880
1880
|
|
|
1881
1881
|
HUFv05_STATIC_ASSERT(sizeof(HUFv05_DEltX2) == sizeof(U16)); /* if compilation fails here, assertion is false */
|
|
1882
|
-
|
|
1882
|
+
/* memset(huffWeight, 0, sizeof(huffWeight)); */ /* is not necessary, even though some analyzer complain ... */
|
|
1883
1883
|
|
|
1884
1884
|
iSize = HUFv05_readStats(huffWeight, HUFv05_MAX_SYMBOL_VALUE + 1, rankVal, &nbSymbols, &tableLog, src, srcSize);
|
|
1885
1885
|
if (HUFv05_isError(iSize)) return iSize;
|
|
@@ -1998,91 +1998,92 @@ size_t HUFv05_decompress4X2_usingDTable(
|
|
|
1998
1998
|
const void* cSrc, size_t cSrcSize,
|
|
1999
1999
|
const U16* DTable)
|
|
2000
2000
|
{
|
|
2001
|
-
const BYTE* const istart = (const BYTE*) cSrc;
|
|
2002
|
-
BYTE* const ostart = (BYTE*) dst;
|
|
2003
|
-
BYTE* const oend = ostart + dstSize;
|
|
2004
|
-
const void* const dtPtr = DTable;
|
|
2005
|
-
const HUFv05_DEltX2* const dt = ((const HUFv05_DEltX2*)dtPtr) +1;
|
|
2006
|
-
const U32 dtLog = DTable[0];
|
|
2007
|
-
size_t errorCode;
|
|
2008
|
-
|
|
2009
|
-
/* Init */
|
|
2010
|
-
BITv05_DStream_t bitD1;
|
|
2011
|
-
BITv05_DStream_t bitD2;
|
|
2012
|
-
BITv05_DStream_t bitD3;
|
|
2013
|
-
BITv05_DStream_t bitD4;
|
|
2014
|
-
const size_t length1 = MEM_readLE16(istart);
|
|
2015
|
-
const size_t length2 = MEM_readLE16(istart+2);
|
|
2016
|
-
const size_t length3 = MEM_readLE16(istart+4);
|
|
2017
|
-
size_t length4;
|
|
2018
|
-
const BYTE* const istart1 = istart + 6; /* jumpTable */
|
|
2019
|
-
const BYTE* const istart2 = istart1 + length1;
|
|
2020
|
-
const BYTE* const istart3 = istart2 + length2;
|
|
2021
|
-
const BYTE* const istart4 = istart3 + length3;
|
|
2022
|
-
const size_t segmentSize = (dstSize+3) / 4;
|
|
2023
|
-
BYTE* const opStart2 = ostart + segmentSize;
|
|
2024
|
-
BYTE* const opStart3 = opStart2 + segmentSize;
|
|
2025
|
-
BYTE* const opStart4 = opStart3 + segmentSize;
|
|
2026
|
-
BYTE* op1 = ostart;
|
|
2027
|
-
BYTE* op2 = opStart2;
|
|
2028
|
-
BYTE* op3 = opStart3;
|
|
2029
|
-
BYTE* op4 = opStart4;
|
|
2030
|
-
U32 endSignal;
|
|
2031
|
-
|
|
2032
2001
|
/* Check */
|
|
2033
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;
|
|
2034
2011
|
|
|
2035
|
-
|
|
2036
|
-
|
|
2037
|
-
|
|
2038
|
-
|
|
2039
|
-
|
|
2040
|
-
|
|
2041
|
-
|
|
2042
|
-
|
|
2043
|
-
|
|
2044
|
-
|
|
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;
|
|
2045
2045
|
|
|
2046
|
-
|
|
2047
|
-
endSignal = BITv05_reloadDStream(&bitD1) | BITv05_reloadDStream(&bitD2) | BITv05_reloadDStream(&bitD3) | BITv05_reloadDStream(&bitD4);
|
|
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);
|
|
2046
|
+
/* 16-32 symbols per loop (4-8 symbols per stream) */
|
|
2065
2047
|
endSignal = BITv05_reloadDStream(&bitD1) | BITv05_reloadDStream(&bitD2) | BITv05_reloadDStream(&bitD3) | BITv05_reloadDStream(&bitD4);
|
|
2066
|
-
|
|
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
|
+
}
|
|
2067
2067
|
|
|
2068
|
-
|
|
2069
|
-
|
|
2070
|
-
|
|
2071
|
-
|
|
2072
|
-
|
|
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 */
|
|
2073
2073
|
|
|
2074
|
-
|
|
2075
|
-
|
|
2076
|
-
|
|
2077
|
-
|
|
2078
|
-
|
|
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);
|
|
2079
2079
|
|
|
2080
|
-
|
|
2081
|
-
|
|
2082
|
-
|
|
2080
|
+
/* check */
|
|
2081
|
+
endSignal = BITv05_endOfDStream(&bitD1) & BITv05_endOfDStream(&bitD2) & BITv05_endOfDStream(&bitD3) & BITv05_endOfDStream(&bitD4);
|
|
2082
|
+
if (!endSignal) return ERROR(corruption_detected);
|
|
2083
2083
|
|
|
2084
|
-
|
|
2085
|
-
|
|
2084
|
+
/* decoded size */
|
|
2085
|
+
return dstSize;
|
|
2086
|
+
}
|
|
2086
2087
|
}
|
|
2087
2088
|
|
|
2088
2089
|
|
|
@@ -2209,7 +2210,7 @@ size_t HUFv05_readDTableX4 (unsigned* DTable, const void* src, size_t srcSize)
|
|
|
2209
2210
|
|
|
2210
2211
|
HUFv05_STATIC_ASSERT(sizeof(HUFv05_DEltX4) == sizeof(unsigned)); /* if compilation fails here, assertion is false */
|
|
2211
2212
|
if (memLog > HUFv05_ABSOLUTEMAX_TABLELOG) return ERROR(tableLog_tooLarge);
|
|
2212
|
-
|
|
2213
|
+
/* memset(weightList, 0, sizeof(weightList)); */ /* is not necessary, even though some analyzer complain ... */
|
|
2213
2214
|
|
|
2214
2215
|
iSize = HUFv05_readStats(weightList, HUFv05_MAX_SYMBOL_VALUE + 1, rankStats, &nbSymbols, &tableLog, src, srcSize);
|
|
2215
2216
|
if (HUFv05_isError(iSize)) return iSize;
|
|
@@ -2538,9 +2539,9 @@ size_t HUFv05_decompress (void* dst, size_t dstSize, const void* cSrc, size_t cS
|
|
|
2538
2539
|
|
|
2539
2540
|
return decompress[algoNb](dst, dstSize, cSrc, cSrcSize);
|
|
2540
2541
|
|
|
2541
|
-
|
|
2542
|
-
|
|
2543
|
-
|
|
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 */
|
|
2544
2545
|
}
|
|
2545
2546
|
/*
|
|
2546
2547
|
zstd - standard compression library
|
|
@@ -3150,14 +3151,17 @@ static void ZSTDv05_decodeSequence(seq_t* seq, seqState_t* seqState)
|
|
|
3150
3151
|
litLength = FSEv05_peakSymbol(&(seqState->stateLL));
|
|
3151
3152
|
prevOffset = litLength ? seq->offset : seqState->prevOffset;
|
|
3152
3153
|
if (litLength == MaxLL) {
|
|
3153
|
-
U32 add = *dumps++;
|
|
3154
|
+
const U32 add = *dumps++;
|
|
3154
3155
|
if (add < 255) litLength += add;
|
|
3155
|
-
else {
|
|
3156
|
-
litLength =
|
|
3157
|
-
|
|
3158
|
-
|
|
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;
|
|
3159
3164
|
}
|
|
3160
|
-
if (dumps > de) { litLength = MaxLL+255; } /* late correction, to avoid using uninitialized memory */
|
|
3161
3165
|
if (dumps >= de) { dumps = de-1; } /* late correction, to avoid read overflow (data is now corrupted anyway) */
|
|
3162
3166
|
}
|
|
3163
3167
|
|
|
@@ -3184,14 +3188,17 @@ static void ZSTDv05_decodeSequence(seq_t* seq, seqState_t* seqState)
|
|
|
3184
3188
|
/* MatchLength */
|
|
3185
3189
|
matchLength = FSEv05_decodeSymbol(&(seqState->stateML), &(seqState->DStream));
|
|
3186
3190
|
if (matchLength == MaxML) {
|
|
3187
|
-
U32 add = *dumps
|
|
3191
|
+
const U32 add = dumps<de ? *dumps++ : 0;
|
|
3188
3192
|
if (add < 255) matchLength += add;
|
|
3189
|
-
else {
|
|
3190
|
-
matchLength =
|
|
3191
|
-
|
|
3192
|
-
|
|
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;
|
|
3193
3201
|
}
|
|
3194
|
-
if (dumps > de) { matchLength = MaxML+255; } /* late correction, to avoid using uninitialized memory */
|
|
3195
3202
|
if (dumps >= de) { dumps = de-1; } /* late correction, to avoid read overflow (data is now corrupted anyway) */
|
|
3196
3203
|
}
|
|
3197
3204
|
matchLength += MINMATCH;
|
|
@@ -3355,8 +3362,10 @@ static size_t ZSTDv05_decompressSequences(
|
|
|
3355
3362
|
size_t lastLLSize = litEnd - litPtr;
|
|
3356
3363
|
if (litPtr > litEnd) return ERROR(corruption_detected); /* too many literals already used */
|
|
3357
3364
|
if (op+lastLLSize > oend) return ERROR(dstSize_tooSmall);
|
|
3358
|
-
|
|
3359
|
-
|
|
3365
|
+
if (lastLLSize > 0) {
|
|
3366
|
+
memcpy(op, litPtr, lastLLSize);
|
|
3367
|
+
op += lastLLSize;
|
|
3368
|
+
}
|
|
3360
3369
|
}
|
|
3361
3370
|
|
|
3362
3371
|
return op-ostart;
|
|
@@ -3784,7 +3793,9 @@ static size_t ZBUFFv05_blockHeaderSize = 3;
|
|
|
3784
3793
|
static size_t ZBUFFv05_limitCopy(void* dst, size_t maxDstSize, const void* src, size_t srcSize)
|
|
3785
3794
|
{
|
|
3786
3795
|
size_t length = MIN(maxDstSize, srcSize);
|
|
3787
|
-
|
|
3796
|
+
if (length > 0) {
|
|
3797
|
+
memcpy(dst, src, length);
|
|
3798
|
+
}
|
|
3788
3799
|
return length;
|
|
3789
3800
|
}
|
|
3790
3801
|
|
|
@@ -3921,7 +3932,7 @@ size_t ZBUFFv05_decompressContinue(ZBUFFv05_DCtx* zbc, void* dst, size_t* maxDst
|
|
|
3921
3932
|
*maxDstSizePtr = 0;
|
|
3922
3933
|
return headerSize - zbc->hPos;
|
|
3923
3934
|
}
|
|
3924
|
-
|
|
3935
|
+
/* zbc->stage = ZBUFFv05ds_decodeHeader; break; */ /* useless : stage follows */
|
|
3925
3936
|
}
|
|
3926
3937
|
/* fall-through */
|
|
3927
3938
|
case ZBUFFv05ds_decodeHeader:
|
|
@@ -3994,7 +4005,7 @@ size_t ZBUFFv05_decompressContinue(ZBUFFv05_DCtx* zbc, void* dst, size_t* maxDst
|
|
|
3994
4005
|
if (!decodedSize) { zbc->stage = ZBUFFv05ds_read; break; } /* this was just a header */
|
|
3995
4006
|
zbc->outEnd = zbc->outStart + decodedSize;
|
|
3996
4007
|
zbc->stage = ZBUFFv05ds_flush;
|
|
3997
|
-
|
|
4008
|
+
/* break; */ /* ZBUFFv05ds_flush follows */
|
|
3998
4009
|
}
|
|
3999
4010
|
}
|
|
4000
4011
|
/* fall-through */
|