extzstd 0.3.2 → 0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +4 -3
- data/contrib/zstd/CHANGELOG +225 -1
- data/contrib/zstd/CONTRIBUTING.md +158 -75
- data/contrib/zstd/LICENSE +4 -4
- data/contrib/zstd/Makefile +106 -69
- data/contrib/zstd/Package.swift +36 -0
- data/contrib/zstd/README.md +64 -36
- data/contrib/zstd/SECURITY.md +15 -0
- data/contrib/zstd/TESTING.md +2 -3
- data/contrib/zstd/lib/BUCK +5 -7
- data/contrib/zstd/lib/Makefile +117 -199
- data/contrib/zstd/lib/README.md +37 -7
- data/contrib/zstd/lib/common/allocations.h +55 -0
- data/contrib/zstd/lib/common/bits.h +200 -0
- data/contrib/zstd/lib/common/bitstream.h +80 -86
- data/contrib/zstd/lib/common/compiler.h +225 -63
- data/contrib/zstd/lib/common/cpu.h +37 -1
- data/contrib/zstd/lib/common/debug.c +7 -1
- data/contrib/zstd/lib/common/debug.h +21 -12
- data/contrib/zstd/lib/common/entropy_common.c +15 -37
- data/contrib/zstd/lib/common/error_private.c +9 -2
- data/contrib/zstd/lib/common/error_private.h +93 -5
- data/contrib/zstd/lib/common/fse.h +12 -87
- data/contrib/zstd/lib/common/fse_decompress.c +37 -117
- data/contrib/zstd/lib/common/huf.h +97 -172
- data/contrib/zstd/lib/common/mem.h +58 -58
- data/contrib/zstd/lib/common/pool.c +38 -17
- data/contrib/zstd/lib/common/pool.h +10 -4
- data/contrib/zstd/lib/common/portability_macros.h +158 -0
- data/contrib/zstd/lib/common/threading.c +74 -14
- data/contrib/zstd/lib/common/threading.h +5 -10
- data/contrib/zstd/lib/common/xxhash.c +6 -814
- data/contrib/zstd/lib/common/xxhash.h +6930 -195
- data/contrib/zstd/lib/common/zstd_common.c +1 -36
- data/contrib/zstd/lib/common/zstd_deps.h +1 -1
- data/contrib/zstd/lib/common/zstd_internal.h +68 -154
- data/contrib/zstd/lib/common/zstd_trace.h +163 -0
- data/contrib/zstd/lib/compress/clevels.h +134 -0
- data/contrib/zstd/lib/compress/fse_compress.c +75 -155
- data/contrib/zstd/lib/compress/hist.c +1 -1
- data/contrib/zstd/lib/compress/hist.h +1 -1
- data/contrib/zstd/lib/compress/huf_compress.c +810 -259
- data/contrib/zstd/lib/compress/zstd_compress.c +2864 -919
- data/contrib/zstd/lib/compress/zstd_compress_internal.h +523 -192
- data/contrib/zstd/lib/compress/zstd_compress_literals.c +117 -40
- data/contrib/zstd/lib/compress/zstd_compress_literals.h +16 -6
- data/contrib/zstd/lib/compress/zstd_compress_sequences.c +28 -19
- data/contrib/zstd/lib/compress/zstd_compress_sequences.h +1 -1
- data/contrib/zstd/lib/compress/zstd_compress_superblock.c +251 -412
- data/contrib/zstd/lib/compress/zstd_compress_superblock.h +1 -1
- data/contrib/zstd/lib/compress/zstd_cwksp.h +284 -97
- data/contrib/zstd/lib/compress/zstd_double_fast.c +382 -133
- data/contrib/zstd/lib/compress/zstd_double_fast.h +14 -2
- data/contrib/zstd/lib/compress/zstd_fast.c +732 -260
- data/contrib/zstd/lib/compress/zstd_fast.h +3 -2
- data/contrib/zstd/lib/compress/zstd_lazy.c +1177 -390
- data/contrib/zstd/lib/compress/zstd_lazy.h +129 -14
- data/contrib/zstd/lib/compress/zstd_ldm.c +280 -210
- data/contrib/zstd/lib/compress/zstd_ldm.h +3 -2
- data/contrib/zstd/lib/compress/zstd_ldm_geartab.h +106 -0
- data/contrib/zstd/lib/compress/zstd_opt.c +516 -285
- data/contrib/zstd/lib/compress/zstd_opt.h +32 -8
- data/contrib/zstd/lib/compress/zstdmt_compress.c +202 -131
- data/contrib/zstd/lib/compress/zstdmt_compress.h +9 -6
- data/contrib/zstd/lib/decompress/huf_decompress.c +1149 -555
- data/contrib/zstd/lib/decompress/huf_decompress_amd64.S +595 -0
- data/contrib/zstd/lib/decompress/zstd_ddict.c +4 -4
- data/contrib/zstd/lib/decompress/zstd_ddict.h +1 -1
- data/contrib/zstd/lib/decompress/zstd_decompress.c +583 -106
- data/contrib/zstd/lib/decompress/zstd_decompress_block.c +1054 -379
- data/contrib/zstd/lib/decompress/zstd_decompress_block.h +14 -3
- data/contrib/zstd/lib/decompress/zstd_decompress_internal.h +56 -6
- data/contrib/zstd/lib/deprecated/zbuff.h +1 -1
- data/contrib/zstd/lib/deprecated/zbuff_common.c +1 -1
- data/contrib/zstd/lib/deprecated/zbuff_compress.c +24 -4
- data/contrib/zstd/lib/deprecated/zbuff_decompress.c +3 -1
- data/contrib/zstd/lib/dictBuilder/cover.c +60 -44
- data/contrib/zstd/lib/dictBuilder/cover.h +6 -11
- data/contrib/zstd/lib/dictBuilder/divsufsort.c +1 -1
- data/contrib/zstd/lib/dictBuilder/fastcover.c +26 -18
- data/contrib/zstd/lib/dictBuilder/zdict.c +100 -101
- data/contrib/zstd/lib/legacy/zstd_legacy.h +38 -1
- data/contrib/zstd/lib/legacy/zstd_v01.c +18 -53
- data/contrib/zstd/lib/legacy/zstd_v01.h +1 -1
- data/contrib/zstd/lib/legacy/zstd_v02.c +28 -85
- data/contrib/zstd/lib/legacy/zstd_v02.h +1 -1
- data/contrib/zstd/lib/legacy/zstd_v03.c +29 -88
- data/contrib/zstd/lib/legacy/zstd_v03.h +1 -1
- data/contrib/zstd/lib/legacy/zstd_v04.c +27 -80
- data/contrib/zstd/lib/legacy/zstd_v04.h +1 -1
- data/contrib/zstd/lib/legacy/zstd_v05.c +36 -85
- data/contrib/zstd/lib/legacy/zstd_v05.h +1 -1
- data/contrib/zstd/lib/legacy/zstd_v06.c +44 -96
- data/contrib/zstd/lib/legacy/zstd_v06.h +1 -1
- data/contrib/zstd/lib/legacy/zstd_v07.c +37 -92
- data/contrib/zstd/lib/legacy/zstd_v07.h +1 -1
- data/contrib/zstd/lib/libzstd.mk +237 -0
- data/contrib/zstd/lib/libzstd.pc.in +4 -3
- data/contrib/zstd/lib/module.modulemap +35 -0
- data/contrib/zstd/lib/{dictBuilder/zdict.h → zdict.h} +202 -33
- data/contrib/zstd/lib/zstd.h +1030 -332
- data/contrib/zstd/lib/{common/zstd_errors.h → zstd_errors.h} +27 -8
- data/ext/extconf.rb +26 -7
- data/ext/extzstd.c +51 -24
- data/ext/extzstd.h +33 -6
- data/ext/extzstd_stream.c +74 -31
- data/ext/libzstd_conf.h +0 -1
- data/ext/zstd_decompress_asm.S +1 -0
- metadata +17 -7
- data/contrib/zstd/appveyor.yml +0 -292
- data/ext/depend +0 -2
@@ -1,5 +1,5 @@
|
|
1
1
|
/*
|
2
|
-
* Copyright (c)
|
2
|
+
* Copyright (c) Yann Collet, Meta Platforms, Inc. and affiliates.
|
3
3
|
* All rights reserved.
|
4
4
|
*
|
5
5
|
* This source code is licensed under both the BSD-style license (found in the
|
@@ -11,6 +11,7 @@
|
|
11
11
|
|
12
12
|
#include <stddef.h> /* size_t, ptrdiff_t */
|
13
13
|
#include "zstd_v03.h"
|
14
|
+
#include "../common/compiler.h"
|
14
15
|
#include "../common/error_private.h"
|
15
16
|
|
16
17
|
|
@@ -29,7 +30,7 @@
|
|
29
30
|
low-level memory access routines
|
30
31
|
Copyright (C) 2013-2015, Yann Collet.
|
31
32
|
|
32
|
-
BSD 2-Clause License (
|
33
|
+
BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)
|
33
34
|
|
34
35
|
Redistribution and use in source and binary forms, with or without
|
35
36
|
modification, are permitted provided that the following conditions are
|
@@ -72,20 +73,6 @@ extern "C" {
|
|
72
73
|
#include <string.h> /* memcpy */
|
73
74
|
|
74
75
|
|
75
|
-
/******************************************
|
76
|
-
* Compiler-specific
|
77
|
-
******************************************/
|
78
|
-
#if defined(__GNUC__)
|
79
|
-
# define MEM_STATIC static __attribute__((unused))
|
80
|
-
#elif defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */)
|
81
|
-
# define MEM_STATIC static inline
|
82
|
-
#elif defined(_MSC_VER)
|
83
|
-
# define MEM_STATIC static __inline
|
84
|
-
#else
|
85
|
-
# define MEM_STATIC static /* this version may generate warnings for unused static functions; disable the relevant warning */
|
86
|
-
#endif
|
87
|
-
|
88
|
-
|
89
76
|
/****************************************************************
|
90
77
|
* Basic Types
|
91
78
|
*****************************************************************/
|
@@ -116,27 +103,6 @@ extern "C" {
|
|
116
103
|
/****************************************************************
|
117
104
|
* Memory I/O
|
118
105
|
*****************************************************************/
|
119
|
-
/* MEM_FORCE_MEMORY_ACCESS
|
120
|
-
* By default, access to unaligned memory is controlled by `memcpy()`, which is safe and portable.
|
121
|
-
* Unfortunately, on some target/compiler combinations, the generated assembly is sub-optimal.
|
122
|
-
* The below switch allow to select different access method for improved performance.
|
123
|
-
* Method 0 (default) : use `memcpy()`. Safe and portable.
|
124
|
-
* Method 1 : `__packed` statement. It depends on compiler extension (ie, not portable).
|
125
|
-
* This method is safe if your compiler supports it, and *generally* as fast or faster than `memcpy`.
|
126
|
-
* Method 2 : direct access. This method is portable but violate C standard.
|
127
|
-
* It can generate buggy code on targets generating assembly depending on alignment.
|
128
|
-
* But in some circumstances, it's the only known way to get the most performance (ie GCC + ARMv6)
|
129
|
-
* See http://fastcompression.blogspot.fr/2015/08/accessing-unaligned-memory.html for details.
|
130
|
-
* Prefer these methods in priority order (0 > 1 > 2)
|
131
|
-
*/
|
132
|
-
#ifndef MEM_FORCE_MEMORY_ACCESS /* can be defined externally, on command line for example */
|
133
|
-
# if defined(__GNUC__) && ( defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) )
|
134
|
-
# define MEM_FORCE_MEMORY_ACCESS 2
|
135
|
-
# elif (defined(__INTEL_COMPILER) && !defined(WIN32)) || \
|
136
|
-
(defined(__GNUC__) && ( defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__) ))
|
137
|
-
# define MEM_FORCE_MEMORY_ACCESS 1
|
138
|
-
# endif
|
139
|
-
#endif
|
140
106
|
|
141
107
|
MEM_STATIC unsigned MEM_32bits(void) { return sizeof(void*)==4; }
|
142
108
|
MEM_STATIC unsigned MEM_64bits(void) { return sizeof(void*)==8; }
|
@@ -147,33 +113,6 @@ MEM_STATIC unsigned MEM_isLittleEndian(void)
|
|
147
113
|
return one.c[0];
|
148
114
|
}
|
149
115
|
|
150
|
-
#if defined(MEM_FORCE_MEMORY_ACCESS) && (MEM_FORCE_MEMORY_ACCESS==2)
|
151
|
-
|
152
|
-
/* violates C standard on structure alignment.
|
153
|
-
Only use if no other choice to achieve best performance on target platform */
|
154
|
-
MEM_STATIC U16 MEM_read16(const void* memPtr) { return *(const U16*) memPtr; }
|
155
|
-
MEM_STATIC U32 MEM_read32(const void* memPtr) { return *(const U32*) memPtr; }
|
156
|
-
MEM_STATIC U64 MEM_read64(const void* memPtr) { return *(const U64*) memPtr; }
|
157
|
-
|
158
|
-
MEM_STATIC void MEM_write16(void* memPtr, U16 value) { *(U16*)memPtr = value; }
|
159
|
-
|
160
|
-
#elif defined(MEM_FORCE_MEMORY_ACCESS) && (MEM_FORCE_MEMORY_ACCESS==1)
|
161
|
-
|
162
|
-
/* __pack instructions are safer, but compiler specific, hence potentially problematic for some compilers */
|
163
|
-
/* currently only defined for gcc and icc */
|
164
|
-
typedef union { U16 u16; U32 u32; U64 u64; } __attribute__((packed)) unalign;
|
165
|
-
|
166
|
-
MEM_STATIC U16 MEM_read16(const void* ptr) { return ((const unalign*)ptr)->u16; }
|
167
|
-
MEM_STATIC U32 MEM_read32(const void* ptr) { return ((const unalign*)ptr)->u32; }
|
168
|
-
MEM_STATIC U64 MEM_read64(const void* ptr) { return ((const unalign*)ptr)->u64; }
|
169
|
-
|
170
|
-
MEM_STATIC void MEM_write16(void* memPtr, U16 value) { ((unalign*)memPtr)->u16 = value; }
|
171
|
-
|
172
|
-
#else
|
173
|
-
|
174
|
-
/* default method, safe and standard.
|
175
|
-
can sometimes prove slower */
|
176
|
-
|
177
116
|
MEM_STATIC U16 MEM_read16(const void* memPtr)
|
178
117
|
{
|
179
118
|
U16 val; memcpy(&val, memPtr, sizeof(val)); return val;
|
@@ -194,10 +133,6 @@ MEM_STATIC void MEM_write16(void* memPtr, U16 value)
|
|
194
133
|
memcpy(memPtr, &value, sizeof(value));
|
195
134
|
}
|
196
135
|
|
197
|
-
|
198
|
-
#endif /* MEM_FORCE_MEMORY_ACCESS */
|
199
|
-
|
200
|
-
|
201
136
|
MEM_STATIC U16 MEM_readLE16(const void* memPtr)
|
202
137
|
{
|
203
138
|
if (MEM_isLittleEndian())
|
@@ -274,7 +209,7 @@ MEM_STATIC size_t MEM_readLEST(const void* memPtr)
|
|
274
209
|
header file (to include)
|
275
210
|
Copyright (C) 2013-2015, Yann Collet.
|
276
211
|
|
277
|
-
BSD 2-Clause License (
|
212
|
+
BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)
|
278
213
|
|
279
214
|
Redistribution and use in source and binary forms, with or without
|
280
215
|
modification, are permitted provided that the following conditions are
|
@@ -356,9 +291,8 @@ MEM_STATIC size_t BIT_readBitsFast(BIT_DStream_t* bitD, unsigned nbBits);
|
|
356
291
|
MEM_STATIC unsigned BIT_highbit32 (U32 val)
|
357
292
|
{
|
358
293
|
# if defined(_MSC_VER) /* Visual */
|
359
|
-
unsigned long r
|
360
|
-
_BitScanReverse
|
361
|
-
return (unsigned) r;
|
294
|
+
unsigned long r;
|
295
|
+
return _BitScanReverse(&r, val) ? (unsigned)r : 0;
|
362
296
|
# elif defined(__GNUC__) && (__GNUC__ >= 3) /* Use GCC Intrinsic */
|
363
297
|
return __builtin_clz (val) ^ 31;
|
364
298
|
# else /* Software version */
|
@@ -439,7 +373,7 @@ MEM_STATIC size_t BIT_lookBits(BIT_DStream_t* bitD, U32 nbBits)
|
|
439
373
|
}
|
440
374
|
|
441
375
|
/*! BIT_lookBitsFast :
|
442
|
-
* unsafe version; only works
|
376
|
+
* unsafe version; only works if nbBits >= 1 */
|
443
377
|
MEM_STATIC size_t BIT_lookBitsFast(BIT_DStream_t* bitD, U32 nbBits)
|
444
378
|
{
|
445
379
|
const U32 bitMask = sizeof(bitD->bitContainer)*8 - 1;
|
@@ -459,7 +393,7 @@ MEM_STATIC size_t BIT_readBits(BIT_DStream_t* bitD, U32 nbBits)
|
|
459
393
|
}
|
460
394
|
|
461
395
|
/*!BIT_readBitsFast :
|
462
|
-
* unsafe version; only works
|
396
|
+
* unsafe version; only works if nbBits >= 1 */
|
463
397
|
MEM_STATIC size_t BIT_readBitsFast(BIT_DStream_t* bitD, U32 nbBits)
|
464
398
|
{
|
465
399
|
size_t value = BIT_lookBitsFast(bitD, nbBits);
|
@@ -516,7 +450,7 @@ MEM_STATIC unsigned BIT_endOfDStream(const BIT_DStream_t* DStream)
|
|
516
450
|
Error codes and messages
|
517
451
|
Copyright (C) 2013-2015, Yann Collet
|
518
452
|
|
519
|
-
BSD 2-Clause License (
|
453
|
+
BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)
|
520
454
|
|
521
455
|
Redistribution and use in source and binary forms, with or without
|
522
456
|
modification, are permitted provided that the following conditions are
|
@@ -615,7 +549,7 @@ typedef unsigned FSE_DTable; /* don't allocate that. It's just a way to be mor
|
|
615
549
|
header file for static linking (only)
|
616
550
|
Copyright (C) 2013-2015, Yann Collet
|
617
551
|
|
618
|
-
BSD 2-Clause License (
|
552
|
+
BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)
|
619
553
|
|
620
554
|
Redistribution and use in source and binary forms, with or without
|
621
555
|
modification, are permitted provided that the following conditions are
|
@@ -759,7 +693,7 @@ MEM_STATIC unsigned FSE_endOfDState(const FSE_DState_t* DStatePtr)
|
|
759
693
|
header file for static linking (only)
|
760
694
|
Copyright (C) 2013-2015, Yann Collet
|
761
695
|
|
762
|
-
BSD 2-Clause License (
|
696
|
+
BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)
|
763
697
|
|
764
698
|
Redistribution and use in source and binary forms, with or without
|
765
699
|
modification, are permitted provided that the following conditions are
|
@@ -827,7 +761,7 @@ static size_t HUF_decompress4X4 (void* dst, size_t dstSize, const void* cSrc, si
|
|
827
761
|
Header File
|
828
762
|
Copyright (C) 2014-2015, Yann Collet.
|
829
763
|
|
830
|
-
BSD 2-Clause License (
|
764
|
+
BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)
|
831
765
|
|
832
766
|
Redistribution and use in source and binary forms, with or without
|
833
767
|
modification, are permitted provided that the following conditions are
|
@@ -887,7 +821,7 @@ typedef struct ZSTD_CCtx_s ZSTD_CCtx; /* incomplete type */
|
|
887
821
|
Header File for static linking only
|
888
822
|
Copyright (C) 2014-2015, Yann Collet.
|
889
823
|
|
890
|
-
BSD 2-Clause License (
|
824
|
+
BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)
|
891
825
|
|
892
826
|
Redistribution and use in source and binary forms, with or without
|
893
827
|
modification, are permitted provided that the following conditions are
|
@@ -928,7 +862,7 @@ extern "C" {
|
|
928
862
|
* Streaming functions
|
929
863
|
***************************************/
|
930
864
|
|
931
|
-
typedef struct
|
865
|
+
typedef struct ZSTDv03_Dctx_s ZSTD_DCtx;
|
932
866
|
|
933
867
|
/*
|
934
868
|
Use above functions alternatively.
|
@@ -951,7 +885,7 @@ typedef struct ZSTD_DCtx_s ZSTD_DCtx;
|
|
951
885
|
FSE : Finite State Entropy coder
|
952
886
|
Copyright (C) 2013-2015, Yann Collet.
|
953
887
|
|
954
|
-
BSD 2-Clause License (
|
888
|
+
BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)
|
955
889
|
|
956
890
|
Redistribution and use in source and binary forms, with or without
|
957
891
|
modification, are permitted provided that the following conditions are
|
@@ -1455,7 +1389,7 @@ static size_t FSE_decompress(void* dst, size_t maxDstSize, const void* cSrc, siz
|
|
1455
1389
|
Huff0 : Huffman coder, part of New Generation Entropy library
|
1456
1390
|
Copyright (C) 2013-2015, Yann Collet.
|
1457
1391
|
|
1458
|
-
BSD 2-Clause License (
|
1392
|
+
BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)
|
1459
1393
|
|
1460
1394
|
Redistribution and use in source and binary forms, with or without
|
1461
1395
|
modification, are permitted provided that the following conditions are
|
@@ -2252,7 +2186,7 @@ static size_t HUF_decompress (void* dst, size_t dstSize, const void* cSrc, size_
|
|
2252
2186
|
zstd - standard compression library
|
2253
2187
|
Copyright (C) 2014-2015, Yann Collet.
|
2254
2188
|
|
2255
|
-
BSD 2-Clause License (
|
2189
|
+
BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)
|
2256
2190
|
|
2257
2191
|
Redistribution and use in source and binary forms, with or without
|
2258
2192
|
modification, are permitted provided that the following conditions are
|
@@ -2443,7 +2377,7 @@ static unsigned ZSTD_isError(size_t code) { return ERR_isError(code); }
|
|
2443
2377
|
/* *************************************************************
|
2444
2378
|
* Decompression section
|
2445
2379
|
***************************************************************/
|
2446
|
-
struct
|
2380
|
+
struct ZSTDv03_Dctx_s
|
2447
2381
|
{
|
2448
2382
|
U32 LLTable[FSE_DTABLE_SIZE_U32(LLFSELog)];
|
2449
2383
|
U32 OffTable[FSE_DTABLE_SIZE_U32(OffFSELog)];
|
@@ -2759,18 +2693,24 @@ static size_t ZSTD_execSequence(BYTE* op,
|
|
2759
2693
|
const BYTE* const litEnd = *litPtr + sequence.litLength;
|
2760
2694
|
|
2761
2695
|
/* checks */
|
2762
|
-
|
2696
|
+
size_t const seqLength = sequence.litLength + sequence.matchLength;
|
2697
|
+
|
2698
|
+
if (seqLength > (size_t)(oend - op)) return ERROR(dstSize_tooSmall);
|
2699
|
+
if (sequence.litLength > (size_t)(litLimit - *litPtr)) return ERROR(corruption_detected);
|
2700
|
+
/* Now we know there are no overflow in literal nor match lengths, can use pointer checks */
|
2701
|
+
if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall);
|
2702
|
+
if (sequence.offset > (U32)(oLitEnd - base)) return ERROR(corruption_detected);
|
2703
|
+
|
2763
2704
|
if (oMatchEnd > oend) return ERROR(dstSize_tooSmall); /* overwrite beyond dst buffer */
|
2764
2705
|
if (litEnd > litLimit) return ERROR(corruption_detected); /* overRead beyond lit buffer */
|
2765
2706
|
|
2766
2707
|
/* copy Literals */
|
2767
|
-
ZSTD_wildcopy(op, *litPtr, sequence.litLength); /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */
|
2708
|
+
ZSTD_wildcopy(op, *litPtr, (ptrdiff_t)sequence.litLength); /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */
|
2768
2709
|
op = oLitEnd;
|
2769
2710
|
*litPtr = litEnd; /* update for next sequence */
|
2770
2711
|
|
2771
2712
|
/* copy Match */
|
2772
|
-
{
|
2773
|
-
const BYTE* match = op - sequence.offset;
|
2713
|
+
{ const BYTE* match = op - sequence.offset;
|
2774
2714
|
|
2775
2715
|
/* check */
|
2776
2716
|
if (sequence.offset > (size_t)op) return ERROR(corruption_detected); /* address space overflow test (this test seems kept by clang optimizer) */
|
@@ -3118,6 +3058,7 @@ static size_t ZSTD_decompressContinue(ZSTD_DCtx* ctx, void* dst, size_t maxDstSi
|
|
3118
3058
|
}
|
3119
3059
|
ctx->phase = 1;
|
3120
3060
|
ctx->expected = ZSTD_blockHeaderSize;
|
3061
|
+
if (ZSTD_isError(rSize)) return rSize;
|
3121
3062
|
ctx->previousDstEnd = (void*)( ((char*)dst) + rSize);
|
3122
3063
|
return rSize;
|
3123
3064
|
}
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/*
|
2
|
-
* Copyright (c)
|
2
|
+
* Copyright (c) Yann Collet, Meta Platforms, Inc. and affiliates.
|
3
3
|
* All rights reserved.
|
4
4
|
*
|
5
5
|
* This source code is licensed under both the BSD-style license (found in the
|
@@ -16,6 +16,7 @@
|
|
16
16
|
#include <string.h> /* memcpy */
|
17
17
|
|
18
18
|
#include "zstd_v04.h"
|
19
|
+
#include "../common/compiler.h"
|
19
20
|
#include "../common/error_private.h"
|
20
21
|
|
21
22
|
|
@@ -37,15 +38,6 @@ extern "C" {
|
|
37
38
|
# include <stdlib.h> /* _byteswap_ulong */
|
38
39
|
# include <intrin.h> /* _byteswap_* */
|
39
40
|
#endif
|
40
|
-
#if defined(__GNUC__)
|
41
|
-
# define MEM_STATIC static __attribute__((unused))
|
42
|
-
#elif defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */)
|
43
|
-
# define MEM_STATIC static inline
|
44
|
-
#elif defined(_MSC_VER)
|
45
|
-
# define MEM_STATIC static __inline
|
46
|
-
#else
|
47
|
-
# define MEM_STATIC static /* this version may generate warnings for unused static functions; disable the relevant warning */
|
48
|
-
#endif
|
49
41
|
|
50
42
|
|
51
43
|
/****************************************************************
|
@@ -87,27 +79,6 @@ extern "C" {
|
|
87
79
|
/****************************************************************
|
88
80
|
* Memory I/O
|
89
81
|
*****************************************************************/
|
90
|
-
/* MEM_FORCE_MEMORY_ACCESS
|
91
|
-
* By default, access to unaligned memory is controlled by `memcpy()`, which is safe and portable.
|
92
|
-
* Unfortunately, on some target/compiler combinations, the generated assembly is sub-optimal.
|
93
|
-
* The below switch allow to select different access method for improved performance.
|
94
|
-
* Method 0 (default) : use `memcpy()`. Safe and portable.
|
95
|
-
* Method 1 : `__packed` statement. It depends on compiler extension (ie, not portable).
|
96
|
-
* This method is safe if your compiler supports it, and *generally* as fast or faster than `memcpy`.
|
97
|
-
* Method 2 : direct access. This method is portable but violate C standard.
|
98
|
-
* It can generate buggy code on targets generating assembly depending on alignment.
|
99
|
-
* But in some circumstances, it's the only known way to get the most performance (ie GCC + ARMv6)
|
100
|
-
* See http://fastcompression.blogspot.fr/2015/08/accessing-unaligned-memory.html for details.
|
101
|
-
* Prefer these methods in priority order (0 > 1 > 2)
|
102
|
-
*/
|
103
|
-
#ifndef MEM_FORCE_MEMORY_ACCESS /* can be defined externally, on command line for example */
|
104
|
-
# if defined(__GNUC__) && ( defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) )
|
105
|
-
# define MEM_FORCE_MEMORY_ACCESS 2
|
106
|
-
# elif (defined(__INTEL_COMPILER) && !defined(WIN32)) || \
|
107
|
-
(defined(__GNUC__) && ( defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__) ))
|
108
|
-
# define MEM_FORCE_MEMORY_ACCESS 1
|
109
|
-
# endif
|
110
|
-
#endif
|
111
82
|
|
112
83
|
MEM_STATIC unsigned MEM_32bits(void) { return sizeof(void*)==4; }
|
113
84
|
MEM_STATIC unsigned MEM_64bits(void) { return sizeof(void*)==8; }
|
@@ -118,33 +89,6 @@ MEM_STATIC unsigned MEM_isLittleEndian(void)
|
|
118
89
|
return one.c[0];
|
119
90
|
}
|
120
91
|
|
121
|
-
#if defined(MEM_FORCE_MEMORY_ACCESS) && (MEM_FORCE_MEMORY_ACCESS==2)
|
122
|
-
|
123
|
-
/* violates C standard on structure alignment.
|
124
|
-
Only use if no other choice to achieve best performance on target platform */
|
125
|
-
MEM_STATIC U16 MEM_read16(const void* memPtr) { return *(const U16*) memPtr; }
|
126
|
-
MEM_STATIC U32 MEM_read32(const void* memPtr) { return *(const U32*) memPtr; }
|
127
|
-
MEM_STATIC U64 MEM_read64(const void* memPtr) { return *(const U64*) memPtr; }
|
128
|
-
|
129
|
-
MEM_STATIC void MEM_write16(void* memPtr, U16 value) { *(U16*)memPtr = value; }
|
130
|
-
|
131
|
-
#elif defined(MEM_FORCE_MEMORY_ACCESS) && (MEM_FORCE_MEMORY_ACCESS==1)
|
132
|
-
|
133
|
-
/* __pack instructions are safer, but compiler specific, hence potentially problematic for some compilers */
|
134
|
-
/* currently only defined for gcc and icc */
|
135
|
-
typedef union { U16 u16; U32 u32; U64 u64; } __attribute__((packed)) unalign;
|
136
|
-
|
137
|
-
MEM_STATIC U16 MEM_read16(const void* ptr) { return ((const unalign*)ptr)->u16; }
|
138
|
-
MEM_STATIC U32 MEM_read32(const void* ptr) { return ((const unalign*)ptr)->u32; }
|
139
|
-
MEM_STATIC U64 MEM_read64(const void* ptr) { return ((const unalign*)ptr)->u64; }
|
140
|
-
|
141
|
-
MEM_STATIC void MEM_write16(void* memPtr, U16 value) { ((unalign*)memPtr)->u16 = value; }
|
142
|
-
|
143
|
-
#else
|
144
|
-
|
145
|
-
/* default method, safe and standard.
|
146
|
-
can sometimes prove slower */
|
147
|
-
|
148
92
|
MEM_STATIC U16 MEM_read16(const void* memPtr)
|
149
93
|
{
|
150
94
|
U16 val; memcpy(&val, memPtr, sizeof(val)); return val;
|
@@ -165,9 +109,6 @@ MEM_STATIC void MEM_write16(void* memPtr, U16 value)
|
|
165
109
|
memcpy(memPtr, &value, sizeof(value));
|
166
110
|
}
|
167
111
|
|
168
|
-
#endif /* MEM_FORCE_MEMORY_ACCESS */
|
169
|
-
|
170
|
-
|
171
112
|
MEM_STATIC U16 MEM_readLE16(const void* memPtr)
|
172
113
|
{
|
173
114
|
if (MEM_isLittleEndian())
|
@@ -545,7 +486,7 @@ If there is an error, the function will return an error code, which can be teste
|
|
545
486
|
header file (to include)
|
546
487
|
Copyright (C) 2013-2015, Yann Collet.
|
547
488
|
|
548
|
-
BSD 2-Clause License (
|
489
|
+
BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)
|
549
490
|
|
550
491
|
Redistribution and use in source and binary forms, with or without
|
551
492
|
modification, are permitted provided that the following conditions are
|
@@ -627,9 +568,8 @@ MEM_STATIC size_t BIT_readBitsFast(BIT_DStream_t* bitD, unsigned nbBits);
|
|
627
568
|
MEM_STATIC unsigned BIT_highbit32 (U32 val)
|
628
569
|
{
|
629
570
|
# if defined(_MSC_VER) /* Visual */
|
630
|
-
unsigned long r
|
631
|
-
_BitScanReverse
|
632
|
-
return (unsigned) r;
|
571
|
+
unsigned long r;
|
572
|
+
return _BitScanReverse(&r, val) ? (unsigned)r : 0;
|
633
573
|
# elif defined(__GNUC__) && (__GNUC__ >= 3) /* Use GCC Intrinsic */
|
634
574
|
return __builtin_clz (val) ^ 31;
|
635
575
|
# else /* Software version */
|
@@ -704,7 +644,7 @@ MEM_STATIC size_t BIT_lookBits(BIT_DStream_t* bitD, U32 nbBits)
|
|
704
644
|
}
|
705
645
|
|
706
646
|
/*! BIT_lookBitsFast :
|
707
|
-
* unsafe version; only works
|
647
|
+
* unsafe version; only works if nbBits >= 1 */
|
708
648
|
MEM_STATIC size_t BIT_lookBitsFast(BIT_DStream_t* bitD, U32 nbBits)
|
709
649
|
{
|
710
650
|
const U32 bitMask = sizeof(bitD->bitContainer)*8 - 1;
|
@@ -724,7 +664,7 @@ MEM_STATIC size_t BIT_readBits(BIT_DStream_t* bitD, U32 nbBits)
|
|
724
664
|
}
|
725
665
|
|
726
666
|
/*!BIT_readBitsFast :
|
727
|
-
* unsafe version; only works
|
667
|
+
* unsafe version; only works if nbBits >= 1 */
|
728
668
|
MEM_STATIC size_t BIT_readBitsFast(BIT_DStream_t* bitD, U32 nbBits)
|
729
669
|
{
|
730
670
|
size_t value = BIT_lookBitsFast(bitD, nbBits);
|
@@ -785,7 +725,7 @@ MEM_STATIC unsigned BIT_endOfDStream(const BIT_DStream_t* DStream)
|
|
785
725
|
header file for static linking (only)
|
786
726
|
Copyright (C) 2013-2015, Yann Collet
|
787
727
|
|
788
|
-
BSD 2-Clause License (
|
728
|
+
BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)
|
789
729
|
|
790
730
|
Redistribution and use in source and binary forms, with or without
|
791
731
|
modification, are permitted provided that the following conditions are
|
@@ -934,7 +874,7 @@ MEM_STATIC unsigned FSE_endOfDState(const FSE_DState_t* DStatePtr)
|
|
934
874
|
FSE : Finite State Entropy coder
|
935
875
|
Copyright (C) 2013-2015, Yann Collet.
|
936
876
|
|
937
|
-
BSD 2-Clause License (
|
877
|
+
BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)
|
938
878
|
|
939
879
|
Redistribution and use in source and binary forms, with or without
|
940
880
|
modification, are permitted provided that the following conditions are
|
@@ -1440,7 +1380,7 @@ static size_t FSE_decompress(void* dst, size_t maxDstSize, const void* cSrc, siz
|
|
1440
1380
|
header file
|
1441
1381
|
Copyright (C) 2013-2015, Yann Collet.
|
1442
1382
|
|
1443
|
-
BSD 2-Clause License (
|
1383
|
+
BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)
|
1444
1384
|
|
1445
1385
|
Redistribution and use in source and binary forms, with or without
|
1446
1386
|
modification, are permitted provided that the following conditions are
|
@@ -1518,7 +1458,7 @@ static unsigned HUF_isError(size_t code); /* tells if a return value i
|
|
1518
1458
|
header file for static linking (only)
|
1519
1459
|
Copyright (C) 2013-2015, Yann Collet
|
1520
1460
|
|
1521
|
-
BSD 2-Clause License (
|
1461
|
+
BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)
|
1522
1462
|
|
1523
1463
|
Redistribution and use in source and binary forms, with or without
|
1524
1464
|
modification, are permitted provided that the following conditions are
|
@@ -1605,7 +1545,7 @@ static size_t HUF_decompress4X4_usingDTable(void* dst, size_t maxDstSize, const
|
|
1605
1545
|
Huff0 : Huffman coder, part of New Generation Entropy library
|
1606
1546
|
Copyright (C) 2013-2015, Yann Collet.
|
1607
1547
|
|
1608
|
-
BSD 2-Clause License (
|
1548
|
+
BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)
|
1609
1549
|
|
1610
1550
|
Redistribution and use in source and binary forms, with or without
|
1611
1551
|
modification, are permitted provided that the following conditions are
|
@@ -2405,7 +2345,7 @@ static size_t HUF_decompress (void* dst, size_t dstSize, const void* cSrc, size_
|
|
2405
2345
|
zstd - decompression module fo v0.4 legacy format
|
2406
2346
|
Copyright (C) 2015-2016, Yann Collet.
|
2407
2347
|
|
2408
|
-
BSD 2-Clause License (
|
2348
|
+
BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)
|
2409
2349
|
|
2410
2350
|
Redistribution and use in source and binary forms, with or without
|
2411
2351
|
modification, are permitted provided that the following conditions are
|
@@ -2880,13 +2820,19 @@ static size_t ZSTD_execSequence(BYTE* op,
|
|
2880
2820
|
const BYTE* const litEnd = *litPtr + sequence.litLength;
|
2881
2821
|
const BYTE* match = oLitEnd - sequence.offset;
|
2882
2822
|
|
2883
|
-
/*
|
2884
|
-
|
2823
|
+
/* checks */
|
2824
|
+
size_t const seqLength = sequence.litLength + sequence.matchLength;
|
2825
|
+
|
2826
|
+
if (seqLength > (size_t)(oend - op)) return ERROR(dstSize_tooSmall);
|
2827
|
+
if (sequence.litLength > (size_t)(litLimit - *litPtr)) return ERROR(corruption_detected);
|
2828
|
+
/* Now we know there are no overflow in literal nor match lengths, can use pointer checks */
|
2829
|
+
if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall);
|
2830
|
+
|
2885
2831
|
if (oMatchEnd > oend) return ERROR(dstSize_tooSmall); /* overwrite beyond dst buffer */
|
2886
|
-
if (litEnd > litLimit) return ERROR(corruption_detected); /*
|
2832
|
+
if (litEnd > litLimit) return ERROR(corruption_detected); /* overRead beyond lit buffer */
|
2887
2833
|
|
2888
2834
|
/* copy Literals */
|
2889
|
-
ZSTD_wildcopy(op, *litPtr, sequence.litLength); /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */
|
2835
|
+
ZSTD_wildcopy(op, *litPtr, (ptrdiff_t)sequence.litLength); /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */
|
2890
2836
|
op = oLitEnd;
|
2891
2837
|
*litPtr = litEnd; /* update for next sequence */
|
2892
2838
|
|
@@ -3264,6 +3210,7 @@ static size_t ZSTD_decompressContinue(ZSTD_DCtx* ctx, void* dst, size_t maxDstSi
|
|
3264
3210
|
}
|
3265
3211
|
ctx->stage = ZSTDds_decodeBlockHeader;
|
3266
3212
|
ctx->expected = ZSTD_blockHeaderSize;
|
3213
|
+
if (ZSTD_isError(rSize)) return rSize;
|
3267
3214
|
ctx->previousDstEnd = (char*)dst + rSize;
|
3268
3215
|
return rSize;
|
3269
3216
|
}
|
@@ -3287,7 +3234,7 @@ static void ZSTD_decompress_insertDictionary(ZSTD_DCtx* ctx, const void* dict, s
|
|
3287
3234
|
Buffered version of Zstd compression library
|
3288
3235
|
Copyright (C) 2015, Yann Collet.
|
3289
3236
|
|
3290
|
-
BSD 2-Clause License (
|
3237
|
+
BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)
|
3291
3238
|
|
3292
3239
|
Redistribution and use in source and binary forms, with or without
|
3293
3240
|
modification, are permitted provided that the following conditions are
|
@@ -3591,8 +3538,8 @@ static size_t ZBUFF_decompressContinue(ZBUFF_DCtx* zbc, void* dst, size_t* maxDs
|
|
3591
3538
|
unsigned ZBUFFv04_isError(size_t errorCode) { return ERR_isError(errorCode); }
|
3592
3539
|
const char* ZBUFFv04_getErrorName(size_t errorCode) { return ERR_getErrorName(errorCode); }
|
3593
3540
|
|
3594
|
-
size_t ZBUFFv04_recommendedDInSize() { return BLOCKSIZE + 3; }
|
3595
|
-
size_t ZBUFFv04_recommendedDOutSize() { return BLOCKSIZE; }
|
3541
|
+
size_t ZBUFFv04_recommendedDInSize(void) { return BLOCKSIZE + 3; }
|
3542
|
+
size_t ZBUFFv04_recommendedDOutSize(void) { return BLOCKSIZE; }
|
3596
3543
|
|
3597
3544
|
|
3598
3545
|
|