zstd-ruby 1.3.8.0 → 1.4.0.0

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.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +6 -5
  3. data/README.md +1 -1
  4. data/ext/zstdruby/libzstd/Makefile +7 -3
  5. data/ext/zstdruby/libzstd/README.md +4 -2
  6. data/ext/zstdruby/libzstd/common/compiler.h +1 -1
  7. data/ext/zstdruby/libzstd/common/fse.h +1 -1
  8. data/ext/zstdruby/libzstd/common/threading.c +2 -2
  9. data/ext/zstdruby/libzstd/common/xxhash.c +2 -2
  10. data/ext/zstdruby/libzstd/common/zstd_internal.h +55 -2
  11. data/ext/zstdruby/libzstd/compress/fse_compress.c +2 -2
  12. data/ext/zstdruby/libzstd/compress/zstd_compress.c +423 -296
  13. data/ext/zstdruby/libzstd/compress/zstd_compress_internal.h +14 -11
  14. data/ext/zstdruby/libzstd/compress/zstd_fast.c +203 -124
  15. data/ext/zstdruby/libzstd/compress/zstd_lazy.h +1 -1
  16. data/ext/zstdruby/libzstd/compress/zstd_ldm.c +1 -1
  17. data/ext/zstdruby/libzstd/compress/zstd_opt.c +27 -11
  18. data/ext/zstdruby/libzstd/compress/zstdmt_compress.c +41 -49
  19. data/ext/zstdruby/libzstd/compress/zstdmt_compress.h +43 -26
  20. data/ext/zstdruby/libzstd/decompress/zstd_ddict.c +4 -4
  21. data/ext/zstdruby/libzstd/decompress/zstd_decompress.c +257 -164
  22. data/ext/zstdruby/libzstd/decompress/zstd_decompress_block.c +51 -47
  23. data/ext/zstdruby/libzstd/decompress/zstd_decompress_internal.h +7 -0
  24. data/ext/zstdruby/libzstd/dictBuilder/cover.c +58 -13
  25. data/ext/zstdruby/libzstd/dictBuilder/cover.h +29 -0
  26. data/ext/zstdruby/libzstd/dictBuilder/fastcover.c +25 -13
  27. data/ext/zstdruby/libzstd/dictBuilder/zdict.h +18 -8
  28. data/ext/zstdruby/libzstd/dll/example/build_package.bat +3 -2
  29. data/ext/zstdruby/libzstd/legacy/zstd_legacy.h +42 -12
  30. data/ext/zstdruby/libzstd/legacy/zstd_v01.c +32 -7
  31. data/ext/zstdruby/libzstd/legacy/zstd_v01.h +12 -7
  32. data/ext/zstdruby/libzstd/legacy/zstd_v02.c +31 -12
  33. data/ext/zstdruby/libzstd/legacy/zstd_v02.h +12 -7
  34. data/ext/zstdruby/libzstd/legacy/zstd_v03.c +32 -12
  35. data/ext/zstdruby/libzstd/legacy/zstd_v03.h +12 -7
  36. data/ext/zstdruby/libzstd/legacy/zstd_v04.c +32 -12
  37. data/ext/zstdruby/libzstd/legacy/zstd_v04.h +12 -7
  38. data/ext/zstdruby/libzstd/legacy/zstd_v05.c +32 -7
  39. data/ext/zstdruby/libzstd/legacy/zstd_v05.h +12 -7
  40. data/ext/zstdruby/libzstd/legacy/zstd_v06.c +36 -8
  41. data/ext/zstdruby/libzstd/legacy/zstd_v06.h +10 -5
  42. data/ext/zstdruby/libzstd/legacy/zstd_v07.c +40 -9
  43. data/ext/zstdruby/libzstd/legacy/zstd_v07.h +10 -5
  44. data/ext/zstdruby/libzstd/zstd.h +689 -542
  45. data/lib/zstd-ruby/version.rb +1 -1
  46. data/zstd-ruby.gemspec +1 -1
  47. metadata +6 -7
  48. data/ext/zstdruby/libzstd/dll/libzstd.def +0 -87
