in internal/encoding/decode.go [1108:1149]
func readMapHeader(r *buffer.Buffer) (count uint32, _ error) {
type_, err := readType(r)
if err != nil {
return 0, err
}
length := r.Len()
switch type_ {
case TypeCodeMap8:
buf, ok := r.Next(2)
if !ok {
return 0, errors.New("invalid length")
}
_ = buf[1]
size := int(buf[0])
if size > length-1 {
return 0, errors.New("invalid length")
}
count = uint32(buf[1])
case TypeCodeMap32:
buf, ok := r.Next(8)
if !ok {
return 0, errors.New("invalid length")
}
_ = buf[7]
size := int(binary.BigEndian.Uint32(buf[:4]))
if size > length-4 {
return 0, errors.New("invalid length")
}
count = binary.BigEndian.Uint32(buf[4:8])
default:
return 0, fmt.Errorf("invalid map type %#02x", type_)
}
if int(count) > r.Len() {
return 0, errors.New("invalid length")
}
return count, nil
}