mirror of
https://github.com/refraction-networking/uquic.git
synced 2025-04-04 20:57:36 +03:00
reject DATAGRAM frames if datagram support is not enabled
This commit is contained in:
parent
913ddc5081
commit
fd41e8fa62
7 changed files with 38 additions and 11 deletions
|
@ -33,7 +33,7 @@ func Fuzz(data []byte) int {
|
||||||
encLevel := toEncLevel(data[0])
|
encLevel := toEncLevel(data[0])
|
||||||
data = data[PrefixLen:]
|
data = data[PrefixLen:]
|
||||||
|
|
||||||
parser := wire.NewFrameParser(version)
|
parser := wire.NewFrameParser(true, version)
|
||||||
parser.SetAckDelayExponent(protocol.DefaultAckDelayExponent)
|
parser.SetAckDelayExponent(protocol.DefaultAckDelayExponent)
|
||||||
|
|
||||||
r := bytes.NewReader(data)
|
r := bytes.NewReader(data)
|
||||||
|
|
|
@ -13,12 +13,17 @@ import (
|
||||||
type frameParser struct {
|
type frameParser struct {
|
||||||
ackDelayExponent uint8
|
ackDelayExponent uint8
|
||||||
|
|
||||||
|
supportsDatagrams bool
|
||||||
|
|
||||||
version protocol.VersionNumber
|
version protocol.VersionNumber
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewFrameParser creates a new frame parser.
|
// NewFrameParser creates a new frame parser.
|
||||||
func NewFrameParser(v protocol.VersionNumber) FrameParser {
|
func NewFrameParser(supportsDatagrams bool, v protocol.VersionNumber) FrameParser {
|
||||||
return &frameParser{version: v}
|
return &frameParser{
|
||||||
|
supportsDatagrams: supportsDatagrams,
|
||||||
|
version: v,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ParseNextFrame parses the next frame
|
// ParseNextFrame parses the next frame
|
||||||
|
@ -88,7 +93,11 @@ func (p *frameParser) parseFrame(r *bytes.Reader, typeByte byte, encLevel protoc
|
||||||
case 0x1e:
|
case 0x1e:
|
||||||
frame, err = parseHandshakeDoneFrame(r, p.version)
|
frame, err = parseHandshakeDoneFrame(r, p.version)
|
||||||
case 0x30, 0x31:
|
case 0x30, 0x31:
|
||||||
frame, err = parseDatagramFrame(r, p.version)
|
if p.supportsDatagrams {
|
||||||
|
frame, err = parseDatagramFrame(r, p.version)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
fallthrough
|
||||||
default:
|
default:
|
||||||
err = errors.New("unknown frame type")
|
err = errors.New("unknown frame type")
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,7 +18,7 @@ var _ = Describe("Frame parsing", func() {
|
||||||
|
|
||||||
BeforeEach(func() {
|
BeforeEach(func() {
|
||||||
buf = &bytes.Buffer{}
|
buf = &bytes.Buffer{}
|
||||||
parser = NewFrameParser(versionIETFFrames)
|
parser = NewFrameParser(true, versionIETFFrames)
|
||||||
})
|
})
|
||||||
|
|
||||||
It("returns nil if there's nothing more to read", func() {
|
It("returns nil if there's nothing more to read", func() {
|
||||||
|
@ -280,6 +280,24 @@ var _ = Describe("Frame parsing", func() {
|
||||||
Expect(frame).To(Equal(f))
|
Expect(frame).To(Equal(f))
|
||||||
})
|
})
|
||||||
|
|
||||||
|
It("unpacks DATAGRAM frames", func() {
|
||||||
|
f := &DatagramFrame{Data: []byte("foobar")}
|
||||||
|
buf := &bytes.Buffer{}
|
||||||
|
Expect(f.Write(buf, versionIETFFrames)).To(Succeed())
|
||||||
|
frame, err := parser.ParseNext(bytes.NewReader(buf.Bytes()), protocol.Encryption1RTT)
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
Expect(frame).To(Equal(f))
|
||||||
|
})
|
||||||
|
|
||||||
|
It("errors when DATAGRAM frames are not supported", func() {
|
||||||
|
parser = NewFrameParser(false, versionIETFFrames)
|
||||||
|
f := &DatagramFrame{Data: []byte("foobar")}
|
||||||
|
buf := &bytes.Buffer{}
|
||||||
|
Expect(f.Write(buf, versionIETFFrames)).To(Succeed())
|
||||||
|
_, err := parser.ParseNext(bytes.NewReader(buf.Bytes()), protocol.Encryption1RTT)
|
||||||
|
Expect(err).To(MatchError("FRAME_ENCODING_ERROR (frame type: 0x30): unknown frame type"))
|
||||||
|
})
|
||||||
|
|
||||||
It("errors on invalid type", func() {
|
It("errors on invalid type", func() {
|
||||||
_, err := parser.ParseNext(bytes.NewReader([]byte{0x42}), protocol.Encryption1RTT)
|
_, err := parser.ParseNext(bytes.NewReader([]byte{0x42}), protocol.Encryption1RTT)
|
||||||
Expect(err).To(MatchError("FRAME_ENCODING_ERROR (frame type: 0x42): unknown frame type"))
|
Expect(err).To(MatchError("FRAME_ENCODING_ERROR (frame type: 0x42): unknown frame type"))
|
||||||
|
|
|
@ -617,7 +617,7 @@ var _ = Describe("Packet packer", func() {
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(secondPayloadByte).To(Equal(byte(0)))
|
Expect(secondPayloadByte).To(Equal(byte(0)))
|
||||||
// ... followed by the PING
|
// ... followed by the PING
|
||||||
frameParser := wire.NewFrameParser(packer.version)
|
frameParser := wire.NewFrameParser(false, packer.version)
|
||||||
frame, err := frameParser.ParseNext(r, protocol.Encryption1RTT)
|
frame, err := frameParser.ParseNext(r, protocol.Encryption1RTT)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(frame).To(BeAssignableToTypeOf(&wire.PingFrame{}))
|
Expect(frame).To(BeAssignableToTypeOf(&wire.PingFrame{}))
|
||||||
|
@ -654,7 +654,7 @@ var _ = Describe("Packet packer", func() {
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(firstPayloadByte).To(Equal(byte(0)))
|
Expect(firstPayloadByte).To(Equal(byte(0)))
|
||||||
// ... followed by the STREAM frame
|
// ... followed by the STREAM frame
|
||||||
frameParser := wire.NewFrameParser(packer.version)
|
frameParser := wire.NewFrameParser(true, packer.version)
|
||||||
frame, err := frameParser.ParseNext(r, protocol.Encryption1RTT)
|
frame, err := frameParser.ParseNext(r, protocol.Encryption1RTT)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(frame).To(BeAssignableToTypeOf(&wire.StreamFrame{}))
|
Expect(frame).To(BeAssignableToTypeOf(&wire.StreamFrame{}))
|
||||||
|
@ -1166,7 +1166,7 @@ var _ = Describe("Packet packer", func() {
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(secondPayloadByte).To(Equal(byte(0)))
|
Expect(secondPayloadByte).To(Equal(byte(0)))
|
||||||
// ... followed by the PING
|
// ... followed by the PING
|
||||||
frameParser := wire.NewFrameParser(packer.version)
|
frameParser := wire.NewFrameParser(false, packer.version)
|
||||||
frame, err := frameParser.ParseNext(r, protocol.Encryption1RTT)
|
frame, err := frameParser.ParseNext(r, protocol.Encryption1RTT)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(frame).To(BeAssignableToTypeOf(&wire.PingFrame{}))
|
Expect(frame).To(BeAssignableToTypeOf(&wire.PingFrame{}))
|
||||||
|
|
|
@ -521,7 +521,7 @@ var _ = Describe("Server", func() {
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
data, err := opener.Open(nil, b[extHdr.ParsedLen():], extHdr.PacketNumber, b[:extHdr.ParsedLen()])
|
data, err := opener.Open(nil, b[extHdr.ParsedLen():], extHdr.PacketNumber, b[:extHdr.ParsedLen()])
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
f, err := wire.NewFrameParser(hdr.Version).ParseNext(bytes.NewReader(data), protocol.EncryptionInitial)
|
f, err := wire.NewFrameParser(false, hdr.Version).ParseNext(bytes.NewReader(data), protocol.EncryptionInitial)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(f).To(BeAssignableToTypeOf(&wire.ConnectionCloseFrame{}))
|
Expect(f).To(BeAssignableToTypeOf(&wire.ConnectionCloseFrame{}))
|
||||||
ccf := f.(*wire.ConnectionCloseFrame)
|
ccf := f.(*wire.ConnectionCloseFrame)
|
||||||
|
|
|
@ -477,7 +477,7 @@ var newClientSession = func(
|
||||||
func (s *session) preSetup() {
|
func (s *session) preSetup() {
|
||||||
s.sendQueue = newSendQueue(s.conn)
|
s.sendQueue = newSendQueue(s.conn)
|
||||||
s.retransmissionQueue = newRetransmissionQueue(s.version)
|
s.retransmissionQueue = newRetransmissionQueue(s.version)
|
||||||
s.frameParser = wire.NewFrameParser(s.version)
|
s.frameParser = wire.NewFrameParser(s.config.EnableDatagrams, s.version)
|
||||||
s.rttStats = &utils.RTTStats{}
|
s.rttStats = &utils.RTTStats{}
|
||||||
s.connFlowController = flowcontrol.NewConnectionFlowController(
|
s.connFlowController = flowcontrol.NewConnectionFlowController(
|
||||||
protocol.InitialMaxData,
|
protocol.InitialMaxData,
|
||||||
|
|
|
@ -39,7 +39,7 @@ var _ = Describe("Streams Map (incoming)", func() {
|
||||||
checkFrameSerialization := func(f wire.Frame) {
|
checkFrameSerialization := func(f wire.Frame) {
|
||||||
b := &bytes.Buffer{}
|
b := &bytes.Buffer{}
|
||||||
ExpectWithOffset(1, f.Write(b, protocol.VersionTLS)).To(Succeed())
|
ExpectWithOffset(1, f.Write(b, protocol.VersionTLS)).To(Succeed())
|
||||||
frame, err := wire.NewFrameParser(protocol.VersionTLS).ParseNext(bytes.NewReader(b.Bytes()), protocol.Encryption1RTT)
|
frame, err := wire.NewFrameParser(false, protocol.VersionTLS).ParseNext(bytes.NewReader(b.Bytes()), protocol.Encryption1RTT)
|
||||||
ExpectWithOffset(1, err).ToNot(HaveOccurred())
|
ExpectWithOffset(1, err).ToNot(HaveOccurred())
|
||||||
Expect(f).To(Equal(frame))
|
Expect(f).To(Equal(frame))
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue