From 2329d0e21e1a5bd2b16dab0c9796984ab40d1e40 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Sun, 25 Aug 2019 16:08:50 +0700 Subject: [PATCH] handle negative max_ack_delay values in the transport parameters --- internal/handshake/transport_parameter_test.go | 11 +++++++++++ internal/handshake/transport_parameters.go | 6 ++++++ internal/wire/ack_frame.go | 3 +-- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/internal/handshake/transport_parameter_test.go b/internal/handshake/transport_parameter_test.go index 48ccc3711..b75749666 100644 --- a/internal/handshake/transport_parameter_test.go +++ b/internal/handshake/transport_parameter_test.go @@ -190,6 +190,17 @@ var _ = Describe("Transport Parameters", func() { Expect(err.Error()).To(ContainSubstring("inconsistent transport parameter length")) }) + It("handles max_ack_delays that decode to a negative duration", func() { + b := &bytes.Buffer{} + val := uint64(math.MaxUint64) / 5 + utils.BigEndian.WriteUint16(b, uint16(maxAckDelayParameterID)) + utils.BigEndian.WriteUint16(b, uint16(utils.VarIntLen(val))) + utils.WriteVarInt(b, val) + p := &TransportParameters{} + Expect(p.Unmarshal(prependLength(b.Bytes()), protocol.PerspectiveServer)).To(Succeed()) + Expect(p.MaxAckDelay).To(BeNumerically(">", 290*365*24*time.Hour)) + }) + It("skips unknown parameters", func() { b := &bytes.Buffer{} // write a known parameter diff --git a/internal/handshake/transport_parameters.go b/internal/handshake/transport_parameters.go index 0c9928046..7f8da704a 100644 --- a/internal/handshake/transport_parameters.go +++ b/internal/handshake/transport_parameters.go @@ -139,6 +139,9 @@ func (p *TransportParameters) Unmarshal(data []byte, sentBy protocol.Perspective if !readMaxAckDelay { p.MaxAckDelay = protocol.DefaultMaxAckDelay } + if p.MaxPacketSize == 0 { + p.MaxPacketSize = protocol.MaxByteCount + } // check that every transport parameter was sent at most once sort.Slice(parameterIDs, func(i, j int) bool { return parameterIDs[i] < parameterIDs[j] }) @@ -197,6 +200,9 @@ func (p *TransportParameters) readNumericTransportParameter( if maxAckDelay >= protocol.MaxMaxAckDelay { return fmt.Errorf("invalid value for max_ack_delay: %dms (maximum %dms)", maxAckDelay/time.Millisecond, (protocol.MaxMaxAckDelay-time.Millisecond)/time.Millisecond) } + if maxAckDelay < 0 { + maxAckDelay = utils.InfDuration + } p.MaxAckDelay = maxAckDelay default: return fmt.Errorf("TransportParameter BUG: transport parameter %d not found", paramID) diff --git a/internal/wire/ack_frame.go b/internal/wire/ack_frame.go index 65ab7008c..378ff6682 100644 --- a/internal/wire/ack_frame.go +++ b/internal/wire/ack_frame.go @@ -3,7 +3,6 @@ package wire import ( "bytes" "errors" - "math" "sort" "time" @@ -42,7 +41,7 @@ func parseAckFrame(r *bytes.Reader, ackDelayExponent uint8, version protocol.Ver delayTime := time.Duration(delay*1<