GH-88968: Reject socket that is already used as a transport (#98010)
This commit is contained in:
parent
c11b667a1d
commit
c06276402b
@ -58,6 +58,7 @@ class BaseSelectorEventLoop(base_events.BaseEventLoop):
|
|||||||
|
|
||||||
def _make_socket_transport(self, sock, protocol, waiter=None, *,
|
def _make_socket_transport(self, sock, protocol, waiter=None, *,
|
||||||
extra=None, server=None):
|
extra=None, server=None):
|
||||||
|
self._ensure_fd_no_transport(sock)
|
||||||
return _SelectorSocketTransport(self, sock, protocol, waiter,
|
return _SelectorSocketTransport(self, sock, protocol, waiter,
|
||||||
extra, server)
|
extra, server)
|
||||||
|
|
||||||
@ -68,6 +69,7 @@ class BaseSelectorEventLoop(base_events.BaseEventLoop):
|
|||||||
ssl_handshake_timeout=constants.SSL_HANDSHAKE_TIMEOUT,
|
ssl_handshake_timeout=constants.SSL_HANDSHAKE_TIMEOUT,
|
||||||
ssl_shutdown_timeout=constants.SSL_SHUTDOWN_TIMEOUT,
|
ssl_shutdown_timeout=constants.SSL_SHUTDOWN_TIMEOUT,
|
||||||
):
|
):
|
||||||
|
self._ensure_fd_no_transport(rawsock)
|
||||||
ssl_protocol = sslproto.SSLProtocol(
|
ssl_protocol = sslproto.SSLProtocol(
|
||||||
self, protocol, sslcontext, waiter,
|
self, protocol, sslcontext, waiter,
|
||||||
server_side, server_hostname,
|
server_side, server_hostname,
|
||||||
@ -80,6 +82,7 @@ class BaseSelectorEventLoop(base_events.BaseEventLoop):
|
|||||||
|
|
||||||
def _make_datagram_transport(self, sock, protocol,
|
def _make_datagram_transport(self, sock, protocol,
|
||||||
address=None, waiter=None, extra=None):
|
address=None, waiter=None, extra=None):
|
||||||
|
self._ensure_fd_no_transport(sock)
|
||||||
return _SelectorDatagramTransport(self, sock, protocol,
|
return _SelectorDatagramTransport(self, sock, protocol,
|
||||||
address, waiter, extra)
|
address, waiter, extra)
|
||||||
|
|
||||||
|
@ -61,8 +61,10 @@ class BaseSelectorEventLoopTests(test_utils.TestCase):
|
|||||||
def test_make_socket_transport(self):
|
def test_make_socket_transport(self):
|
||||||
m = mock.Mock()
|
m = mock.Mock()
|
||||||
self.loop.add_reader = mock.Mock()
|
self.loop.add_reader = mock.Mock()
|
||||||
|
self.loop._ensure_fd_no_transport = mock.Mock()
|
||||||
transport = self.loop._make_socket_transport(m, asyncio.Protocol())
|
transport = self.loop._make_socket_transport(m, asyncio.Protocol())
|
||||||
self.assertIsInstance(transport, _SelectorSocketTransport)
|
self.assertIsInstance(transport, _SelectorSocketTransport)
|
||||||
|
self.assertEqual(self.loop._ensure_fd_no_transport.call_count, 1)
|
||||||
|
|
||||||
# Calling repr() must not fail when the event loop is closed
|
# Calling repr() must not fail when the event loop is closed
|
||||||
self.loop.close()
|
self.loop.close()
|
||||||
@ -78,8 +80,10 @@ class BaseSelectorEventLoopTests(test_utils.TestCase):
|
|||||||
self.loop.add_writer = mock.Mock()
|
self.loop.add_writer = mock.Mock()
|
||||||
self.loop.remove_reader = mock.Mock()
|
self.loop.remove_reader = mock.Mock()
|
||||||
self.loop.remove_writer = mock.Mock()
|
self.loop.remove_writer = mock.Mock()
|
||||||
|
self.loop._ensure_fd_no_transport = mock.Mock()
|
||||||
with self.assertRaises(RuntimeError):
|
with self.assertRaises(RuntimeError):
|
||||||
self.loop._make_ssl_transport(m, m, m, m)
|
self.loop._make_ssl_transport(m, m, m, m)
|
||||||
|
self.assertEqual(self.loop._ensure_fd_no_transport.call_count, 1)
|
||||||
|
|
||||||
def test_close(self):
|
def test_close(self):
|
||||||
class EventLoop(BaseSelectorEventLoop):
|
class EventLoop(BaseSelectorEventLoop):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user