summaryrefslogtreecommitdiff
path: root/asyncio
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2015-01-29 02:52:57 +0100
committerVictor Stinner <victor.stinner@gmail.com>2015-01-29 02:52:57 +0100
commit4bbfa97905d6bb79b33d90979c9ae35ecf7bd8f5 (patch)
treede38f996d29d8ce285847f25dbb9f777fcb5c634 /asyncio
parent1ac041be4f0aa79bc7533d17c16f531928180ecd (diff)
downloadtrollius-4bbfa97905d6bb79b33d90979c9ae35ecf7bd8f5.tar.gz
Fix _SelectorSslTransport.close()
Don't call protocol.connection_lost() if protocol.connection_made() was not called yet: if the SSL handshake failed or is still in progress. The close() method can be called if the creation of the connection is cancelled, by a timeout for example.
Diffstat (limited to 'asyncio')
-rw-r--r--asyncio/selector_events.py7
1 files changed, 6 insertions, 1 deletions
diff --git a/asyncio/selector_events.py b/asyncio/selector_events.py
index d046eb2..3195f62 100644
--- a/asyncio/selector_events.py
+++ b/asyncio/selector_events.py
@@ -479,6 +479,7 @@ class _SelectorTransport(transports._FlowControlMixin,
self._sock = sock
self._sock_fd = sock.fileno()
self._protocol = protocol
+ self._protocol_connected = True
self._server = server
self._buffer = self._buffer_factory()
self._conn_lost = 0 # Set when call to connection_lost scheduled.
@@ -555,7 +556,8 @@ class _SelectorTransport(transports._FlowControlMixin,
def _call_connection_lost(self, exc):
try:
- self._protocol.connection_lost(exc)
+ if self._protocol_connected:
+ self._protocol.connection_lost(exc)
finally:
self._sock.close()
self._sock = None
@@ -718,6 +720,8 @@ class _SelectorSslTransport(_SelectorTransport):
sslsock = sslcontext.wrap_socket(rawsock, **wrap_kwargs)
super().__init__(loop, sslsock, protocol, extra, server)
+ # the protocol connection is only made after the SSL handshake
+ self._protocol_connected = False
self._server_hostname = server_hostname
self._waiter = waiter
@@ -797,6 +801,7 @@ class _SelectorSslTransport(_SelectorTransport):
self._read_wants_write = False
self._write_wants_read = False
self._loop.add_reader(self._sock_fd, self._read_ready)
+ self._protocol_connected = True
self._loop.call_soon(self._protocol.connection_made, self)
# only wake up the waiter when connection_made() has been called
self._loop.call_soon(self._wakeup_waiter)