msgpack-ruby icon indicating copy to clipboard operation
msgpack-ruby copied to clipboard

Unpacker's buffer is broken after EOF

Open andrew-aladev opened this issue 6 years ago • 1 comments

Lets feed unpacker's buffer with some object. We can "forget" to feed the last byte.

s = MessagePack::Packer.new.pack({ "fit" => true }).to_s
u = MessagePack::Unpacker.new
(s.length - 1).times { |i| u.feed s[i] }
puts s.length - u.buffer.size

> 1

Now we are trying to read some data.

u.read

> EOFError

puts u.buffer.size

> 0

Buffer is broken, we couldn't clear it. But we could feed the last byte and read our message.

u.buffer.clear
u.feed s[-1]
puts u.read

> {"fit"=>true}

I think that it is an issue with some pointer that should be reverted after some error like EOF.

andrew-aladev avatar Jun 21 '18 13:06 andrew-aladev

I can reproduce

require 'msgpack'

s = MessagePack::Packer.new.pack({ "fit" => true }).to_s
u = MessagePack::Unpacker.new
(s.length - 1).times { |i| u.feed s[i] }
p s.length - u.buffer.size # => 1
p u.read
p u.buffer.size
u.buffer.clear
u.feed s[-1]
p u.read

But I'm not sure this is a bug. You tried to read something - it wasn't there so you got an error. It doesn't push back into the buffer what it used to do that. Is it normal to expect data something consumed in a failed read to be pushed back?

Open to discussion.

chrisseaton avatar Jul 20 '22 12:07 chrisseaton