diff options
author | Miguel Brito <5544985+miguendes@users.noreply.github.com> | 2024-02-27 14:57:59 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-02-27 14:57:59 (GMT) |
commit | 686ec17f506cddd0b14a8aad5849c15ffc20ed46 (patch) | |
tree | 03c4fd999b5f62d115fbd3f1a4a1b79574149d0d /Lib | |
parent | 3a72fc36f93d40048371b789e32eefc97b6ade63 (diff) | |
download | cpython-686ec17f506cddd0b14a8aad5849c15ffc20ed46.zip cpython-686ec17f506cddd0b14a8aad5849c15ffc20ed46.tar.gz cpython-686ec17f506cddd0b14a8aad5849c15ffc20ed46.tar.bz2 |
bpo-43952: Fix multiprocessing Listener authkey bug (GH-25845)
Listener.accept() no longer hangs when authkey is an empty bytes object.
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/multiprocessing/connection.py | 3 | ||||
-rw-r--r-- | Lib/test/_test_multiprocessing.py | 19 |
2 files changed, 21 insertions, 1 deletions
diff --git a/Lib/multiprocessing/connection.py b/Lib/multiprocessing/connection.py index 58d697f..b7e1e13 100644 --- a/Lib/multiprocessing/connection.py +++ b/Lib/multiprocessing/connection.py @@ -476,8 +476,9 @@ class Listener(object): ''' 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 diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py index f70a693..058537b 100644 --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -3504,6 +3504,25 @@ class _TestListener(BaseTestCase): 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): |