|
|
|
@ -820,6 +820,16 @@ func (s *Stream) Kind() (kind Kind, size uint64, err error) { |
|
|
|
|
func (s *Stream) readKind() (kind Kind, size uint64, err error) { |
|
|
|
|
b, err := s.readByte() |
|
|
|
|
if err != nil { |
|
|
|
|
if len(s.stack) == 0 { |
|
|
|
|
// At toplevel, Adjust the error to actual EOF. io.EOF is
|
|
|
|
|
// used by callers to determine when to stop decoding.
|
|
|
|
|
switch err { |
|
|
|
|
case io.ErrUnexpectedEOF: |
|
|
|
|
err = io.EOF |
|
|
|
|
case ErrValueTooLarge: |
|
|
|
|
err = io.EOF |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return 0, 0, err |
|
|
|
|
} |
|
|
|
|
s.byteval = 0 |
|
|
|
@ -876,9 +886,6 @@ func (s *Stream) readUint(size byte) (uint64, error) { |
|
|
|
|
return 0, nil |
|
|
|
|
case 1: |
|
|
|
|
b, err := s.readByte() |
|
|
|
|
if err == io.EOF { |
|
|
|
|
err = io.ErrUnexpectedEOF |
|
|
|
|
} |
|
|
|
|
return uint64(b), err |
|
|
|
|
default: |
|
|
|
|
start := int(8 - size) |
|
|
|
@ -899,10 +906,9 @@ func (s *Stream) readUint(size byte) (uint64, error) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (s *Stream) readFull(buf []byte) (err error) { |
|
|
|
|
if s.limited && s.remaining < uint64(len(buf)) { |
|
|
|
|
return ErrValueTooLarge |
|
|
|
|
if err := s.willRead(uint64(len(buf))); err != nil { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
s.willRead(uint64(len(buf))) |
|
|
|
|
var nn, n int |
|
|
|
|
for n < len(buf) && err == nil { |
|
|
|
|
nn, err = s.r.Read(buf[n:]) |
|
|
|
@ -915,23 +921,32 @@ func (s *Stream) readFull(buf []byte) (err error) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (s *Stream) readByte() (byte, error) { |
|
|
|
|
if s.limited && s.remaining == 0 { |
|
|
|
|
return 0, io.EOF |
|
|
|
|
if err := s.willRead(1); err != nil { |
|
|
|
|
return 0, err |
|
|
|
|
} |
|
|
|
|
s.willRead(1) |
|
|
|
|
b, err := s.r.ReadByte() |
|
|
|
|
if len(s.stack) > 0 && err == io.EOF { |
|
|
|
|
if err == io.EOF { |
|
|
|
|
err = io.ErrUnexpectedEOF |
|
|
|
|
} |
|
|
|
|
return b, err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (s *Stream) willRead(n uint64) { |
|
|
|
|
func (s *Stream) willRead(n uint64) error { |
|
|
|
|
s.kind = -1 // rearm Kind
|
|
|
|
|
if s.limited { |
|
|
|
|
s.remaining -= n |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if len(s.stack) > 0 { |
|
|
|
|
// check list overflow
|
|
|
|
|
tos := s.stack[len(s.stack)-1] |
|
|
|
|
if n > tos.size-tos.pos { |
|
|
|
|
return ErrElemTooLarge |
|
|
|
|
} |
|
|
|
|
s.stack[len(s.stack)-1].pos += n |
|
|
|
|
} |
|
|
|
|
if s.limited { |
|
|
|
|
if n > s.remaining { |
|
|
|
|
return ErrValueTooLarge |
|
|
|
|
} |
|
|
|
|
s.remaining -= n |
|
|
|
|
} |
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|