Skip to content

Commit

Permalink
bpo-43952: Fix multiprocessing Listener authkey bug (pythonGH-25845)
Browse files Browse the repository at this point in the history
Listener.accept() no longer hangs when authkey is an empty bytes object.
  • Loading branch information
miguendes committed Feb 27, 2024
1 parent 3a72fc3 commit 686ec17
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 1 deletion.
3 changes: 2 additions & 1 deletion Lib/multiprocessing/connection.py
Original file line number Diff line number Diff line change
Expand Up @@ -476,8 +476,9 @@ def accept(self):
'''
if self._listener is None:
raise OSError('listener is closed')

c = self._listener.accept()
if self._authkey:
if self._authkey is not None:
deliver_challenge(c, self._authkey)
answer_challenge(c, self._authkey)
return c
Expand Down
19 changes: 19 additions & 0 deletions Lib/test/_test_multiprocessing.py
Original file line number Diff line number Diff line change
Expand Up @@ -3504,6 +3504,25 @@ def test_context(self):
if self.TYPE == 'processes':
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,
"test needs abstract socket support")
def test_abstract_socket(self):
Expand Down
Original file line number Diff line number Diff line change
@@ -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.

0 comments on commit 686ec17

Please sign in to comment.