@@ -35,13 +35,18 @@ ZSTDv02_decompress() : decompress ZSTD frames compliant with v0.2.x format
35
35
  size_t ZSTDv02_decompress( void* dst, size_t maxOriginalSize,
36
36
  const void* src, size_t compressedSize);
37
37
 
38
- /**
39
- ZSTDv02_getFrameSrcSize() : get the source length of a ZSTD frame compliant with v0.2.x format
40
- compressedSize : The size of the 'src' buffer, at least as large as the frame pointed to by 'src'
41
- return : the number of bytes that would be read to decompress this frame
42
- or an errorCode if it fails (which can be tested using ZSTDv02_isError())
43
- */
44
- size_t ZSTDv02_findFrameCompressedSize(const void* src, size_t compressedSize);
38
+ /**
39
+ ZSTDv02_findFrameSizeInfoLegacy() : get the source length and decompressed bound of a ZSTD frame compliant with v0.2.x format
40
+ srcSize : The size of the 'src' buffer, at least as large as the frame pointed to by 'src'
41
+ cSize (output parameter) : the number of bytes that would be read to decompress this frame
42
+ or an error code if it fails (which can be tested using ZSTDv01_isError())
43
+ dBound (output parameter) : an upper-bound for the decompressed size of the data in the frame
44
+ or ZSTD_CONTENTSIZE_ERROR if an error occurs
45
+
46
+ note : assumes `cSize` and `dBound` are _not_ NULL.
47
+ */
48
+ void ZSTDv02_findFrameSizeInfoLegacy(const void *src, size_t srcSize,
49
+ size_t* cSize, unsigned long long* dBound);
45
50
 
46
51
  /**
47
52
  ZSTDv02_isError() : tells if the result of ZSTDv02_decompress() is an error
@@ -2369,6 +2369,8 @@ static size_t HUF_decompress (void* dst, size_t dstSize, const void* cSrc, size_
2369
2369
  #define LITERAL_NOENTROPY 63
2370
2370
  #define COMMAND_NOENTROPY 7 /* to remove */
2371
2371
 
2372
+ #define ZSTD_CONTENTSIZE_ERROR (0ULL - 2)
2373
+
2372
2374
  static const size_t ZSTD_blockHeaderSize = 3;
2373
2375
  static const size_t ZSTD_frameHeaderSize = 4;
2374
2376
 
@@ -2737,7 +2739,7 @@ static size_t ZSTD_execSequence(BYTE* op,
2737
2739
  BYTE* const base, BYTE* const oend)
2738
2740
  {
2739
2741
  static const int dec32table[] = {0, 1, 2, 1, 4, 4, 4, 4}; /* added */
2740
- static const int dec64table[] = {8, 8, 8, 7, 8, 9,10,11}; /* substracted */
2742
+ static const int dec64table[] = {8, 8, 8, 7, 8, 9,10,11}; /* subtracted */
2741
2743
  const BYTE* const ostart = op;
2742
2744
  BYTE* const oLitEnd = op + sequence.litLength;
2743
2745
  BYTE* const oMatchEnd = op + sequence.litLength + sequence.matchLength; /* risk : address space overflow (32-bits) */
@@ -2953,36 +2955,59 @@ static size_t ZSTD_decompress(void* dst, size_t maxDstSize, const void* src, siz
2953
2955
  return ZSTD_decompressDCtx(&ctx, dst, maxDstSize, src, srcSize);
2954
2956
  }
2955
2957
 
2956
- static size_t ZSTD_findFrameCompressedSize(const void* src, size_t srcSize)
2958
+ /* ZSTD_errorFrameSizeInfoLegacy() :
2959
+ assumes `cSize` and `dBound` are _not_ NULL */
2960
+ MEM_STATIC void ZSTD_errorFrameSizeInfoLegacy(size_t* cSize, unsigned long long* dBound, size_t ret)
2961
+ {
2962
+ *cSize = ret;
2963
+ *dBound = ZSTD_CONTENTSIZE_ERROR;
2964
+ }
2965
+
2966
+ void ZSTDv03_findFrameSizeInfoLegacy(const void *src, size_t srcSize, size_t* cSize, unsigned long long* dBound)
2957
2967
  {
2958
2968
  const BYTE* ip = (const BYTE*)src;
2959
2969
  size_t remainingSize = srcSize;
2970
+ size_t nbBlocks = 0;
2960
2971
  U32 magicNumber;
2961
2972
  blockProperties_t blockProperties;
2962
2973
 
2963
2974
  /* Frame Header */
2964
- if (srcSize < ZSTD_frameHeaderSize+ZSTD_blockHeaderSize) return ERROR(srcSize_wrong);
2975
+ if (srcSize < ZSTD_frameHeaderSize+ZSTD_blockHeaderSize) {
2976
+ ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(srcSize_wrong));
2977
+ return;
2978
+ }
2965
2979
  magicNumber = MEM_readLE32(src);
2966
- if (magicNumber != ZSTD_magicNumber) return ERROR(prefix_unknown);
2980
+ if (magicNumber != ZSTD_magicNumber) {
2981
+ ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(prefix_unknown));
2982
+ return;
2983
+ }
2967
2984
  ip += ZSTD_frameHeaderSize; remainingSize -= ZSTD_frameHeaderSize;
