From 8352e5dc3236d1b26858ff44f85b699ced095bac Mon Sep 17 00:00:00 2001 From: kelmenhorst <45046038+kelmenhorst@users.noreply.github.com> Date: Wed, 21 Jun 2023 11:14:57 +0200 Subject: [PATCH] check for uninitialized fields when closing the Transport (#3908) * close Transport: check for possibly uninitialized fields * close Transport: close Conn, as conn might not be initialized * close Transport: add test case --- transport.go | 12 ++++++++---- transport_test.go | 16 ++++++++++++++++ 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/transport.go b/transport.go index 242eedc10..3bc11d3bd 100644 --- a/transport.go +++ b/transport.go @@ -244,14 +244,16 @@ func (t *Transport) runSendQueue() { func (t *Transport) Close() error { t.close(errors.New("closing")) if t.createdConn { - if err := t.conn.Close(); err != nil { + if err := t.Conn.Close(); err != nil { return err } - } else { + } else if t.conn != nil { t.conn.SetReadDeadline(time.Now()) defer func() { t.conn.SetReadDeadline(time.Time{}) }() } - <-t.listening // wait until listening returns + if t.listening != nil { + <-t.listening // wait until listening returns + } return nil } @@ -280,7 +282,9 @@ func (t *Transport) close(e error) { return } - t.handlerMap.Close(e) + if t.handlerMap != nil { + t.handlerMap.Close(e) + } if t.server != nil { t.server.setCloseError(e) } diff --git a/transport_test.go b/transport_test.go index 9426f350c..c78742f80 100644 --- a/transport_test.go +++ b/transport_test.go @@ -291,4 +291,20 @@ var _ = Describe("Transport", func() { close(packetChan) tr.Close() }) + + It("closes uninitialized Transport and closes underlying PacketConn", func() { + packetChan := make(chan packetToRead) + pconn := newMockPacketConn(packetChan) + + tr := &Transport{ + Conn: pconn, + createdConn: true, // owns pconn + } + // NO init + + // shutdown + close(packetChan) + pconn.EXPECT().Close() + Expect(tr.Close()).To(Succeed()) + }) })