extlz4 0.3.3 → 0.3.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/Rakefile +22 -0
  4. data/contrib/lz4/LICENSE +2 -1
  5. data/contrib/lz4/Makefile.inc +39 -15
  6. data/contrib/lz4/NEWS +21 -0
  7. data/contrib/lz4/README.md +1 -1
  8. data/contrib/lz4/build/VS2010/liblz4-dll/liblz4-dll.rc +1 -1
  9. data/contrib/lz4/build/VS2010/lz4/lz4.rc +1 -1
  10. data/contrib/lz4/build/VS2017/liblz4-dll/liblz4-dll.rc +1 -1
  11. data/contrib/lz4/build/VS2017/lz4/lz4.rc +1 -1
  12. data/contrib/lz4/build/VS2017/lz4/lz4.vcxproj +12 -1
  13. data/contrib/lz4/build/VS2022/datagen/datagen.vcxproj +173 -0
  14. data/contrib/lz4/build/VS2022/frametest/frametest.vcxproj +180 -0
  15. data/contrib/lz4/build/VS2022/fullbench/fullbench.vcxproj +180 -0
  16. data/contrib/lz4/build/VS2022/fullbench-dll/fullbench-dll.vcxproj +184 -0
  17. data/contrib/lz4/build/VS2022/fuzzer/fuzzer.vcxproj +177 -0
  18. data/contrib/lz4/build/VS2022/liblz4/liblz4.vcxproj +179 -0
  19. data/contrib/lz4/build/VS2022/liblz4-dll/liblz4-dll.rc +51 -0
  20. data/contrib/lz4/build/VS2022/liblz4-dll/liblz4-dll.vcxproj +183 -0
  21. data/contrib/lz4/build/VS2022/lz4.sln +103 -0
  22. data/contrib/lz4/build/cmake/CMakeLists.txt +49 -11
  23. data/contrib/lz4/build/cmake/lz4Config.cmake.in +2 -0
  24. data/contrib/lz4/lib/LICENSE +1 -1
  25. data/contrib/lz4/lib/README.md +45 -13
  26. data/contrib/lz4/lib/liblz4-dll.rc.in +1 -1
  27. data/contrib/lz4/lib/liblz4.pc.in +3 -3
  28. data/contrib/lz4/lib/lz4.c +422 -195
  29. data/contrib/lz4/lib/lz4.h +114 -46
  30. data/contrib/lz4/lib/lz4file.c +311 -0
  31. data/contrib/lz4/lib/lz4file.h +93 -0
  32. data/contrib/lz4/lib/lz4frame.c +421 -242
  33. data/contrib/lz4/lib/lz4frame.h +122 -53
  34. data/contrib/lz4/lib/lz4frame_static.h +1 -1
  35. data/contrib/lz4/lib/lz4hc.c +127 -111
  36. data/contrib/lz4/lib/lz4hc.h +14 -14
  37. data/contrib/lz4/ossfuzz/Makefile +1 -0
  38. data/contrib/lz4/ossfuzz/decompress_fuzzer.c +18 -2
  39. data/contrib/lz4/ossfuzz/fuzz_helpers.h +3 -2
  40. data/contrib/lz4/ossfuzz/round_trip_frame_uncompressed_fuzzer.c +134 -0
  41. data/contrib/lz4/ossfuzz/round_trip_fuzzer.c +66 -6
  42. data/ext/blockapi.c +8 -8
  43. data/ext/extlz4.h +12 -0
  44. data/ext/frameapi.c +3 -3
  45. data/ext/hashargs.c +7 -1
  46. metadata +16 -5
  47. data/contrib/lz4/tmp +0 -0
  48. data/contrib/lz4/tmpsparse +0 -0
@@ -39,7 +39,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
39
39
  /* No dictionary. */
40
40
  LZ4_decompress_safe_usingDict((char const*)data, dst, size,
41
41
  dstCapacity, NULL, 0);
42
- /* Small external dictonary. */
42
+ /* Small external dictionary. */
43
43
  LZ4_decompress_safe_usingDict((char const*)data, dst, size,
44
44
  dstCapacity, smallDict, smallDictSize);
45
45
  /* Large external dictionary. */
@@ -49,11 +49,27 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
49
49
  LZ4_decompress_safe_usingDict((char const*)dataAfterDict, dst, size,
50
50
  dstCapacity, smallDict, smallDictSize);
51
51
  /* Large prefix. */
