From f4fd4f952dded9ea1006e82642f2c15008bb68d3 Mon Sep 17 00:00:00 2001 From: Michael Lazar Date: Wed, 15 Dec 2021 13:18:11 -0500 Subject: Add additional error handling around code where an OSError may be raised on failed connections. Fixes #378 --- amqp/transport.py | 12 ++++++++++-- t/unit/test_transport.py | 17 +++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/amqp/transport.py b/amqp/transport.py index 177fb22..b87f9fe 100644 --- a/amqp/transport.py +++ b/amqp/transport.py @@ -272,7 +272,11 @@ class _AbstractTransport: def close(self): if self.sock is not None: - self._shutdown_transport() + try: + self._shutdown_transport() + except OSError: + pass + # Call shutdown first to make sure that pending messages # reach the AMQP broker if the program exits after # calling this method. @@ -280,7 +284,11 @@ class _AbstractTransport: self.sock.shutdown(socket.SHUT_RDWR) except OSError: pass - self.sock.close() + + try: + self.sock.close() + except OSError: + pass self.sock = None self.connected = False diff --git a/t/unit/test_transport.py b/t/unit/test_transport.py index b111497..0c7b0e2 100644 --- a/t/unit/test_transport.py +++ b/t/unit/test_transport.py @@ -835,6 +835,23 @@ class test_SSLTransport: self.t._shutdown_transport() assert self.t.sock is sock.unwrap() + def test_close__unwrap_error(self): + # sock.unwrap() can raise an error if the was a connection failure + # make sure the socket is properly closed and deallocated + sock = self.t.sock = Mock() + sock.unwrap.side_effect = OSError + self.t.close() + assert self.t.sock is None + + def test_close__close_error(self): + # sock.close() can raise an error if the fd is invalid + # make sure the socket is properly deallocated + sock = self.t.sock = Mock() + sock.close.side_effect = OSError + self.t.close() + sock.close.assert_called_with() + assert self.t.sock is None and self.t.connected is False + def test_read_EOF(self): self.t.sock = Mock(name='SSLSocket') self.t.connected = True -- cgit v1.2.1