From de2cb96e21ea6b43ece58d53843c6b2627cdf92f Mon Sep 17 00:00:00 2001 From: Joel Dice Date: Thu, 12 Feb 2026 10:54:53 -0700 Subject: [PATCH 1/2] gh-146139: Disable `socketpair` authentication on WASI Calling `connect(2)` on a non-blocking socket on WASI may leave the socket in a "connecting" but not yet "connected" state. In the former case, calling `getpeername(2)` on it will fail, leading to an unhandled exception in Python. --- Lib/socket.py | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/Lib/socket.py b/Lib/socket.py index 3073c012b19877..20be64570194cf 100644 --- a/Lib/socket.py +++ b/Lib/socket.py @@ -649,18 +649,22 @@ def _fallback_socketpair(family=AF_INET, type=SOCK_STREAM, proto=0): # Authenticating avoids using a connection from something else # able to connect to {host}:{port} instead of us. # We expect only AF_INET and AF_INET6 families. - try: - if ( - ssock.getsockname() != csock.getpeername() - or csock.getsockname() != ssock.getpeername() - ): - raise ConnectionError("Unexpected peer connection") - except: - # getsockname() and getpeername() can fail - # if either socket isn't connected. - ssock.close() - csock.close() - raise + # + # Note that we skip this on WASI because on that platorm the client socket + # may not have finished connecting by the time we've reached this point. + if sys.platform != "wasi": + try: + if ( + ssock.getsockname() != csock.getpeername() + or csock.getsockname() != ssock.getpeername() + ): + raise ConnectionError("Unexpected peer connection") + except: + # getsockname() and getpeername() can fail + # if either socket isn't connected. + ssock.close() + csock.close() + raise return (ssock, csock) From eb851efd4e898b54f2d9ad3a2d97365f778d191f Mon Sep 17 00:00:00 2001 From: Joel Dice Date: Thu, 19 Mar 2026 09:33:38 -0600 Subject: [PATCH 2/2] Update Lib/socket.py Co-authored-by: Victor Stinner --- Lib/socket.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/socket.py b/Lib/socket.py index 20be64570194cf..34d897a82edd4f 100644 --- a/Lib/socket.py +++ b/Lib/socket.py @@ -651,7 +651,7 @@ def _fallback_socketpair(family=AF_INET, type=SOCK_STREAM, proto=0): # We expect only AF_INET and AF_INET6 families. # # Note that we skip this on WASI because on that platorm the client socket - # may not have finished connecting by the time we've reached this point. + # may not have finished connecting by the time we've reached this point (gh-146139). if sys.platform != "wasi": try: if (