analyzer: make http3/quic handling more reliable
Some checks failed
Quality check / Static analysis (push) Has been cancelled
Quality check / Tests (push) Has been cancelled

This commit is contained in:
2026-02-11 15:49:32 +05:30
parent c3fe0ea16f
commit 43cb4755d0
4 changed files with 59 additions and 22 deletions

View File

@@ -9,6 +9,8 @@ import (
"github.com/quic-go/quic-go/quicvarint"
)
var ErrNotInitialPacket = errors.New("not initial packet")
// The Header represents a QUIC header.
type Header struct {
Type uint8
@@ -36,6 +38,9 @@ func parseLongHeader(b *bytes.Reader) (*Header, error) {
if err != nil {
return nil, err
}
if !isLongHeader(typeByte) {
return nil, ErrNotInitialPacket
}
h := &Header{}
ver, err := beUint32(b)
if err != nil {
@@ -66,18 +71,19 @@ func parseLongHeader(b *bytes.Reader) (*Header, error) {
if h.Version == V2 {
initialPacketType = 0b01
}
if (typeByte >> 4 & 0b11) == initialPacketType {
tokenLen, err := quicvarint.Read(b)
if err != nil {
return nil, err
}
if tokenLen > uint64(b.Len()) {
return nil, io.EOF
}
h.Token = make([]byte, tokenLen)
if _, err := io.ReadFull(b, h.Token); err != nil {
return nil, err
}
if (typeByte>>4)&0b11 != initialPacketType {
return nil, ErrNotInitialPacket
}
tokenLen, err := quicvarint.Read(b)
if err != nil {
return nil, err
}
if tokenLen > uint64(b.Len()) {
return nil, io.EOF
}
h.Token = make([]byte, tokenLen)
if _, err := io.ReadFull(b, h.Token); err != nil {
return nil, err
}
pl, err := quicvarint.Read(b)