From 0dd8fd03584b61cd769be88f5a2fb59b0d8f6d18 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 28 May 2018 18:44:16 -0700 Subject: [PATCH] bpo-33674: asyncio: Fix SSLProtocol race (GH-7175) (#7187) Fix a race condition in SSLProtocol.connection_made() of asyncio.sslproto: start immediately the handshake instead of using call_soon(). Previously, data_received() could be called before the handshake started, causing the handshake to hang or fail. (cherry picked from commit be00a5583a2cb696335c527b921d1868266a42c6) Co-authored-by: Victor Stinner --- Lib/asyncio/sslproto.py | 2 +- .../next/Library/2018-05-28-22-49-59.bpo-33674.6LFFj7.rst | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2018-05-28-22-49-59.bpo-33674.6LFFj7.rst diff --git a/Lib/asyncio/sslproto.py b/Lib/asyncio/sslproto.py index 2bfa45dd15..ab43e93b28 100644 --- a/Lib/asyncio/sslproto.py +++ b/Lib/asyncio/sslproto.py @@ -592,10 +592,10 @@ class SSLProtocol(protocols.Protocol): # (b'', 1) is a special value in _process_write_backlog() to do # the SSL handshake self._write_backlog.append((b'', 1)) - self._loop.call_soon(self._process_write_backlog) self._handshake_timeout_handle = \ self._loop.call_later(self._ssl_handshake_timeout, self._check_handshake_timeout) + self._process_write_backlog() def _check_handshake_timeout(self): if self._in_handshake is True: diff --git a/Misc/NEWS.d/next/Library/2018-05-28-22-49-59.bpo-33674.6LFFj7.rst b/Misc/NEWS.d/next/Library/2018-05-28-22-49-59.bpo-33674.6LFFj7.rst new file mode 100644 index 0000000000..1e9868073f --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-05-28-22-49-59.bpo-33674.6LFFj7.rst @@ -0,0 +1,4 @@ +Fix a race condition in SSLProtocol.connection_made() of asyncio.sslproto: +start immediately the handshake instead of using call_soon(). Previously, +data_received() could be called before the handshake started, causing the +handshake to hang or fail. -- 2.40.0