msgpack 1.7.2 → 1.7.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 +8 -0
- data/README.md +21 -12
- data/ext/msgpack/buffer.h +0 -24
- data/ext/msgpack/packer.h +4 -4
- data/ext/msgpack/unpacker.c +119 -73
- data/ext/msgpack/unpacker.h +7 -5
- data/ext/msgpack/unpacker_class.c +22 -11
- data/lib/msgpack/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fa4847fba5fd9dfbed01473471b038a0b06a0ee131395c9724a5bceeab7e9823
|
4
|
+
data.tar.gz: e80a7dfd7c92a1eaa76b3604027094f1dff4d65ba46babcf739019423dd37fad
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8f6cbd005ef5d490a2d99ccf45208984a6450ed797f8835884ff758bf71e41e02e397dc174801972386728216f147d09d375763fcc4d9eb853b99520ea40eb19
|
7
|
+
data.tar.gz: e0f6aafd4c147075fe7dcde2f54775cbd84b0d4b8c85b660f2569f4f790dfec979ecbef3da032e8a236558678a54dd8fa1e7ce5346c6cb042936d94037b1ec80
|
data/ChangeLog
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
2024-11-11 1.7.4
|
2
|
+
|
3
|
+
* Fixed a potental memory leak when recursive unpacker raise.
|
4
|
+
|
5
|
+
2024-10-03 1.7.3
|
6
|
+
|
7
|
+
* Limit initial containers pre-allocation to `SHRT_MAX` (32k) entries.
|
8
|
+
|
1
9
|
2023-07-18 1.7.2:
|
2
10
|
|
3
11
|
* Fix a potential GC bug when packing data using recursive extensions and buffers containing over 512KkiB of data (See #341).
|
data/README.md
CHANGED
@@ -8,15 +8,24 @@ and typical short strings only require an extra byte in addition to the strings
|
|
8
8
|
If you ever wished to use JSON for convenience (storing an image with metadata) but could
|
9
9
|
not for technical reasons (binary data, size, speed...), MessagePack is a perfect replacement.
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
11
|
+
```ruby
|
12
|
+
require 'msgpack'
|
13
|
+
msg = [1,2,3].to_msgpack #=> "\x93\x01\x02\x03"
|
14
|
+
MessagePack.unpack(msg) #=> [1,2,3]
|
15
|
+
```
|
16
|
+
|
17
|
+
Add msgpack to your Gemfile to install with Bundler:
|
18
|
+
|
19
|
+
```ruby
|
20
|
+
# Gemfile
|
21
|
+
gem 'msgpack'
|
22
|
+
```
|
14
23
|
|
15
|
-
|
24
|
+
Or, use RubyGems to install:
|
16
25
|
|
17
26
|
gem install msgpack
|
18
27
|
|
19
|
-
|
28
|
+
Or, build msgpack-ruby and install from a checked-out msgpack-ruby repository:
|
20
29
|
|
21
30
|
bundle
|
22
31
|
rake
|
@@ -27,11 +36,11 @@ or build msgpack-ruby and install:
|
|
27
36
|
|
28
37
|
* Create REST API returing MessagePack using Rails + [RABL](https://github.com/nesquena/rabl)
|
29
38
|
* Store objects efficiently serialized by msgpack on memcached or Redis
|
30
|
-
* In fact Redis supports msgpack in [EVAL-scripts](
|
39
|
+
* In fact Redis supports msgpack in [EVAL-scripts](https://redis.io/docs/latest/commands/eval/)
|
31
40
|
* Upload data in efficient format from mobile devices such as smartphones
|
32
41
|
* MessagePack works on iPhone/iPad and Android. See also [Objective-C](https://github.com/msgpack/msgpack-objectivec) and [Java](https://github.com/msgpack/msgpack-java) implementations
|
33
42
|
* Design a portable protocol to communicate with embedded devices
|
34
|
-
* Check also [Fluentd](
|
43
|
+
* Check also [Fluentd](https://www.fluentd.org) which is a log collector which uses msgpack for the log format (they say it uses JSON but actually it's msgpack, which is compatible with JSON)
|
35
44
|
* Exchange objects between software components written in different languages
|
36
45
|
* You'll need a flexible but efficient format so that components exchange objects while keeping compatibility
|
37
46
|
|
@@ -128,9 +137,9 @@ being serialized altogether by throwing an exception:
|
|
128
137
|
|
129
138
|
```ruby
|
130
139
|
class Symbol
|
131
|
-
|
132
|
-
|
133
|
-
|
140
|
+
def to_msgpack_ext
|
141
|
+
raise "Serialization of symbols prohibited"
|
142
|
+
end
|
134
143
|
end
|
135
144
|
|
136
145
|
MessagePack::DefaultFactory.register_type(0x00, Symbol)
|
@@ -276,8 +285,8 @@ If this directory has Gemfile.lock (generated with MRI), remove it beforehand.
|
|
276
285
|
|
277
286
|
## Updating documents
|
278
287
|
|
279
|
-
Online
|
280
|
-
|
288
|
+
Online documentation (https://ruby.msgpack.org) is generated from the gh-pages branch.
|
289
|
+
To update documents in gh-pages branch:
|
281
290
|
|
282
291
|
bundle exec rake doc
|
283
292
|
git checkout gh-pages
|
data/ext/msgpack/buffer.h
CHANGED
@@ -81,20 +81,6 @@ struct msgpack_buffer_chunk_t {
|
|
81
81
|
bool rmem;
|
82
82
|
};
|
83
83
|
|
84
|
-
union msgpack_buffer_cast_block_t {
|
85
|
-
char buffer[8];
|
86
|
-
uint8_t u8;
|
87
|
-
uint16_t u16;
|
88
|
-
uint32_t u32;
|
89
|
-
uint64_t u64;
|
90
|
-
int8_t i8;
|
91
|
-
int16_t i16;
|
92
|
-
int32_t i32;
|
93
|
-
int64_t i64;
|
94
|
-
float f;
|
95
|
-
double d;
|
96
|
-
};
|
97
|
-
|
98
84
|
struct msgpack_buffer_t {
|
99
85
|
char* read_buffer;
|
100
86
|
char* tail_buffer_end;
|
@@ -107,8 +93,6 @@ struct msgpack_buffer_t {
|
|
107
93
|
char* rmem_end;
|
108
94
|
void** rmem_owner;
|
109
95
|
|
110
|
-
union msgpack_buffer_cast_block_t cast_block;
|
111
|
-
|
112
96
|
VALUE io;
|
113
97
|
VALUE io_buffer;
|
114
98
|
ID io_write_all_method;
|
@@ -383,14 +367,6 @@ static inline size_t msgpack_buffer_skip_nonblock(msgpack_buffer_t* b, size_t le
|
|
383
367
|
return length;
|
384
368
|
}
|
385
369
|
|
386
|
-
static inline union msgpack_buffer_cast_block_t* msgpack_buffer_read_cast_block(msgpack_buffer_t* b, size_t n)
|
387
|
-
{
|
388
|
-
if(!msgpack_buffer_read_all(b, b->cast_block.buffer, n)) {
|
389
|
-
return NULL;
|
390
|
-
}
|
391
|
-
return &b->cast_block;
|
392
|
-
}
|
393
|
-
|
394
370
|
size_t msgpack_buffer_read_to_string_nonblock(msgpack_buffer_t* b, VALUE string, size_t length);
|
395
371
|
|
396
372
|
static inline size_t msgpack_buffer_read_to_string(msgpack_buffer_t* b, VALUE string, size_t length)
|
data/ext/msgpack/packer.h
CHANGED
@@ -31,15 +31,15 @@ typedef struct msgpack_packer_t msgpack_packer_t;
|
|
31
31
|
struct msgpack_packer_t {
|
32
32
|
msgpack_buffer_t buffer;
|
33
33
|
|
34
|
-
bool compatibility_mode;
|
35
|
-
bool has_bigint_ext_type;
|
36
|
-
bool has_symbol_ext_type;
|
37
|
-
|
38
34
|
ID to_msgpack_method;
|
39
35
|
VALUE to_msgpack_arg;
|
40
36
|
|
41
37
|
VALUE buffer_ref;
|
42
38
|
|
39
|
+
bool compatibility_mode;
|
40
|
+
bool has_bigint_ext_type;
|
41
|
+
bool has_symbol_ext_type;
|
42
|
+
|
43
43
|
/* options */
|
44
44
|
bool comaptibility_mode;
|
45
45
|
msgpack_packer_ext_registry_t ext_registry;
|
data/ext/msgpack/unpacker.c
CHANGED
@@ -20,13 +20,36 @@
|
|
20
20
|
#include "rmem.h"
|
21
21
|
#include "extension_value_class.h"
|
22
22
|
#include <assert.h>
|
23
|
+
#include <limits.h>
|
23
24
|
|
24
25
|
#if !defined(HAVE_RB_PROC_CALL_WITH_BLOCK)
|
25
26
|
#define rb_proc_call_with_block(recv, argc, argv, block) rb_funcallv(recv, rb_intern("call"), argc, argv)
|
26
27
|
#endif
|
27
28
|
|
29
|
+
struct protected_proc_call_args {
|
30
|
+
VALUE proc;
|
31
|
+
int argc;
|
32
|
+
VALUE *argv;
|
33
|
+
};
|
34
|
+
|
35
|
+
static VALUE protected_proc_call_safe(VALUE _args) {
|
36
|
+
struct protected_proc_call_args *args = (struct protected_proc_call_args *)_args;
|
37
|
+
|
38
|
+
return rb_proc_call_with_block(args->proc, args->argc, args->argv, Qnil);
|
39
|
+
}
|
40
|
+
|
41
|
+
static VALUE protected_proc_call(VALUE proc, int argc, VALUE *argv, int *raised) {
|
42
|
+
struct protected_proc_call_args args = {
|
43
|
+
.proc = proc,
|
44
|
+
.argc = argc,
|
45
|
+
.argv = argv,
|
46
|
+
};
|
47
|
+
return rb_protect(protected_proc_call_safe, (VALUE)&args, raised);
|
48
|
+
}
|
49
|
+
|
28
50
|
static int RAW_TYPE_STRING = 256;
|
29
51
|
static int RAW_TYPE_BINARY = 257;
|
52
|
+
static int16_t INITIAL_BUFFER_CAPACITY_MAX = SHRT_MAX;
|
30
53
|
|
31
54
|
static msgpack_rmem_t s_stack_rmem;
|
32
55
|
|
@@ -37,6 +60,11 @@ static inline VALUE rb_hash_new_capa(long capa)
|
|
37
60
|
}
|
38
61
|
#endif
|
39
62
|
|
63
|
+
static inline int16_t initial_buffer_size(long size)
|
64
|
+
{
|
65
|
+
return (size > INITIAL_BUFFER_CAPACITY_MAX) ? INITIAL_BUFFER_CAPACITY_MAX : size;
|
66
|
+
}
|
67
|
+
|
40
68
|
void msgpack_unpacker_static_init(void)
|
41
69
|
{
|
42
70
|
assert(sizeof(msgpack_unpacker_stack_entry_t) * MSGPACK_UNPACKER_STACK_CAPACITY <= MSGPACK_RMEM_PAGE_SIZE);
|
@@ -51,12 +79,9 @@ void msgpack_unpacker_static_destroy(void)
|
|
51
79
|
|
52
80
|
#define HEAD_BYTE_REQUIRED 0xc1
|
53
81
|
|
54
|
-
static inline msgpack_unpacker_stack_t*
|
55
|
-
msgpack_unpacker_stack_t *stack = ZALLOC(msgpack_unpacker_stack_t);
|
82
|
+
static inline void _msgpack_unpacker_stack_init(msgpack_unpacker_stack_t *stack) {
|
56
83
|
stack->capacity = MSGPACK_UNPACKER_STACK_CAPACITY;
|
57
84
|
stack->data = msgpack_rmem_alloc(&s_stack_rmem);
|
58
|
-
/*memset(uk->stack, 0, MSGPACK_UNPACKER_STACK_CAPACITY);*/
|
59
|
-
return stack;
|
60
85
|
}
|
61
86
|
|
62
87
|
void _msgpack_unpacker_init(msgpack_unpacker_t* uk)
|
@@ -68,32 +93,32 @@ void _msgpack_unpacker_init(msgpack_unpacker_t* uk)
|
|
68
93
|
uk->last_object = Qnil;
|
69
94
|
uk->reading_raw = Qnil;
|
70
95
|
|
71
|
-
uk->stack
|
96
|
+
_msgpack_unpacker_stack_init(&uk->stack);
|
72
97
|
}
|
73
98
|
|
74
99
|
static inline void _msgpack_unpacker_free_stack(msgpack_unpacker_stack_t* stack) {
|
75
100
|
if (!msgpack_rmem_free(&s_stack_rmem, stack->data)) {
|
76
101
|
rb_bug("Failed to free an rmem pointer, memory leak?");
|
77
102
|
}
|
78
|
-
|
103
|
+
stack->data = NULL;
|
104
|
+
stack->depth = 0;
|
79
105
|
}
|
80
106
|
|
81
107
|
void _msgpack_unpacker_destroy(msgpack_unpacker_t* uk)
|
82
108
|
{
|
83
|
-
_msgpack_unpacker_free_stack(uk->stack);
|
109
|
+
_msgpack_unpacker_free_stack(&uk->stack);
|
84
110
|
msgpack_buffer_destroy(UNPACKER_BUFFER_(uk));
|
85
111
|
}
|
86
112
|
|
87
113
|
void msgpack_unpacker_mark_stack(msgpack_unpacker_stack_t* stack)
|
88
114
|
{
|
89
|
-
|
115
|
+
if (stack->data) {
|
90
116
|
msgpack_unpacker_stack_entry_t* s = stack->data;
|
91
117
|
msgpack_unpacker_stack_entry_t* send = stack->data + stack->depth;
|
92
118
|
for(; s < send; s++) {
|
93
119
|
rb_gc_mark(s->object);
|
94
120
|
rb_gc_mark(s->key);
|
95
121
|
}
|
96
|
-
stack = stack->parent;
|
97
122
|
}
|
98
123
|
}
|
99
124
|
|
@@ -101,7 +126,7 @@ void msgpack_unpacker_mark(msgpack_unpacker_t* uk)
|
|
101
126
|
{
|
102
127
|
rb_gc_mark(uk->last_object);
|
103
128
|
rb_gc_mark(uk->reading_raw);
|
104
|
-
msgpack_unpacker_mark_stack(uk->stack);
|
129
|
+
msgpack_unpacker_mark_stack(&uk->stack);
|
105
130
|
/* See MessagePack_Buffer_wrap */
|
106
131
|
/* msgpack_buffer_mark(UNPACKER_BUFFER_(uk)); */
|
107
132
|
rb_gc_mark(uk->buffer_ref);
|
@@ -114,8 +139,8 @@ void _msgpack_unpacker_reset(msgpack_unpacker_t* uk)
|
|
114
139
|
|
115
140
|
uk->head_byte = HEAD_BYTE_REQUIRED;
|
116
141
|
|
117
|
-
/*memset(uk->stack, 0, sizeof(msgpack_unpacker_t) * uk->stack
|
118
|
-
uk->stack
|
142
|
+
/*memset(uk->stack, 0, sizeof(msgpack_unpacker_t) * uk->stack.depth);*/
|
143
|
+
uk->stack.depth = 0;
|
119
144
|
uk->last_object = Qnil;
|
120
145
|
uk->reading_raw = Qnil;
|
121
146
|
uk->reading_raw_remaining = 0;
|
@@ -179,7 +204,12 @@ static inline int object_complete_ext(msgpack_unpacker_t* uk, int ext_type, VALU
|
|
179
204
|
if(proc != Qnil) {
|
180
205
|
VALUE obj;
|
181
206
|
VALUE arg = (str == Qnil ? rb_str_buf_new(0) : str);
|
182
|
-
|
207
|
+
int raised;
|
208
|
+
obj = protected_proc_call(proc, 1, &arg, &raised);
|
209
|
+
if (raised) {
|
210
|
+
uk->last_object = rb_errinfo();
|
211
|
+
return PRIMITIVE_RECURSIVE_RAISED;
|
212
|
+
}
|
183
213
|
return object_complete(uk, obj);
|
184
214
|
}
|
185
215
|
|
@@ -194,35 +224,35 @@ static inline int object_complete_ext(msgpack_unpacker_t* uk, int ext_type, VALU
|
|
194
224
|
/* stack funcs */
|
195
225
|
static inline msgpack_unpacker_stack_entry_t* _msgpack_unpacker_stack_entry_top(msgpack_unpacker_t* uk)
|
196
226
|
{
|
197
|
-
return &uk->stack
|
227
|
+
return &uk->stack.data[uk->stack.depth-1];
|
198
228
|
}
|
199
229
|
|
200
230
|
static inline int _msgpack_unpacker_stack_push(msgpack_unpacker_t* uk, enum stack_type_t type, size_t count, VALUE object)
|
201
231
|
{
|
202
232
|
reset_head_byte(uk);
|
203
233
|
|
204
|
-
if(uk->stack
|
234
|
+
if(uk->stack.capacity - uk->stack.depth <= 0) {
|
205
235
|
return PRIMITIVE_STACK_TOO_DEEP;
|
206
236
|
}
|
207
237
|
|
208
|
-
msgpack_unpacker_stack_entry_t* next = &uk->stack
|
238
|
+
msgpack_unpacker_stack_entry_t* next = &uk->stack.data[uk->stack.depth];
|
209
239
|
next->count = count;
|
210
240
|
next->type = type;
|
211
241
|
next->object = object;
|
212
242
|
next->key = Qnil;
|
213
243
|
|
214
|
-
uk->stack
|
244
|
+
uk->stack.depth++;
|
215
245
|
return PRIMITIVE_CONTAINER_START;
|
216
246
|
}
|
217
247
|
|
218
|
-
static inline
|
248
|
+
static inline size_t msgpack_unpacker_stack_pop(msgpack_unpacker_t* uk)
|
219
249
|
{
|
220
|
-
return --uk->stack
|
250
|
+
return --uk->stack.depth;
|
221
251
|
}
|
222
252
|
|
223
253
|
static inline bool msgpack_unpacker_stack_is_empty(msgpack_unpacker_t* uk)
|
224
254
|
{
|
225
|
-
return uk->stack
|
255
|
+
return uk->stack.depth == 0;
|
226
256
|
}
|
227
257
|
|
228
258
|
#ifdef USE_CASE_RANGE
|
@@ -241,16 +271,29 @@ static inline bool msgpack_unpacker_stack_is_empty(msgpack_unpacker_t* uk)
|
|
241
271
|
|
242
272
|
#endif
|
243
273
|
|
274
|
+
union msgpack_buffer_cast_block_t {
|
275
|
+
char buffer[8];
|
276
|
+
uint8_t u8;
|
277
|
+
uint16_t u16;
|
278
|
+
uint32_t u32;
|
279
|
+
uint64_t u64;
|
280
|
+
int8_t i8;
|
281
|
+
int16_t i16;
|
282
|
+
int32_t i32;
|
283
|
+
int64_t i64;
|
284
|
+
float f;
|
285
|
+
double d;
|
286
|
+
};
|
244
287
|
|
245
288
|
#define READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, n) \
|
246
|
-
union msgpack_buffer_cast_block_t
|
247
|
-
if(
|
289
|
+
union msgpack_buffer_cast_block_t cb; \
|
290
|
+
if (!msgpack_buffer_read_all(UNPACKER_BUFFER_(uk), (char *)&cb.buffer, n)) { \
|
248
291
|
return PRIMITIVE_EOF; \
|
249
292
|
}
|
250
293
|
|
251
294
|
static inline bool is_reading_map_key(msgpack_unpacker_t* uk)
|
252
295
|
{
|
253
|
-
if(uk->stack
|
296
|
+
if(uk->stack.depth > 0) {
|
254
297
|
msgpack_unpacker_stack_entry_t* top = _msgpack_unpacker_stack_entry_top(uk);
|
255
298
|
if(top->type == STACK_TYPE_MAP_KEY) {
|
256
299
|
return true;
|
@@ -305,14 +348,15 @@ static inline int read_raw_body_begin(msgpack_unpacker_t* uk, int raw_type)
|
|
305
348
|
reset_head_byte(uk);
|
306
349
|
uk->reading_raw_remaining = 0;
|
307
350
|
|
308
|
-
|
309
|
-
|
310
|
-
uk->
|
311
|
-
|
312
|
-
obj = rb_proc_call_with_block(proc, 1, &uk->self, Qnil);
|
351
|
+
_msgpack_unpacker_stack_push(uk, STACK_TYPE_RECURSIVE, 1, Qnil);
|
352
|
+
int raised;
|
353
|
+
obj = protected_proc_call(proc, 1, &uk->self, &raised);
|
354
|
+
msgpack_unpacker_stack_pop(uk);
|
313
355
|
|
314
|
-
|
315
|
-
|
356
|
+
if (raised) {
|
357
|
+
uk->last_object = rb_errinfo();
|
358
|
+
return PRIMITIVE_RECURSIVE_RAISED;
|
359
|
+
}
|
316
360
|
|
317
361
|
return object_complete(uk, obj);
|
318
362
|
}
|
@@ -375,14 +419,14 @@ static int read_primitive(msgpack_unpacker_t* uk)
|
|
375
419
|
if(count == 0) {
|
376
420
|
return object_complete(uk, rb_ary_new());
|
377
421
|
}
|
378
|
-
return _msgpack_unpacker_stack_push(uk, STACK_TYPE_ARRAY, count, rb_ary_new2(count));
|
422
|
+
return _msgpack_unpacker_stack_push(uk, STACK_TYPE_ARRAY, count, rb_ary_new2(initial_buffer_size(count)));
|
379
423
|
|
380
424
|
SWITCH_RANGE(b, 0x80, 0x8f) // FixMap
|
381
425
|
int count = b & 0x0f;
|
382
426
|
if(count == 0) {
|
383
427
|
return object_complete(uk, rb_hash_new());
|
384
428
|
}
|
385
|
-
return _msgpack_unpacker_stack_push(uk, STACK_TYPE_MAP_KEY, count*2, rb_hash_new_capa(count));
|
429
|
+
return _msgpack_unpacker_stack_push(uk, STACK_TYPE_MAP_KEY, count*2, rb_hash_new_capa(initial_buffer_size(count)));
|
386
430
|
|
387
431
|
SWITCH_RANGE(b, 0xc0, 0xdf) // Variable
|
388
432
|
switch(b) {
|
@@ -400,8 +444,8 @@ static int read_primitive(msgpack_unpacker_t* uk)
|
|
400
444
|
case 0xc7: // ext 8
|
401
445
|
{
|
402
446
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 2);
|
403
|
-
uint8_t length = cb
|
404
|
-
int ext_type = (signed char) cb
|
447
|
+
uint8_t length = cb.u8;
|
448
|
+
int ext_type = (signed char) cb.buffer[1];
|
405
449
|
if(length == 0) {
|
406
450
|
return object_complete_ext(uk, ext_type, Qnil);
|
407
451
|
}
|
@@ -412,8 +456,8 @@ static int read_primitive(msgpack_unpacker_t* uk)
|
|
412
456
|
case 0xc8: // ext 16
|
413
457
|
{
|
414
458
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 3);
|
415
|
-
uint16_t length = _msgpack_be16(cb
|
416
|
-
int ext_type = (signed char) cb
|
459
|
+
uint16_t length = _msgpack_be16(cb.u16);
|
460
|
+
int ext_type = (signed char) cb.buffer[2];
|
417
461
|
if(length == 0) {
|
418
462
|
return object_complete_ext(uk, ext_type, Qnil);
|
419
463
|
}
|
@@ -424,8 +468,8 @@ static int read_primitive(msgpack_unpacker_t* uk)
|
|
424
468
|
case 0xc9: // ext 32
|
425
469
|
{
|
426
470
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 5);
|
427
|
-
uint32_t length = _msgpack_be32(cb
|
428
|
-
int ext_type = (signed char) cb
|
471
|
+
uint32_t length = _msgpack_be32(cb.u32);
|
472
|
+
int ext_type = (signed char) cb.buffer[4];
|
429
473
|
if(length == 0) {
|
430
474
|
return object_complete_ext(uk, ext_type, Qnil);
|
431
475
|
}
|
@@ -436,77 +480,77 @@ static int read_primitive(msgpack_unpacker_t* uk)
|
|
436
480
|
case 0xca: // float
|
437
481
|
{
|
438
482
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 4);
|
439
|
-
cb
|
440
|
-
return object_complete(uk, rb_float_new(cb
|
483
|
+
cb.u32 = _msgpack_be_float(cb.u32);
|
484
|
+
return object_complete(uk, rb_float_new(cb.f));
|
441
485
|
}
|
442
486
|
|
443
487
|
case 0xcb: // double
|
444
488
|
{
|
445
489
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 8);
|
446
|
-
cb
|
447
|
-
return object_complete(uk, rb_float_new(cb
|
490
|
+
cb.u64 = _msgpack_be_double(cb.u64);
|
491
|
+
return object_complete(uk, rb_float_new(cb.d));
|
448
492
|
}
|
449
493
|
|
450
494
|
case 0xcc: // unsigned int 8
|
451
495
|
{
|
452
496
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 1);
|
453
|
-
uint8_t u8 = cb
|
497
|
+
uint8_t u8 = cb.u8;
|
454
498
|
return object_complete(uk, INT2NUM((int)u8));
|
455
499
|
}
|
456
500
|
|
457
501
|
case 0xcd: // unsigned int 16
|
458
502
|
{
|
459
503
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 2);
|
460
|
-
uint16_t u16 = _msgpack_be16(cb
|
504
|
+
uint16_t u16 = _msgpack_be16(cb.u16);
|
461
505
|
return object_complete(uk, INT2NUM((int)u16));
|
462
506
|
}
|
463
507
|
|
464
508
|
case 0xce: // unsigned int 32
|
465
509
|
{
|
466
510
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 4);
|
467
|
-
uint32_t u32 = _msgpack_be32(cb
|
511
|
+
uint32_t u32 = _msgpack_be32(cb.u32);
|
468
512
|
return object_complete(uk, ULONG2NUM(u32)); // long at least 32 bits
|
469
513
|
}
|
470
514
|
|
471
515
|
case 0xcf: // unsigned int 64
|
472
516
|
{
|
473
517
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 8);
|
474
|
-
uint64_t u64 = _msgpack_be64(cb
|
518
|
+
uint64_t u64 = _msgpack_be64(cb.u64);
|
475
519
|
return object_complete(uk, rb_ull2inum(u64));
|
476
520
|
}
|
477
521
|
|
478
522
|
case 0xd0: // signed int 8
|
479
523
|
{
|
480
524
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 1);
|
481
|
-
int8_t i8 = cb
|
525
|
+
int8_t i8 = cb.i8;
|
482
526
|
return object_complete(uk, INT2NUM((int)i8));
|
483
527
|
}
|
484
528
|
|
485
529
|
case 0xd1: // signed int 16
|
486
530
|
{
|
487
531
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 2);
|
488
|
-
int16_t i16 = _msgpack_be16(cb
|
532
|
+
int16_t i16 = _msgpack_be16(cb.i16);
|
489
533
|
return object_complete(uk, INT2NUM((int)i16));
|
490
534
|
}
|
491
535
|
|
492
536
|
case 0xd2: // signed int 32
|
493
537
|
{
|
494
538
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 4);
|
495
|
-
int32_t i32 = _msgpack_be32(cb
|
539
|
+
int32_t i32 = _msgpack_be32(cb.i32);
|
496
540
|
return object_complete(uk, LONG2NUM(i32)); // long at least 32 bits
|
497
541
|
}
|
498
542
|
|
499
543
|
case 0xd3: // signed int 64
|
500
544
|
{
|
501
545
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 8);
|
502
|
-
int64_t i64 = _msgpack_be64(cb
|
546
|
+
int64_t i64 = _msgpack_be64(cb.i64);
|
503
547
|
return object_complete(uk, rb_ll2inum(i64));
|
504
548
|
}
|
505
549
|
|
506
550
|
case 0xd4: // fixext 1
|
507
551
|
{
|
508
552
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 1);
|
509
|
-
int ext_type = cb
|
553
|
+
int ext_type = cb.i8;
|
510
554
|
uk->reading_raw_remaining = 1;
|
511
555
|
return read_raw_body_begin(uk, ext_type);
|
512
556
|
}
|
@@ -514,7 +558,7 @@ static int read_primitive(msgpack_unpacker_t* uk)
|
|
514
558
|
case 0xd5: // fixext 2
|
515
559
|
{
|
516
560
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 1);
|
517
|
-
int ext_type = cb
|
561
|
+
int ext_type = cb.i8;
|
518
562
|
uk->reading_raw_remaining = 2;
|
519
563
|
return read_raw_body_begin(uk, ext_type);
|
520
564
|
}
|
@@ -522,7 +566,7 @@ static int read_primitive(msgpack_unpacker_t* uk)
|
|
522
566
|
case 0xd6: // fixext 4
|
523
567
|
{
|
524
568
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 1);
|
525
|
-
int ext_type = cb
|
569
|
+
int ext_type = cb.i8;
|
526
570
|
uk->reading_raw_remaining = 4;
|
527
571
|
return read_raw_body_begin(uk, ext_type);
|
528
572
|
}
|
@@ -530,7 +574,7 @@ static int read_primitive(msgpack_unpacker_t* uk)
|
|
530
574
|
case 0xd7: // fixext 8
|
531
575
|
{
|
532
576
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 1);
|
533
|
-
int ext_type = cb
|
577
|
+
int ext_type = cb.i8;
|
534
578
|
uk->reading_raw_remaining = 8;
|
535
579
|
return read_raw_body_begin(uk, ext_type);
|
536
580
|
}
|
@@ -538,7 +582,7 @@ static int read_primitive(msgpack_unpacker_t* uk)
|
|
538
582
|
case 0xd8: // fixext 16
|
539
583
|
{
|
540
584
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 1);
|
541
|
-
int ext_type = cb
|
585
|
+
int ext_type = cb.i8;
|
542
586
|
uk->reading_raw_remaining = 16;
|
543
587
|
return read_raw_body_begin(uk, ext_type);
|
544
588
|
}
|
@@ -547,7 +591,7 @@ static int read_primitive(msgpack_unpacker_t* uk)
|
|
547
591
|
case 0xd9: // raw 8 / str 8
|
548
592
|
{
|
549
593
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 1);
|
550
|
-
uint8_t count = cb
|
594
|
+
uint8_t count = cb.u8;
|
551
595
|
/* read_raw_body_begin sets uk->reading_raw */
|
552
596
|
uk->reading_raw_remaining = count;
|
553
597
|
return read_raw_body_begin(uk, RAW_TYPE_STRING);
|
@@ -556,7 +600,7 @@ static int read_primitive(msgpack_unpacker_t* uk)
|
|
556
600
|
case 0xda: // raw 16 / str 16
|
557
601
|
{
|
558
602
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 2);
|
559
|
-
uint16_t count = _msgpack_be16(cb
|
603
|
+
uint16_t count = _msgpack_be16(cb.u16);
|
560
604
|
/* read_raw_body_begin sets uk->reading_raw */
|
561
605
|
uk->reading_raw_remaining = count;
|
562
606
|
return read_raw_body_begin(uk, RAW_TYPE_STRING);
|
@@ -565,7 +609,7 @@ static int read_primitive(msgpack_unpacker_t* uk)
|
|
565
609
|
case 0xdb: // raw 32 / str 32
|
566
610
|
{
|
567
611
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 4);
|
568
|
-
uint32_t count = _msgpack_be32(cb
|
612
|
+
uint32_t count = _msgpack_be32(cb.u32);
|
569
613
|
/* read_raw_body_begin sets uk->reading_raw */
|
570
614
|
uk->reading_raw_remaining = count;
|
571
615
|
return read_raw_body_begin(uk, RAW_TYPE_STRING);
|
@@ -574,7 +618,7 @@ static int read_primitive(msgpack_unpacker_t* uk)
|
|
574
618
|
case 0xc4: // bin 8
|
575
619
|
{
|
576
620
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 1);
|
577
|
-
uint8_t count = cb
|
621
|
+
uint8_t count = cb.u8;
|
578
622
|
/* read_raw_body_begin sets uk->reading_raw */
|
579
623
|
uk->reading_raw_remaining = count;
|
580
624
|
return read_raw_body_begin(uk, RAW_TYPE_BINARY);
|
@@ -583,7 +627,7 @@ static int read_primitive(msgpack_unpacker_t* uk)
|
|
583
627
|
case 0xc5: // bin 16
|
584
628
|
{
|
585
629
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 2);
|
586
|
-
uint16_t count = _msgpack_be16(cb
|
630
|
+
uint16_t count = _msgpack_be16(cb.u16);
|
587
631
|
/* read_raw_body_begin sets uk->reading_raw */
|
588
632
|
uk->reading_raw_remaining = count;
|
589
633
|
return read_raw_body_begin(uk, RAW_TYPE_BINARY);
|
@@ -592,7 +636,7 @@ static int read_primitive(msgpack_unpacker_t* uk)
|
|
592
636
|
case 0xc6: // bin 32
|
593
637
|
{
|
594
638
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 4);
|
595
|
-
uint32_t count = _msgpack_be32(cb
|
639
|
+
uint32_t count = _msgpack_be32(cb.u32);
|
596
640
|
/* read_raw_body_begin sets uk->reading_raw */
|
597
641
|
uk->reading_raw_remaining = count;
|
598
642
|
return read_raw_body_begin(uk, RAW_TYPE_BINARY);
|
@@ -601,41 +645,41 @@ static int read_primitive(msgpack_unpacker_t* uk)
|
|
601
645
|
case 0xdc: // array 16
|
602
646
|
{
|
603
647
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 2);
|
604
|
-
uint16_t count = _msgpack_be16(cb
|
648
|
+
uint16_t count = _msgpack_be16(cb.u16);
|
605
649
|
if(count == 0) {
|
606
650
|
return object_complete(uk, rb_ary_new());
|
607
651
|
}
|
608
|
-
return _msgpack_unpacker_stack_push(uk, STACK_TYPE_ARRAY, count, rb_ary_new2(count));
|
652
|
+
return _msgpack_unpacker_stack_push(uk, STACK_TYPE_ARRAY, count, rb_ary_new2(initial_buffer_size(count)));
|
609
653
|
}
|
610
654
|
|
611
655
|
case 0xdd: // array 32
|
612
656
|
{
|
613
657
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 4);
|
614
|
-
uint32_t count = _msgpack_be32(cb
|
658
|
+
uint32_t count = _msgpack_be32(cb.u32);
|
615
659
|
if(count == 0) {
|
616
660
|
return object_complete(uk, rb_ary_new());
|
617
661
|
}
|
618
|
-
return _msgpack_unpacker_stack_push(uk, STACK_TYPE_ARRAY, count, rb_ary_new2(count));
|
662
|
+
return _msgpack_unpacker_stack_push(uk, STACK_TYPE_ARRAY, count, rb_ary_new2(initial_buffer_size(count)));
|
619
663
|
}
|
620
664
|
|
621
665
|
case 0xde: // map 16
|
622
666
|
{
|
623
667
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 2);
|
624
|
-
uint16_t count = _msgpack_be16(cb
|
668
|
+
uint16_t count = _msgpack_be16(cb.u16);
|
625
669
|
if(count == 0) {
|
626
670
|
return object_complete(uk, rb_hash_new());
|
627
671
|
}
|
628
|
-
return _msgpack_unpacker_stack_push(uk, STACK_TYPE_MAP_KEY, count*2, rb_hash_new_capa(count));
|
672
|
+
return _msgpack_unpacker_stack_push(uk, STACK_TYPE_MAP_KEY, count*2, rb_hash_new_capa(initial_buffer_size(count)));
|
629
673
|
}
|
630
674
|
|
631
675
|
case 0xdf: // map 32
|
632
676
|
{
|
633
677
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 4);
|
634
|
-
uint32_t count = _msgpack_be32(cb
|
678
|
+
uint32_t count = _msgpack_be32(cb.u32);
|
635
679
|
if(count == 0) {
|
636
680
|
return object_complete(uk, rb_hash_new());
|
637
681
|
}
|
638
|
-
return _msgpack_unpacker_stack_push(uk, STACK_TYPE_MAP_KEY, count*2, rb_hash_new_capa(count));
|
682
|
+
return _msgpack_unpacker_stack_push(uk, STACK_TYPE_MAP_KEY, count*2, rb_hash_new_capa(initial_buffer_size(count)));
|
639
683
|
}
|
640
684
|
|
641
685
|
default:
|
@@ -661,12 +705,12 @@ int msgpack_unpacker_read_array_header(msgpack_unpacker_t* uk, uint32_t* result_
|
|
661
705
|
} else if(b == 0xdc) {
|
662
706
|
/* array 16 */
|
663
707
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 2);
|
664
|
-
*result_size = _msgpack_be16(cb
|
708
|
+
*result_size = _msgpack_be16(cb.u16);
|
665
709
|
|
666
710
|
} else if(b == 0xdd) {
|
667
711
|
/* array 32 */
|
668
712
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 4);
|
669
|
-
*result_size = _msgpack_be32(cb
|
713
|
+
*result_size = _msgpack_be32(cb.u32);
|
670
714
|
|
671
715
|
} else {
|
672
716
|
return PRIMITIVE_UNEXPECTED_TYPE;
|
@@ -689,12 +733,12 @@ int msgpack_unpacker_read_map_header(msgpack_unpacker_t* uk, uint32_t* result_si
|
|
689
733
|
} else if(b == 0xde) {
|
690
734
|
/* map 16 */
|
691
735
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 2);
|
692
|
-
*result_size = _msgpack_be16(cb
|
736
|
+
*result_size = _msgpack_be16(cb.u16);
|
693
737
|
|
694
738
|
} else if(b == 0xdf) {
|
695
739
|
/* map 32 */
|
696
740
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 4);
|
697
|
-
*result_size = _msgpack_be32(cb
|
741
|
+
*result_size = _msgpack_be32(cb.u32);
|
698
742
|
|
699
743
|
} else {
|
700
744
|
return PRIMITIVE_UNEXPECTED_TYPE;
|
@@ -740,6 +784,8 @@ int msgpack_unpacker_read(msgpack_unpacker_t* uk, size_t target_stack_depth)
|
|
740
784
|
}
|
741
785
|
top->type = STACK_TYPE_MAP_KEY;
|
742
786
|
break;
|
787
|
+
case STACK_TYPE_RECURSIVE:
|
788
|
+
return PRIMITIVE_OBJECT_COMPLETE;
|
743
789
|
}
|
744
790
|
size_t count = --top->count;
|
745
791
|
|
data/ext/msgpack/unpacker.h
CHANGED
@@ -31,6 +31,7 @@ enum stack_type_t {
|
|
31
31
|
STACK_TYPE_ARRAY,
|
32
32
|
STACK_TYPE_MAP_KEY,
|
33
33
|
STACK_TYPE_MAP_VALUE,
|
34
|
+
STACK_TYPE_RECURSIVE,
|
34
35
|
};
|
35
36
|
|
36
37
|
typedef struct {
|
@@ -44,31 +45,31 @@ struct msgpack_unpacker_stack_t {
|
|
44
45
|
size_t depth;
|
45
46
|
size_t capacity;
|
46
47
|
msgpack_unpacker_stack_entry_t *data;
|
47
|
-
msgpack_unpacker_stack_t *parent;
|
48
48
|
};
|
49
49
|
|
50
50
|
struct msgpack_unpacker_t {
|
51
51
|
msgpack_buffer_t buffer;
|
52
|
-
msgpack_unpacker_stack_t
|
53
|
-
unsigned int head_byte;
|
52
|
+
msgpack_unpacker_stack_t stack;
|
54
53
|
|
55
54
|
VALUE self;
|
56
55
|
VALUE last_object;
|
57
56
|
|
58
57
|
VALUE reading_raw;
|
59
58
|
size_t reading_raw_remaining;
|
60
|
-
int reading_raw_type;
|
61
59
|
|
62
60
|
VALUE buffer_ref;
|
63
61
|
|
64
62
|
msgpack_unpacker_ext_registry_t *ext_registry;
|
65
63
|
|
64
|
+
int reading_raw_type;
|
65
|
+
unsigned int head_byte;
|
66
|
+
|
66
67
|
/* options */
|
68
|
+
int symbol_ext_type;
|
67
69
|
bool symbolize_keys;
|
68
70
|
bool freeze;
|
69
71
|
bool allow_unknown_ext;
|
70
72
|
bool optimized_symbol_ext_type;
|
71
|
-
int symbol_ext_type;
|
72
73
|
};
|
73
74
|
|
74
75
|
#define UNPACKER_BUFFER_(uk) (&(uk)->buffer)
|
@@ -119,6 +120,7 @@ static inline void msgpack_unpacker_set_allow_unknown_ext(msgpack_unpacker_t* uk
|
|
119
120
|
#define PRIMITIVE_STACK_TOO_DEEP -3
|
120
121
|
#define PRIMITIVE_UNEXPECTED_TYPE -4
|
121
122
|
#define PRIMITIVE_UNEXPECTED_EXT_TYPE -5
|
123
|
+
#define PRIMITIVE_RECURSIVE_RAISED -6
|
122
124
|
|
123
125
|
int msgpack_unpacker_read(msgpack_unpacker_t* uk, size_t target_stack_depth);
|
124
126
|
|
@@ -58,14 +58,17 @@ static void Unpacker_mark(void *ptr)
|
|
58
58
|
|
59
59
|
static size_t Unpacker_memsize(const void *ptr)
|
60
60
|
{
|
61
|
+
const msgpack_unpacker_t* uk = ptr;
|
62
|
+
|
61
63
|
size_t total_size = sizeof(msgpack_unpacker_t);
|
62
64
|
|
63
|
-
const msgpack_unpacker_t* uk = ptr;
|
64
65
|
if (uk->ext_registry) {
|
65
66
|
total_size += sizeof(msgpack_unpacker_ext_registry_t) / (uk->ext_registry->borrow_count + 1);
|
66
67
|
}
|
67
68
|
|
68
|
-
|
69
|
+
if (uk->stack.data) {
|
70
|
+
total_size += (uk->stack.depth + 1) * sizeof(msgpack_unpacker_stack_t);
|
71
|
+
}
|
69
72
|
|
70
73
|
return total_size + msgpack_buffer_memsize(&uk->buffer);
|
71
74
|
}
|
@@ -156,20 +159,28 @@ static VALUE Unpacker_allow_unknown_ext_p(VALUE self)
|
|
156
159
|
return uk->allow_unknown_ext ? Qtrue : Qfalse;
|
157
160
|
}
|
158
161
|
|
159
|
-
NORETURN(static void raise_unpacker_error(int r))
|
162
|
+
NORETURN(static void raise_unpacker_error(msgpack_unpacker_t *uk, int r))
|
160
163
|
{
|
164
|
+
uk->stack.depth = 0;
|
161
165
|
switch(r) {
|
162
166
|
case PRIMITIVE_EOF:
|
163
167
|
rb_raise(rb_eEOFError, "end of buffer reached");
|
168
|
+
break;
|
164
169
|
case PRIMITIVE_INVALID_BYTE:
|
165
170
|
rb_raise(eMalformedFormatError, "invalid byte");
|
171
|
+
break;
|
166
172
|
case PRIMITIVE_STACK_TOO_DEEP:
|
167
173
|
rb_raise(eStackError, "stack level too deep");
|
174
|
+
break;
|
168
175
|
case PRIMITIVE_UNEXPECTED_TYPE:
|
169
176
|
rb_raise(eUnexpectedTypeError, "unexpected type");
|
177
|
+
break;
|
170
178
|
case PRIMITIVE_UNEXPECTED_EXT_TYPE:
|
171
|
-
// rb_bug("unexpected extension type");
|
172
179
|
rb_raise(eUnknownExtTypeError, "unexpected extension type");
|
180
|
+
break;
|
181
|
+
case PRIMITIVE_RECURSIVE_RAISED:
|
182
|
+
rb_exc_raise(msgpack_unpacker_get_last_object(uk));
|
183
|
+
break;
|
173
184
|
default:
|
174
185
|
rb_raise(eUnpackError, "logically unknown error %d", r);
|
175
186
|
}
|
@@ -190,7 +201,7 @@ static VALUE Unpacker_read(VALUE self)
|
|
190
201
|
|
191
202
|
int r = msgpack_unpacker_read(uk, 0);
|
192
203
|
if(r < 0) {
|
193
|
-
raise_unpacker_error(r);
|
204
|
+
raise_unpacker_error(uk, r);
|
194
205
|
}
|
195
206
|
|
196
207
|
return msgpack_unpacker_get_last_object(uk);
|
@@ -202,7 +213,7 @@ static VALUE Unpacker_skip(VALUE self)
|
|
202
213
|
|
203
214
|
int r = msgpack_unpacker_skip(uk, 0);
|
204
215
|
if(r < 0) {
|
205
|
-
raise_unpacker_error(r);
|
216
|
+
raise_unpacker_error(uk, r);
|
206
217
|
}
|
207
218
|
|
208
219
|
return Qnil;
|
@@ -214,7 +225,7 @@ static VALUE Unpacker_skip_nil(VALUE self)
|
|
214
225
|
|
215
226
|
int r = msgpack_unpacker_skip_nil(uk);
|
216
227
|
if(r < 0) {
|
217
|
-
raise_unpacker_error(r);
|
228
|
+
raise_unpacker_error(uk, r);
|
218
229
|
}
|
219
230
|
|
220
231
|
if(r) {
|
@@ -230,7 +241,7 @@ static VALUE Unpacker_read_array_header(VALUE self)
|
|
230
241
|
uint32_t size;
|
231
242
|
int r = msgpack_unpacker_read_array_header(uk, &size);
|
232
243
|
if(r < 0) {
|
233
|
-
raise_unpacker_error(r);
|
244
|
+
raise_unpacker_error(uk, r);
|
234
245
|
}
|
235
246
|
|
236
247
|
return ULONG2NUM(size); // long at least 32 bits
|
@@ -243,7 +254,7 @@ static VALUE Unpacker_read_map_header(VALUE self)
|
|
243
254
|
uint32_t size;
|
244
255
|
int r = msgpack_unpacker_read_map_header(uk, &size);
|
245
256
|
if(r < 0) {
|
246
|
-
raise_unpacker_error(
|
257
|
+
raise_unpacker_error(uk, r);
|
247
258
|
}
|
248
259
|
|
249
260
|
return ULONG2NUM(size); // long at least 32 bits
|
@@ -270,7 +281,7 @@ static VALUE Unpacker_each_impl(VALUE self)
|
|
270
281
|
if(r == PRIMITIVE_EOF) {
|
271
282
|
return Qnil;
|
272
283
|
}
|
273
|
-
raise_unpacker_error(r);
|
284
|
+
raise_unpacker_error(uk, r);
|
274
285
|
}
|
275
286
|
VALUE v = msgpack_unpacker_get_last_object(uk);
|
276
287
|
#ifdef JRUBY
|
@@ -369,7 +380,7 @@ static VALUE Unpacker_full_unpack(VALUE self)
|
|
369
380
|
|
370
381
|
int r = msgpack_unpacker_read(uk, 0);
|
371
382
|
if(r < 0) {
|
372
|
-
raise_unpacker_error(r);
|
383
|
+
raise_unpacker_error(uk, r);
|
373
384
|
}
|
374
385
|
|
375
386
|
/* raise if extra bytes follow */
|
data/lib/msgpack/version.rb
CHANGED
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.7.
|
4
|
+
version: 1.7.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sadayuki Furuhashi
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2024-11-11 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: bundler
|
@@ -208,7 +208,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
208
208
|
- !ruby/object:Gem::Version
|
209
209
|
version: '0'
|
210
210
|
requirements: []
|
211
|
-
rubygems_version: 3.
|
211
|
+
rubygems_version: 3.5.11
|
212
212
|
signing_key:
|
213
213
|
specification_version: 4
|
214
214
|
summary: MessagePack, a binary-based efficient data interchange format.
|