@@ -1752,7 +1752,6 @@ class FakeSock:
17521752
17531753 def test_create_datagram_endpoint_sockopts (self ):
17541754 # Socket options should not be applied unless asked for.
1755- # SO_REUSEADDR defaults to on for UNIX.
17561755 # SO_REUSEPORT is not available on all platforms.
17571756
17581757 coro = self .loop .create_datagram_endpoint (
@@ -1761,18 +1760,8 @@ def test_create_datagram_endpoint_sockopts(self):
17611760 transport , protocol = self .loop .run_until_complete (coro )
17621761 sock = transport .get_extra_info ('socket' )
17631762
1764- reuse_address_default_on = (
1765- os .name == 'posix' and sys .platform != 'cygwin' )
17661763 reuseport_supported = hasattr (socket , 'SO_REUSEPORT' )
17671764
1768- if reuse_address_default_on :
1769- self .assertTrue (
1770- sock .getsockopt (
1771- socket .SOL_SOCKET , socket .SO_REUSEADDR ))
1772- else :
1773- self .assertFalse (
1774- sock .getsockopt (
1775- socket .SOL_SOCKET , socket .SO_REUSEADDR ))
17761765 if reuseport_supported :
17771766 self .assertFalse (
17781767 sock .getsockopt (
@@ -1788,13 +1777,12 @@ def test_create_datagram_endpoint_sockopts(self):
17881777 coro = self .loop .create_datagram_endpoint (
17891778 lambda : MyDatagramProto (create_future = True , loop = self .loop ),
17901779 local_addr = ('127.0.0.1' , 0 ),
1791- reuse_address = True ,
17921780 reuse_port = reuseport_supported ,
17931781 allow_broadcast = True )
17941782 transport , protocol = self .loop .run_until_complete (coro )
17951783 sock = transport .get_extra_info ('socket' )
17961784
1797- self .assertTrue (
1785+ self .assertFalse (
17981786 sock .getsockopt (
17991787 socket .SOL_SOCKET , socket .SO_REUSEADDR ))
18001788 if reuseport_supported :
@@ -1809,6 +1797,18 @@ def test_create_datagram_endpoint_sockopts(self):
18091797 self .loop .run_until_complete (protocol .done )
18101798 self .assertEqual ('CLOSED' , protocol .state )
18111799
1800+ def test_create_datagram_endpoint_reuse_address_error (self ):
1801+ # bpo-37228: Ensure that explicit passing of `reuse_address=True`
1802+ # raises an error, as it is not safe to use SO_REUSEADDR when using UDP
1803+
1804+ coro = self .loop .create_datagram_endpoint (
1805+ lambda : MyDatagramProto (create_future = True , loop = self .loop ),
1806+ local_addr = ('127.0.0.1' , 0 ),
1807+ reuse_address = True )
1808+
1809+ with self .assertRaises (RuntimeError ):
1810+ self .loop .run_until_complete (coro )
1811+
18121812 @patch_socket
18131813 def test_create_datagram_endpoint_nosoreuseport (self , m_socket ):
18141814 del m_socket .SO_REUSEPORT
0 commit comments