From 924bf4a99951e991635c4c2e393b1c1c9f376a36 Mon Sep 17 00:00:00 2001 From: Lucas Clemente Date: Sun, 8 May 2016 14:24:35 +0200 Subject: [PATCH] don't read timestamps in truncated acks fixes #59 --- frames/ack_frame.go | 41 +++++++++++++++++++++------------------- frames/ack_frame_test.go | 3 ++- 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/frames/ack_frame.go b/frames/ack_frame.go index 5dee5487..274ab177 100644 --- a/frames/ack_frame.go +++ b/frames/ack_frame.go @@ -156,34 +156,37 @@ func ParseAckFrame(r *bytes.Reader) (*AckFrame, error) { } frame.DelayTime = time.Duration(delay) * time.Microsecond - numTimestampByte, err := r.ReadByte() - if err != nil { - return nil, err - } - numTimestamp := uint8(numTimestampByte) + if !frame.Truncated { + var err error + numTimestampByte, err := r.ReadByte() + if err != nil { + return nil, err + } + numTimestamp := uint8(numTimestampByte) - // Delta Largest observed - _, err = r.ReadByte() - if err != nil { - return nil, err - } - // First Timestamp - _, err = utils.ReadUint32(r) - if err != nil { - return nil, err - } - - for i := 0; i < int(numTimestamp)-1; i++ { // Delta Largest observed _, err = r.ReadByte() if err != nil { return nil, err } - // Time Since Previous Timestamp - _, err = utils.ReadUint16(r) + // First Timestamp + _, err = utils.ReadUint32(r) if err != nil { return nil, err } + + for i := 0; i < int(numTimestamp)-1; i++ { + // Delta Largest observed + _, err = r.ReadByte() + if err != nil { + return nil, err + } + // Time Since Previous Timestamp + _, err = utils.ReadUint16(r) + if err != nil { + return nil, err + } + } } // Invalid NACK Handling: diff --git a/frames/ack_frame_test.go b/frames/ack_frame_test.go index b903e9ce..ad8963bb 100644 --- a/frames/ack_frame_test.go +++ b/frames/ack_frame_test.go @@ -82,10 +82,11 @@ var _ = Describe("AckFrame", func() { }) It("accepts truncated acks", func() { - b := bytes.NewReader([]byte{0x50, 0xA4, 0x03, 0x23, 0x45, 0x01, 0x02, 0xFF, 0xEE, 0xDD, 0xCC}) + b := bytes.NewReader([]byte{0x50, 0xA4, 0x03, 0x23, 0x45}) frame, err := ParseAckFrame(b) Expect(err).ToNot(HaveOccurred()) Expect(frame.Truncated).To(BeTrue()) + Expect(b.Len()).To(BeZero()) }) Context("contiguous NACK ranges", func() {