52
- LZ4_decompress_safe_usingDict((char const*)data, dst, size,
52
+ LZ4_decompress_safe_usingDict((char const*)dataAfterDict, dst, size,
53
53
  dstCapacity, largeDict, largeDictSize);
54
54
  /* Partial decompression. */
55
55
  LZ4_decompress_safe_partial((char const*)data, dst, size,
56
56
  dstCapacity, dstCapacity);
57
+ /* Partial decompression using each possible dictionary configuration. */
58
+ /* Partial decompression with no dictionary. */
59
+ LZ4_decompress_safe_partial_usingDict((char const*)data, dst, size,
60
+ dstCapacity, dstCapacity, NULL, 0);
61
+ /* Partial decompression with small external dictionary. */
62
+ LZ4_decompress_safe_partial_usingDict((char const*)data, dst, size,
63
+ dstCapacity, dstCapacity, smallDict, smallDictSize);
64
+ /* Partial decompression with large external dictionary. */
65
+ LZ4_decompress_safe_partial_usingDict((char const*)data, dst, size,
66
+ dstCapacity, dstCapacity, largeDict, largeDictSize);
67
+ /* Partial decompression with small prefix. */
68
+ LZ4_decompress_safe_partial_usingDict((char const*)dataAfterDict, dst, size,
69
+ dstCapacity, dstCapacity, smallDict, smallDictSize);
70
+ /* Partial decompression wtih large prefix. */
71
+ LZ4_decompress_safe_partial_usingDict((char const*)dataAfterDict, dst, size,
72
+ dstCapacity, dstCapacity, largeDict, largeDictSize);
57
73
  free(dst);
58
74
  free(dict);
59
75
  FUZZ_dataProducer_free(producer);
@@ -4,7 +4,8 @@
4
4
  *
5
5
  * This source code is licensed under both the BSD-style license (found in the
6
6
  * LICENSE file in the root directory of this source tree) and the GPLv2 (found
7
- * in the COPYING file in the root directory of this source tree).
7
+ * in the COPYING file in the root directory of this source tree),
8
+ * meaning you may select, at your option, one of the above-listed licenses.
8
9
  */
9
10
 
