]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-113892: Add a extra check to `ProactorEventLoop.sock_connect` to ensure that the...
authorKirill Podoprigora <kirill.bast9@mail.ru>
Sat, 1 Jun 2024 16:05:19 +0000 (19:05 +0300)
committerGitHub <noreply@github.com>
Sat, 1 Jun 2024 16:05:19 +0000 (09:05 -0700)
Lib/asyncio/proactor_events.py
Lib/test/test_asyncio/test_proactor_events.py
Misc/NEWS.d/next/Library/2024-05-24-21-54-55.gh-issue-113892.JKDFqq.rst [new file with mode: 0644]

index 397a8cda75789507fe0b7f4425b91302fdf854f6..7eb55bd63ddb73efc52658fc351bd59a3118530a 100644 (file)
@@ -721,6 +721,8 @@ class BaseProactorEventLoop(base_events.BaseEventLoop):
         return await self._proactor.sendto(sock, data, 0, address)
 
     async def sock_connect(self, sock, address):
+        if self._debug and sock.gettimeout() != 0:
+            raise ValueError("the socket must be non-blocking")
         return await self._proactor.connect(sock, address)
 
     async def sock_accept(self, sock):
index fcaa2f6ade2b7675d4ce8c6f713e95416059087b..4b3d551dd7b3a2b970a38c249770e16d7cfca7bf 100644 (file)
@@ -1018,9 +1018,9 @@ class ProactorEventLoopUnixSockSendfileTests(test_utils.TestCase):
         self.addCleanup(self.file.close)
         super().setUp()
 
-    def make_socket(self, cleanup=True):
+    def make_socket(self, cleanup=True, blocking=False):
         sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-        sock.setblocking(False)
+        sock.setblocking(blocking)
         sock.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 1024)
         sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 1024)
         if cleanup:
@@ -1082,6 +1082,11 @@ class ProactorEventLoopUnixSockSendfileTests(test_utils.TestCase):
                                                           0, None))
         self.assertEqual(self.file.tell(), 0)
 
+    def test_blocking_socket(self):
+        self.loop.set_debug(True)
+        sock = self.make_socket(blocking=True)
+        with self.assertRaisesRegex(ValueError, "must be non-blocking"):
+            self.run_loop(self.loop.sock_sendfile(sock, self.file))
 
 if __name__ == '__main__':
     unittest.main()
diff --git a/Misc/NEWS.d/next/Library/2024-05-24-21-54-55.gh-issue-113892.JKDFqq.rst b/Misc/NEWS.d/next/Library/2024-05-24-21-54-55.gh-issue-113892.JKDFqq.rst
new file mode 100644 (file)
index 0000000..639d5ab
--- /dev/null
@@ -0,0 +1,3 @@
+Now, the method ``sock_connect`` of :class:`asyncio.ProactorEventLoop`
+raises a :exc:`ValueError` if given socket is not in
+non-blocking mode, as well as in other loop implementations.