diff --git a/session.go b/session.go index 55dd1394f..3fbc9179c 100644 --- a/session.go +++ b/session.go @@ -265,7 +265,7 @@ runLoop: continue } s.close(err) - break runLoop + continue } // This is a bit unclean, but works properly, since the packet always // begins with the public header and we never copy it. diff --git a/session_test.go b/session_test.go index 14bd32812..7f4ec81f5 100644 --- a/session_test.go +++ b/session_test.go @@ -708,6 +708,20 @@ var _ = Describe("Session", func() { Expect(sess.largestRcvdPacketNumber).To(Equal(protocol.PacketNumber(5))) }) + It("closes when handling a packet fails", func(done Done) { + testErr := errors.New("unpack error") + hdr.PacketNumber = 5 + var runErr error + go func() { + runErr = sess.run() + }() + sess.unpacker.(*mockUnpacker).unpackErr = testErr + sess.handlePacket(&receivedPacket{publicHeader: hdr}) + Eventually(func() error { return runErr }).Should(MatchError(testErr)) + Expect(sess.runClosed).To(BeClosed()) + close(done) + }) + It("sets the {last,largest}RcvdPacketNumber, for an out-of-order packet", func() { hdr.PacketNumber = 5 err := sess.handlePacketImpl(&receivedPacket{publicHeader: hdr})