msgpack 1.8.2 → 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 +11 -1
- data/ext/java/org/msgpack/jruby/Decoder.java +15 -7
- data/ext/msgpack/buffer.c +23 -0
- data/ext/msgpack/packer.h +0 -6
- data/ext/msgpack/unpacker.c +34 -103
- 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,8 +1,18 @@
|
|
|
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
|
+
|
|
7
|
+
2026-06-10 1.8.3
|
|
8
|
+
|
|
9
|
+
* Fix an integer overflow when parsing maps.
|
|
10
|
+
|
|
1
11
|
2026-06-09 1.8.2
|
|
2
12
|
|
|
3
13
|
* Fix `Buffer#clear` to properly reset memory chunks before adding them back to the pool.
|
|
4
14
|
This could have caused data to leak across buffers when using the MessagePack::Buffer API
|
|
5
|
-
directly. [CVE-
|
|
15
|
+
directly. [CVE-2026-54522].
|
|
6
16
|
|
|
7
17
|
2026-05-28 1.8.1
|
|
8
18
|
|
|
@@ -85,6 +85,14 @@ public class Decoder implements Iterator<IRubyObject> {
|
|
|
85
85
|
feed(bytes, offset, length);
|
|
86
86
|
}
|
|
87
87
|
|
|
88
|
+
private int getUnsignedInt() {
|
|
89
|
+
int size = buffer.getInt();
|
|
90
|
+
if (size < 0) {
|
|
91
|
+
throw runtime.newRaiseException(underflowErrorClass, "Size too large (limited to 2**31 for the Java version)");
|
|
92
|
+
}
|
|
93
|
+
return size;
|
|
94
|
+
}
|
|
95
|
+
|
|
88
96
|
public void feed(byte[] bytes) {
|
|
89
97
|
feed(bytes, 0, bytes.length);
|
|
90
98
|
}
|
|
@@ -200,7 +208,7 @@ public class Decoder implements Iterator<IRubyObject> {
|
|
|
200
208
|
} else if (b == ARY16) {
|
|
201
209
|
return runtime.newFixnum(buffer.getShort() & 0xffff);
|
|
202
210
|
} else if (b == ARY32) {
|
|
203
|
-
return runtime.newFixnum(
|
|
211
|
+
return runtime.newFixnum(getUnsignedInt());
|
|
204
212
|
}
|
|
205
213
|
throw runtime.newRaiseException(unexpectedTypeErrorClass, "unexpected type");
|
|
206
214
|
} catch (RaiseException re) {
|
|
@@ -221,7 +229,7 @@ public class Decoder implements Iterator<IRubyObject> {
|
|
|
221
229
|
} else if (b == MAP16) {
|
|
222
230
|
return runtime.newFixnum(buffer.getShort() & 0xffff);
|
|
223
231
|
} else if (b == MAP32) {
|
|
224
|
-
return runtime.newFixnum(
|
|
232
|
+
return runtime.newFixnum(getUnsignedInt());
|
|
225
233
|
}
|
|
226
234
|
throw runtime.newRaiseException(unexpectedTypeErrorClass, "unexpected type");
|
|
227
235
|
} catch (RaiseException re) {
|
|
@@ -258,10 +266,10 @@ public class Decoder implements Iterator<IRubyObject> {
|
|
|
258
266
|
case TRUE: return runtime.getTrue();
|
|
259
267
|
case BIN8: return consumeString(buffer.get() & 0xff, binaryEncoding);
|
|
260
268
|
case BIN16: return consumeString(buffer.getShort() & 0xffff, binaryEncoding);
|
|
261
|
-
case BIN32: return consumeString(
|
|
269
|
+
case BIN32: return consumeString(getUnsignedInt(), binaryEncoding);
|
|
262
270
|
case VAREXT8: return consumeExtension(buffer.get() & 0xff);
|
|
263
271
|
case VAREXT16: return consumeExtension(buffer.getShort() & 0xffff);
|
|
264
|
-
case VAREXT32: return consumeExtension(
|
|
272
|
+
case VAREXT32: return consumeExtension(getUnsignedInt());
|
|
265
273
|
case FLOAT32: return runtime.newFloat(buffer.getFloat());
|
|
266
274
|
case FLOAT64: return runtime.newFloat(buffer.getDouble());
|
|
267
275
|
case UINT8: return runtime.newFixnum(buffer.get() & 0xffL);
|
|
@@ -283,11 +291,11 @@ public class Decoder implements Iterator<IRubyObject> {
|
|
|
283
291
|
case FIXEXT16: return consumeExtension(16);
|
|
284
292
|
case STR8: return consumeString(buffer.get() & 0xff, utf8Encoding);
|
|
285
293
|
case STR16: return consumeString(buffer.getShort() & 0xffff, utf8Encoding);
|
|
286
|
-
case STR32: return consumeString(
|
|
294
|
+
case STR32: return consumeString(getUnsignedInt(), utf8Encoding);
|
|
287
295
|
case ARY16: return consumeArray(buffer.getShort() & 0xffff);
|
|
288
|
-
case ARY32: return consumeArray(
|
|
296
|
+
case ARY32: return consumeArray(getUnsignedInt());
|
|
289
297
|
case MAP16: return consumeHash(buffer.getShort() & 0xffff);
|
|
290
|
-
case MAP32: return consumeHash(
|
|
298
|
+
case MAP32: return consumeHash(getUnsignedInt());
|
|
291
299
|
default: break outer;
|
|
292
300
|
}
|
|
293
301
|
case 0xe:
|
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,19 +457,19 @@ 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;
|
|
460
467
|
/* read_raw_body_begin sets uk->reading_raw */
|
|
461
468
|
uk->reading_raw_remaining = count;
|
|
462
469
|
return read_raw_body_begin(uk, RAW_TYPE_STRING);
|
|
463
470
|
|
|
464
471
|
SWITCH_RANGE(b, 0x90, 0x9f) // FixArray
|
|
465
|
-
|
|
472
|
+
size_t count = b & 0x0f;
|
|
466
473
|
if(count == 0) {
|
|
467
474
|
return object_complete(uk, rb_ary_new());
|
|
468
475
|
}
|
|
@@ -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
|
|
@@ -638,7 +645,7 @@ static int read_primitive(msgpack_unpacker_t* uk)
|
|
|
638
645
|
case 0xd9: // raw 8 / str 8
|
|
639
646
|
{
|
|
640
647
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 1);
|
|
641
|
-
|
|
648
|
+
size_t count = cb.u8;
|
|
642
649
|
/* read_raw_body_begin sets uk->reading_raw */
|
|
643
650
|
uk->reading_raw_remaining = count;
|
|
644
651
|
return read_raw_body_begin(uk, RAW_TYPE_STRING);
|
|
@@ -647,7 +654,7 @@ static int read_primitive(msgpack_unpacker_t* uk)
|
|
|
647
654
|
case 0xda: // raw 16 / str 16
|
|
648
655
|
{
|
|
649
656
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 2);
|
|
650
|
-
|
|
657
|
+
size_t count = _msgpack_be16(cb.u16);
|
|
651
658
|
/* read_raw_body_begin sets uk->reading_raw */
|
|
652
659
|
uk->reading_raw_remaining = count;
|
|
653
660
|
return read_raw_body_begin(uk, RAW_TYPE_STRING);
|
|
@@ -656,7 +663,7 @@ static int read_primitive(msgpack_unpacker_t* uk)
|
|
|
656
663
|
case 0xdb: // raw 32 / str 32
|
|
657
664
|
{
|
|
658
665
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 4);
|
|
659
|
-
|
|
666
|
+
size_t count = _msgpack_be32(cb.u32);
|
|
660
667
|
/* read_raw_body_begin sets uk->reading_raw */
|
|
661
668
|
uk->reading_raw_remaining = count;
|
|
662
669
|
return read_raw_body_begin(uk, RAW_TYPE_STRING);
|
|
@@ -665,7 +672,7 @@ static int read_primitive(msgpack_unpacker_t* uk)
|
|
|
665
672
|
case 0xc4: // bin 8
|
|
666
673
|
{
|
|
667
674
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 1);
|
|
668
|
-
|
|
675
|
+
size_t count = cb.u8;
|
|
669
676
|
/* read_raw_body_begin sets uk->reading_raw */
|
|
670
677
|
uk->reading_raw_remaining = count;
|
|
671
678
|
return read_raw_body_begin(uk, RAW_TYPE_BINARY);
|
|
@@ -674,7 +681,7 @@ static int read_primitive(msgpack_unpacker_t* uk)
|
|
|
674
681
|
case 0xc5: // bin 16
|
|
675
682
|
{
|
|
676
683
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 2);
|
|
677
|
-
|
|
684
|
+
size_t count = _msgpack_be16(cb.u16);
|
|
678
685
|
/* read_raw_body_begin sets uk->reading_raw */
|
|
679
686
|
uk->reading_raw_remaining = count;
|
|
680
687
|
return read_raw_body_begin(uk, RAW_TYPE_BINARY);
|
|
@@ -683,7 +690,7 @@ static int read_primitive(msgpack_unpacker_t* uk)
|
|
|
683
690
|
case 0xc6: // bin 32
|
|
684
691
|
{
|
|
685
692
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 4);
|
|
686
|
-
|
|
693
|
+
size_t count = _msgpack_be32(cb.u32);
|
|
687
694
|
/* read_raw_body_begin sets uk->reading_raw */
|
|
688
695
|
uk->reading_raw_remaining = count;
|
|
689
696
|
return read_raw_body_begin(uk, RAW_TYPE_BINARY);
|
|
@@ -692,7 +699,7 @@ static int read_primitive(msgpack_unpacker_t* uk)
|
|
|
692
699
|
case 0xdc: // array 16
|
|
693
700
|
{
|
|
694
701
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 2);
|
|
695
|
-
|
|
702
|
+
size_t count = _msgpack_be16(cb.u16);
|
|
696
703
|
if(count == 0) {
|
|
697
704
|
return object_complete(uk, rb_ary_new());
|
|
698
705
|
}
|
|
@@ -702,7 +709,7 @@ static int read_primitive(msgpack_unpacker_t* uk)
|
|
|
702
709
|
case 0xdd: // array 32
|
|
703
710
|
{
|
|
704
711
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 4);
|
|
705
|
-
|
|
712
|
+
size_t count = _msgpack_be32(cb.u32);
|
|
706
713
|
if(count == 0) {
|
|
707
714
|
return object_complete(uk, rb_ary_new());
|
|
708
715
|
}
|
|
@@ -712,7 +719,7 @@ static int read_primitive(msgpack_unpacker_t* uk)
|
|
|
712
719
|
case 0xde: // map 16
|
|
713
720
|
{
|
|
714
721
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 2);
|
|
715
|
-
|
|
722
|
+
size_t count = _msgpack_be16(cb.u16);
|
|
716
723
|
if(count == 0) {
|
|
717
724
|
return object_complete(uk, rb_hash_new());
|
|
718
725
|
}
|
|
@@ -722,7 +729,7 @@ static int read_primitive(msgpack_unpacker_t* uk)
|
|
|
722
729
|
case 0xdf: // map 32
|
|
723
730
|
{
|
|
724
731
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 4);
|
|
725
|
-
|
|
732
|
+
size_t count = _msgpack_be32(cb.u32);
|
|
726
733
|
if(count == 0) {
|
|
727
734
|
return object_complete(uk, rb_hash_new());
|
|
728
735
|
}
|
|
@@ -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: []
|