2968
2985
 
2969
2986
  /* Loop on each block */
2970
2987
  while (1)
2971
2988
  {
2972
2989
  size_t cBlockSize = ZSTD_getcBlockSize(ip, remainingSize, &blockProperties);
2973
- if (ZSTD_isError(cBlockSize)) return cBlockSize;
2990
+ if (ZSTD_isError(cBlockSize)) {
2991
+ ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, cBlockSize);
2992
+ return;
2993
+ }
2974
2994
 
2975
2995
  ip += ZSTD_blockHeaderSize;
2976
2996
  remainingSize -= ZSTD_blockHeaderSize;
2977
- if (cBlockSize > remainingSize) return ERROR(srcSize_wrong);
2997
+ if (cBlockSize > remainingSize) {
2998
+ ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(srcSize_wrong));
2999
+ return;
3000
+ }
2978
3001
 
2979
3002
  if (cBlockSize == 0) break; /* bt_end */
2980
3003
 
2981
3004
  ip += cBlockSize;
2982
3005
  remainingSize -= cBlockSize;
3006
+ nbBlocks++;
2983
3007
  }
2984
3008
 
2985
- return ip - (const BYTE*)src;
3009
+ *cSize = ip - (const BYTE*)src;
3010
+ *dBound = nbBlocks * BLOCKSIZE;
2986
3011
  }
2987
3012
 
2988
3013
 
@@ -3099,11 +3124,6 @@ size_t ZSTDv03_decompress( void* dst, size_t maxOriginalSize,
3099
3124
  return ZSTD_decompress(dst, maxOriginalSize, src, compressedSize);
3100
3125
  }
3101
3126
 
3102
- size_t ZSTDv03_findFrameCompressedSize(const void* src, size_t srcSize)
3103
- {
3104
- return ZSTD_findFrameCompressedSize(src, srcSize);
3105
- }
3106
-
3107
3127
  ZSTDv03_Dctx* ZSTDv03_createDCtx(void)
