From 79790bc35fe722a49977b52647f9b5fe1deda2b7 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 8 Jun 2018 00:25:52 +0200 Subject: bpo-33694: Fix race condition in asyncio proactor (GH-7498) The cancellation of an overlapped WSARecv() has a race condition which causes data loss because of the current implementation of proactor in asyncio. No longer cancel overlapped WSARecv() in _ProactorReadPipeTransport to work around the race condition. Remove the optimized recv_into() implementation to get simple implementation of pause_reading() using the single _pending_data attribute. Move _feed_data_to_bufferred_proto() to protocols.py. Remove set_protocol() method which became useless. --- Lib/asyncio/protocols.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'Lib/asyncio/protocols.py') diff --git a/Lib/asyncio/protocols.py b/Lib/asyncio/protocols.py index b8d2e6be55..4d47da387c 100644 --- a/Lib/asyncio/protocols.py +++ b/Lib/asyncio/protocols.py @@ -189,3 +189,22 @@ class SubprocessProtocol(BaseProtocol): def process_exited(self): """Called when subprocess has exited.""" + + +def _feed_data_to_bufferred_proto(proto, data): + data_len = len(data) + while data_len: + buf = proto.get_buffer(data_len) + buf_len = len(buf) + if not buf_len: + raise RuntimeError('get_buffer() returned an empty buffer') + + if buf_len >= data_len: + buf[:data_len] = data + proto.buffer_updated(data_len) + return + else: + buf[:buf_len] = data[:buf_len] + proto.buffer_updated(buf_len) + data = data[buf_len:] + data_len = len(data) -- cgit v1.2.1