in internal/encoding/decode.go [333:373]
func readListHeader(r *buffer.Buffer) (length int64, _ error) {
type_, err := readType(r)
if err != nil {
return 0, err
}
listLength := r.Len()
switch type_ {
case TypeCodeList0:
return 0, nil
case TypeCodeList8:
buf, ok := r.Next(2)
if !ok {
return 0, errors.New("invalid length")
}
_ = buf[1]
size := int(buf[0])
if size > listLength-1 {
return 0, errors.New("invalid length")
}
length = int64(buf[1])
case TypeCodeList32:
buf, ok := r.Next(8)
if !ok {
return 0, errors.New("invalid length")
}
_ = buf[7]
size := int(binary.BigEndian.Uint32(buf[:4]))
if size > listLength-4 {
return 0, errors.New("invalid length")
}
length = int64(binary.BigEndian.Uint32(buf[4:8]))
default:
return 0, fmt.Errorf("type code %#02x is not a recognized list type", type_)
}
return length, nil
}