zstd-ruby 1.4.5.0 → 1.4.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ruby.yml +35 -0
- data/README.md +2 -2
- data/ext/zstdruby/libzstd/Makefile +237 -138
- data/ext/zstdruby/libzstd/README.md +28 -0
- data/ext/zstdruby/libzstd/common/bitstream.h +25 -16
- data/ext/zstdruby/libzstd/common/compiler.h +118 -4
- data/ext/zstdruby/libzstd/common/cpu.h +1 -3
- data/ext/zstdruby/libzstd/common/debug.c +1 -1
- data/ext/zstdruby/libzstd/common/debug.h +12 -19
- data/ext/zstdruby/libzstd/common/entropy_common.c +189 -43
- data/ext/zstdruby/libzstd/common/error_private.c +2 -1
- data/ext/zstdruby/libzstd/common/error_private.h +2 -2
- data/ext/zstdruby/libzstd/common/fse.h +40 -12
- data/ext/zstdruby/libzstd/common/fse_decompress.c +124 -17
- data/ext/zstdruby/libzstd/common/huf.h +27 -6
- data/ext/zstdruby/libzstd/common/mem.h +67 -94
- data/ext/zstdruby/libzstd/common/pool.c +23 -17
- data/ext/zstdruby/libzstd/common/pool.h +2 -2
- data/ext/zstdruby/libzstd/common/threading.c +6 -5
- data/ext/zstdruby/libzstd/common/xxhash.c +19 -57
- data/ext/zstdruby/libzstd/common/xxhash.h +2 -2
- data/ext/zstdruby/libzstd/common/zstd_common.c +10 -10
- data/ext/zstdruby/libzstd/common/zstd_deps.h +111 -0
- data/ext/zstdruby/libzstd/common/zstd_errors.h +2 -1
- data/ext/zstdruby/libzstd/common/zstd_internal.h +90 -59
- data/ext/zstdruby/libzstd/common/zstd_trace.c +42 -0
- data/ext/zstdruby/libzstd/common/zstd_trace.h +152 -0
- data/ext/zstdruby/libzstd/compress/fse_compress.c +31 -24
- data/ext/zstdruby/libzstd/compress/hist.c +27 -29
- data/ext/zstdruby/libzstd/compress/hist.h +2 -2
- data/ext/zstdruby/libzstd/compress/huf_compress.c +217 -101
- data/ext/zstdruby/libzstd/compress/zstd_compress.c +1495 -478
- data/ext/zstdruby/libzstd/compress/zstd_compress_internal.h +143 -44
- data/ext/zstdruby/libzstd/compress/zstd_compress_literals.c +7 -7
- data/ext/zstdruby/libzstd/compress/zstd_compress_literals.h +1 -1
- data/ext/zstdruby/libzstd/compress/zstd_compress_sequences.c +18 -4
- data/ext/zstdruby/libzstd/compress/zstd_compress_sequences.h +1 -1
- data/ext/zstdruby/libzstd/compress/zstd_compress_superblock.c +25 -21
- data/ext/zstdruby/libzstd/compress/zstd_compress_superblock.h +1 -1
- data/ext/zstdruby/libzstd/compress/zstd_cwksp.h +62 -26
- data/ext/zstdruby/libzstd/compress/zstd_double_fast.c +23 -23
- data/ext/zstdruby/libzstd/compress/zstd_double_fast.h +1 -1
- data/ext/zstdruby/libzstd/compress/zstd_fast.c +21 -21
- data/ext/zstdruby/libzstd/compress/zstd_fast.h +1 -1
- data/ext/zstdruby/libzstd/compress/zstd_lazy.c +352 -78
- data/ext/zstdruby/libzstd/compress/zstd_lazy.h +21 -1
- data/ext/zstdruby/libzstd/compress/zstd_ldm.c +276 -209
- data/ext/zstdruby/libzstd/compress/zstd_ldm.h +8 -2
- data/ext/zstdruby/libzstd/compress/zstd_ldm_geartab.h +103 -0
- data/ext/zstdruby/libzstd/compress/zstd_opt.c +191 -46
- data/ext/zstdruby/libzstd/compress/zstd_opt.h +1 -1
- data/ext/zstdruby/libzstd/compress/zstdmt_compress.c +79 -410
- data/ext/zstdruby/libzstd/compress/zstdmt_compress.h +27 -109
- data/ext/zstdruby/libzstd/decompress/huf_decompress.c +303 -201
- data/ext/zstdruby/libzstd/decompress/zstd_ddict.c +9 -9
- data/ext/zstdruby/libzstd/decompress/zstd_ddict.h +2 -2
- data/ext/zstdruby/libzstd/decompress/zstd_decompress.c +370 -87
- data/ext/zstdruby/libzstd/decompress/zstd_decompress_block.c +153 -45
- data/ext/zstdruby/libzstd/decompress/zstd_decompress_block.h +6 -3
- data/ext/zstdruby/libzstd/decompress/zstd_decompress_internal.h +28 -11
- data/ext/zstdruby/libzstd/deprecated/zbuff.h +1 -1
- data/ext/zstdruby/libzstd/deprecated/zbuff_common.c +1 -1
- data/ext/zstdruby/libzstd/deprecated/zbuff_compress.c +1 -1
- data/ext/zstdruby/libzstd/deprecated/zbuff_decompress.c +1 -1
- data/ext/zstdruby/libzstd/dictBuilder/cover.c +40 -31
- data/ext/zstdruby/libzstd/dictBuilder/cover.h +2 -2
- data/ext/zstdruby/libzstd/dictBuilder/divsufsort.c +1 -1
- data/ext/zstdruby/libzstd/dictBuilder/fastcover.c +26 -25
- data/ext/zstdruby/libzstd/dictBuilder/zdict.c +22 -24
- data/ext/zstdruby/libzstd/dictBuilder/zdict.h +5 -4
- data/ext/zstdruby/libzstd/dll/example/Makefile +1 -1
- data/ext/zstdruby/libzstd/dll/example/README.md +16 -22
- data/ext/zstdruby/libzstd/legacy/zstd_legacy.h +1 -1
- data/ext/zstdruby/libzstd/legacy/zstd_v01.c +6 -2
- data/ext/zstdruby/libzstd/legacy/zstd_v01.h +1 -1
- data/ext/zstdruby/libzstd/legacy/zstd_v02.c +6 -2
- data/ext/zstdruby/libzstd/legacy/zstd_v02.h +1 -1
- data/ext/zstdruby/libzstd/legacy/zstd_v03.c +6 -2
- data/ext/zstdruby/libzstd/legacy/zstd_v03.h +1 -1
- data/ext/zstdruby/libzstd/legacy/zstd_v04.c +7 -3
- data/ext/zstdruby/libzstd/legacy/zstd_v04.h +1 -1
- data/ext/zstdruby/libzstd/legacy/zstd_v05.c +10 -6
- data/ext/zstdruby/libzstd/legacy/zstd_v05.h +1 -1
- data/ext/zstdruby/libzstd/legacy/zstd_v06.c +10 -6
- data/ext/zstdruby/libzstd/legacy/zstd_v06.h +1 -1
- data/ext/zstdruby/libzstd/legacy/zstd_v07.c +10 -6
- data/ext/zstdruby/libzstd/legacy/zstd_v07.h +1 -1
- data/ext/zstdruby/libzstd/libzstd.pc.in +3 -3
- data/ext/zstdruby/libzstd/zstd.h +414 -54
- data/lib/zstd-ruby/version.rb +1 -1
- metadata +7 -3
- data/.travis.yml +0 -14
@@ -1,5 +1,5 @@
|
|
1
1
|
/*
|
2
|
-
* Copyright (c) 2016-
|
2
|
+
* Copyright (c) 2016-2021, 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
|
@@ -14,7 +14,7 @@
|
|
14
14
|
/*-*******************************************************
|
15
15
|
* Dependencies
|
16
16
|
*********************************************************/
|
17
|
-
#include
|
17
|
+
#include "../common/zstd_deps.h" /* ZSTD_memcpy, ZSTD_memmove, ZSTD_memset */
|
18
18
|
#include "../common/compiler.h" /* prefetch */
|
19
19
|
#include "../common/cpu.h" /* bmi2 */
|
20
20
|
#include "../common/mem.h" /* low level memory routines */
|
@@ -44,7 +44,7 @@
|
|
44
44
|
/*_*******************************************************
|
45
45
|
* Memory operations
|
46
46
|
**********************************************************/
|
47
|
-
static void ZSTD_copy4(void* dst, const void* src) {
|
47
|
+
static void ZSTD_copy4(void* dst, const void* src) { ZSTD_memcpy(dst, src, 4); }
|
48
48
|
|
49
49
|
|
50
50
|
/*-*************************************************************
|
@@ -166,7 +166,7 @@ size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx,
|
|
166
166
|
dctx->litSize = litSize;
|
167
167
|
dctx->litEntropy = 1;
|
168
168
|
if (litEncType==set_compressed) dctx->HUFptr = dctx->entropy.hufTable;
|
169
|
-
|
169
|
+
ZSTD_memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH);
|
170
170
|
return litCSize + lhSize;
|
171
171
|
}
|
172
172
|
|
@@ -191,10 +191,10 @@ size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx,
|
|
191
191
|
|
192
192
|
if (lhSize+litSize+WILDCOPY_OVERLENGTH > srcSize) { /* risk reading beyond src buffer with wildcopy */
|
193
193
|
RETURN_ERROR_IF(litSize+lhSize > srcSize, corruption_detected, "");
|
194
|
-
|
194
|
+
ZSTD_memcpy(dctx->litBuffer, istart+lhSize, litSize);
|
195
195
|
dctx->litPtr = dctx->litBuffer;
|
196
196
|
dctx->litSize = litSize;
|
197
|
-
|
197
|
+
ZSTD_memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH);
|
198
198
|
return lhSize+litSize;
|
199
199
|
}
|
200
200
|
/* direct reference into compressed stream */
|
@@ -223,7 +223,7 @@ size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx,
|
|
223
223
|
break;
|
224
224
|
}
|
225
225
|
RETURN_ERROR_IF(litSize > ZSTD_BLOCKSIZE_MAX, corruption_detected, "");
|
226
|
-
|
226
|
+
ZSTD_memset(dctx->litBuffer, istart[lhSize], litSize + WILDCOPY_OVERLENGTH);
|
227
227
|
dctx->litPtr = dctx->litBuffer;
|
228
228
|
dctx->litSize = litSize;
|
229
229
|
return lhSize+1;
|
@@ -236,7 +236,7 @@ size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx,
|
|
236
236
|
|
237
237
|
/* Default FSE distribution tables.
|
238
238
|
* These are pre-calculated FSE decoding tables using default distributions as defined in specification :
|
239
|
-
* https://github.com/facebook/zstd/blob/
|
239
|
+
* https://github.com/facebook/zstd/blob/release/doc/zstd_compression_format.md#default-distributions
|
240
240
|
* They were generated programmatically with following method :
|
241
241
|
* - start from default distributions, present in /lib/common/zstd_internal.h
|
242
242
|
* - generate tables normally, using ZSTD_buildFSETable()
|
@@ -364,23 +364,26 @@ static void ZSTD_buildSeqTable_rle(ZSTD_seqSymbol* dt, U32 baseValue, U32 nbAddB
|
|
364
364
|
* generate FSE decoding table for one symbol (ll, ml or off)
|
365
365
|
* cannot fail if input is valid =>
|
366
366
|
* all inputs are presumed validated at this stage */
|
367
|
-
|
368
|
-
|
367
|
+
FORCE_INLINE_TEMPLATE
|
368
|
+
void ZSTD_buildFSETable_body(ZSTD_seqSymbol* dt,
|
369
369
|
const short* normalizedCounter, unsigned maxSymbolValue,
|
370
370
|
const U32* baseValue, const U32* nbAdditionalBits,
|
371
|
-
unsigned tableLog)
|
371
|
+
unsigned tableLog, void* wksp, size_t wkspSize)
|
372
372
|
{
|
373
373
|
ZSTD_seqSymbol* const tableDecode = dt+1;
|
374
|
-
U16 symbolNext[MaxSeq+1];
|
375
|
-
|
376
374
|
U32 const maxSV1 = maxSymbolValue + 1;
|
377
375
|
U32 const tableSize = 1 << tableLog;
|
378
|
-
|
376
|
+
|
377
|
+
U16* symbolNext = (U16*)wksp;
|
378
|
+
BYTE* spread = (BYTE*)(symbolNext + MaxSeq + 1);
|
379
|
+
U32 highThreshold = tableSize - 1;
|
380
|
+
|
379
381
|
|
380
382
|
/* Sanity Checks */
|
381
383
|
assert(maxSymbolValue <= MaxSeq);
|
382
384
|
assert(tableLog <= MaxFSELog);
|
383
|
-
|
385
|
+
assert(wkspSize >= ZSTD_BUILD_FSE_TABLE_WKSP_SIZE);
|
386
|
+
(void)wkspSize;
|
384
387
|
/* Init, lay down lowprob symbols */
|
385
388
|
{ ZSTD_seqSymbol_header DTableH;
|
386
389
|
DTableH.tableLog = tableLog;
|
@@ -396,16 +399,69 @@ ZSTD_buildFSETable(ZSTD_seqSymbol* dt,
|
|
396
399
|
assert(normalizedCounter[s]>=0);
|
397
400
|
symbolNext[s] = (U16)normalizedCounter[s];
|
398
401
|
} } }
|
399
|
-
|
402
|
+
ZSTD_memcpy(dt, &DTableH, sizeof(DTableH));
|
400
403
|
}
|
401
404
|
|
402
405
|
/* Spread symbols */
|
403
|
-
|
406
|
+
assert(tableSize <= 512);
|
407
|
+
/* Specialized symbol spreading for the case when there are
|
408
|
+
* no low probability (-1 count) symbols. When compressing
|
409
|
+
* small blocks we avoid low probability symbols to hit this
|
410
|
+
* case, since header decoding speed matters more.
|
411
|
+
*/
|
412
|
+
if (highThreshold == tableSize - 1) {
|
413
|
+
size_t const tableMask = tableSize-1;
|
414
|
+
size_t const step = FSE_TABLESTEP(tableSize);
|
415
|
+
/* First lay down the symbols in order.
|
416
|
+
* We use a uint64_t to lay down 8 bytes at a time. This reduces branch
|
417
|
+
* misses since small blocks generally have small table logs, so nearly
|
418
|
+
* all symbols have counts <= 8. We ensure we have 8 bytes at the end of
|
419
|
+
* our buffer to handle the over-write.
|
420
|
+
*/
|
421
|
+
{
|
422
|
+
U64 const add = 0x0101010101010101ull;
|
423
|
+
size_t pos = 0;
|
424
|
+
U64 sv = 0;
|
425
|
+
U32 s;
|
426
|
+
for (s=0; s<maxSV1; ++s, sv += add) {
|
427
|
+
int i;
|
428
|
+
int const n = normalizedCounter[s];
|
429
|
+
MEM_write64(spread + pos, sv);
|
430
|
+
for (i = 8; i < n; i += 8) {
|
431
|
+
MEM_write64(spread + pos + i, sv);
|
432
|
+
}
|
433
|
+
pos += n;
|
434
|
+
}
|
435
|
+
}
|
436
|
+
/* Now we spread those positions across the table.
|
437
|
+
* The benefit of doing it in two stages is that we avoid the the
|
438
|
+
* variable size inner loop, which caused lots of branch misses.
|
439
|
+
* Now we can run through all the positions without any branch misses.
|
440
|
+
* We unroll the loop twice, since that is what emperically worked best.
|
441
|
+
*/
|
442
|
+
{
|
443
|
+
size_t position = 0;
|
444
|
+
size_t s;
|
445
|
+
size_t const unroll = 2;
|
446
|
+
assert(tableSize % unroll == 0); /* FSE_MIN_TABLELOG is 5 */
|
447
|
+
for (s = 0; s < (size_t)tableSize; s += unroll) {
|
448
|
+
size_t u;
|
449
|
+
for (u = 0; u < unroll; ++u) {
|
450
|
+
size_t const uPosition = (position + (u * step)) & tableMask;
|
451
|
+
tableDecode[uPosition].baseValue = spread[s + u];
|
452
|
+
}
|
453
|
+
position = (position + (unroll * step)) & tableMask;
|
454
|
+
}
|
455
|
+
assert(position == 0);
|
456
|
+
}
|
457
|
+
} else {
|
458
|
+
U32 const tableMask = tableSize-1;
|
404
459
|
U32 const step = FSE_TABLESTEP(tableSize);
|
405
460
|
U32 s, position = 0;
|
406
461
|
for (s=0; s<maxSV1; s++) {
|
407
462
|
int i;
|
408
|
-
|
463
|
+
int const n = normalizedCounter[s];
|
464
|
+
for (i=0; i<n; i++) {
|
409
465
|
tableDecode[position].baseValue = s;
|
410
466
|
position = (position + step) & tableMask;
|
411
467
|
while (position > highThreshold) position = (position + step) & tableMask; /* lowprob area */
|
@@ -414,7 +470,8 @@ ZSTD_buildFSETable(ZSTD_seqSymbol* dt,
|
|
414
470
|
}
|
415
471
|
|
416
472
|
/* Build Decoding table */
|
417
|
-
{
|
473
|
+
{
|
474
|
+
U32 u;
|
418
475
|
for (u=0; u<tableSize; u++) {
|
419
476
|
U32 const symbol = tableDecode[u].baseValue;
|
420
477
|
U32 const nextState = symbolNext[symbol]++;
|
@@ -423,7 +480,46 @@ ZSTD_buildFSETable(ZSTD_seqSymbol* dt,
|
|
423
480
|
assert(nbAdditionalBits[symbol] < 255);
|
424
481
|
tableDecode[u].nbAdditionalBits = (BYTE)nbAdditionalBits[symbol];
|
425
482
|
tableDecode[u].baseValue = baseValue[symbol];
|
426
|
-
|
483
|
+
}
|
484
|
+
}
|
485
|
+
}
|
486
|
+
|
487
|
+
/* Avoids the FORCE_INLINE of the _body() function. */
|
488
|
+
static void ZSTD_buildFSETable_body_default(ZSTD_seqSymbol* dt,
|
489
|
+
const short* normalizedCounter, unsigned maxSymbolValue,
|
490
|
+
const U32* baseValue, const U32* nbAdditionalBits,
|
491
|
+
unsigned tableLog, void* wksp, size_t wkspSize)
|
492
|
+
{
|
493
|
+
ZSTD_buildFSETable_body(dt, normalizedCounter, maxSymbolValue,
|
494
|
+
baseValue, nbAdditionalBits, tableLog, wksp, wkspSize);
|
495
|
+
}
|
496
|
+
|
497
|
+
#if DYNAMIC_BMI2
|
498
|
+
TARGET_ATTRIBUTE("bmi2") static void ZSTD_buildFSETable_body_bmi2(ZSTD_seqSymbol* dt,
|
499
|
+
const short* normalizedCounter, unsigned maxSymbolValue,
|
500
|
+
const U32* baseValue, const U32* nbAdditionalBits,
|
501
|
+
unsigned tableLog, void* wksp, size_t wkspSize)
|
502
|
+
{
|
503
|
+
ZSTD_buildFSETable_body(dt, normalizedCounter, maxSymbolValue,
|
504
|
+
baseValue, nbAdditionalBits, tableLog, wksp, wkspSize);
|
505
|
+
}
|
506
|
+
#endif
|
507
|
+
|
508
|
+
void ZSTD_buildFSETable(ZSTD_seqSymbol* dt,
|
509
|
+
const short* normalizedCounter, unsigned maxSymbolValue,
|
510
|
+
const U32* baseValue, const U32* nbAdditionalBits,
|
511
|
+
unsigned tableLog, void* wksp, size_t wkspSize, int bmi2)
|
512
|
+
{
|
513
|
+
#if DYNAMIC_BMI2
|
514
|
+
if (bmi2) {
|
515
|
+
ZSTD_buildFSETable_body_bmi2(dt, normalizedCounter, maxSymbolValue,
|
516
|
+
baseValue, nbAdditionalBits, tableLog, wksp, wkspSize);
|
517
|
+
return;
|
518
|
+
}
|
519
|
+
#endif
|
520
|
+
(void)bmi2;
|
521
|
+
ZSTD_buildFSETable_body_default(dt, normalizedCounter, maxSymbolValue,
|
522
|
+
baseValue, nbAdditionalBits, tableLog, wksp, wkspSize);
|
427
523
|
}
|
428
524
|
|
429
525
|
|
@@ -435,7 +531,8 @@ static size_t ZSTD_buildSeqTable(ZSTD_seqSymbol* DTableSpace, const ZSTD_seqSymb
|
|
435
531
|
const void* src, size_t srcSize,
|
436
532
|
const U32* baseValue, const U32* nbAdditionalBits,
|
437
533
|
const ZSTD_seqSymbol* defaultTable, U32 flagRepeatTable,
|
438
|
-
int ddictIsCold, int nbSeq
|
534
|
+
int ddictIsCold, int nbSeq, U32* wksp, size_t wkspSize,
|
535
|
+
int bmi2)
|
439
536
|
{
|
440
537
|
switch(type)
|
441
538
|
{
|
@@ -467,7 +564,7 @@ static size_t ZSTD_buildSeqTable(ZSTD_seqSymbol* DTableSpace, const ZSTD_seqSymb
|
|
467
564
|
size_t const headerSize = FSE_readNCount(norm, &max, &tableLog, src, srcSize);
|
468
565
|
RETURN_ERROR_IF(FSE_isError(headerSize), corruption_detected, "");
|
469
566
|
RETURN_ERROR_IF(tableLog > maxLog, corruption_detected, "");
|
470
|
-
ZSTD_buildFSETable(DTableSpace, norm, max, baseValue, nbAdditionalBits, tableLog);
|
567
|
+
ZSTD_buildFSETable(DTableSpace, norm, max, baseValue, nbAdditionalBits, tableLog, wksp, wkspSize, bmi2);
|
471
568
|
*DTablePtr = DTableSpace;
|
472
569
|
return headerSize;
|
473
570
|
}
|
@@ -480,7 +577,7 @@ static size_t ZSTD_buildSeqTable(ZSTD_seqSymbol* DTableSpace, const ZSTD_seqSymb
|
|
480
577
|
size_t ZSTD_decodeSeqHeaders(ZSTD_DCtx* dctx, int* nbSeqPtr,
|
481
578
|
const void* src, size_t srcSize)
|
482
579
|
{
|
483
|
-
const BYTE* const istart = (const BYTE*
|
580
|
+
const BYTE* const istart = (const BYTE*)src;
|
484
581
|
const BYTE* const iend = istart + srcSize;
|
485
582
|
const BYTE* ip = istart;
|
486
583
|
int nbSeq;
|
@@ -499,7 +596,8 @@ size_t ZSTD_decodeSeqHeaders(ZSTD_DCtx* dctx, int* nbSeqPtr,
|
|
499
596
|
if (nbSeq > 0x7F) {
|
500
597
|
if (nbSeq == 0xFF) {
|
501
598
|
RETURN_ERROR_IF(ip+2 > iend, srcSize_wrong, "");
|
502
|
-
nbSeq = MEM_readLE16(ip) + LONGNBSEQ
|
599
|
+
nbSeq = MEM_readLE16(ip) + LONGNBSEQ;
|
600
|
+
ip+=2;
|
503
601
|
} else {
|
504
602
|
RETURN_ERROR_IF(ip >= iend, srcSize_wrong, "");
|
505
603
|
nbSeq = ((nbSeq-0x80)<<8) + *ip++;
|
@@ -520,7 +618,9 @@ size_t ZSTD_decodeSeqHeaders(ZSTD_DCtx* dctx, int* nbSeqPtr,
|
|
520
618
|
ip, iend-ip,
|
521
619
|
LL_base, LL_bits,
|
522
620
|
LL_defaultDTable, dctx->fseEntropy,
|
523
|
-
dctx->ddictIsCold, nbSeq
|
621
|
+
dctx->ddictIsCold, nbSeq,
|
622
|
+
dctx->workspace, sizeof(dctx->workspace),
|
623
|
+
dctx->bmi2);
|
524
624
|
RETURN_ERROR_IF(ZSTD_isError(llhSize), corruption_detected, "ZSTD_buildSeqTable failed");
|
525
625
|
ip += llhSize;
|
526
626
|
}
|
@@ -530,7 +630,9 @@ size_t ZSTD_decodeSeqHeaders(ZSTD_DCtx* dctx, int* nbSeqPtr,
|
|
530
630
|
ip, iend-ip,
|
531
631
|
OF_base, OF_bits,
|
532
632
|
OF_defaultDTable, dctx->fseEntropy,
|
533
|
-
dctx->ddictIsCold, nbSeq
|
633
|
+
dctx->ddictIsCold, nbSeq,
|
634
|
+
dctx->workspace, sizeof(dctx->workspace),
|
635
|
+
dctx->bmi2);
|
534
636
|
RETURN_ERROR_IF(ZSTD_isError(ofhSize), corruption_detected, "ZSTD_buildSeqTable failed");
|
535
637
|
ip += ofhSize;
|
536
638
|
}
|
@@ -540,7 +642,9 @@ size_t ZSTD_decodeSeqHeaders(ZSTD_DCtx* dctx, int* nbSeqPtr,
|
|
540
642
|
ip, iend-ip,
|
541
643
|
ML_base, ML_bits,
|
542
644
|
ML_defaultDTable, dctx->fseEntropy,
|
543
|
-
dctx->ddictIsCold, nbSeq
|
645
|
+
dctx->ddictIsCold, nbSeq,
|
646
|
+
dctx->workspace, sizeof(dctx->workspace),
|
647
|
+
dctx->bmi2);
|
544
648
|
RETURN_ERROR_IF(ZSTD_isError(mlhSize), corruption_detected, "ZSTD_buildSeqTable failed");
|
545
649
|
ip += mlhSize;
|
546
650
|
}
|
@@ -686,12 +790,12 @@ size_t ZSTD_execSequenceEnd(BYTE* op,
|
|
686
790
|
RETURN_ERROR_IF(sequence.offset > (size_t)(oLitEnd - virtualStart), corruption_detected, "");
|
687
791
|
match = dictEnd - (prefixStart-match);
|
688
792
|
if (match + sequence.matchLength <= dictEnd) {
|
689
|
-
|
793
|
+
ZSTD_memmove(oLitEnd, match, sequence.matchLength);
|
690
794
|
return sequenceLength;
|
691
795
|
}
|
692
796
|
/* span extDict & currentPrefixSegment */
|
693
797
|
{ size_t const length1 = dictEnd - match;
|
694
|
-
|
798
|
+
ZSTD_memmove(oLitEnd, match, length1);
|
695
799
|
op = oLitEnd + length1;
|
696
800
|
sequence.matchLength -= length1;
|
697
801
|
match = prefixStart;
|
@@ -752,12 +856,12 @@ size_t ZSTD_execSequence(BYTE* op,
|
|
752
856
|
RETURN_ERROR_IF(UNLIKELY(sequence.offset > (size_t)(oLitEnd - virtualStart)), corruption_detected, "");
|
753
857
|
match = dictEnd + (match - prefixStart);
|
754
858
|
if (match + sequence.matchLength <= dictEnd) {
|
755
|
-
|
859
|
+
ZSTD_memmove(oLitEnd, match, sequence.matchLength);
|
756
860
|
return sequenceLength;
|
757
861
|
}
|
758
862
|
/* span extDict & currentPrefixSegment */
|
759
863
|
{ size_t const length1 = dictEnd - match;
|
760
|
-
|
864
|
+
ZSTD_memmove(oLitEnd, match, length1);
|
761
865
|
op = oLitEnd + length1;
|
762
866
|
sequence.matchLength -= length1;
|
763
867
|
match = prefixStart;
|
@@ -948,7 +1052,7 @@ ZSTD_decodeSequence(seqState_t* seqState, const ZSTD_longOffset_e longOffsets, c
|
|
948
1052
|
}
|
949
1053
|
|
950
1054
|
#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
|
951
|
-
|
1055
|
+
MEM_STATIC int ZSTD_dictionaryIsActive(ZSTD_DCtx const* dctx, BYTE const* prefixStart, BYTE const* oLitEnd)
|
952
1056
|
{
|
953
1057
|
size_t const windowSize = dctx->fParams.windowSize;
|
954
1058
|
/* No dictionary used. */
|
@@ -969,6 +1073,7 @@ MEM_STATIC void ZSTD_assertValidSequence(
|
|
969
1073
|
seq_t const seq,
|
970
1074
|
BYTE const* prefixStart, BYTE const* virtualStart)
|
971
1075
|
{
|
1076
|
+
#if DEBUGLEVEL >= 1
|
972
1077
|
size_t const windowSize = dctx->fParams.windowSize;
|
973
1078
|
size_t const sequenceSize = seq.litLength + seq.matchLength;
|
974
1079
|
BYTE const* const oLitEnd = op + seq.litLength;
|
@@ -986,6 +1091,9 @@ MEM_STATIC void ZSTD_assertValidSequence(
|
|
986
1091
|
/* Offset must be within our window. */
|
987
1092
|
assert(seq.offset <= windowSize);
|
988
1093
|
}
|
1094
|
+
#else
|
1095
|
+
(void)dctx, (void)op, (void)oend, (void)seq, (void)prefixStart, (void)virtualStart;
|
1096
|
+
#endif
|
989
1097
|
}
|
990
1098
|
#endif
|
991
1099
|
|
@@ -1000,7 +1108,7 @@ ZSTD_decompressSequences_body( ZSTD_DCtx* dctx,
|
|
1000
1108
|
{
|
1001
1109
|
const BYTE* ip = (const BYTE*)seqStart;
|
1002
1110
|
const BYTE* const iend = ip + seqSize;
|
1003
|
-
BYTE* const ostart = (BYTE*
|
1111
|
+
BYTE* const ostart = (BYTE*)dst;
|
1004
1112
|
BYTE* const oend = ostart + maxDstSize;
|
1005
1113
|
BYTE* op = ostart;
|
1006
1114
|
const BYTE* litPtr = dctx->litPtr;
|
@@ -1080,14 +1188,14 @@ ZSTD_decompressSequences_body( ZSTD_DCtx* dctx,
|
|
1080
1188
|
#endif
|
1081
1189
|
DEBUGLOG(6, "regenerated sequence size : %u", (U32)oneSeqSize);
|
1082
1190
|
BIT_reloadDStream(&(seqState.DStream));
|
1191
|
+
op += oneSeqSize;
|
1083
1192
|
/* gcc and clang both don't like early returns in this loop.
|
1084
|
-
*
|
1085
|
-
* Instead save an error and report it at the end.
|
1086
|
-
* When there is an error, don't increment op, so we don't
|
1087
|
-
* overwrite.
|
1193
|
+
* Instead break and check for an error at the end of the loop.
|
1088
1194
|
*/
|
1089
|
-
if (UNLIKELY(ZSTD_isError(oneSeqSize)))
|
1090
|
-
|
1195
|
+
if (UNLIKELY(ZSTD_isError(oneSeqSize))) {
|
1196
|
+
error = oneSeqSize;
|
1197
|
+
break;
|
1198
|
+
}
|
1091
1199
|
if (UNLIKELY(!--nbSeq)) break;
|
1092
1200
|
}
|
1093
1201
|
|
@@ -1104,7 +1212,7 @@ ZSTD_decompressSequences_body( ZSTD_DCtx* dctx,
|
|
1104
1212
|
{ size_t const lastLLSize = litEnd - litPtr;
|
1105
1213
|
RETURN_ERROR_IF(lastLLSize > (size_t)(oend-op), dstSize_tooSmall, "");
|
1106
1214
|
if (op != NULL) {
|
1107
|
-
|
1215
|
+
ZSTD_memcpy(op, litPtr, lastLLSize);
|
1108
1216
|
op += lastLLSize;
|
1109
1217
|
}
|
1110
1218
|
}
|
@@ -1134,7 +1242,7 @@ ZSTD_decompressSequencesLong_body(
|
|
1134
1242
|
{
|
1135
1243
|
const BYTE* ip = (const BYTE*)seqStart;
|
1136
1244
|
const BYTE* const iend = ip + seqSize;
|
1137
|
-
BYTE* const ostart = (BYTE*
|
1245
|
+
BYTE* const ostart = (BYTE*)dst;
|
1138
1246
|
BYTE* const oend = ostart + maxDstSize;
|
1139
1247
|
BYTE* op = ostart;
|
1140
1248
|
const BYTE* litPtr = dctx->litPtr;
|
@@ -1209,7 +1317,7 @@ ZSTD_decompressSequencesLong_body(
|
|
1209
1317
|
{ size_t const lastLLSize = litEnd - litPtr;
|
1210
1318
|
RETURN_ERROR_IF(lastLLSize > (size_t)(oend-op), dstSize_tooSmall, "");
|
1211
1319
|
if (op != NULL) {
|
1212
|
-
|
1320
|
+
ZSTD_memcpy(op, litPtr, lastLLSize);
|
1213
1321
|
op += lastLLSize;
|
1214
1322
|
}
|
1215
1323
|
}
|
@@ -1409,9 +1517,9 @@ ZSTD_decompressBlock_internal(ZSTD_DCtx* dctx,
|
|
1409
1517
|
}
|
1410
1518
|
|
1411
1519
|
|
1412
|
-
void ZSTD_checkContinuity(ZSTD_DCtx* dctx, const void* dst)
|
1520
|
+
void ZSTD_checkContinuity(ZSTD_DCtx* dctx, const void* dst, size_t dstSize)
|
1413
1521
|
{
|
1414
|
-
if (dst != dctx->previousDstEnd) { /* not contiguous */
|
1522
|
+
if (dst != dctx->previousDstEnd && dstSize > 0) { /* not contiguous */
|
1415
1523
|
dctx->dictEnd = dctx->previousDstEnd;
|
1416
1524
|
dctx->virtualStart = (const char*)dst - ((const char*)(dctx->previousDstEnd) - (const char*)(dctx->prefixStart));
|
1417
1525
|
dctx->prefixStart = dst;
|
@@ -1425,7 +1533,7 @@ size_t ZSTD_decompressBlock(ZSTD_DCtx* dctx,
|
|
1425
1533
|
const void* src, size_t srcSize)
|
1426
1534
|
{
|
1427
1535
|
size_t dSize;
|
1428
|
-
ZSTD_checkContinuity(dctx, dst);
|
1536
|
+
ZSTD_checkContinuity(dctx, dst, dstCapacity);
|
1429
1537
|
dSize = ZSTD_decompressBlock_internal(dctx, dst, dstCapacity, src, srcSize, /* frame */ 0);
|
1430
1538
|
dctx->previousDstEnd = (char*)dst + dSize;
|
1431
1539
|
return dSize;
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/*
|
2
|
-
* Copyright (c) 2016-
|
2
|
+
* Copyright (c) 2016-2021, 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
|
@@ -15,7 +15,7 @@
|
|
15
15
|
/*-*******************************************************
|
16
16
|
* Dependencies
|
17
17
|
*********************************************************/
|
18
|
-
#include
|
18
|
+
#include "../common/zstd_deps.h" /* size_t */
|
19
19
|
#include "../zstd.h" /* DCtx, and some public functions */
|
20
20
|
#include "../common/zstd_internal.h" /* blockProperties_t, and some public functions */
|
21
21
|
#include "zstd_decompress_internal.h" /* ZSTD_seqSymbol */
|
@@ -48,12 +48,15 @@ size_t ZSTD_decompressBlock_internal(ZSTD_DCtx* dctx,
|
|
48
48
|
* this function must be called with valid parameters only
|
49
49
|
* (dt is large enough, normalizedCounter distribution total is a power of 2, max is within range, etc.)
|
50
50
|
* in which case it cannot fail.
|
51
|
+
* The workspace must be 4-byte aligned and at least ZSTD_BUILD_FSE_TABLE_WKSP_SIZE bytes, which is
|
52
|
+
* defined in zstd_decompress_internal.h.
|
51
53
|
* Internal use only.
|
52
54
|
*/
|
53
55
|
void ZSTD_buildFSETable(ZSTD_seqSymbol* dt,
|
54
56
|
const short* normalizedCounter, unsigned maxSymbolValue,
|
55
57
|
const U32* baseValue, const U32* nbAdditionalBits,
|
56
|
-
unsigned tableLog
|
58
|
+
unsigned tableLog, void* wksp, size_t wkspSize,
|
59
|
+
int bmi2);
|
57
60
|
|
58
61
|
|
59
62
|
#endif /* ZSTD_DEC_BLOCK_H */
|