From: Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> Date: Tue, 27 Feb 2024 16:14:01 +0000 (+0100) Subject: [3.11] bpo-43952: Fix multiprocessing Listener authkey bug (GH-25845) (GH-115994) X-Git-Tag: v3.11.9~135 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=eb13ac66c49bbee7e0b04e564e463502cab55c13;p=thirdparty%2FPython%2Fcpython.git [3.11] bpo-43952: Fix multiprocessing Listener authkey bug (GH-25845) (GH-115994) Listener.accept() no longer hangs when authkey is an empty bytes object. (cherry picked from commit 686ec17f506cddd0b14a8aad5849c15ffc20ed46) Co-authored-by: Miguel Brito <5544985+miguendes@users.noreply.github.com> --- diff --git a/Lib/multiprocessing/connection.py b/Lib/multiprocessing/connection.py index 8b81f9954e47..59c61d2aa292 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 ccaddf4fa01c..60e7000c48fa 100644 --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -3465,6 +3465,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): diff --git a/Misc/NEWS.d/next/Library/2021-05-03-11-04-12.bpo-43952.Me7fJe.rst b/Misc/NEWS.d/next/Library/2021-05-03-11-04-12.bpo-43952.Me7fJe.rst new file mode 100644 index 000000000000..e164619e44a3 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-05-03-11-04-12.bpo-43952.Me7fJe.rst @@ -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.