10
11
  /**
@@ -81,7 +82,7 @@ FUZZ_STATIC uint32_t FUZZ_rand(uint32_t *state) {
81
82
  return rand32 >> 5;
82
83
  }
83
84
 
84
- /* Returns a random numer in the range [min, max]. */
85
+ /* Returns a random number in the range [min, max]. */
85
86
  FUZZ_STATIC uint32_t FUZZ_rand32(uint32_t *state, uint32_t min, uint32_t max) {
86
87
  uint32_t random = FUZZ_rand(state);
87
88
  return min + (random % (max - min + 1));
@@ -0,0 +1,134 @@
1
+ /**
2
+ * This fuzz target performs a lz4 round-trip test (compress & decompress),
3
+ * compares the result with the original, and calls abort() on corruption.
4
+ */
5
+
6
+ #include <stddef.h>
7
+ #include <stdint.h>
8
+ #include <stdlib.h>
9
+ #include <string.h>
10
+
11
+ #include "fuzz_data_producer.h"
12
+ #include "fuzz_helpers.h"
13
+ #include "lz4.h"
14
+ #include "lz4_helpers.h"
15
+ #include "lz4frame.h"
16
+ #include "lz4frame_static.h"
17
+
18
+ static void decompress(LZ4F_dctx *dctx, void *src, void *dst,
19
+ size_t dstCapacity, size_t readSize) {
20
+ size_t ret = 1;
21
+ const void *srcPtr = (const char *) src;
22
+ void *dstPtr = (char *) dst;
23
+ const void *const srcEnd = (const char *) srcPtr + readSize;
24
+
25
+ while (ret != 0) {
26
+ while (srcPtr < srcEnd && ret != 0) {
27
+ /* Any data within dst has been flushed at this stage */
28
+ size_t dstSize = dstCapacity;
29
+ size_t srcSize = (const char *) srcEnd - (const char *) srcPtr;
30
+ ret = LZ4F_decompress(dctx, dstPtr, &dstSize, srcPtr, &srcSize,
31
+ /* LZ4F_decompressOptions_t */ NULL);
32
+ FUZZ_ASSERT(!LZ4F_isError(ret));
33
+
34
+ /* Update input */
35
+ srcPtr = (const char *) srcPtr + srcSize;
36
+ dstPtr = (char *) dstPtr + dstSize;
37
+ }
38
+
39
+ FUZZ_ASSERT(srcPtr <= srcEnd);
40
+ }
41
+ }
42
+
43
+ static void compress_round_trip(const uint8_t *data, size_t size,
44
+ FUZZ_dataProducer_t *producer, LZ4F_preferences_t const prefs) {
45
+
46
+ // Choose random uncompressed offset start and end by producing seeds from random data, calculate the remaining
47
+ // data size that will be used for compression later and use the seeds to actually calculate the offsets
48
+ size_t const uncompressedOffsetSeed = FUZZ_dataProducer_retrieve32(producer);
49
+ size_t const uncompressedEndOffsetSeed = FUZZ_dataProducer_retrieve32(producer);
50
+ size = FUZZ_dataProducer_remainingBytes(producer);
51
+
52
+ size_t const uncompressedOffset = FUZZ_getRange_from_uint32(uncompressedOffsetSeed, 0, size);
53
+ size_t const uncompressedEndOffset = FUZZ_getRange_from_uint32(uncompressedEndOffsetSeed, uncompressedOffset, size);
54
+ size_t const uncompressedSize = uncompressedEndOffset - uncompressedOffset;
55
+ FUZZ_ASSERT(uncompressedOffset <= uncompressedEndOffset);
56
+ FUZZ_ASSERT(uncompressedEndOffset <= size);
57
+
58
+ const uint8_t *const uncompressedData = data + uncompressedOffset;
59
+
60
+ size_t const dstCapacity =
61
+ LZ4F_compressFrameBound(LZ4_compressBound(size), &prefs) +
62
+ uncompressedSize;
63
+ char *const dst = (char *) malloc(dstCapacity);
64
+ size_t rtCapacity = dstCapacity;
65
+ char *const rt = (char *) malloc(rtCapacity);
66
+
67
+ FUZZ_ASSERT(dst);
68
+ FUZZ_ASSERT(rt);
69
+
70
+ /* Compression must succeed and round trip correctly. */
71
+ LZ4F_compressionContext_t ctx;
72
+ size_t const ctxCreation = LZ4F_createCompressionContext(&ctx, LZ4F_VERSION);
73
+ FUZZ_ASSERT(!LZ4F_isError(ctxCreation));
74
+
75
+ size_t const headerSize = LZ4F_compressBegin(ctx, dst, dstCapacity, &prefs);
76
+ FUZZ_ASSERT(!LZ4F_isError(headerSize));
77
+ size_t compressedSize = headerSize;
78
+
79
+ /* Compress data before uncompressed offset */
80
+ size_t lz4Return = LZ4F_compressUpdate(ctx, dst + compressedSize, dstCapacity,
81
+ data, uncompressedOffset, NULL);
82
+ FUZZ_ASSERT(!LZ4F_isError(lz4Return));
83
+ compressedSize += lz4Return;
84
+
85
+ /* Add uncompressed data */
86
+ lz4Return = LZ4F_uncompressedUpdate(ctx, dst + compressedSize, dstCapacity,
87
+ uncompressedData, uncompressedSize, NULL);
88
+ FUZZ_ASSERT(!LZ4F_isError(lz4Return));
89
+ compressedSize += lz4Return;
90
+
91
+ /* Compress data after uncompressed offset */
92
+ lz4Return = LZ4F_compressUpdate(ctx, dst + compressedSize, dstCapacity,
93
+ data + uncompressedEndOffset,
94
+ size - uncompressedEndOffset, NULL);
95
+ FUZZ_ASSERT(!LZ4F_isError(lz4Return));
96
+ compressedSize += lz4Return;
97
+
98
+ /* Finish compression */
99
+ lz4Return = LZ4F_compressEnd(ctx, dst + compressedSize, dstCapacity, NULL);
100
+ FUZZ_ASSERT(!LZ4F_isError(lz4Return));
101
+ compressedSize += lz4Return;
102
+
103
+ LZ4F_decompressOptions_t opts;
104
+ memset(&opts, 0, sizeof(opts));
105
+ opts.stableDst = 1;
106
+ LZ4F_dctx *dctx;
107
+ LZ4F_createDecompressionContext(&dctx, LZ4F_VERSION);
108
+ FUZZ_ASSERT(dctx);
109
+
110
+ decompress(dctx, dst, rt, rtCapacity, compressedSize);
111
+
112
+ LZ4F_freeDecompressionContext(dctx);
113
+
114
+ FUZZ_ASSERT_MSG(!memcmp(data, rt, size), "Corruption!");
115
+
116
+ free(dst);
117
+ free(rt);
118
+
119
+ FUZZ_dataProducer_free(producer);
120
+ LZ4F_freeCompressionContext(ctx);
121
+ }
122
+
123
+ static void compress_independent_block_mode(const uint8_t *data, size_t size) {
124
+ FUZZ_dataProducer_t *producer = FUZZ_dataProducer_create(data, size);
125
+ LZ4F_preferences_t prefs = FUZZ_dataProducer_preferences(producer);
126
+ prefs.frameInfo.blockMode = LZ4F_blockIndependent;
127
+ compress_round_trip(data, size, producer, prefs);
128
+ }
129
+
130
+
131
+ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
132
+ compress_independent_block_mode(data, size);
133
+ return 0;
134
+ }
@@ -20,11 +20,16 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
20
20
 
