]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.11] bpo-43952: Fix multiprocessing Listener authkey bug (GH-25845) (GH-115994)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Tue, 27 Feb 2024 16:14:01 +0000 (17:14 +0100)
committerGitHub <noreply@github.com>
Tue, 27 Feb 2024 16:14:01 +0000 (16:14 +0000)
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>
Lib/multiprocessing/connection.py
Lib/test/_test_multiprocessing.py
Misc/NEWS.d/next/Library/2021-05-03-11-04-12.bpo-43952.Me7fJe.rst [new file with mode: 0644]

index 8b81f9954e47933c1b067a7ccfa267c02a6f7060..59c61d2aa292cb7269eb9444474dfdada728ad3f 100644 (file)
@@ -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
index ccaddf4fa01cb20a115040e0c02112b9ec30c7cb..60e7000c48fa7970b49e6c0e905ba6564a0e3db7 100644 (file)
@@ -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 (file)
index 0000000..e164619
--- /dev/null
@@ -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.