3108
3128
  {
3109
3129
  return (ZSTDv03_Dctx*)ZSTD_createDCtx();
@@ -35,13 +35,18 @@ ZSTDv03_decompress() : decompress ZSTD frames compliant with v0.3.x format
35
35
  size_t ZSTDv03_decompress( void* dst, size_t maxOriginalSize,
36
36
  const void* src, size_t compressedSize);
37
37
 
38
- /**
39
- ZSTDv03_getFrameSrcSize() : get the source length of a ZSTD frame compliant with v0.3.x format
40
- compressedSize : The size of the 'src' buffer, at least as large as the frame pointed to by 'src'
41
- return : the number of bytes that would be read to decompress this frame
42
- or an errorCode if it fails (which can be tested using ZSTDv03_isError())
43
- */
44
- size_t ZSTDv03_findFrameCompressedSize(const void* src, size_t compressedSize);
38
+ /**
39
+ ZSTDv03_findFrameSizeInfoLegacy() : get the source length and decompressed bound of a ZSTD frame compliant with v0.3.x format
40
+ srcSize : The size of the 'src' buffer, at least as large as the frame pointed to by 'src'
41
+ cSize (output parameter) : the number of bytes that would be read to decompress this frame
42
+ or an error code if it fails (which can be tested using ZSTDv01_isError())
43
+ dBound (output parameter) : an upper-bound for the decompressed size of the data in the frame
44
+ or ZSTD_CONTENTSIZE_ERROR if an error occurs
45
+
46
+ note : assumes `cSize` and `dBound` are _not_ NULL.
47
+ */
48
+ void ZSTDv03_findFrameSizeInfoLegacy(const void *src, size_t srcSize,
49
+ size_t* cSize, unsigned long long* dBound);
45
50
 
46
51
  /**
47
52
  ZSTDv03_isError() : tells if the result of ZSTDv03_decompress() is an error
@@ -373,6 +373,8 @@ static const size_t ZSTD_frameHeaderSize_min = 5;
373
373
  #define MIN_SEQUENCES_SIZE (2 /*seqNb*/ + 2 /*dumps*/ + 3 /*seqTables*/ + 1 /*bitStream*/)
374
374
  #define MIN_CBLOCK_SIZE (3 /*litCSize*/ + MIN_SEQUENCES_SIZE)
375
375
 
376
+ #define ZSTD_CONTENTSIZE_ERROR (0ULL - 2)
377
+
376
378
  typedef enum { bt_compressed, bt_raw, bt_rle, bt_end } blockType_t;
377
379
 
378
380
 
@@ -2860,7 +2862,7 @@ static size_t ZSTD_execSequence(BYTE* op,
2860
2862
  const BYTE* const base, const BYTE* const vBase, const BYTE* const dictEnd)
2861
2863
  {
2862
2864
  static const int dec32table[] = { 0, 1, 2, 1, 4, 4, 4, 4 }; /* added */
2863
- static const int dec64table[] = { 8, 8, 8, 7, 8, 9,10,11 }; /* substracted */
2865
+ static const int dec64table[] = { 8, 8, 8, 7, 8, 9,10,11 }; /* subtracted */
2864
2866
  BYTE* const oLitEnd = op + sequence.litLength;
2865
2867
  const size_t sequenceLength = sequence.litLength + sequence.matchLength;
2866
2868
  BYTE* const oMatchEnd = op + sequenceLength; /* risk : address space overflow (32-bits) */
@@ -3119,34 +3121,57 @@ static size_t ZSTD_decompress_usingDict(ZSTD_DCtx* ctx,
3119
3121
  return op-ostart;
3120
3122
  }
3121
3123
 
3122
- static size_t ZSTD_findFrameCompressedSize(const void* src, size_t srcSize)
3124
+ /* ZSTD_errorFrameSizeInfoLegacy() :
3125
+ assumes `cSize` and `dBound` are _not_ NULL */
3126
+ static void ZSTD_errorFrameSizeInfoLegacy(size_t* cSize, unsigned long long* dBound, size_t ret)
3127
+ {
3128
+ *cSize = ret;
3129
+ *dBound = ZSTD_CONTENTSIZE_ERROR;
3130
+ }
3131
+
3132
+ void ZSTDv04_findFrameSizeInfoLegacy(const void *src, size_t srcSize, size_t* cSize, unsigned long long* dBound)
3123
3133
  {
3124
3134
  const BYTE* ip = (const BYTE*)src;
3125
3135
  size_t remainingSize = srcSize;
3136
+ size_t nbBlocks = 0;
3126
3137
  blockProperties_t blockProperties;
3127
3138
 
3128
3139
  /* Frame Header */
3129
- if (srcSize < ZSTD_frameHeaderSize_min) return ERROR(srcSize_wrong);
3130
- if (MEM_readLE32(src) != ZSTD_MAGICNUMBER) return ERROR(prefix_unknown);
3140
+ if (srcSize < ZSTD_frameHeaderSize_min) {
3141
+ ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(srcSize_wrong));
3142
+ return;
3143
+ }
3144
+ if (MEM_readLE32(src) != ZSTD_MAGICNUMBER) {
3145
+ ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(prefix_unknown));
3146
+ return;
3147
+ }
3131
3148
  ip += ZSTD_frameHeaderSize_min; remainingSize -= ZSTD_frameHeaderSize_min;
