From 8ffe094e4959e101fdc11aaef8150511848fa565 Mon Sep 17 00:00:00 2001 From: Yury Selivanov Date: Sun, 11 Jun 2017 16:19:10 +0200 Subject: [PATCH] Revert "[3.6] bpo-29406: asyncio SSL contexts leak sockets after calling close with certain servers (GH-409) (#2062)" This reverts commit 6e14fd2a14cef6ea0709ad234ab41198c2195591. --- Lib/asyncio/sslproto.py | 24 +----------------- Lib/test/test_asyncio/test_sslproto.py | 34 -------------------------- Misc/NEWS | 4 --- 3 files changed, 1 insertion(+), 61 deletions(-) diff --git a/Lib/asyncio/sslproto.py b/Lib/asyncio/sslproto.py index 3b1eb993dfc7a8..7948c4c3b4efe6 100644 --- a/Lib/asyncio/sslproto.py +++ b/Lib/asyncio/sslproto.py @@ -7,7 +7,6 @@ from . import base_events from . import compat -from . import futures from . import protocols from . import transports from .log import logger @@ -413,7 +412,7 @@ class SSLProtocol(protocols.Protocol): def __init__(self, loop, app_protocol, sslcontext, waiter, server_side=False, server_hostname=None, - call_connection_made=True, shutdown_timeout=5.0): + call_connection_made=True): if ssl is None: raise RuntimeError('stdlib ssl module not available') @@ -444,8 +443,6 @@ def __init__(self, loop, app_protocol, sslcontext, waiter, self._session_established = False self._in_handshake = False self._in_shutdown = False - self._shutdown_timeout = shutdown_timeout - self._shutdown_timeout_handle = None # transport, ex: SelectorSocketTransport self._transport = None self._call_connection_made = call_connection_made @@ -560,15 +557,6 @@ def _start_shutdown(self): self._in_shutdown = True self._write_appdata(b'') - if self._shutdown_timeout is not None: - self._shutdown_timeout_handle = self._loop.call_later( - self._shutdown_timeout, self._on_shutdown_timeout) - - def _on_shutdown_timeout(self): - if self._transport is not None: - self._fatal_error( - futures.TimeoutError(), 'Can not complete shitdown operation') - def _write_appdata(self, data): self._write_backlog.append((data, 0)) self._write_buffer_size += len(data) @@ -696,22 +684,12 @@ def _fatal_error(self, exc, message='Fatal error on transport'): }) if self._transport: self._transport._force_close(exc) - self._transport = None - - if self._shutdown_timeout_handle is not None: - self._shutdown_timeout_handle.cancel() - self._shutdown_timeout_handle = None def _finalize(self): self._sslpipe = None if self._transport is not None: self._transport.close() - self._transport = None - - if self._shutdown_timeout_handle is not None: - self._shutdown_timeout_handle.cancel() - self._shutdown_timeout_handle = None def _abort(self): try: diff --git a/Lib/test/test_asyncio/test_sslproto.py b/Lib/test/test_asyncio/test_sslproto.py index 6bcaa9edb4306d..bcd236ea2632ed 100644 --- a/Lib/test/test_asyncio/test_sslproto.py +++ b/Lib/test/test_asyncio/test_sslproto.py @@ -96,40 +96,6 @@ def test_connection_lost(self): test_utils.run_briefly(self.loop) self.assertIsInstance(waiter.exception(), ConnectionAbortedError) - def test_close_abort(self): - # From issue #bpo-29406 - # abort connection if server does not complete shutdown procedure - ssl_proto = self.ssl_protocol() - transport = self.connection_made(ssl_proto) - ssl_proto._on_handshake_complete(None) - ssl_proto._start_shutdown() - self.assertIsNotNone(ssl_proto._shutdown_timeout_handle) - - exc_handler = mock.Mock() - self.loop.set_exception_handler(exc_handler) - ssl_proto._shutdown_timeout_handle._run() - - exc_handler.assert_called_with( - self.loop, {'message': 'Can not complete shitdown operation', - 'exception': mock.ANY, - 'transport': transport, - 'protocol': ssl_proto} - ) - self.assertIsNone(ssl_proto._shutdown_timeout_handle) - - def test_close(self): - # From issue #bpo-29406 - # abort connection if server does not complete shutdown procedure - ssl_proto = self.ssl_protocol() - transport = self.connection_made(ssl_proto) - ssl_proto._on_handshake_complete(None) - ssl_proto._start_shutdown() - self.assertIsNotNone(ssl_proto._shutdown_timeout_handle) - - ssl_proto._finalize() - self.assertIsNone(ssl_proto._transport) - self.assertIsNone(ssl_proto._shutdown_timeout_handle) - def test_close_during_handshake(self): # bpo-29743 Closing transport during handshake process leaks socket waiter = asyncio.Future(loop=self.loop) diff --git a/Misc/NEWS b/Misc/NEWS index 5f44a790f7f9f2..be2ec4f9547b2c 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -56,10 +56,6 @@ Library support for ContextManager on all versions. Original PRs by Jelle Zijlstra and Ivan Levkivskyi -- bpo-29406: asyncio SSL contexts leak sockets after calling close with - certain servers. - Patch by Nikolay Kim - - bpo-29870: Fix ssl sockets leaks when connection is aborted in asyncio/ssl implementation. Patch by Michaël Sghaïer.