error on malformed version negotiation packets

This commit is contained in:
Marten Seemann
2016-12-02 15:19:41 +07:00
parent d37380b7a5
commit 46678abfa6
2 changed files with 13 additions and 2 deletions

View File

@@ -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

View File

@@ -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() {