3132
3149
 
3133
3150
  /* Loop on each block */
3134
3151
  while (1)
3135
3152
  {
3136
3153
  size_t cBlockSize = ZSTD_getcBlockSize(ip, remainingSize, &blockProperties);
3137
- if (ZSTD_isError(cBlockSize)) return cBlockSize;
3154
+ if (ZSTD_isError(cBlockSize)) {
3155
+ ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, cBlockSize);
3156
+ return;
3157
+ }
3138
3158
 
3139
3159
  ip += ZSTD_blockHeaderSize;
3140
3160
  remainingSize -= ZSTD_blockHeaderSize;
3141
- if (cBlockSize > remainingSize) return ERROR(srcSize_wrong);
3161
+ if (cBlockSize > remainingSize) {
3162
+ ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(srcSize_wrong));
3163
+ return;
3164
+ }
3142
3165
 
3143
3166
  if (cBlockSize == 0) break; /* bt_end */
3144
3167
 
3145
3168
  ip += cBlockSize;
3146
3169
  remainingSize -= cBlockSize;
3170
+ nbBlocks++;
3147
3171
  }
3148
3172
 
3149
- return ip - (const BYTE*)src;
3173
+ *cSize = ip - (const BYTE*)src;
3174
+ *dBound = nbBlocks * BLOCKSIZE;
3150
3175
  }
3151
3176
 
3152
3177
  /* ******************************
@@ -3578,11 +3603,6 @@ size_t ZSTDv04_decompress(void* dst, size_t maxDstSize, const void* src, size_t
3578
3603
  #endif
3579
3604
  }
3580
3605
 
3581
- size_t ZSTDv04_findFrameCompressedSize(const void* src, size_t srcSize)
3582
- {
3583
- return ZSTD_findFrameCompressedSize(src, srcSize);
3584
- }
3585
-
3586
3606
  size_t ZSTDv04_resetDCtx(ZSTDv04_Dctx* dctx) { return ZSTD_resetDCtx(dctx); }
3587
3607
 
3588
3608
  size_t ZSTDv04_nextSrcSizeToDecompress(ZSTDv04_Dctx* dctx)
@@ -35,13 +35,18 @@ ZSTDv04_decompress() : decompress ZSTD frames compliant with v0.4.x format
35
35
  size_t ZSTDv04_decompress( void* dst, size_t maxOriginalSize,
36
36
  const void* src, size_t compressedSize);
37
37
 
38
- /**
39
- ZSTDv04_getFrameSrcSize() : get the source length of a ZSTD frame compliant with v0.4.x format
40
- compressedSize : The size of the 'src' buffer, at least as large as the frame pointed to by 'src'
41
- return : the number of bytes that would be read to decompress this frame
42
- or an errorCode if it fails (which can be tested using ZSTDv04_isError())
43
- */
44
- size_t ZSTDv04_findFrameCompressedSize(const void* src, size_t compressedSize);
38
+ /**
39
+ ZSTDv04_findFrameSizeInfoLegacy() : get the source length and decompressed bound of a ZSTD frame compliant with v0.4.x format
40
+ srcSize : The size of the 'src' buffer, at least as large as the frame pointed to by 'src'
41
+ cSize (output parameter) : the number of bytes that would be read to decompress this frame
42
+ or an error code if it fails (which can be tested using ZSTDv01_isError())
43
+ dBound (output parameter) : an upper-bound for the decompressed size of the data in the frame
44
+ or ZSTD_CONTENTSIZE_ERROR if an error occurs
45
+
46
+ note : assumes `cSize` and `dBound` are _not_ NULL.
47
+ */
48
+ void ZSTDv04_findFrameSizeInfoLegacy(const void *src, size_t srcSize,
49
+ size_t* cSize, unsigned long long* dBound);
45
50
 
