From eacd994e67997fdf303ea02fc325434ee6bce577 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Thu, 4 May 2017 13:15:20 +0800 Subject: [PATCH] close session if reading from the socket fails in the server fixes #425 --- server.go | 1 + server_test.go | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/server.go b/server.go index af4b7e6be..71eb40647 100644 --- a/server.go +++ b/server.go @@ -86,6 +86,7 @@ func (s *server) Serve() error { // If it does, we only read a truncated packet, which will then end up undecryptable n, remoteAddr, err := s.conn.ReadFrom(data) if err != nil { + _ = s.Close() return err } data = data[:n] diff --git a/server_test.go b/server_test.go index 06512d8dd..c2666af76 100644 --- a/server_test.go +++ b/server_test.go @@ -236,6 +236,17 @@ var _ = Describe("Server", func() { Expect(err).To(MatchError(testErr)) }) + It("closes all sessions when encountering a connection error", func() { + err := serv.handlePacket(nil, nil, firstPacket) + Expect(err).ToNot(HaveOccurred()) + Expect(serv.sessions).To(HaveKey(connID)) + Expect(serv.sessions[connID].(*mockSession).closed).To(BeFalse()) + testErr := errors.New("connection error") + conn.readErr = testErr + _ = serv.Serve() + Expect(serv.sessions[connID].(*mockSession).closed).To(BeTrue()) + }) + It("ignores delayed packets with mismatching versions", func() { err := serv.handlePacket(nil, nil, firstPacket) Expect(err).ToNot(HaveOccurred())