summaryrefslogtreecommitdiffstats
path: root/Lib/asyncio
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2015-04-07 19:38:04 (GMT)
committerVictor Stinner <victor.stinner@gmail.com>2015-04-07 19:38:04 (GMT)
commitc9d11c341e0e140cb71fab6699fc1b49d8f35436 (patch)
treef522364a9c1436f9a65ed8975390b5c1f54ca711 /Lib/asyncio
parent033c58ad972973ab4b8a87bede922bc9bf1a2cf9 (diff)
downloadcpython-c9d11c341e0e140cb71fab6699fc1b49d8f35436.zip
cpython-c9d11c341e0e140cb71fab6699fc1b49d8f35436.tar.gz
cpython-c9d11c341e0e140cb71fab6699fc1b49d8f35436.tar.bz2
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.
Diffstat (limited to 'Lib/asyncio')
-rw-r--r--Lib/asyncio/selector_events.py14
1 files changed, 6 insertions, 8 deletions
diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py
index 68e9415..7c5b9b5 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)