46
51
  /**
47
52
  ZSTDv04_isError() : tells if the result of ZSTDv04_decompress() is an error
@@ -491,6 +491,8 @@ static const size_t ZSTDv05_frameHeaderSize_min = 5;
491
491
 
492
492
  #define WILDCOPY_OVERLENGTH 8
493
493
 
494
+ #define ZSTD_CONTENTSIZE_ERROR (0ULL - 2)
495
+
494
496
  typedef enum { bt_compressed, bt_raw, bt_rle, bt_end } blockType_t;
495
497
 
496
498
 
@@ -3217,7 +3219,7 @@ static size_t ZSTDv05_execSequence(BYTE* op,
3217
3219
  const BYTE* const base, const BYTE* const vBase, const BYTE* const dictEnd)
3218
3220
  {
3219
3221
  static const int dec32table[] = { 0, 1, 2, 1, 4, 4, 4, 4 }; /* added */
3220
- static const int dec64table[] = { 8, 8, 8, 7, 8, 9,10,11 }; /* substracted */
3222
+ static const int dec64table[] = { 8, 8, 8, 7, 8, 9,10,11 }; /* subtracted */
3221
3223
  BYTE* const oLitEnd = op + sequence.litLength;
3222
3224
  const size_t sequenceLength = sequence.litLength + sequence.matchLength;
3223
3225
  BYTE* const oMatchEnd = op + sequenceLength; /* risk : address space overflow (32-bits) */
@@ -3508,34 +3510,57 @@ size_t ZSTDv05_decompress(void* dst, size_t maxDstSize, const void* src, size_t
3508
3510
  #endif
3509
3511
  }
3510
3512
 
3511
- size_t ZSTDv05_findFrameCompressedSize(const void *src, size_t srcSize)
3513
+ /* ZSTD_errorFrameSizeInfoLegacy() :
3514
+ assumes `cSize` and `dBound` are _not_ NULL */
3515
+ static void ZSTD_errorFrameSizeInfoLegacy(size_t* cSize, unsigned long long* dBound, size_t ret)
3516
+ {
3517
+ *cSize = ret;
3518
+ *dBound = ZSTD_CONTENTSIZE_ERROR;
3519
+ }
3520
+
3521
+ void ZSTDv05_findFrameSizeInfoLegacy(const void *src, size_t srcSize, size_t* cSize, unsigned long long* dBound)
3512
3522
  {
3513
3523
  const BYTE* ip = (const BYTE*)src;
3514
3524
  size_t remainingSize = srcSize;
3525
+ size_t nbBlocks = 0;
3515
3526
  blockProperties_t blockProperties;
3516
3527
 
3517
3528
  /* Frame Header */
3518
- if (srcSize < ZSTDv05_frameHeaderSize_min) return ERROR(srcSize_wrong);
3519
- if (MEM_readLE32(src) != ZSTDv05_MAGICNUMBER) return ERROR(prefix_unknown);
3529
+ if (srcSize < ZSTDv05_frameHeaderSize_min) {
3530
+ ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(srcSize_wrong));
3531
+ return;
3532
+ }
3533
+ if (MEM_readLE32(src) != ZSTDv05_MAGICNUMBER) {
3534
+ ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(prefix_unknown));
3535
+ return;
3536
+ }
3520
3537
  ip += ZSTDv05_frameHeaderSize_min; remainingSize -= ZSTDv05_frameHeaderSize_min;
3521
3538
 
3522
3539
  /* Loop on each block */
3523
3540
  while (1)