21
21
  size_t const partialCapacity = FUZZ_getRange_from_uint32(partialCapacitySeed, 0, size);
22
22
  size_t const dstCapacity = LZ4_compressBound(size);
23
-
24
- char* const dst = (char*)malloc(dstCapacity);
23
+ size_t const largeSize = 64 * 1024 - 1;
24
+ size_t const smallSize = 1024;
25
+ char* const dstPlusLargePrefix = (char*)malloc(dstCapacity + largeSize);
26
+ FUZZ_ASSERT(dstPlusLargePrefix);
27
+ char* const dstPlusSmallPrefix = dstPlusLargePrefix + largeSize - smallSize;
28
+ char* const largeDict = (char*)malloc(largeSize);
29
+ FUZZ_ASSERT(largeDict);
30
+ char* const smallDict = largeDict + largeSize - smallSize;
31
+ char* const dst = dstPlusLargePrefix + largeSize;
25
32
  char* const rt = (char*)malloc(size);
26
-
27
- FUZZ_ASSERT(dst);
28
33
  FUZZ_ASSERT(rt);
29
34
 
30
35
  /* Compression must succeed and round trip correctly. */
@@ -47,9 +52,64 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
47
52
  FUZZ_ASSERT_MSG(!memcmp(data, partial, partialSize), "Corruption!");
48
53
  free(partial);
49
54
  }
55
+ /* Partial decompression using dict with no dict. */
56
+ {
57
+ char* const partial = (char*)malloc(partialCapacity);
58
+ FUZZ_ASSERT(partial);
59
+ int const partialSize = LZ4_decompress_safe_partial_usingDict(
60
+ dst, partial, dstSize, partialCapacity, partialCapacity, NULL, 0);
61
+ FUZZ_ASSERT(partialSize >= 0);
62
+ FUZZ_ASSERT_MSG(partialSize == partialCapacity, "Incorrect size");
63
+ FUZZ_ASSERT_MSG(!memcmp(data, partial, partialSize), "Corruption!");
64
+ free(partial);
65
+ }
66
+ /* Partial decompression using dict with small prefix as dict */
67
+ {
68
+ char* const partial = (char*)malloc(partialCapacity);
69
+ FUZZ_ASSERT(partial);
70
+ int const partialSize = LZ4_decompress_safe_partial_usingDict(
71
+ dst, partial, dstSize, partialCapacity, partialCapacity, dstPlusSmallPrefix, smallSize);
72
+ FUZZ_ASSERT(partialSize >= 0);
73
+ FUZZ_ASSERT_MSG(partialSize == partialCapacity, "Incorrect size");
74
+ FUZZ_ASSERT_MSG(!memcmp(data, partial, partialSize), "Corruption!");
75
+ free(partial);
76
+ }
77
+ /* Partial decompression using dict with large prefix as dict */
78
+ {
79
+ char* const partial = (char*)malloc(partialCapacity);
80
+ FUZZ_ASSERT(partial);
81
+ int const partialSize = LZ4_decompress_safe_partial_usingDict(
82
+ dst, partial, dstSize, partialCapacity, partialCapacity, dstPlusLargePrefix, largeSize);
83
+ FUZZ_ASSERT(partialSize >= 0);
84
+ FUZZ_ASSERT_MSG(partialSize == partialCapacity, "Incorrect size");
85
+ FUZZ_ASSERT_MSG(!memcmp(data, partial, partialSize), "Corruption!");
86
+ free(partial);
87
+ }
88
+ /* Partial decompression using dict with small external dict */
89
+ {
90
+ char* const partial = (char*)malloc(partialCapacity);
91
+ FUZZ_ASSERT(partial);
92
+ int const partialSize = LZ4_decompress_safe_partial_usingDict(
93
+ dst, partial, dstSize, partialCapacity, partialCapacity, smallDict, smallSize);
94
+ FUZZ_ASSERT(partialSize >= 0);
95
+ FUZZ_ASSERT_MSG(partialSize == partialCapacity, "Incorrect size");
96
+ FUZZ_ASSERT_MSG(!memcmp(data, partial, partialSize), "Corruption!");
97
+ free(partial);
98
+ }
99
+ /* Partial decompression using dict with large external dict */
100
+ {
101
+ char* const partial = (char*)malloc(partialCapacity);
102
+ FUZZ_ASSERT(partial);
103
+ int const partialSize = LZ4_decompress_safe_partial_usingDict(
104
+ dst, partial, dstSize, partialCapacity, partialCapacity, largeDict, largeSize);
105
+ FUZZ_ASSERT(partialSize >= 0);
106
+ FUZZ_ASSERT_MSG(partialSize == partialCapacity, "Incorrect size");
107
+ FUZZ_ASSERT_MSG(!memcmp(data, partial, partialSize), "Corruption!");
108
+ free(partial);
109
+ }
50
110
 
