msgpack-ruby
msgpack-ruby copied to clipboard
Unpacker's buffer is broken after EOF
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.
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.