3524
3541
  {
3525
3542
  size_t cBlockSize = ZSTDv05_getcBlockSize(ip, remainingSize, &blockProperties);
3526
- if (ZSTDv05_isError(cBlockSize)) return cBlockSize;
3543
+ if (ZSTDv05_isError(cBlockSize)) {
3544
+ ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, cBlockSize);
3545
+ return;
3546
+ }
3527
3547
 
3528
3548
  ip += ZSTDv05_blockHeaderSize;
3529
3549
  remainingSize -= ZSTDv05_blockHeaderSize;
3530
- if (cBlockSize > remainingSize) return ERROR(srcSize_wrong);
3550
+ if (cBlockSize > remainingSize) {
3551
+ ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(srcSize_wrong));
3552
+ return;
3553
+ }
3531
3554
 
3532
3555
  if (cBlockSize == 0) break; /* bt_end */
3533
3556
 
3534
3557
  ip += cBlockSize;
3535
3558
  remainingSize -= cBlockSize;
3559
+ nbBlocks++;
3536
3560
  }
3537
3561
 
3538
- return ip - (const BYTE*)src;
3562
+ *cSize = ip - (const BYTE*)src;
3563
+ *dBound = nbBlocks * BLOCKSIZE;
3539
3564
  }
3540
3565
 
3541
3566
  /* ******************************
@@ -33,13 +33,18 @@ extern "C" {
33
33
  size_t ZSTDv05_decompress( void* dst, size_t dstCapacity,
34
34
  const void* src, size_t compressedSize);
35
35
 
36
- /**
37
- ZSTDv05_getFrameSrcSize() : get the source length of a ZSTD frame
38
- compressedSize : The size of the 'src' buffer, at least as large as the frame pointed to by 'src'
39
- return : the number of bytes that would be read to decompress this frame
40
- or an errorCode if it fails (which can be tested using ZSTDv05_isError())
41
- */
42
- size_t ZSTDv05_findFrameCompressedSize(const void* src, size_t compressedSize);
36
+ /**
37
+ ZSTDv05_findFrameSizeInfoLegacy() : get the source length and decompressed bound of a ZSTD frame compliant with v0.5.x format
38
+ srcSize : The size of the 'src' buffer, at least as large as the frame pointed to by 'src'
39
+ cSize (output parameter) : the number of bytes that would be read to decompress this frame
40
+ or an error code if it fails (which can be tested using ZSTDv01_isError())
41
+ dBound (output parameter) : an upper-bound for the decompressed size of the data in the frame
42
+ or ZSTD_CONTENTSIZE_ERROR if an error occurs
43
+
44
+ note : assumes `cSize` and `dBound` are _not_ NULL.
45
+ */
46
+ void ZSTDv05_findFrameSizeInfoLegacy(const void *src, size_t srcSize,
47
+ size_t* cSize, unsigned long long* dBound);
43
48
 
44
49
  /* *************************************
45
50
  * Helper functions
@@ -506,6 +506,8 @@ typedef enum { bt_compressed, bt_raw, bt_rle, bt_end } blockType_t;
506
506
  #define FSEv06_ENCODING_STATIC 2
507
507
  #define FSEv06_ENCODING_DYNAMIC 3
508
508
 
509
+ #define ZSTD_CONTENTSIZE_ERROR (0ULL - 2)
510
+
509
511
  static const U32 LL_bits[MaxLL+1] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
510
512
  1, 1, 1, 1, 2, 2, 3, 3, 4, 6, 7, 8, 9,10,11,12,
511
513
  13,14,15,16 };
@@ -3406,7 +3408,7 @@ static size_t ZSTDv06_execSequence(BYTE* op,
3406
3408
  if (sequence.offset < 8) {
3407
3409
  /* close range match, overlap */
3408
3410
  static const U32 dec32table[] = { 0, 1, 2, 1, 4, 4, 4, 4 }; /* added */
3409
- static const int dec64table[] = { 8, 8, 8, 7, 8, 9,10,11 }; /* substracted */
3411
+ static const int dec64table[] = { 8, 8, 8, 7, 8, 9,10,11 }; /* subtracted */
3410
3412
  int const sub2 = dec64table[sequence.offset];
