zstdlib 0.12.0-x64-mingw32 → 0.13.0-x64-mingw32
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/CHANGES.md +7 -0
- data/Rakefile +1 -1
- data/ext/zstdlib_c/extconf.rb +1 -1
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/allocations.h +1 -1
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/bitstream.h +49 -29
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/compiler.h +114 -22
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/cpu.h +36 -0
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/debug.c +6 -0
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/debug.h +20 -11
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/error_private.h +45 -36
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/fse.h +3 -2
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/fse_decompress.c +19 -17
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/huf.h +14 -1
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/mem.h +0 -9
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/pool.c +1 -1
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/pool.h +1 -1
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/portability_macros.h +2 -0
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/threading.c +8 -2
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/xxhash.c +5 -11
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/xxhash.h +2341 -1007
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/zstd_internal.h +5 -5
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/fse_compress.c +8 -7
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/huf_compress.c +54 -25
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_compress.c +282 -161
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_compress_internal.h +29 -27
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_compress_superblock.c +224 -113
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_cwksp.h +19 -13
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_double_fast.c +17 -5
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_double_fast.h +11 -0
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_fast.c +14 -6
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_lazy.c +129 -87
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_lazy.h +103 -28
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_ldm.c +8 -2
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_opt.c +216 -112
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_opt.h +31 -7
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstdmt_compress.c +94 -79
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/decompress/huf_decompress.c +188 -126
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/decompress/huf_decompress_amd64.S +38 -19
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/decompress/zstd_decompress.c +84 -32
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/decompress/zstd_decompress_block.c +231 -208
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/decompress/zstd_decompress_block.h +1 -1
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/decompress/zstd_decompress_internal.h +2 -0
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/zstd.h +129 -60
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/zlibWrapper/gzclose.c +1 -3
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/zlibWrapper/gzlib.c +20 -73
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/zlibWrapper/gzread.c +17 -58
- data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/zlibWrapper/gzwrite.c +18 -58
- data/lib/2.4/zstdlib_c.so +0 -0
- data/lib/2.5/zstdlib_c.so +0 -0
- data/lib/2.6/zstdlib_c.so +0 -0
- data/lib/2.7/zstdlib_c.so +0 -0
- data/lib/3.0/zstdlib_c.so +0 -0
- metadata +75 -75
- /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/bits.h +0 -0
- /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/entropy_common.c +0 -0
- /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/error_private.c +0 -0
- /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/threading.h +0 -0
- /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/zstd_common.c +0 -0
- /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/zstd_deps.h +0 -0
- /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/zstd_trace.h +0 -0
- /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/clevels.h +0 -0
- /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/hist.c +0 -0
- /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/hist.h +0 -0
- /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_compress_literals.c +0 -0
- /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_compress_literals.h +0 -0
- /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_compress_sequences.c +0 -0
- /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_compress_sequences.h +0 -0
- /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_compress_superblock.h +0 -0
- /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_fast.h +0 -0
- /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_ldm.h +0 -0
- /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_ldm_geartab.h +0 -0
- /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstdmt_compress.h +0 -0
- /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/decompress/zstd_ddict.c +0 -0
- /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/decompress/zstd_ddict.h +0 -0
- /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/zdict.h +0 -0
- /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/zstd_errors.h +0 -0
- /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/zlibWrapper/gzcompatibility.h +0 -0
- /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/zlibWrapper/gzguts.h +0 -0
- /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/zlibWrapper/zstd_zlibwrapper.c +0 -0
- /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/zlibWrapper/zstd_zlibwrapper.h +0 -0
@@ -10,11 +10,32 @@
|
|
10
10
|
|
11
11
|
#include "../common/portability_macros.h"
|
12
12
|
|
13
|
+
#if defined(__ELF__) && defined(__GNUC__)
|
13
14
|
/* Stack marking
|
14
15
|
* ref: https://wiki.gentoo.org/wiki/Hardened/GNU_stack_quickstart
|
15
16
|
*/
|
16
|
-
#if defined(__ELF__) && defined(__GNUC__)
|
17
17
|
.section .note.GNU-stack,"",%progbits
|
18
|
+
|
19
|
+
#if defined(__aarch64__)
|
20
|
+
/* Mark that this assembly supports BTI & PAC, because it is empty for aarch64.
|
21
|
+
* See: https://github.com/facebook/zstd/issues/3841
|
22
|
+
* See: https://gcc.godbolt.org/z/sqr5T4ffK
|
23
|
+
* See: https://lore.kernel.org/linux-arm-kernel/20200429211641.9279-8-broonie@kernel.org/
|
24
|
+
* See: https://reviews.llvm.org/D62609
|
25
|
+
*/
|
26
|
+
.pushsection .note.gnu.property, "a"
|
27
|
+
.p2align 3
|
28
|
+
.long 4 /* size of the name - "GNU\0" */
|
29
|
+
.long 0x10 /* size of descriptor */
|
30
|
+
.long 0x5 /* NT_GNU_PROPERTY_TYPE_0 */
|
31
|
+
.asciz "GNU"
|
32
|
+
.long 0xc0000000 /* pr_type - GNU_PROPERTY_AARCH64_FEATURE_1_AND */
|
33
|
+
.long 4 /* pr_datasz - 4 bytes */
|
34
|
+
.long 3 /* pr_data - GNU_PROPERTY_AARCH64_FEATURE_1_BTI | GNU_PROPERTY_AARCH64_FEATURE_1_PAC */
|
35
|
+
.p2align 3 /* pr_padding - bring everything to 8 byte alignment */
|
36
|
+
.popsection
|
37
|
+
#endif
|
38
|
+
|
18
39
|
#endif
|
19
40
|
|
20
41
|
#if ZSTD_ENABLE_ASM_X86_64_BMI2
|
@@ -131,7 +152,7 @@ HUF_decompress4X1_usingDTable_internal_fast_asm_loop:
|
|
131
152
|
movq 88(%rax), %bits3
|
132
153
|
movq 96(%rax), %dtable
|
133
154
|
push %rax /* argument */
|
134
|
-
push 104(%rax) /*
|
155
|
+
push 104(%rax) /* ilowest */
|
135
156
|
push 112(%rax) /* oend */
|
136
157
|
push %olimit /* olimit space */
|
137
158
|
|
@@ -156,11 +177,11 @@ HUF_decompress4X1_usingDTable_internal_fast_asm_loop:
|
|
156
177
|
shrq $2, %r15
|
157
178
|
|
158
179
|
movq %ip0, %rax /* rax = ip0 */
|
159
|
-
movq 40(%rsp), %rdx /* rdx =
|
160
|
-
subq %rdx, %rax /* rax = ip0 -
|
161
|
-
movq %rax, %rbx /* rbx = ip0 -
|
180
|
+
movq 40(%rsp), %rdx /* rdx = ilowest */
|
181
|
+
subq %rdx, %rax /* rax = ip0 - ilowest */
|
182
|
+
movq %rax, %rbx /* rbx = ip0 - ilowest */
|
162
183
|
|
163
|
-
/* rdx = (ip0 -
|
184
|
+
/* rdx = (ip0 - ilowest) / 7 */
|
164
185
|
movabsq $2635249153387078803, %rdx
|
165
186
|
mulq %rdx
|
166
187
|
subq %rdx, %rbx
|
@@ -183,9 +204,8 @@ HUF_decompress4X1_usingDTable_internal_fast_asm_loop:
|
|
183
204
|
|
184
205
|
/* If (op3 + 20 > olimit) */
|
185
206
|
movq %op3, %rax /* rax = op3 */
|
186
|
-
|
187
|
-
|
188
|
-
jb .L_4X1_exit
|
207
|
+
cmpq %rax, %olimit /* op3 == olimit */
|
208
|
+
je .L_4X1_exit
|
189
209
|
|
190
210
|
/* If (ip1 < ip0) go to exit */
|
191
211
|
cmpq %ip0, %ip1
|
@@ -316,7 +336,7 @@ HUF_decompress4X1_usingDTable_internal_fast_asm_loop:
|
|
316
336
|
/* Restore stack (oend & olimit) */
|
317
337
|
pop %rax /* olimit */
|
318
338
|
pop %rax /* oend */
|
319
|
-
pop %rax /*
|
339
|
+
pop %rax /* ilowest */
|
320
340
|
pop %rax /* arg */
|
321
341
|
|
322
342
|
/* Save ip / op / bits */
|
@@ -387,7 +407,7 @@ HUF_decompress4X2_usingDTable_internal_fast_asm_loop:
|
|
387
407
|
movq 96(%rax), %dtable
|
388
408
|
push %rax /* argument */
|
389
409
|
push %rax /* olimit */
|
390
|
-
push 104(%rax) /*
|
410
|
+
push 104(%rax) /* ilowest */
|
391
411
|
|
392
412
|
movq 112(%rax), %rax
|
393
413
|
push %rax /* oend3 */
|
@@ -414,9 +434,9 @@ HUF_decompress4X2_usingDTable_internal_fast_asm_loop:
|
|
414
434
|
|
415
435
|
/* We can consume up to 7 input bytes each iteration. */
|
416
436
|
movq %ip0, %rax /* rax = ip0 */
|
417
|
-
movq 40(%rsp), %rdx /* rdx =
|
418
|
-
subq %rdx, %rax /* rax = ip0 -
|
419
|
-
movq %rax, %r15 /* r15 = ip0 -
|
437
|
+
movq 40(%rsp), %rdx /* rdx = ilowest */
|
438
|
+
subq %rdx, %rax /* rax = ip0 - ilowest */
|
439
|
+
movq %rax, %r15 /* r15 = ip0 - ilowest */
|
420
440
|
|
421
441
|
/* rdx = rax / 7 */
|
422
442
|
movabsq $2635249153387078803, %rdx
|
@@ -426,7 +446,7 @@ HUF_decompress4X2_usingDTable_internal_fast_asm_loop:
|
|
426
446
|
addq %r15, %rdx
|
427
447
|
shrq $2, %rdx
|
428
448
|
|
429
|
-
/* r15 = (ip0 -
|
449
|
+
/* r15 = (ip0 - ilowest) / 7 */
|
430
450
|
movq %rdx, %r15
|
431
451
|
|
432
452
|
/* r15 = min(r15, min(oend0 - op0, oend1 - op1, oend2 - op2, oend3 - op3) / 10) */
|
@@ -467,9 +487,8 @@ HUF_decompress4X2_usingDTable_internal_fast_asm_loop:
|
|
467
487
|
|
468
488
|
/* If (op3 + 10 > olimit) */
|
469
489
|
movq %op3, %rax /* rax = op3 */
|
470
|
-
|
471
|
-
|
472
|
-
jb .L_4X2_exit
|
490
|
+
cmpq %rax, %olimit /* op3 == olimit */
|
491
|
+
je .L_4X2_exit
|
473
492
|
|
474
493
|
/* If (ip1 < ip0) go to exit */
|
475
494
|
cmpq %ip0, %ip1
|
@@ -537,7 +556,7 @@ HUF_decompress4X2_usingDTable_internal_fast_asm_loop:
|
|
537
556
|
pop %rax /* oend1 */
|
538
557
|
pop %rax /* oend2 */
|
539
558
|
pop %rax /* oend3 */
|
540
|
-
pop %rax /*
|
559
|
+
pop %rax /* ilowest */
|
541
560
|
pop %rax /* olimit */
|
542
561
|
pop %rax /* arg */
|
543
562
|
|
@@ -55,18 +55,19 @@
|
|
55
55
|
/*-*******************************************************
|
56
56
|
* Dependencies
|
57
57
|
*********************************************************/
|
58
|
-
#include "../common/allocations.h" /* ZSTD_customMalloc, ZSTD_customCalloc, ZSTD_customFree */
|
59
58
|
#include "../common/zstd_deps.h" /* ZSTD_memcpy, ZSTD_memmove, ZSTD_memset */
|
59
|
+
#include "../common/allocations.h" /* ZSTD_customMalloc, ZSTD_customCalloc, ZSTD_customFree */
|
60
|
+
#include "../common/error_private.h"
|
61
|
+
#include "../common/zstd_internal.h" /* blockProperties_t */
|
60
62
|
#include "../common/mem.h" /* low level memory routines */
|
63
|
+
#include "../common/bits.h" /* ZSTD_highbit32 */
|
61
64
|
#define FSE_STATIC_LINKING_ONLY
|
62
65
|
#include "../common/fse.h"
|
63
66
|
#include "../common/huf.h"
|
64
67
|
#include "../common/xxhash.h" /* XXH64_reset, XXH64_update, XXH64_digest, XXH64 */
|
65
|
-
#include "../common/zstd_internal.h" /* blockProperties_t */
|
66
68
|
#include "zstd_decompress_internal.h" /* ZSTD_DCtx */
|
67
69
|
#include "zstd_ddict.h" /* ZSTD_DDictDictContent */
|
68
70
|
#include "zstd_decompress_block.h" /* ZSTD_decompressBlock_internal */
|
69
|
-
#include "../common/bits.h" /* ZSTD_highbit32 */
|
70
71
|
|
71
72
|
#if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT>=1)
|
72
73
|
# include "../legacy/zstd_legacy.h"
|
@@ -245,6 +246,7 @@ static void ZSTD_DCtx_resetParameters(ZSTD_DCtx* dctx)
|
|
245
246
|
dctx->forceIgnoreChecksum = ZSTD_d_validateChecksum;
|
246
247
|
dctx->refMultipleDDicts = ZSTD_rmd_refSingleDDict;
|
247
248
|
dctx->disableHufAsm = 0;
|
249
|
+
dctx->maxBlockSizeParam = 0;
|
248
250
|
}
|
249
251
|
|
250
252
|
static void ZSTD_initDCtx_internal(ZSTD_DCtx* dctx)
|
@@ -265,6 +267,7 @@ static void ZSTD_initDCtx_internal(ZSTD_DCtx* dctx)
|
|
265
267
|
#endif
|
266
268
|
dctx->noForwardProgress = 0;
|
267
269
|
dctx->oversizedDuration = 0;
|
270
|
+
dctx->isFrameDecompression = 1;
|
268
271
|
#if DYNAMIC_BMI2
|
269
272
|
dctx->bmi2 = ZSTD_cpuSupportsBmi2();
|
270
273
|
#endif
|
@@ -726,17 +729,17 @@ static ZSTD_frameSizeInfo ZSTD_errorFrameSizeInfo(size_t ret)
|
|
726
729
|
return frameSizeInfo;
|
727
730
|
}
|
728
731
|
|
729
|
-
static ZSTD_frameSizeInfo ZSTD_findFrameSizeInfo(const void* src, size_t srcSize)
|
732
|
+
static ZSTD_frameSizeInfo ZSTD_findFrameSizeInfo(const void* src, size_t srcSize, ZSTD_format_e format)
|
730
733
|
{
|
731
734
|
ZSTD_frameSizeInfo frameSizeInfo;
|
732
735
|
ZSTD_memset(&frameSizeInfo, 0, sizeof(ZSTD_frameSizeInfo));
|
733
736
|
|
734
737
|
#if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT >= 1)
|
735
|
-
if (ZSTD_isLegacy(src, srcSize))
|
738
|
+
if (format == ZSTD_f_zstd1 && ZSTD_isLegacy(src, srcSize))
|
736
739
|
return ZSTD_findFrameSizeInfoLegacy(src, srcSize);
|
737
740
|
#endif
|
738
741
|
|
739
|
-
if ((srcSize >= ZSTD_SKIPPABLEHEADERSIZE)
|
742
|
+
if (format == ZSTD_f_zstd1 && (srcSize >= ZSTD_SKIPPABLEHEADERSIZE)
|
740
743
|
&& (MEM_readLE32(src) & ZSTD_MAGIC_SKIPPABLE_MASK) == ZSTD_MAGIC_SKIPPABLE_START) {
|
741
744
|
frameSizeInfo.compressedSize = readSkippableFrameSize(src, srcSize);
|
742
745
|
assert(ZSTD_isError(frameSizeInfo.compressedSize) ||
|
@@ -750,7 +753,7 @@ static ZSTD_frameSizeInfo ZSTD_findFrameSizeInfo(const void* src, size_t srcSize
|
|
750
753
|
ZSTD_frameHeader zfh;
|
751
754
|
|
752
755
|
/* Extract Frame Header */
|
753
|
-
{ size_t const ret =
|
756
|
+
{ size_t const ret = ZSTD_getFrameHeader_advanced(&zfh, src, srcSize, format);
|
754
757
|
if (ZSTD_isError(ret))
|
755
758
|
return ZSTD_errorFrameSizeInfo(ret);
|
756
759
|
if (ret > 0)
|
@@ -793,15 +796,17 @@ static ZSTD_frameSizeInfo ZSTD_findFrameSizeInfo(const void* src, size_t srcSize
|
|
793
796
|
}
|
794
797
|
}
|
795
798
|
|
799
|
+
static size_t ZSTD_findFrameCompressedSize_advanced(const void *src, size_t srcSize, ZSTD_format_e format) {
|
800
|
+
ZSTD_frameSizeInfo const frameSizeInfo = ZSTD_findFrameSizeInfo(src, srcSize, format);
|
801
|
+
return frameSizeInfo.compressedSize;
|
802
|
+
}
|
803
|
+
|
796
804
|
/** ZSTD_findFrameCompressedSize() :
|
797
|
-
*
|
798
|
-
*
|
799
|
-
* `srcSize` must be at least as large as the frame contained
|
800
|
-
* @return : the compressed size of the frame starting at `src` */
|
805
|
+
* See docs in zstd.h
|
806
|
+
* Note: compatible with legacy mode */
|
801
807
|
size_t ZSTD_findFrameCompressedSize(const void *src, size_t srcSize)
|
802
808
|
{
|
803
|
-
|
804
|
-
return frameSizeInfo.compressedSize;
|
809
|
+
return ZSTD_findFrameCompressedSize_advanced(src, srcSize, ZSTD_f_zstd1);
|
805
810
|
}
|
806
811
|
|
807
812
|
/** ZSTD_decompressBound() :
|
@@ -815,7 +820,7 @@ unsigned long long ZSTD_decompressBound(const void* src, size_t srcSize)
|
|
815
820
|
unsigned long long bound = 0;
|
816
821
|
/* Iterate over each frame */
|
817
822
|
while (srcSize > 0) {
|
818
|
-
ZSTD_frameSizeInfo const frameSizeInfo = ZSTD_findFrameSizeInfo(src, srcSize);
|
823
|
+
ZSTD_frameSizeInfo const frameSizeInfo = ZSTD_findFrameSizeInfo(src, srcSize, ZSTD_f_zstd1);
|
819
824
|
size_t const compressedSize = frameSizeInfo.compressedSize;
|
820
825
|
unsigned long long const decompressedBound = frameSizeInfo.decompressedBound;
|
821
826
|
if (ZSTD_isError(compressedSize) || decompressedBound == ZSTD_CONTENTSIZE_ERROR)
|
@@ -835,7 +840,7 @@ size_t ZSTD_decompressionMargin(void const* src, size_t srcSize)
|
|
835
840
|
|
836
841
|
/* Iterate over each frame */
|
837
842
|
while (srcSize > 0) {
|
838
|
-
ZSTD_frameSizeInfo const frameSizeInfo = ZSTD_findFrameSizeInfo(src, srcSize);
|
843
|
+
ZSTD_frameSizeInfo const frameSizeInfo = ZSTD_findFrameSizeInfo(src, srcSize, ZSTD_f_zstd1);
|
839
844
|
size_t const compressedSize = frameSizeInfo.compressedSize;
|
840
845
|
unsigned long long const decompressedBound = frameSizeInfo.decompressedBound;
|
841
846
|
ZSTD_frameHeader zfh;
|
@@ -971,6 +976,10 @@ static size_t ZSTD_decompressFrame(ZSTD_DCtx* dctx,
|
|
971
976
|
ip += frameHeaderSize; remainingSrcSize -= frameHeaderSize;
|
972
977
|
}
|
973
978
|
|
979
|
+
/* Shrink the blockSizeMax if enabled */
|
980
|
+
if (dctx->maxBlockSizeParam != 0)
|
981
|
+
dctx->fParams.blockSizeMax = MIN(dctx->fParams.blockSizeMax, (unsigned)dctx->maxBlockSizeParam);
|
982
|
+
|
974
983
|
/* Loop on each block */
|
975
984
|
while (1) {
|
976
985
|
BYTE* oBlockEnd = oend;
|
@@ -1003,7 +1012,8 @@ static size_t ZSTD_decompressFrame(ZSTD_DCtx* dctx,
|
|
1003
1012
|
switch(blockProperties.blockType)
|
1004
1013
|
{
|
1005
1014
|
case bt_compressed:
|
1006
|
-
|
1015
|
+
assert(dctx->isFrameDecompression == 1);
|
1016
|
+
decodedSize = ZSTD_decompressBlock_internal(dctx, op, (size_t)(oBlockEnd-op), ip, cBlockSize, not_streaming);
|
1007
1017
|
break;
|
1008
1018
|
case bt_raw :
|
1009
1019
|
/* Use oend instead of oBlockEnd because this function is safe to overlap. It uses memmove. */
|
@@ -1016,12 +1026,14 @@ static size_t ZSTD_decompressFrame(ZSTD_DCtx* dctx,
|
|
1016
1026
|
default:
|
1017
1027
|
RETURN_ERROR(corruption_detected, "invalid block type");
|
1018
1028
|
}
|
1019
|
-
|
1020
|
-
|
1021
|
-
if (dctx->validateChecksum)
|
1029
|
+
FORWARD_IF_ERROR(decodedSize, "Block decompression failure");
|
1030
|
+
DEBUGLOG(5, "Decompressed block of dSize = %u", (unsigned)decodedSize);
|
1031
|
+
if (dctx->validateChecksum) {
|
1022
1032
|
XXH64_update(&dctx->xxhState, op, decodedSize);
|
1023
|
-
|
1033
|
+
}
|
1034
|
+
if (decodedSize) /* support dst = NULL,0 */ {
|
1024
1035
|
op += decodedSize;
|
1036
|
+
}
|
1025
1037
|
assert(ip != NULL);
|
1026
1038
|
ip += cBlockSize;
|
1027
1039
|
remainingSrcSize -= cBlockSize;
|
@@ -1051,7 +1063,9 @@ static size_t ZSTD_decompressFrame(ZSTD_DCtx* dctx,
|
|
1051
1063
|
return (size_t)(op-ostart);
|
1052
1064
|
}
|
1053
1065
|
|
1054
|
-
static
|
1066
|
+
static
|
1067
|
+
ZSTD_ALLOW_POINTER_OVERFLOW_ATTR
|
1068
|
+
size_t ZSTD_decompressMultiFrame(ZSTD_DCtx* dctx,
|
1055
1069
|
void* dst, size_t dstCapacity,
|
1056
1070
|
const void* src, size_t srcSize,
|
1057
1071
|
const void* dict, size_t dictSize,
|
@@ -1071,7 +1085,7 @@ static size_t ZSTD_decompressMultiFrame(ZSTD_DCtx* dctx,
|
|
1071
1085
|
while (srcSize >= ZSTD_startingInputLength(dctx->format)) {
|
1072
1086
|
|
1073
1087
|
#if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT >= 1)
|
1074
|
-
if (ZSTD_isLegacy(src, srcSize)) {
|
1088
|
+
if (dctx->format == ZSTD_f_zstd1 && ZSTD_isLegacy(src, srcSize)) {
|
1075
1089
|
size_t decodedSize;
|
1076
1090
|
size_t const frameSize = ZSTD_findFrameCompressedSizeLegacy(src, srcSize);
|
1077
1091
|
if (ZSTD_isError(frameSize)) return frameSize;
|
@@ -1081,6 +1095,15 @@ static size_t ZSTD_decompressMultiFrame(ZSTD_DCtx* dctx,
|
|
1081
1095
|
decodedSize = ZSTD_decompressLegacy(dst, dstCapacity, src, frameSize, dict, dictSize);
|
1082
1096
|
if (ZSTD_isError(decodedSize)) return decodedSize;
|
1083
1097
|
|
1098
|
+
{
|
1099
|
+
unsigned long long const expectedSize = ZSTD_getFrameContentSize(src, srcSize);
|
1100
|
+
RETURN_ERROR_IF(expectedSize == ZSTD_CONTENTSIZE_ERROR, corruption_detected, "Corrupted frame header!");
|
1101
|
+
if (expectedSize != ZSTD_CONTENTSIZE_UNKNOWN) {
|
1102
|
+
RETURN_ERROR_IF(expectedSize != decodedSize, corruption_detected,
|
1103
|
+
"Frame header size does not match decoded size!");
|
1104
|
+
}
|
1105
|
+
}
|
1106
|
+
|
1084
1107
|
assert(decodedSize <= dstCapacity);
|
1085
1108
|
dst = (BYTE*)dst + decodedSize;
|
1086
1109
|
dstCapacity -= decodedSize;
|
@@ -1092,7 +1115,7 @@ static size_t ZSTD_decompressMultiFrame(ZSTD_DCtx* dctx,
|
|
1092
1115
|
}
|
1093
1116
|
#endif
|
1094
1117
|
|
1095
|
-
if (srcSize >= 4) {
|
1118
|
+
if (dctx->format == ZSTD_f_zstd1 && srcSize >= 4) {
|
1096
1119
|
U32 const magicNumber = MEM_readLE32(src);
|
1097
1120
|
DEBUGLOG(5, "reading magic number %08X", (unsigned)magicNumber);
|
1098
1121
|
if ((magicNumber & ZSTD_MAGIC_SKIPPABLE_MASK) == ZSTD_MAGIC_SKIPPABLE_START) {
|
@@ -1319,7 +1342,8 @@ size_t ZSTD_decompressContinue(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, c
|
|
1319
1342
|
{
|
1320
1343
|
case bt_compressed:
|
1321
1344
|
DEBUGLOG(5, "ZSTD_decompressContinue: case bt_compressed");
|
1322
|
-
|
1345
|
+
assert(dctx->isFrameDecompression == 1);
|
1346
|
+
rSize = ZSTD_decompressBlock_internal(dctx, dst, dstCapacity, src, srcSize, is_streaming);
|
1323
1347
|
dctx->expected = 0; /* Streaming not supported */
|
1324
1348
|
break;
|
1325
1349
|
case bt_raw :
|
@@ -1388,6 +1412,7 @@ size_t ZSTD_decompressContinue(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, c
|
|
1388
1412
|
case ZSTDds_decodeSkippableHeader:
|
1389
1413
|
assert(src != NULL);
|
1390
1414
|
assert(srcSize <= ZSTD_SKIPPABLEHEADERSIZE);
|
1415
|
+
assert(dctx->format != ZSTD_f_zstd1_magicless);
|
1391
1416
|
ZSTD_memcpy(dctx->headerBuffer + (ZSTD_SKIPPABLEHEADERSIZE - srcSize), src, srcSize); /* complete skippable header */
|
1392
1417
|
dctx->expected = MEM_readLE32(dctx->headerBuffer + ZSTD_FRAMEIDSIZE); /* note : dctx->expected can grow seriously large, beyond local buffer size */
|
1393
1418
|
dctx->stage = ZSTDds_skipFrame;
|
@@ -1548,6 +1573,7 @@ size_t ZSTD_decompressBegin(ZSTD_DCtx* dctx)
|
|
1548
1573
|
dctx->litEntropy = dctx->fseEntropy = 0;
|
1549
1574
|
dctx->dictID = 0;
|
1550
1575
|
dctx->bType = bt_reserved;
|
1576
|
+
dctx->isFrameDecompression = 1;
|
1551
1577
|
ZSTD_STATIC_ASSERT(sizeof(dctx->entropy.rep) == sizeof(repStartValue));
|
1552
1578
|
ZSTD_memcpy(dctx->entropy.rep, repStartValue, sizeof(repStartValue)); /* initial repcodes */
|
1553
1579
|
dctx->LLTptr = dctx->entropy.LLTable;
|
@@ -1819,6 +1845,10 @@ ZSTD_bounds ZSTD_dParam_getBounds(ZSTD_dParameter dParam)
|
|
1819
1845
|
bounds.lowerBound = 0;
|
1820
1846
|
bounds.upperBound = 1;
|
1821
1847
|
return bounds;
|
1848
|
+
case ZSTD_d_maxBlockSize:
|
1849
|
+
bounds.lowerBound = ZSTD_BLOCKSIZE_MAX_MIN;
|
1850
|
+
bounds.upperBound = ZSTD_BLOCKSIZE_MAX;
|
1851
|
+
return bounds;
|
1822
1852
|
|
1823
1853
|
default:;
|
1824
1854
|
}
|
@@ -1863,6 +1893,9 @@ size_t ZSTD_DCtx_getParameter(ZSTD_DCtx* dctx, ZSTD_dParameter param, int* value
|
|
1863
1893
|
case ZSTD_d_disableHuffmanAssembly:
|
1864
1894
|
*value = (int)dctx->disableHufAsm;
|
1865
1895
|
return 0;
|
1896
|
+
case ZSTD_d_maxBlockSize:
|
1897
|
+
*value = dctx->maxBlockSizeParam;
|
1898
|
+
return 0;
|
1866
1899
|
default:;
|
1867
1900
|
}
|
1868
1901
|
RETURN_ERROR(parameter_unsupported, "");
|
@@ -1900,6 +1933,10 @@ size_t ZSTD_DCtx_setParameter(ZSTD_DCtx* dctx, ZSTD_dParameter dParam, int value
|
|
1900
1933
|
CHECK_DBOUNDS(ZSTD_d_disableHuffmanAssembly, value);
|
1901
1934
|
dctx->disableHufAsm = value != 0;
|
1902
1935
|
return 0;
|
1936
|
+
case ZSTD_d_maxBlockSize:
|
1937
|
+
if (value != 0) CHECK_DBOUNDS(ZSTD_d_maxBlockSize, value);
|
1938
|
+
dctx->maxBlockSizeParam = value;
|
1939
|
+
return 0;
|
1903
1940
|
default:;
|
1904
1941
|
}
|
1905
1942
|
RETURN_ERROR(parameter_unsupported, "");
|
@@ -1911,6 +1948,7 @@ size_t ZSTD_DCtx_reset(ZSTD_DCtx* dctx, ZSTD_ResetDirective reset)
|
|
1911
1948
|
|| (reset == ZSTD_reset_session_and_parameters) ) {
|
1912
1949
|
dctx->streamStage = zdss_init;
|
1913
1950
|
dctx->noForwardProgress = 0;
|
1951
|
+
dctx->isFrameDecompression = 1;
|
1914
1952
|
}
|
1915
1953
|
if ( (reset == ZSTD_reset_parameters)
|
1916
1954
|
|| (reset == ZSTD_reset_session_and_parameters) ) {
|
@@ -1927,11 +1965,17 @@ size_t ZSTD_sizeof_DStream(const ZSTD_DStream* dctx)
|
|
1927
1965
|
return ZSTD_sizeof_DCtx(dctx);
|
1928
1966
|
}
|
1929
1967
|
|
1930
|
-
size_t
|
1968
|
+
static size_t ZSTD_decodingBufferSize_internal(unsigned long long windowSize, unsigned long long frameContentSize, size_t blockSizeMax)
|
1931
1969
|
{
|
1932
|
-
size_t const blockSize = (size_t)
|
1933
|
-
/*
|
1934
|
-
|
1970
|
+
size_t const blockSize = MIN((size_t)MIN(windowSize, ZSTD_BLOCKSIZE_MAX), blockSizeMax);
|
1971
|
+
/* We need blockSize + WILDCOPY_OVERLENGTH worth of buffer so that if a block
|
1972
|
+
* ends at windowSize + WILDCOPY_OVERLENGTH + 1 bytes, we can start writing
|
1973
|
+
* the block at the beginning of the output buffer, and maintain a full window.
|
1974
|
+
*
|
1975
|
+
* We need another blockSize worth of buffer so that we can store split
|
1976
|
+
* literals at the end of the block without overwriting the extDict window.
|
1977
|
+
*/
|
1978
|
+
unsigned long long const neededRBSize = windowSize + (blockSize * 2) + (WILDCOPY_OVERLENGTH * 2);
|
1935
1979
|
unsigned long long const neededSize = MIN(frameContentSize, neededRBSize);
|
1936
1980
|
size_t const minRBSize = (size_t) neededSize;
|
1937
1981
|
RETURN_ERROR_IF((unsigned long long)minRBSize != neededSize,
|
@@ -1939,6 +1983,11 @@ size_t ZSTD_decodingBufferSize_min(unsigned long long windowSize, unsigned long
|
|
1939
1983
|
return minRBSize;
|
1940
1984
|
}
|
1941
1985
|
|
1986
|
+
size_t ZSTD_decodingBufferSize_min(unsigned long long windowSize, unsigned long long frameContentSize)
|
1987
|
+
{
|
1988
|
+
return ZSTD_decodingBufferSize_internal(windowSize, frameContentSize, ZSTD_BLOCKSIZE_MAX);
|
1989
|
+
}
|
1990
|
+
|
1942
1991
|
size_t ZSTD_estimateDStreamSize(size_t windowSize)
|
1943
1992
|
{
|
1944
1993
|
size_t const blockSize = MIN(windowSize, ZSTD_BLOCKSIZE_MAX);
|
@@ -2134,12 +2183,12 @@ size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inB
|
|
2134
2183
|
if (zds->fParams.frameContentSize != ZSTD_CONTENTSIZE_UNKNOWN
|
2135
2184
|
&& zds->fParams.frameType != ZSTD_skippableFrame
|
2136
2185
|
&& (U64)(size_t)(oend-op) >= zds->fParams.frameContentSize) {
|
2137
|
-
size_t const cSize =
|
2186
|
+
size_t const cSize = ZSTD_findFrameCompressedSize_advanced(istart, (size_t)(iend-istart), zds->format);
|
2138
2187
|
if (cSize <= (size_t)(iend-istart)) {
|
2139
2188
|
/* shortcut : using single-pass mode */
|
2140
2189
|
size_t const decompressedSize = ZSTD_decompress_usingDDict(zds, op, (size_t)(oend-op), istart, cSize, ZSTD_getDDict(zds));
|
2141
2190
|
if (ZSTD_isError(decompressedSize)) return decompressedSize;
|
2142
|
-
DEBUGLOG(4, "shortcut to single-pass ZSTD_decompress_usingDDict()")
|
2191
|
+
DEBUGLOG(4, "shortcut to single-pass ZSTD_decompress_usingDDict()");
|
2143
2192
|
assert(istart != NULL);
|
2144
2193
|
ip = istart + cSize;
|
2145
2194
|
op = op ? op + decompressedSize : op; /* can occur if frameContentSize = 0 (empty frame) */
|
@@ -2161,7 +2210,8 @@ size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inB
|
|
2161
2210
|
DEBUGLOG(4, "Consume header");
|
2162
2211
|
FORWARD_IF_ERROR(ZSTD_decompressBegin_usingDDict(zds, ZSTD_getDDict(zds)), "");
|
2163
2212
|
|
2164
|
-
if (
|
2213
|
+
if (zds->format == ZSTD_f_zstd1
|
2214
|
+
&& (MEM_readLE32(zds->headerBuffer) & ZSTD_MAGIC_SKIPPABLE_MASK) == ZSTD_MAGIC_SKIPPABLE_START) { /* skippable frame */
|
2165
2215
|
zds->expected = MEM_readLE32(zds->headerBuffer + ZSTD_FRAMEIDSIZE);
|
2166
2216
|
zds->stage = ZSTDds_skipFrame;
|
2167
2217
|
} else {
|
@@ -2177,11 +2227,13 @@ size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inB
|
|
2177
2227
|
zds->fParams.windowSize = MAX(zds->fParams.windowSize, 1U << ZSTD_WINDOWLOG_ABSOLUTEMIN);
|
2178
2228
|
RETURN_ERROR_IF(zds->fParams.windowSize > zds->maxWindowSize,
|
2179
2229
|
frameParameter_windowTooLarge, "");
|
2230
|
+
if (zds->maxBlockSizeParam != 0)
|
2231
|
+
zds->fParams.blockSizeMax = MIN(zds->fParams.blockSizeMax, (unsigned)zds->maxBlockSizeParam);
|
2180
2232
|
|
2181
2233
|
/* Adapt buffer sizes to frame header instructions */
|
2182
2234
|
{ size_t const neededInBuffSize = MAX(zds->fParams.blockSizeMax, 4 /* frame checksum */);
|
2183
2235
|
size_t const neededOutBuffSize = zds->outBufferMode == ZSTD_bm_buffered
|
2184
|
-
?
|
2236
|
+
? ZSTD_decodingBufferSize_internal(zds->fParams.windowSize, zds->fParams.frameContentSize, zds->fParams.blockSizeMax)
|
2185
2237
|
: 0;
|
2186
2238
|
|
2187
2239
|
ZSTD_DCtx_updateOversizedDuration(zds, neededInBuffSize, neededOutBuffSize);
|