]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.11] bpo-35191: Fix unexpected integer truncation in socket.setblocking() (GH-10415)
authorAlexey Izbyshev <izbyshev@ispras.ru>
Fri, 1 Dec 2023 15:44:03 +0000 (18:44 +0300)
committerGitHub <noreply@github.com>
Fri, 1 Dec 2023 15:44:03 +0000 (17:44 +0200)
On platforms with 64-bit long, socket.setblocking(x) treated all x
which lower 32 bits are zero as False due to integer truncation.

Reported by ubsan.

Lib/test/test_socket.py
Misc/NEWS.d/next/Library/2018-11-08-18-44-04.bpo-35191.s29bWu.rst [new file with mode: 0644]
Modules/socketmodule.c

index 3fceac340a461cb05d399246f80a963900c26178..f6941e7a6f3771b18f47b8ff39418d20eaa6d8ec 100644 (file)
@@ -4705,10 +4705,10 @@ class NonBlockingTCPTests(ThreadedTCPSocketTest):
             self.skipTest('needs UINT_MAX < ULONG_MAX')
 
         self.serv.setblocking(False)
-        self.assertEqual(self.serv.gettimeout(), 0.0)
+        self.assert_sock_timeout(self.serv, 0.0)
 
         self.serv.setblocking(_testcapi.UINT_MAX + 1)
-        self.assertIsNone(self.serv.gettimeout())
+        self.assert_sock_timeout(self.serv, None)
 
     _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
 
diff --git a/Misc/NEWS.d/next/Library/2018-11-08-18-44-04.bpo-35191.s29bWu.rst b/Misc/NEWS.d/next/Library/2018-11-08-18-44-04.bpo-35191.s29bWu.rst
new file mode 100644 (file)
index 0000000..37f6f56
--- /dev/null
@@ -0,0 +1,2 @@
+Fix unexpected integer truncation in :meth:`socket.setblocking` which caused
+it to interpret multiples of ``2**32`` as ``False``.
index 8d9d3c3e1cd3e3ab0e930c3132ffb7a5de98430f..997df43f20ca7959196bea14ea56471afc004f26 100644 (file)
@@ -2815,12 +2815,14 @@ For IP sockets, the address info is a pair (hostaddr, port).");
 static PyObject *
 sock_setblocking(PySocketSockObject *s, PyObject *arg)
 {
-    long block;
+    long value;
+    int block;
 
-    block = PyLong_AsLong(arg);
-    if (block == -1 && PyErr_Occurred())
+    value = PyLong_AsLong(arg);
+    if (value == -1 && PyErr_Occurred())
         return NULL;
 
+    block = (value != 0);
     s->sock_timeout = _PyTime_FromSeconds(block ? -1 : 0);
     if (internal_setblocking(s, block) == -1) {
         return NULL;