3411
3413
  op[0] = match[0];
3412
3414
  op[1] = match[1];
@@ -3654,36 +3656,62 @@ size_t ZSTDv06_decompress(void* dst, size_t dstCapacity, const void* src, size_t
3654
3656
  #endif
3655
3657
  }
3656
3658
 
3657
- size_t ZSTDv06_findFrameCompressedSize(const void* src, size_t srcSize)
3659
+ /* ZSTD_errorFrameSizeInfoLegacy() :
3660
+ assumes `cSize` and `dBound` are _not_ NULL */
3661
+ static void ZSTD_errorFrameSizeInfoLegacy(size_t* cSize, unsigned long long* dBound, size_t ret)
3662
+ {
3663
+ *cSize = ret;
3664
+ *dBound = ZSTD_CONTENTSIZE_ERROR;
3665
+ }
3666
+
3667
+ void ZSTDv06_findFrameSizeInfoLegacy(const void *src, size_t srcSize, size_t* cSize, unsigned long long* dBound)
3658
3668
  {
3659
3669
  const BYTE* ip = (const BYTE*)src;
3660
3670
  size_t remainingSize = srcSize;
3671
+ size_t nbBlocks = 0;
3661
3672
  blockProperties_t blockProperties = { bt_compressed, 0 };
3662
3673
 
3663
3674
  /* Frame Header */
3664
3675
  { size_t const frameHeaderSize = ZSTDv06_frameHeaderSize(src, ZSTDv06_frameHeaderSize_min);
3665
- if (ZSTDv06_isError(frameHeaderSize)) return frameHeaderSize;
3666
- if (MEM_readLE32(src) != ZSTDv06_MAGICNUMBER) return ERROR(prefix_unknown);
3667
- if (srcSize < frameHeaderSize+ZSTDv06_blockHeaderSize) return ERROR(srcSize_wrong);
3676
+ if (ZSTDv06_isError(frameHeaderSize)) {
3677
+ ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, frameHeaderSize);
3678
+ return;
3679
+ }
3680
+ if (MEM_readLE32(src) != ZSTDv06_MAGICNUMBER) {
3681
+ ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(prefix_unknown));
3682
+ return;
3683
+ }
3684
+ if (srcSize < frameHeaderSize+ZSTDv06_blockHeaderSize) {
3685
+ ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(srcSize_wrong));
3686
+ return;
3687
+ }
3668
3688
  ip += frameHeaderSize; remainingSize -= frameHeaderSize;
3669
3689
  }
3670
3690
 
3671
3691
  /* Loop on each block */
3672
3692
  while (1) {
3673
3693
  size_t const cBlockSize = ZSTDv06_getcBlockSize(ip, remainingSize, &blockProperties);
3674
- if (ZSTDv06_isError(cBlockSize)) return cBlockSize;
3694
+ if (ZSTDv06_isError(cBlockSize)) {
3695
+ ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, cBlockSize);
3696
+ return;
3697
+ }
3675
3698
 
3676
3699
  ip += ZSTDv06_blockHeaderSize;
3677
3700
  remainingSize -= ZSTDv06_blockHeaderSize;
3678
- if (cBlockSize > remainingSize) return ERROR(srcSize_wrong);
3701
+ if (cBlockSize > remainingSize) {
3702
+ ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(srcSize_wrong));
3703
+ return;
3704
+ }
3679
3705
 
3680
3706
  if (cBlockSize == 0) break; /* bt_end */
3681
3707
 
3682
3708
  ip += cBlockSize;
3683
3709
  remainingSize -= cBlockSize;
3710
+ nbBlocks++;
3684
3711
  }
3685
3712
 
3686
- return ip - (const BYTE*)src;
3713
+ *cSize = ip - (const BYTE*)src;
3714
+ *dBound = nbBlocks * ZSTDv06_BLOCKSIZE_MAX;
3687
3715
  }
3688
3716
 
3689
3717
  /*_******************************