]> granicus.if.org Git - python/commitdiff
bpo-35972: _xxsubinterpreters: Fix potential integer truncation on 32-bit in channel_...
authorAlexey Izbyshev <izbyshev@ispras.ru>
Tue, 12 Feb 2019 16:06:43 +0000 (19:06 +0300)
committerEric Snow <ericsnowcurrently@gmail.com>
Tue, 12 Feb 2019 16:06:43 +0000 (09:06 -0700)
Lib/test/test__xxsubinterpreters.py
Python/pystate.c

index 26032d6c85f2a51e16986bee0087dd1d2917bfcc..1eece965924914a67e48415bba0393661d354965 100644 (file)
@@ -393,7 +393,19 @@ class ShareableTypeTests(unittest.TestCase):
                             for i in range(-1, 258))
 
     def test_int(self):
-        self._assert_values(range(-1, 258))
+        self._assert_values(itertools.chain(range(-1, 258),
+                                            [sys.maxsize, -sys.maxsize - 1]))
+
+    def test_non_shareable_int(self):
+        ints = [
+            sys.maxsize + 1,
+            -sys.maxsize - 2,
+            2**1000,
+        ]
+        for i in ints:
+            with self.subTest(i):
+                with self.assertRaises(OverflowError):
+                    interpreters.channel_send(self.cid, i)
 
 
 ##################################
index 4dc3b81e4cdb97285af248fc9b4e903d623eb942..f0b2a6729f33306ae2277701fbf02c986babed56 100644 (file)
@@ -1467,13 +1467,17 @@ _str_shared(PyObject *obj, _PyCrossInterpreterData *data)
 static PyObject *
 _new_long_object(_PyCrossInterpreterData *data)
 {
-    return PyLong_FromLongLong((intptr_t)(data->data));
+    return PyLong_FromSsize_t((Py_ssize_t)(data->data));
 }
 
 static int
 _long_shared(PyObject *obj, _PyCrossInterpreterData *data)
 {
-    int64_t value = PyLong_AsLongLong(obj);
+    /* Note that this means the size of shareable ints is bounded by
+     * sys.maxsize.  Hence on 32-bit architectures that is half the
+     * size of maximum shareable ints on 64-bit.
+     */
+    Py_ssize_t value = PyLong_AsSsize_t(obj);
     if (value == -1 && PyErr_Occurred()) {
         if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
             PyErr_SetString(PyExc_OverflowError, "try sending as bytes");