mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
bpo-43952: Fix multiprocessing Listener authkey bug (GH-25845)
Listener.accept() no longer hangs when authkey is an empty bytes object.
This commit is contained in:
parent
3a72fc36f9
commit
686ec17f50
3 changed files with 23 additions and 1 deletions
|
@ -476,8 +476,9 @@ class Listener(object):
|
||||||
'''
|
'''
|
||||||
if self._listener is None:
|
if self._listener is None:
|
||||||
raise OSError('listener is closed')
|
raise OSError('listener is closed')
|
||||||
|
|
||||||
c = self._listener.accept()
|
c = self._listener.accept()
|
||||||
if self._authkey:
|
if self._authkey is not None:
|
||||||
deliver_challenge(c, self._authkey)
|
deliver_challenge(c, self._authkey)
|
||||||
answer_challenge(c, self._authkey)
|
answer_challenge(c, self._authkey)
|
||||||
return c
|
return c
|
||||||
|
|
|
@ -3504,6 +3504,25 @@ class _TestListener(BaseTestCase):
|
||||||
if self.TYPE == 'processes':
|
if self.TYPE == 'processes':
|
||||||
self.assertRaises(OSError, l.accept)
|
self.assertRaises(OSError, l.accept)
|
||||||
|
|
||||||
|
def test_empty_authkey(self):
|
||||||
|
# bpo-43952: allow empty bytes as authkey
|
||||||
|
def handler(*args):
|
||||||
|
raise RuntimeError('Connection took too long...')
|
||||||
|
|
||||||
|
def run(addr, authkey):
|
||||||
|
client = self.connection.Client(addr, authkey=authkey)
|
||||||
|
client.send(1729)
|
||||||
|
|
||||||
|
key = b""
|
||||||
|
|
||||||
|
with self.connection.Listener(authkey=key) as listener:
|
||||||
|
threading.Thread(target=run, args=(listener.address, key)).start()
|
||||||
|
with listener.accept() as d:
|
||||||
|
self.assertEqual(d.recv(), 1729)
|
||||||
|
|
||||||
|
if self.TYPE == 'processes':
|
||||||
|
self.assertRaises(OSError, listener.accept)
|
||||||
|
|
||||||
@unittest.skipUnless(util.abstract_sockets_supported,
|
@unittest.skipUnless(util.abstract_sockets_supported,
|
||||||
"test needs abstract socket support")
|
"test needs abstract socket support")
|
||||||
def test_abstract_socket(self):
|
def test_abstract_socket(self):
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Fix :meth:`multiprocessing.connection.Listener.accept()` to accept empty bytes
|
||||||
|
as authkey. Not accepting empty bytes as key causes it to hang indefinitely.
|
Loading…
Add table
Add a link
Reference in a new issue