diff --git a/tape/dynamic.go b/tape/dynamic.go index 5b90ff9..01345ea 100644 --- a/tape/dynamic.go +++ b/tape/dynamic.go @@ -46,9 +46,16 @@ func EncodeAny(encoder *Encoder, value any, tag Tag) (n int, err error) { case reflect.Uint32: return encoder.WriteUint32(uint32(reflectValue.Uint())) case reflect.Int64: return encoder.WriteInt64(int64(reflectValue.Int())) case reflect.Uint64: return encoder.WriteUint64(uint64(reflectValue.Uint())) - case reflect.String: return EncodeAny(encoder, []byte(reflectValue.String()), tag) + case reflect.String: + if reflectValue.Len() > MaxStructureLength { + return 0, ErrTooLong + } + return EncodeAny(encoder, []byte(reflectValue.String()), tag) } if reflectValue.CanConvert(reflect.TypeOf(dummyBuffer)) { + if reflectValue.Len() > MaxStructureLength { + return 0, ErrTooLong + } if tag.Is(LBA) { nn, err := encoder.WriteUintN(uint64(reflectValue.Len()), tag.CN() + 1) n += nn; if err != nil { return n, err } @@ -64,8 +71,13 @@ func EncodeAny(encoder *Encoder, value any, tag Tag) (n int, err error) { case reflect.Slice: return encodeAnySlice(encoder, value, tag) // case reflect.Array: + // TODO: we can encode arrays. but can we decode into them? + // that's the fucken question. maybe we just do the first // return encodeAnySlice(encoder, reflect.ValueOf(value).Slice(0, reflectType.Len()).Interface(), tag) case reflect.Map: + if reflectValue.Len() > MaxStructureLength { + return 0, ErrTooLong + } if reflectType.Key() == reflect.TypeOf(uint16(0)) { return encodeAnyMap(encoder, value, tag) }