bpo-35972: _xxsubinterpreters: Fix potential integer truncation on 32-bit in channel_send() (gh-11822)
This commit is contained in:
parent
b01786c881
commit
16f842da3c
|
@ -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)
|
||||
|
||||
|
||||
##################################
|
||||
|
|
|
@ -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");
|
||||
|
|
Loading…
Reference in New Issue