forked from quic-go/quic-go
quicvarint: improve panic message for numbers larger 2^62 (#5410)
This commit is contained in:
@@ -20,6 +20,14 @@ const (
|
|||||||
maxVarInt8 = 4611686018427387903
|
maxVarInt8 = 4611686018427387903
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type varintLengthError struct {
|
||||||
|
Num uint64
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *varintLengthError) Error() string {
|
||||||
|
return fmt.Sprintf("value doesn't fit into 62 bits: %d", e.Num)
|
||||||
|
}
|
||||||
|
|
||||||
// Read reads a number in the QUIC varint format from r.
|
// Read reads a number in the QUIC varint format from r.
|
||||||
func Read(r io.ByteReader) (uint64, error) {
|
func Read(r io.ByteReader) (uint64, error) {
|
||||||
firstByte, err := r.ReadByte()
|
firstByte, err := r.ReadByte()
|
||||||
@@ -118,7 +126,7 @@ func Append(b []byte, i uint64) []byte {
|
|||||||
uint8(i >> 24), uint8(i >> 16), uint8(i >> 8), uint8(i),
|
uint8(i >> 24), uint8(i >> 16), uint8(i >> 8), uint8(i),
|
||||||
}...)
|
}...)
|
||||||
}
|
}
|
||||||
panic(fmt.Sprintf("%#x doesn't fit into 62 bits", i))
|
panic(&varintLengthError{Num: i})
|
||||||
}
|
}
|
||||||
|
|
||||||
// AppendWithLen append i in the QUIC varint format with the desired length.
|
// AppendWithLen append i in the QUIC varint format with the desired length.
|
||||||
@@ -168,8 +176,5 @@ func Len(i uint64) int {
|
|||||||
}
|
}
|
||||||
// Don't use a fmt.Sprintf here to format the error message.
|
// Don't use a fmt.Sprintf here to format the error message.
|
||||||
// The function would then exceed the inlining budget.
|
// The function would then exceed the inlining budget.
|
||||||
panic(struct {
|
panic(&varintLengthError{Num: i})
|
||||||
message string
|
|
||||||
num uint64
|
|
||||||
}{"value doesn't fit into 62 bits: ", i})
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package quicvarint
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"math/rand/v2"
|
"math/rand/v2"
|
||||||
"testing"
|
"testing"
|
||||||
@@ -125,7 +126,10 @@ func TestVarintEncoding(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
t.Run("panics when given a too large number (> 62 bit)", func(t *testing.T) {
|
t.Run("panics when given a too large number (> 62 bit)", func(t *testing.T) {
|
||||||
require.Panics(t, func() { Append(nil, maxVarInt8+1) })
|
require.PanicsWithError(t,
|
||||||
|
fmt.Sprintf("value doesn't fit into 62 bits: %d", maxVarInt8+1),
|
||||||
|
func() { Append(nil, maxVarInt8+1) },
|
||||||
|
)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -203,7 +207,10 @@ func TestLen(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
t.Run("panics on too large number", func(t *testing.T) {
|
t.Run("panics on too large number", func(t *testing.T) {
|
||||||
require.Panics(t, func() { Len(maxVarInt8 + 1) })
|
require.PanicsWithError(t,
|
||||||
|
fmt.Sprintf("value doesn't fit into 62 bits: %d", maxVarInt8+1),
|
||||||
|
func() { Len(maxVarInt8 + 1) },
|
||||||
|
)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user