From: Victor Stinner Date: Tue, 7 Apr 2015 19:38:04 +0000 (+0200) Subject: Issue #23879, asyncio: SelectorEventLoop.sock_connect() must not call connect() X-Git-Tag: v3.5.0a4~93^2^2~10 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c9d11c341e0e140cb71fab6699fc1b49d8f35436;p=python Issue #23879, asyncio: SelectorEventLoop.sock_connect() must not call connect() again if the first call to connect() raises an InterruptedError. When the C function connect() fails with EINTR, the connection runs in background. We have to wait until the socket becomes writable to be notified when the connection succeed or fails. --- diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py index 68e9415e6a..7c5b9b5b9a 100644 --- a/Lib/asyncio/selector_events.py +++ b/Lib/asyncio/selector_events.py @@ -408,14 +408,12 @@ class BaseSelectorEventLoop(base_events.BaseEventLoop): def _sock_connect(self, fut, sock, address): fd = sock.fileno() try: - while True: - try: - sock.connect(address) - except InterruptedError: - continue - else: - break - except BlockingIOError: + sock.connect(address) + except (BlockingIOError, InterruptedError): + # Issue #23618: When the C function connect() fails with EINTR, the + # connection runs in background. We have to wait until the socket + # becomes writable to be notified when the connection succeed or + # fails. fut.add_done_callback(functools.partial(self._sock_connect_done, fd)) self.add_writer(fd, self._sock_connect_cb, fut, sock, address)