Merge pull request #9793 from ellemouton/tlvSizeBigSize

tlv: catch unhandled type in SizeBigSize
This commit is contained in:
Oliver Gugger 2025-05-07 19:21:57 +02:00 committed by GitHub
commit 8b413e89f1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 14 additions and 8 deletions

View File

@ -375,16 +375,22 @@ func DBigSize(r io.Reader, val interface{}, buf *[8]byte, l uint64) error {
return NewTypeForDecodingErr(val, "BigSize", l, 8) return NewTypeForDecodingErr(val, "BigSize", l, 8)
} }
// constraintUint32Or64 is a type constraint for uint32 or uint64 types.
type constraintUint32Or64 interface {
uint32 | uint64
}
// SizeBigSize returns a SizeFunc that can compute the length of BigSize. // SizeBigSize returns a SizeFunc that can compute the length of BigSize.
func SizeBigSize(val interface{}) SizeFunc { func SizeBigSize[T constraintUint32Or64](val *T) SizeFunc {
var size uint64 var size uint64
if i, ok := val.(*uint32); ok { switch i := any(val).(type) {
size = VarIntSize(uint64(*i)) case *uint32:
}
if i, ok := val.(*uint64); ok {
size = VarIntSize(uint64(*i)) size = VarIntSize(uint64(*i))
case *uint64:
size = VarIntSize(*i)
default:
panic(fmt.Sprintf("unexpected type %T for SizeBigSize", val))
} }
return func() uint64 { return func() uint64 {

View File

@ -273,14 +273,14 @@ func SortRecords(records []Record) {
// //
// NOTE: for uint32, we would only gain space reduction if the encoded value is // NOTE: for uint32, we would only gain space reduction if the encoded value is
// no greater than 65535, which requires at most 3 bytes to encode. // no greater than 65535, which requires at most 3 bytes to encode.
func MakeBigSizeRecord(typ Type, val interface{}) Record { func MakeBigSizeRecord[T constraintUint32Or64](typ Type, val *T) Record {
var ( var (
staticSize uint64 staticSize uint64
sizeFunc SizeFunc sizeFunc SizeFunc
encoder Encoder encoder Encoder
decoder Decoder decoder Decoder
) )
switch val.(type) { switch any(val).(type) {
case *uint32: case *uint32:
sizeFunc = SizeBigSize(val) sizeFunc = SizeBigSize(val)
encoder = EBigSize encoder = EBigSize