51
-
52
- free(dst);
111
+ free(dstPlusLargePrefix);
112
+ free(largeDict);
53
113
  free(rt);
54
114
  FUZZ_dataProducer_free(producer);
55
115
 
data/ext/blockapi.c CHANGED
@@ -188,7 +188,7 @@ aux_shouldbe_string(VALUE obj)
188
188
  static inline size_t
189
189
  aux_lz4_compressbound(VALUE src)
190
190
  {
191
- return LZ4_compressBound(RSTRING_LEN(src));
191
+ return LZ4_compressBound(rb_long2int(RSTRING_LEN(src)));
192
192
  }
193
193
 
194
194
  enum {
@@ -441,7 +441,7 @@ blkenc_setup(int argc, VALUE argv[], struct blockencoder *p, VALUE predict)
441
441
  * NOTE: すぐ下で LZ4_saveDict() を実行するため、
442
442
  * NOTE: p->predict のバッファ領域が保持されることはない。
443
443
  */
444
- p->traits->loaddict(p->context, RSTRING_PTR(p->predict), RSTRING_LEN(p->predict));
444
+ p->traits->loaddict(p->context, RSTRING_PTR(p->predict), rb_long2int(RSTRING_LEN(p->predict)));
445
445
  }
446
446
 
447
447
  p->prefixsize = p->traits->savedict(p->context, p->prefix, sizeof(p->prefix));
@@ -492,7 +492,7 @@ blkenc_update(int argc, VALUE argv[], VALUE enc)
492
492
  char *srcp;
493
493
  size_t srcsize;
494
494
  RSTRING_GETMEM(src, srcp, srcsize);
