summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_asyncio
diff options
context:
space:
mode:
authorVincent Michel <vxgmichel@gmail.com>2019-05-07 17:18:49 (GMT)
committerMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2019-05-07 17:18:49 (GMT)
commit63deaa5b70108ef441c57728322da6b4321db4fc (patch)
tree79e5e4911d6a0d6460d36355d394c969b98f437b /Lib/test/test_asyncio
parent91cc01f40eec03ece2d6b04ad9ea786e77707d8d (diff)
downloadcpython-63deaa5b70108ef441c57728322da6b4321db4fc.zip
cpython-63deaa5b70108ef441c57728322da6b4321db4fc.tar.gz
cpython-63deaa5b70108ef441c57728322da6b4321db4fc.tar.bz2
bpo-31922: Do not connect UDP sockets when broadcast is allowed (GH-423)
*Moved from python/asyncio#493.* This PR fixes issue python/asyncio#480, as explained in [this comment](https://github.com/python/asyncio/issues/480#issuecomment-278703828). The `_SelectorDatagramTransport.sendto` method has to be modified ~~so `_sock.sendto` is used in all cases (because it is tricky to reliably tell if the socket is connected or not). Could that be an issue for connected sockets?~~ *EDIT* ... so `_sock.send` is used only if `_sock` is connected. It also protects `socket.getsockname` against `OSError` in `_SelectorTransport`. This might happen on Windows if the socket is not connected (e.g. for UDP broadcasting). https://bugs.python.org/issue31922
Diffstat (limited to 'Lib/test/test_asyncio')
-rw-r--r--Lib/test/test_asyncio/test_base_events.py17
-rw-r--r--Lib/test/test_asyncio/test_selector_events.py1
2 files changed, 18 insertions, 0 deletions
diff --git a/Lib/test/test_asyncio/test_base_events.py b/Lib/test/test_asyncio/test_base_events.py
index c245c47..25420b2 100644
--- a/Lib/test/test_asyncio/test_base_events.py
+++ b/Lib/test/test_asyncio/test_base_events.py
@@ -1586,6 +1586,23 @@ class BaseEventLoopWithSelectorTests(test_utils.TestCase):
self.assertRaises(
OSError, self.loop.run_until_complete, coro)
+ def test_create_datagram_endpoint_allow_broadcast(self):
+ protocol = MyDatagramProto(create_future=True, loop=self.loop)
+ self.loop.sock_connect = sock_connect = mock.Mock()
+ sock_connect.return_value = []
+
+ coro = self.loop.create_datagram_endpoint(
+ lambda: protocol,
+ remote_addr=('127.0.0.1', 0),
+ allow_broadcast=True)
+
+ transport, _ = self.loop.run_until_complete(coro)
+ self.assertFalse(sock_connect.called)
+
+ transport.close()
+ self.loop.run_until_complete(protocol.done)
+ self.assertEqual('CLOSED', protocol.state)
+
@patch_socket
def test_create_datagram_endpoint_socket_err(self, m_socket):
m_socket.getaddrinfo = socket.getaddrinfo
diff --git a/Lib/test/test_asyncio/test_selector_events.py b/Lib/test/test_asyncio/test_selector_events.py
index d0d171a..bf721b0 100644
--- a/Lib/test/test_asyncio/test_selector_events.py
+++ b/Lib/test/test_asyncio/test_selector_events.py
@@ -1065,6 +1065,7 @@ class SelectorDatagramTransportTests(test_utils.TestCase):
self.sock.fileno.return_value = 7
def datagram_transport(self, address=None):
+ self.sock.getpeername.side_effect = None if address else OSError
transport = _SelectorDatagramTransport(self.loop, self.sock,
self.protocol,
address=address)