msgpack 1.8.3 → 1.8.4
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/ChangeLog +7 -1
- data/ext/msgpack/buffer.c +23 -0
- data/ext/msgpack/packer.h +0 -6
- data/ext/msgpack/unpacker.c +22 -91
- data/ext/msgpack/unpacker.h +0 -13
- data/lib/msgpack/version.rb +1 -1
- data/msgpack.gemspec +0 -9
- metadata +3 -115
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 4a5aa259ac95b61218c0f1cf10a23195bf3c847c7b1423172f50ece723363905
|
|
4
|
+
data.tar.gz: 9b3369d91349618e125cef788f3051fd706bcbbf01a78ed2afcb82ecd6d0ecf5
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 9feed41442045775173abfcae2d384b27904c44b81cd3674dfa18bfbf10558c9f77ea2f2ed51b694101a33e37761fa94553108fedb866d4834bbce697f96579a
|
|
7
|
+
data.tar.gz: ae0d30ca66f5f4e1e22fcfee2615bd91db00ddfe101e043a0753e32bc7252c42d9bbfc3b763d3a519f20fdbb28ad0be2f5071472ad8b7c6c4053ac7702875432
|
data/ChangeLog
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
2026-07-28 1.8.4
|
|
2
|
+
|
|
3
|
+
* Fix `MessagePack::Buffer` to stop using already released memory page.
|
|
4
|
+
This could have caused data to leak across buffers when using the MessagePack::Buffer API
|
|
5
|
+
directly.
|
|
6
|
+
|
|
1
7
|
2026-06-10 1.8.3
|
|
2
8
|
|
|
3
9
|
* Fix an integer overflow when parsing maps.
|
|
@@ -6,7 +12,7 @@
|
|
|
6
12
|
|
|
7
13
|
* Fix `Buffer#clear` to properly reset memory chunks before adding them back to the pool.
|
|
8
14
|
This could have caused data to leak across buffers when using the MessagePack::Buffer API
|
|
9
|
-
directly. [CVE-
|
|
15
|
+
directly. [CVE-2026-54522].
|
|
10
16
|
|
|
11
17
|
2026-05-28 1.8.1
|
|
12
18
|
|
data/ext/msgpack/buffer.c
CHANGED
|
@@ -127,6 +127,15 @@ void msgpack_buffer_mark(void *ptr)
|
|
|
127
127
|
|
|
128
128
|
bool _msgpack_buffer_shift_chunk(msgpack_buffer_t* b)
|
|
129
129
|
{
|
|
130
|
+
if(b->rmem_owner == &b->head->mem) {
|
|
131
|
+
/* the chunk that owns the rmem page is going away and takes the page
|
|
132
|
+
* with it. don't carve the remaining space out of a page that is
|
|
133
|
+
* already back in the pool. */
|
|
134
|
+
b->rmem_end = NULL;
|
|
135
|
+
b->rmem_last = NULL;
|
|
136
|
+
b->rmem_owner = NULL;
|
|
137
|
+
}
|
|
138
|
+
|
|
130
139
|
_msgpack_buffer_chunk_destroy(b->head);
|
|
131
140
|
|
|
132
141
|
if(b->head == &b->tail) {
|
|
@@ -264,6 +273,18 @@ static inline msgpack_buffer_chunk_t* _msgpack_buffer_alloc_new_chunk(msgpack_bu
|
|
|
264
273
|
return chunk;
|
|
265
274
|
}
|
|
266
275
|
|
|
276
|
+
/* b->tail is copied into nc and then rebuilt, so the rmem page pointer moves
|
|
277
|
+
* to nc. the owner has to follow it: if it kept pointing at b->tail.mem, the
|
|
278
|
+
* transfer in _msgpack_buffer_chunk_malloc would degenerate into a
|
|
279
|
+
* self-assignment and the page would be released by nc while the rebuilt tail
|
|
280
|
+
* is still reading from it. */
|
|
281
|
+
static inline void _msgpack_buffer_transfer_rmem_owner(msgpack_buffer_t* b, msgpack_buffer_chunk_t* nc)
|
|
282
|
+
{
|
|
283
|
+
if(b->rmem_owner == &b->tail.mem) {
|
|
284
|
+
b->rmem_owner = &nc->mem;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
|
|
267
288
|
static inline void _msgpack_buffer_add_new_chunk(msgpack_buffer_t* b)
|
|
268
289
|
{
|
|
269
290
|
if(b->head == &b->tail) {
|
|
@@ -275,6 +296,7 @@ static inline void _msgpack_buffer_add_new_chunk(msgpack_buffer_t* b)
|
|
|
275
296
|
msgpack_buffer_chunk_t* nc = _msgpack_buffer_alloc_new_chunk(b);
|
|
276
297
|
|
|
277
298
|
*nc = b->tail;
|
|
299
|
+
_msgpack_buffer_transfer_rmem_owner(b, nc);
|
|
278
300
|
b->head = nc;
|
|
279
301
|
nc->next = &b->tail;
|
|
280
302
|
|
|
@@ -295,6 +317,7 @@ static inline void _msgpack_buffer_add_new_chunk(msgpack_buffer_t* b)
|
|
|
295
317
|
|
|
296
318
|
/* rebuild tail */
|
|
297
319
|
*nc = b->tail;
|
|
320
|
+
_msgpack_buffer_transfer_rmem_owner(b, nc);
|
|
298
321
|
before_tail->next = nc;
|
|
299
322
|
nc->next = &b->tail;
|
|
300
323
|
}
|
data/ext/msgpack/packer.h
CHANGED
|
@@ -25,11 +25,6 @@
|
|
|
25
25
|
#define MSGPACK_PACKER_IO_FLUSH_THRESHOLD_TO_WRITE_STRING_BODY (1024)
|
|
26
26
|
#endif
|
|
27
27
|
|
|
28
|
-
#ifndef UNREACHABLE_RETURN
|
|
29
|
-
// Ruby 2.5
|
|
30
|
-
#define UNREACHABLE_RETURN() return
|
|
31
|
-
#endif
|
|
32
|
-
|
|
33
28
|
struct msgpack_packer_t;
|
|
34
29
|
typedef struct msgpack_packer_t msgpack_packer_t;
|
|
35
30
|
|
|
@@ -418,7 +413,6 @@ static inline void msgpack_packer_write_string_value(msgpack_packer_t* pk, VALUE
|
|
|
418
413
|
|
|
419
414
|
if(RB_UNLIKELY(len > 0xffffffffL)) {
|
|
420
415
|
rb_raise(rb_eArgError, "size of string is too long to pack: %lu bytes should be <= %ld", len, 0xffffffffL);
|
|
421
|
-
UNREACHABLE_RETURN();
|
|
422
416
|
}
|
|
423
417
|
|
|
424
418
|
if (RB_UNLIKELY(pk->compatibility_mode)) {
|
data/ext/msgpack/unpacker.c
CHANGED
|
@@ -211,7 +211,7 @@ static inline int object_complete(msgpack_unpacker_t* uk, VALUE object)
|
|
|
211
211
|
return PRIMITIVE_OBJECT_COMPLETE;
|
|
212
212
|
}
|
|
213
213
|
|
|
214
|
-
static inline int
|
|
214
|
+
static inline int object_complete_frozen(msgpack_unpacker_t* uk, VALUE object)
|
|
215
215
|
{
|
|
216
216
|
uk->last_object = object;
|
|
217
217
|
reset_head_byte(uk);
|
|
@@ -222,9 +222,9 @@ static inline int object_complete_ext(msgpack_unpacker_t* uk, int ext_type, VALU
|
|
|
222
222
|
{
|
|
223
223
|
if (uk->optimized_symbol_ext_type && ext_type == uk->symbol_ext_type) {
|
|
224
224
|
if (RB_UNLIKELY(NIL_P(str))) { // empty extension is returned as Qnil
|
|
225
|
-
return
|
|
225
|
+
return object_complete_frozen(uk, ID2SYM(rb_intern3("", 0, rb_utf8_encoding())));
|
|
226
226
|
}
|
|
227
|
-
return
|
|
227
|
+
return object_complete_frozen(uk, rb_str_intern(str));
|
|
228
228
|
}
|
|
229
229
|
|
|
230
230
|
int ext_flags;
|
|
@@ -378,7 +378,14 @@ static inline int read_raw_body_begin(msgpack_unpacker_t* uk, int raw_type)
|
|
|
378
378
|
reset_head_byte(uk);
|
|
379
379
|
uk->reading_raw_remaining = 0;
|
|
380
380
|
|
|
381
|
-
_msgpack_unpacker_stack_push(uk, STACK_TYPE_RECURSIVE, 1, Qnil)
|
|
381
|
+
if(_msgpack_unpacker_stack_push(uk, STACK_TYPE_RECURSIVE, 1, Qnil) < 0) {
|
|
382
|
+
/* Recursive extensions re-enter msgpack_unpacker_read() through the
|
|
383
|
+
* user proc, consuming a full C stack frame per nesting level. If we
|
|
384
|
+
* ignore a failed push (stack already at MSGPACK_UNPACKER_STACK_CAPACITY)
|
|
385
|
+
* the recursion continues unbounded and exhausts the C stack (SIGSEGV)
|
|
386
|
+
* instead of raising StackError like every other container type. */
|
|
387
|
+
return PRIMITIVE_STACK_TOO_DEEP;
|
|
388
|
+
}
|
|
382
389
|
int raised;
|
|
383
390
|
obj = protected_proc_call(proc, 1, &uk->self, &raised);
|
|
384
391
|
msgpack_unpacker_stack_pop(uk);
|
|
@@ -398,7 +405,7 @@ static inline int read_raw_body_begin(msgpack_unpacker_t* uk, int raw_type)
|
|
|
398
405
|
int ret;
|
|
399
406
|
if ((uk->optimized_symbol_ext_type && uk->symbol_ext_type == raw_type)) {
|
|
400
407
|
VALUE symbol = msgpack_buffer_read_top_as_symbol(UNPACKER_BUFFER_(uk), length, raw_type != RAW_TYPE_BINARY);
|
|
401
|
-
ret =
|
|
408
|
+
ret = object_complete_frozen(uk, symbol);
|
|
402
409
|
} else if (is_reading_map_key(uk) && raw_type == RAW_TYPE_STRING) {
|
|
403
410
|
/* don't use zerocopy for hash keys but get a frozen string directly
|
|
404
411
|
* because rb_hash_aset freezes keys and it causes copying */
|
|
@@ -409,7 +416,7 @@ static inline int read_raw_body_begin(msgpack_unpacker_t* uk, int raw_type)
|
|
|
409
416
|
} else {
|
|
410
417
|
key = msgpack_buffer_read_top_as_symbol(UNPACKER_BUFFER_(uk), length, true);
|
|
411
418
|
}
|
|
412
|
-
ret =
|
|
419
|
+
ret = object_complete_frozen(uk, key);
|
|
413
420
|
} else {
|
|
414
421
|
if (uk->use_key_cache) {
|
|
415
422
|
key = msgpack_buffer_read_top_as_interned_string(UNPACKER_BUFFER_(uk), &uk->key_cache, length);
|
|
@@ -450,10 +457,10 @@ static int read_primitive(msgpack_unpacker_t* uk)
|
|
|
450
457
|
|
|
451
458
|
SWITCH_RANGE_BEGIN(b)
|
|
452
459
|
SWITCH_RANGE(b, 0x00, 0x7f) // Positive Fixnum
|
|
453
|
-
return
|
|
460
|
+
return object_complete_frozen(uk, INT2NUM(b));
|
|
454
461
|
|
|
455
462
|
SWITCH_RANGE(b, 0xe0, 0xff) // Negative Fixnum
|
|
456
|
-
return
|
|
463
|
+
return object_complete_frozen(uk, INT2NUM((int8_t)b));
|
|
457
464
|
|
|
458
465
|
SWITCH_RANGE(b, 0xa0, 0xbf) // FixRaw / fixstr
|
|
459
466
|
size_t count = b & 0x1f;
|
|
@@ -478,15 +485,15 @@ static int read_primitive(msgpack_unpacker_t* uk)
|
|
|
478
485
|
SWITCH_RANGE(b, 0xc0, 0xdf) // Variable
|
|
479
486
|
switch(b) {
|
|
480
487
|
case 0xc0: // nil
|
|
481
|
-
return
|
|
488
|
+
return object_complete_frozen(uk, Qnil);
|
|
482
489
|
|
|
483
490
|
//case 0xc1: // string
|
|
484
491
|
|
|
485
492
|
case 0xc2: // false
|
|
486
|
-
return
|
|
493
|
+
return object_complete_frozen(uk, Qfalse);
|
|
487
494
|
|
|
488
495
|
case 0xc3: // true
|
|
489
|
-
return
|
|
496
|
+
return object_complete_frozen(uk, Qtrue);
|
|
490
497
|
|
|
491
498
|
case 0xc7: // ext 8
|
|
492
499
|
{
|
|
@@ -542,14 +549,14 @@ static int read_primitive(msgpack_unpacker_t* uk)
|
|
|
542
549
|
{
|
|
543
550
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 1);
|
|
544
551
|
uint8_t u8 = cb.u8;
|
|
545
|
-
return
|
|
552
|
+
return object_complete_frozen(uk, INT2NUM((int)u8));
|
|
546
553
|
}
|
|
547
554
|
|
|
548
555
|
case 0xcd: // unsigned int 16
|
|
549
556
|
{
|
|
550
557
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 2);
|
|
551
558
|
uint16_t u16 = _msgpack_be16(cb.u16);
|
|
552
|
-
return
|
|
559
|
+
return object_complete_frozen(uk, INT2NUM((int)u16));
|
|
553
560
|
}
|
|
554
561
|
|
|
555
562
|
case 0xce: // unsigned int 32
|
|
@@ -570,14 +577,14 @@ static int read_primitive(msgpack_unpacker_t* uk)
|
|
|
570
577
|
{
|
|
571
578
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 1);
|
|
572
579
|
int8_t i8 = cb.i8;
|
|
573
|
-
return
|
|
580
|
+
return object_complete_frozen(uk, INT2NUM((int)i8));
|
|
574
581
|
}
|
|
575
582
|
|
|
576
583
|
case 0xd1: // signed int 16
|
|
577
584
|
{
|
|
578
585
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 2);
|
|
579
586
|
int16_t i16 = _msgpack_be16(cb.i16);
|
|
580
|
-
return
|
|
587
|
+
return object_complete_frozen(uk, INT2NUM((int)i16));
|
|
581
588
|
}
|
|
582
589
|
|
|
583
590
|
case 0xd2: // signed int 32
|
|
@@ -897,82 +904,6 @@ int msgpack_unpacker_skip(msgpack_unpacker_t* uk, size_t target_stack_depth)
|
|
|
897
904
|
}
|
|
898
905
|
}
|
|
899
906
|
|
|
900
|
-
int msgpack_unpacker_peek_next_object_type(msgpack_unpacker_t* uk)
|
|
901
|
-
{
|
|
902
|
-
int b = get_head_byte(uk);
|
|
903
|
-
if(b < 0) {
|
|
904
|
-
return b;
|
|
905
|
-
}
|
|
906
|
-
|
|
907
|
-
SWITCH_RANGE_BEGIN(b)
|
|
908
|
-
SWITCH_RANGE(b, 0x00, 0x7f) // Positive Fixnum
|
|
909
|
-
return TYPE_INTEGER;
|
|
910
|
-
|
|
911
|
-
SWITCH_RANGE(b, 0xe0, 0xff) // Negative Fixnum
|
|
912
|
-
return TYPE_INTEGER;
|
|
913
|
-
|
|
914
|
-
SWITCH_RANGE(b, 0xa0, 0xbf) // FixRaw
|
|
915
|
-
return TYPE_RAW;
|
|
916
|
-
|
|
917
|
-
SWITCH_RANGE(b, 0x90, 0x9f) // FixArray
|
|
918
|
-
return TYPE_ARRAY;
|
|
919
|
-
|
|
920
|
-
SWITCH_RANGE(b, 0x80, 0x8f) // FixMap
|
|
921
|
-
return TYPE_MAP;
|
|
922
|
-
|
|
923
|
-
SWITCH_RANGE(b, 0xc0, 0xdf) // Variable
|
|
924
|
-
switch(b) {
|
|
925
|
-
case 0xc0: // nil
|
|
926
|
-
return TYPE_NIL;
|
|
927
|
-
|
|
928
|
-
case 0xc2: // false
|
|
929
|
-
case 0xc3: // true
|
|
930
|
-
return TYPE_BOOLEAN;
|
|
931
|
-
|
|
932
|
-
case 0xca: // float
|
|
933
|
-
case 0xcb: // double
|
|
934
|
-
return TYPE_FLOAT;
|
|
935
|
-
|
|
936
|
-
case 0xcc: // unsigned int 8
|
|
937
|
-
case 0xcd: // unsigned int 16
|
|
938
|
-
case 0xce: // unsigned int 32
|
|
939
|
-
case 0xcf: // unsigned int 64
|
|
940
|
-
return TYPE_INTEGER;
|
|
941
|
-
|
|
942
|
-
case 0xd0: // signed int 8
|
|
943
|
-
case 0xd1: // signed int 16
|
|
944
|
-
case 0xd2: // signed int 32
|
|
945
|
-
case 0xd3: // signed int 64
|
|
946
|
-
return TYPE_INTEGER;
|
|
947
|
-
|
|
948
|
-
case 0xd9: // raw 8 / str 8
|
|
949
|
-
case 0xda: // raw 16 / str 16
|
|
950
|
-
case 0xdb: // raw 32 / str 32
|
|
951
|
-
return TYPE_RAW;
|
|
952
|
-
|
|
953
|
-
case 0xc4: // bin 8
|
|
954
|
-
case 0xc5: // bin 16
|
|
955
|
-
case 0xc6: // bin 32
|
|
956
|
-
return TYPE_RAW;
|
|
957
|
-
|
|
958
|
-
case 0xdc: // array 16
|
|
959
|
-
case 0xdd: // array 32
|
|
960
|
-
return TYPE_ARRAY;
|
|
961
|
-
|
|
962
|
-
case 0xde: // map 16
|
|
963
|
-
case 0xdf: // map 32
|
|
964
|
-
return TYPE_MAP;
|
|
965
|
-
|
|
966
|
-
default:
|
|
967
|
-
return PRIMITIVE_INVALID_BYTE;
|
|
968
|
-
}
|
|
969
|
-
|
|
970
|
-
SWITCH_RANGE_DEFAULT
|
|
971
|
-
return PRIMITIVE_INVALID_BYTE;
|
|
972
|
-
|
|
973
|
-
SWITCH_RANGE_END
|
|
974
|
-
}
|
|
975
|
-
|
|
976
907
|
int msgpack_unpacker_skip_nil(msgpack_unpacker_t* uk)
|
|
977
908
|
{
|
|
978
909
|
int b = get_head_byte(uk);
|
data/ext/msgpack/unpacker.h
CHANGED
|
@@ -77,16 +77,6 @@ struct msgpack_unpacker_t {
|
|
|
77
77
|
|
|
78
78
|
#define UNPACKER_BUFFER_(uk) (&(uk)->buffer)
|
|
79
79
|
|
|
80
|
-
enum msgpack_unpacker_object_type {
|
|
81
|
-
TYPE_NIL = 0,
|
|
82
|
-
TYPE_BOOLEAN,
|
|
83
|
-
TYPE_INTEGER,
|
|
84
|
-
TYPE_FLOAT,
|
|
85
|
-
TYPE_RAW,
|
|
86
|
-
TYPE_ARRAY,
|
|
87
|
-
TYPE_MAP,
|
|
88
|
-
};
|
|
89
|
-
|
|
90
80
|
void msgpack_unpacker_static_init(void);
|
|
91
81
|
|
|
92
82
|
void msgpack_unpacker_static_destroy(void);
|
|
@@ -139,9 +129,6 @@ static inline VALUE msgpack_unpacker_get_last_object(msgpack_unpacker_t* uk)
|
|
|
139
129
|
return uk->last_object;
|
|
140
130
|
}
|
|
141
131
|
|
|
142
|
-
|
|
143
|
-
int msgpack_unpacker_peek_next_object_type(msgpack_unpacker_t* uk);
|
|
144
|
-
|
|
145
132
|
int msgpack_unpacker_skip_nil(msgpack_unpacker_t* uk);
|
|
146
133
|
|
|
147
134
|
int msgpack_unpacker_read_array_header(msgpack_unpacker_t* uk, uint32_t* result_size);
|
data/lib/msgpack/version.rb
CHANGED
data/msgpack.gemspec
CHANGED
|
@@ -29,13 +29,4 @@ Gem::Specification.new do |s|
|
|
|
29
29
|
"documentation_uri" => "https://github.com/msgpack/msgpack/blob/master/spec.md",
|
|
30
30
|
"source_code_uri" => "https://github.com/msgpack/msgpack-ruby"
|
|
31
31
|
}
|
|
32
|
-
|
|
33
|
-
s.add_development_dependency 'bundler'
|
|
34
|
-
s.add_development_dependency 'rake'
|
|
35
|
-
s.add_development_dependency 'rake-compiler', ['>= 1.1.9']
|
|
36
|
-
s.add_development_dependency 'rspec', ['~> 3.3']
|
|
37
|
-
s.add_development_dependency 'ruby_memcheck'
|
|
38
|
-
s.add_development_dependency 'yard'
|
|
39
|
-
s.add_development_dependency 'json'
|
|
40
|
-
s.add_development_dependency 'benchmark-ips', ['~> 2.10.0']
|
|
41
32
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: msgpack
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.8.
|
|
4
|
+
version: 1.8.4
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Sadayuki Furuhashi
|
|
@@ -10,119 +10,7 @@ authors:
|
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
12
|
date: 1980-01-02 00:00:00.000000000 Z
|
|
13
|
-
dependencies:
|
|
14
|
-
- !ruby/object:Gem::Dependency
|
|
15
|
-
name: bundler
|
|
16
|
-
requirement: !ruby/object:Gem::Requirement
|
|
17
|
-
requirements:
|
|
18
|
-
- - ">="
|
|
19
|
-
- !ruby/object:Gem::Version
|
|
20
|
-
version: '0'
|
|
21
|
-
type: :development
|
|
22
|
-
prerelease: false
|
|
23
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
24
|
-
requirements:
|
|
25
|
-
- - ">="
|
|
26
|
-
- !ruby/object:Gem::Version
|
|
27
|
-
version: '0'
|
|
28
|
-
- !ruby/object:Gem::Dependency
|
|
29
|
-
name: rake
|
|
30
|
-
requirement: !ruby/object:Gem::Requirement
|
|
31
|
-
requirements:
|
|
32
|
-
- - ">="
|
|
33
|
-
- !ruby/object:Gem::Version
|
|
34
|
-
version: '0'
|
|
35
|
-
type: :development
|
|
36
|
-
prerelease: false
|
|
37
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
38
|
-
requirements:
|
|
39
|
-
- - ">="
|
|
40
|
-
- !ruby/object:Gem::Version
|
|
41
|
-
version: '0'
|
|
42
|
-
- !ruby/object:Gem::Dependency
|
|
43
|
-
name: rake-compiler
|
|
44
|
-
requirement: !ruby/object:Gem::Requirement
|
|
45
|
-
requirements:
|
|
46
|
-
- - ">="
|
|
47
|
-
- !ruby/object:Gem::Version
|
|
48
|
-
version: 1.1.9
|
|
49
|
-
type: :development
|
|
50
|
-
prerelease: false
|
|
51
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
52
|
-
requirements:
|
|
53
|
-
- - ">="
|
|
54
|
-
- !ruby/object:Gem::Version
|
|
55
|
-
version: 1.1.9
|
|
56
|
-
- !ruby/object:Gem::Dependency
|
|
57
|
-
name: rspec
|
|
58
|
-
requirement: !ruby/object:Gem::Requirement
|
|
59
|
-
requirements:
|
|
60
|
-
- - "~>"
|
|
61
|
-
- !ruby/object:Gem::Version
|
|
62
|
-
version: '3.3'
|
|
63
|
-
type: :development
|
|
64
|
-
prerelease: false
|
|
65
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
66
|
-
requirements:
|
|
67
|
-
- - "~>"
|
|
68
|
-
- !ruby/object:Gem::Version
|
|
69
|
-
version: '3.3'
|
|
70
|
-
- !ruby/object:Gem::Dependency
|
|
71
|
-
name: ruby_memcheck
|
|
72
|
-
requirement: !ruby/object:Gem::Requirement
|
|
73
|
-
requirements:
|
|
74
|
-
- - ">="
|
|
75
|
-
- !ruby/object:Gem::Version
|
|
76
|
-
version: '0'
|
|
77
|
-
type: :development
|
|
78
|
-
prerelease: false
|
|
79
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
80
|
-
requirements:
|
|
81
|
-
- - ">="
|
|
82
|
-
- !ruby/object:Gem::Version
|
|
83
|
-
version: '0'
|
|
84
|
-
- !ruby/object:Gem::Dependency
|
|
85
|
-
name: yard
|
|
86
|
-
requirement: !ruby/object:Gem::Requirement
|
|
87
|
-
requirements:
|
|
88
|
-
- - ">="
|
|
89
|
-
- !ruby/object:Gem::Version
|
|
90
|
-
version: '0'
|
|
91
|
-
type: :development
|
|
92
|
-
prerelease: false
|
|
93
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
94
|
-
requirements:
|
|
95
|
-
- - ">="
|
|
96
|
-
- !ruby/object:Gem::Version
|
|
97
|
-
version: '0'
|
|
98
|
-
- !ruby/object:Gem::Dependency
|
|
99
|
-
name: json
|
|
100
|
-
requirement: !ruby/object:Gem::Requirement
|
|
101
|
-
requirements:
|
|
102
|
-
- - ">="
|
|
103
|
-
- !ruby/object:Gem::Version
|
|
104
|
-
version: '0'
|
|
105
|
-
type: :development
|
|
106
|
-
prerelease: false
|
|
107
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
108
|
-
requirements:
|
|
109
|
-
- - ">="
|
|
110
|
-
- !ruby/object:Gem::Version
|
|
111
|
-
version: '0'
|
|
112
|
-
- !ruby/object:Gem::Dependency
|
|
113
|
-
name: benchmark-ips
|
|
114
|
-
requirement: !ruby/object:Gem::Requirement
|
|
115
|
-
requirements:
|
|
116
|
-
- - "~>"
|
|
117
|
-
- !ruby/object:Gem::Version
|
|
118
|
-
version: 2.10.0
|
|
119
|
-
type: :development
|
|
120
|
-
prerelease: false
|
|
121
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
122
|
-
requirements:
|
|
123
|
-
- - "~>"
|
|
124
|
-
- !ruby/object:Gem::Version
|
|
125
|
-
version: 2.10.0
|
|
13
|
+
dependencies: []
|
|
126
14
|
description: MessagePack is a binary-based efficient object serialization library.
|
|
127
15
|
It enables to exchange structured objects between many languages like JSON. But
|
|
128
16
|
unlike JSON, it is very fast and small.
|
|
@@ -210,7 +98,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
210
98
|
- !ruby/object:Gem::Version
|
|
211
99
|
version: '0'
|
|
212
100
|
requirements: []
|
|
213
|
-
rubygems_version: 4.0.
|
|
101
|
+
rubygems_version: 4.0.16
|
|
214
102
|
specification_version: 4
|
|
215
103
|
summary: MessagePack, a binary-based efficient data interchange format.
|
|
216
104
|
test_files: []
|