diff --git a/ext/msgpack/unpacker.c b/ext/msgpack/unpacker.c index 2178c9b1..7ee9463f 100644 --- a/ext/msgpack/unpacker.c +++ b/ext/msgpack/unpacker.c @@ -95,7 +95,8 @@ void msgpack_unpacker_static_destroy(void) msgpack_rmem_destroy(&s_stack_rmem); } -#define HEAD_BYTE_REQUIRED 0xc1 +/* outside 0..255 so it never collides with a real byte, including the invalid 0xc1 */ +#define HEAD_BYTE_REQUIRED 0x100 static inline bool _msgpack_unpacker_stack_init(msgpack_unpacker_stack_t *stack) { if (!stack->data) { diff --git a/spec/cruby/unpacker_spec.rb b/spec/cruby/unpacker_spec.rb index ae8c9b22..068e1c07 100644 --- a/spec/cruby/unpacker_spec.rb +++ b/spec/cruby/unpacker_spec.rb @@ -67,5 +67,33 @@ unpacker.skip }.should raise_error(MessagePack::MalformedFormatError) end + + it 'skip_nil keeps invalid byte' do + unpacker.feed("\xc1\x01") + unpacker.skip_nil.should == false + lambda { + unpacker.read + }.should raise_error(MessagePack::MalformedFormatError) + end + + it 'read_array_header keeps invalid byte' do + unpacker.feed("\xc1\x01") + lambda { + unpacker.read_array_header + }.should raise_error(MessagePack::UnpackError) + lambda { + unpacker.read + }.should raise_error(MessagePack::MalformedFormatError) + end + + it 'read_map_header keeps invalid byte' do + unpacker.feed("\xc1\x01") + lambda { + unpacker.read_map_header + }.should raise_error(MessagePack::UnpackError) + lambda { + unpacker.read + }.should raise_error(MessagePack::MalformedFormatError) + end end