forked from quic-go/quic-go
error on malformed version negotiation packets
This commit is contained in:
@@ -3,7 +3,6 @@ package quic
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"errors"
|
"errors"
|
||||||
"io"
|
|
||||||
|
|
||||||
"github.com/lucas-clemente/quic-go/protocol"
|
"github.com/lucas-clemente/quic-go/protocol"
|
||||||
"github.com/lucas-clemente/quic-go/qerr"
|
"github.com/lucas-clemente/quic-go/qerr"
|
||||||
@@ -112,7 +111,7 @@ func (h *PublicHeader) Write(b *bytes.Buffer, version protocol.VersionNumber, pe
|
|||||||
|
|
||||||
// ParsePublicHeader parses a QUIC packet's public header
|
// ParsePublicHeader parses a QUIC packet's public header
|
||||||
// the packetSentBy is the perspective of the peer that sent this PublicHeader, i.e. if we're the server, packetSentBy should be PerspectiveClient
|
// the packetSentBy is the perspective of the peer that sent this PublicHeader, i.e. if we're the server, packetSentBy should be PerspectiveClient
|
||||||
func ParsePublicHeader(b io.ByteReader, packetSentBy protocol.Perspective) (*PublicHeader, error) {
|
func ParsePublicHeader(b *bytes.Reader, packetSentBy protocol.Perspective) (*PublicHeader, error) {
|
||||||
header := &PublicHeader{}
|
header := &PublicHeader{}
|
||||||
|
|
||||||
// First byte
|
// First byte
|
||||||
@@ -180,6 +179,9 @@ func ParsePublicHeader(b io.ByteReader, packetSentBy protocol.Perspective) (*Pub
|
|||||||
}
|
}
|
||||||
header.VersionNumber = protocol.VersionTagToNumber(versionTag)
|
header.VersionNumber = protocol.VersionTagToNumber(versionTag)
|
||||||
} else { // parse the version negotiaton packet
|
} else { // parse the version negotiaton packet
|
||||||
|
if b.Len()%4 != 0 {
|
||||||
|
return nil, qerr.InvalidVersionNegotiationPacket
|
||||||
|
}
|
||||||
header.SupportedVersions = make([]protocol.VersionNumber, 0)
|
header.SupportedVersions = make([]protocol.VersionNumber, 0)
|
||||||
for {
|
for {
|
||||||
var versionTag uint32
|
var versionTag uint32
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import (
|
|||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
|
|
||||||
"github.com/lucas-clemente/quic-go/protocol"
|
"github.com/lucas-clemente/quic-go/protocol"
|
||||||
|
"github.com/lucas-clemente/quic-go/qerr"
|
||||||
. "github.com/onsi/ginkgo"
|
. "github.com/onsi/ginkgo"
|
||||||
. "github.com/onsi/gomega"
|
. "github.com/onsi/gomega"
|
||||||
)
|
)
|
||||||
@@ -113,6 +114,14 @@ var _ = Describe("Public Header", func() {
|
|||||||
Expect(hdr.SupportedVersions).To(Equal([]protocol.VersionNumber{protocol.VersionUnsupported, protocol.SupportedVersions[0], protocol.VersionUnsupported}))
|
Expect(hdr.SupportedVersions).To(Equal([]protocol.VersionNumber{protocol.VersionUnsupported, protocol.SupportedVersions[0], protocol.VersionUnsupported}))
|
||||||
Expect(b.Len()).To(BeZero())
|
Expect(b.Len()).To(BeZero())
|
||||||
})
|
})
|
||||||
|
|
||||||
|
It("errors on invalid version tags", func() {
|
||||||
|
data := composeVersionNegotiation(0x1337)
|
||||||
|
data = append(data, []byte{0x13, 0x37}...)
|
||||||
|
b := bytes.NewReader(data)
|
||||||
|
_, err := ParsePublicHeader(b, protocol.PerspectiveServer)
|
||||||
|
Expect(err).To(MatchError(qerr.InvalidVersionNegotiationPacket))
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
Context("Packet Number lengths", func() {
|
Context("Packet Number lengths", func() {
|
||||||
|
|||||||
Reference in New Issue
Block a user