diff --git a/Misc/NEWS.d/next/Library/2025-05-26-01-48-09.gh-issue-117208.mmFGDb.rst b/Misc/NEWS.d/next/Library/2025-05-26-01-48-09.gh-issue-117208.mmFGDb.rst new file mode 100644 index 00000000000000..029d3ae7c44ec9 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-05-26-01-48-09.gh-issue-117208.mmFGDb.rst @@ -0,0 +1,3 @@ +Fix error handling for non-blocking ``connect`` calls which meant +:meth:`socket.socket.connect` was sometimes raising a :exc:`BlockingIOError` +instead of waiting when a connection could not be immediately completed. diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index 92c9aa8b510dca..6cd00613ac8ea9 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -3671,7 +3671,8 @@ internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen, wait_connect = (s->sock_timeout != 0 && IS_SELECTABLE(s)); } else { - wait_connect = (s->sock_timeout > 0 && err == SOCK_INPROGRESS_ERR + wait_connect = (s->sock_timeout > 0 + && (err == EAGAIN || err == SOCK_INPROGRESS_ERR) && IS_SELECTABLE(s)); }