495
- int s = p->traits->update(p->context, srcp, RSTRING_PTR(dest), srcsize, maxsize, p->level);
495
+ int s = p->traits->update(p->context, srcp, RSTRING_PTR(dest), aux_size2int(srcsize), aux_size2int(maxsize), p->level);
496
496
  if (s <= 0) {
497
497
  rb_raise(extlz4_eError,
498
498
  "destsize too small (given destsize is %"PRIuSIZE")",
@@ -673,7 +673,7 @@ blkenc_s_encode(int argc, VALUE argv[], VALUE lz4)
673
673
  aux_str_reserve(dest, maxsize);
674
674
  rb_str_set_len(dest, 0);
675
675
 
676
- int size = encoder(RSTRING_PTR(src), RSTRING_PTR(dest), srcsize, maxsize, level);
676
+ int size = encoder(RSTRING_PTR(src), RSTRING_PTR(dest), aux_size2int(srcsize), aux_size2int(maxsize), level);
677
677
  if (size <= 0) {
678
678
  rb_raise(extlz4_eError,
679
679
  "failed LZ4 compress - maxsize is too small, or out of memory");
@@ -870,8 +870,8 @@ blkdec_update(int argc, VALUE argv[], VALUE dec)
870
870
  const char *srcp;
871
871
  size_t srcsize;
872
872
  RSTRING_GETMEM(src, srcp, srcsize);
873
- LZ4_setStreamDecode(p->context, p->dictbuf, p->dictsize);
874
- int s = aux_LZ4_decompress_safe_continue(p->context, srcp, RSTRING_PTR(dest), srcsize, maxsize);
873
+ LZ4_setStreamDecode(p->context, p->dictbuf, aux_size2int(p->dictsize));
874
+ int s = aux_LZ4_decompress_safe_continue(p->context, srcp, RSTRING_PTR(dest), aux_size2int(srcsize), aux_size2int(maxsize));
875
875
  if (s < 0) {
876
876
  rb_raise(extlz4_eError,
877
877
  "`max_dest_size' too small, or corrupt lz4'd data");
@@ -879,7 +879,7 @@ blkdec_update(int argc, VALUE argv[], VALUE dec)
879
879
  rb_str_set_len(dest, s);
880
880
 
881
881
  /* copy prefix */
882
- if (s < sizeof(p->dictbuf)) {
882
+ if ((size_t)s < sizeof(p->dictbuf)) {
883
883
  ssize_t discard = (p->dictsize + s) - sizeof(p->dictbuf);
884
884
  if (discard > 0) {
885
885
  size_t remain = p->dictsize - discard;
@@ -967,7 +967,7 @@ blkdec_s_decode(int argc, VALUE argv[], VALUE lz4)
967
967
  aux_str_reserve(dest, maxsize);
968
968
  rb_str_set_len(dest, 0);
969
969
 
970
- int size = LZ4_decompress_safe(RSTRING_PTR(src), RSTRING_PTR(dest), RSTRING_LEN(src), maxsize);
970
+ int size = LZ4_decompress_safe(RSTRING_PTR(src), RSTRING_PTR(dest), rb_long2int(RSTRING_LEN(src)), aux_size2int(maxsize));
971
971
  if (size < 0) {
972
972
  rb_raise(extlz4_eError,
973
973
  "failed LZ4_decompress_safe - max_dest_size is too small, or data is corrupted");
data/ext/extlz4.h CHANGED
@@ -111,4 +111,16 @@ getref(VALUE obj, const rb_data_type_t *type)
111
111
  return checkref(obj, getrefp(obj, type));
112
112
  }
113
113
 
114
+ static inline int
115
+ aux_size2int(size_t n)
116
+ {
117
+ int m = (int)n;
118
+
119
+ if (m < 0 || (size_t)m != n) {
120
+ rb_raise(rb_eRangeError, "out of range integer conversion (size_t to int)");
121
+ }
122
+
123
+ return m;
124
+ }
125
+
114
126
  #endif /* !EXTLZ4_H */
data/ext/frameapi.c CHANGED
@@ -423,7 +423,7 @@ aux_read(VALUE obj, size_t size, VALUE buf)
423
423
  if (NIL_P(AUX_FUNCALL(obj, id_read, SIZET2NUM(size), buf))) {
424
424
  return Qnil;
425
425
  } else {
426
- if (RSTRING_LEN(buf) > size) {
426
+ if ((size_t)RSTRING_LEN(buf) > size) {
427
427
  rb_raise(rb_eRuntimeError, "most read (%d, but expected to %d)", (int)RSTRING_LEN(buf), (int)size);
428
428
  }
429
429
  return buf;
@@ -511,7 +511,7 @@ fdec_read_fetch(VALUE dec, struct decoder *p)
511
511
  rb_str_set_len(p->inbuf, 0);
512
512
  }
513
513
 
514
- while (RSTRING_LEN(p->inbuf) < p->status) {
514
+ while ((size_t)RSTRING_LEN(p->inbuf) < p->status) {
515
515
  p->readbuf = aux_read(p->inport, p->status - RSTRING_LEN(p->inbuf), p->readbuf);
516
516
  if (NIL_P(p->readbuf)) {
517
517
  rb_raise(rb_eRuntimeError,
@@ -547,7 +547,7 @@ fdec_read_decode(VALUE dec, struct decoder *p, char *dest, size_t size)
547
547
  break;
548
548
  }
549
549
 
550
- if (p->status > 0 && p->outoff >= RSTRING_LEN(p->outbuf)) {
550
+ if (p->status > 0 && p->outoff >= (size_t)RSTRING_LEN(p->outbuf)) {
551
551
  fdec_read_fetch(dec, p);
552
552
  }
553
553
 
data/ext/hashargs.c CHANGED
@@ -11,6 +11,12 @@
11
11
 
12
12
  #include "hashargs.h"
13
13
 
14
+ #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L
15
+ # define aux_noreturn _Noreturn
16
+ #else
17
+ # define aux_noreturn
18
+ #endif
19
+
14
20
  struct rbx_scanhash_args
15
21
  {
16
22
  struct rbx_scanhash_arg *args;
@@ -18,7 +24,7 @@ struct rbx_scanhash_args
18
24
  VALUE rest;
19
25
  };
20
26
 
21
- static void
27
+ aux_noreturn static void
22
28
  rbx_scanhash_error(ID given, struct rbx_scanhash_arg *args, const struct rbx_scanhash_arg *end)
23
29
  {
24
30
  // 引数の数が㌧でもない数の場合、よくないことが起きそう。
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: extlz4
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.3
4
+ version: 0.3.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - dearblue
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-10-05 00:00:00.000000000 Z
11
+ date: 2023-06-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -100,13 +100,25 @@ files:
100
100
  - contrib/lz4/build/VS2017/lz4.sln
101
101
  - contrib/lz4/build/VS2017/lz4/lz4.rc
102
102
  - contrib/lz4/build/VS2017/lz4/lz4.vcxproj
103
+ - contrib/lz4/build/VS2022/datagen/datagen.vcxproj
104
+ - contrib/lz4/build/VS2022/frametest/frametest.vcxproj
105
+ - contrib/lz4/build/VS2022/fullbench-dll/fullbench-dll.vcxproj
106
+ - contrib/lz4/build/VS2022/fullbench/fullbench.vcxproj
107
+ - contrib/lz4/build/VS2022/fuzzer/fuzzer.vcxproj
108
+ - contrib/lz4/build/VS2022/liblz4-dll/liblz4-dll.rc
109
+ - contrib/lz4/build/VS2022/liblz4-dll/liblz4-dll.vcxproj
110
+ - contrib/lz4/build/VS2022/liblz4/liblz4.vcxproj
111
+ - contrib/lz4/build/VS2022/lz4.sln
103
112
  - contrib/lz4/build/cmake/CMakeLists.txt
113
+ - contrib/lz4/build/cmake/lz4Config.cmake.in
104
114
  - contrib/lz4/lib/LICENSE
105
115
  - contrib/lz4/lib/README.md
106
116
  - contrib/lz4/lib/liblz4-dll.rc.in
107
117
  - contrib/lz4/lib/liblz4.pc.in
108
118
  - contrib/lz4/lib/lz4.c
109
119
  - contrib/lz4/lib/lz4.h
120
+ - contrib/lz4/lib/lz4file.c
121
+ - contrib/lz4/lib/lz4file.h
110
122
  - contrib/lz4/lib/lz4frame.c
111
123
  - contrib/lz4/lib/lz4frame.h
112
124
  - contrib/lz4/lib/lz4frame_static.h
@@ -128,13 +140,12 @@ files:
128
140
  - contrib/lz4/ossfuzz/lz4_helpers.h
129
141
  - contrib/lz4/ossfuzz/ossfuzz.sh
130
142
  - contrib/lz4/ossfuzz/round_trip_frame_fuzzer.c
143
+ - contrib/lz4/ossfuzz/round_trip_frame_uncompressed_fuzzer.c
131
144
  - contrib/lz4/ossfuzz/round_trip_fuzzer.c
132
145
  - contrib/lz4/ossfuzz/round_trip_hc_fuzzer.c
133
146
  - contrib/lz4/ossfuzz/round_trip_stream_fuzzer.c
134
147
  - contrib/lz4/ossfuzz/standaloneengine.c
135
148
  - contrib/lz4/ossfuzz/travisoss.sh
136
- - contrib/lz4/tmp
137
- - contrib/lz4/tmpsparse
138
149
  - examples/frameapi.rb
139
150
  - ext/blockapi.c
140
151
  - ext/depend
@@ -176,7 +187,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
176
187
  - !ruby/object:Gem::Version
177
188
  version: '0'
178
189
  requirements: []
179
- rubygems_version: 3.3.7
190
+ rubygems_version: 3.4.13
180
191
  signing_key:
181
192
  specification_version: 4
182
193
  summary: ruby bindings for LZ4
data/contrib/lz4/tmp DELETED
Binary file
Binary file