Skip to content

Commit c062764

Browse files
authored
GH-88968: Reject socket that is already used as a transport (#98010)
1 parent c11b667 commit c062764

File tree

2 files changed

+7
-0
lines changed

2 files changed

+7
-0
lines changed

Lib/asyncio/selector_events.py

+3
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ def __init__(self, selector=None):
5858

5959
def _make_socket_transport(self, sock, protocol, waiter=None, *,
6060
extra=None, server=None):
61+
self._ensure_fd_no_transport(sock)
6162
return _SelectorSocketTransport(self, sock, protocol, waiter,
6263
extra, server)
6364

@@ -68,6 +69,7 @@ def _make_ssl_transport(
6869
ssl_handshake_timeout=constants.SSL_HANDSHAKE_TIMEOUT,
6970
ssl_shutdown_timeout=constants.SSL_SHUTDOWN_TIMEOUT,
7071
):
72+
self._ensure_fd_no_transport(rawsock)
7173
ssl_protocol = sslproto.SSLProtocol(
7274
self, protocol, sslcontext, waiter,
7375
server_side, server_hostname,
@@ -80,6 +82,7 @@ def _make_ssl_transport(
8082

8183
def _make_datagram_transport(self, sock, protocol,
8284
address=None, waiter=None, extra=None):
85+
self._ensure_fd_no_transport(sock)
8386
return _SelectorDatagramTransport(self, sock, protocol,
8487
address, waiter, extra)
8588

Lib/test/test_asyncio/test_selector_events.py

+4
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,10 @@ def setUp(self):
6161
def test_make_socket_transport(self):
6262
m = mock.Mock()
6363
self.loop.add_reader = mock.Mock()
64+
self.loop._ensure_fd_no_transport = mock.Mock()
6465
transport = self.loop._make_socket_transport(m, asyncio.Protocol())
6566
self.assertIsInstance(transport, _SelectorSocketTransport)
67+
self.assertEqual(self.loop._ensure_fd_no_transport.call_count, 1)
6668

6769
# Calling repr() must not fail when the event loop is closed
6870
self.loop.close()
@@ -78,8 +80,10 @@ def test_make_ssl_transport_without_ssl_error(self):
7880
self.loop.add_writer = mock.Mock()
7981
self.loop.remove_reader = mock.Mock()
8082
self.loop.remove_writer = mock.Mock()
83+
self.loop._ensure_fd_no_transport = mock.Mock()
8184
with self.assertRaises(RuntimeError):
8285
self.loop._make_ssl_transport(m, m, m, m)
86+
self.assertEqual(self.loop._ensure_fd_no_transport.call_count, 1)
8387

8488
def test_close(self):
8589
class EventLoop(BaseSelectorEventLoop):

0 commit comments

Comments
 (0)