mirror of
https://github.com/python/cpython.git
synced 2025-10-21 14:12:27 +00:00
bpo-35972: _xxsubinterpreters: Fix potential integer truncation on 32-bit in channel_send() (gh-11822)
This commit is contained in:
parent
b01786c881
commit
16f842da3c
2 changed files with 19 additions and 3 deletions
|
@ -393,7 +393,19 @@ class ShareableTypeTests(unittest.TestCase):
|
||||||
for i in range(-1, 258))
|
for i in range(-1, 258))
|
||||||
|
|
||||||
def test_int(self):
|
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 *
|
static PyObject *
|
||||||
_new_long_object(_PyCrossInterpreterData *data)
|
_new_long_object(_PyCrossInterpreterData *data)
|
||||||
{
|
{
|
||||||
return PyLong_FromLongLong((intptr_t)(data->data));
|
return PyLong_FromSsize_t((Py_ssize_t)(data->data));
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
_long_shared(PyObject *obj, _PyCrossInterpreterData *data)
|
_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 (value == -1 && PyErr_Occurred()) {
|
||||||
if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
|
if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
|
||||||
PyErr_SetString(PyExc_OverflowError, "try sending as bytes");
|
PyErr_SetString(PyExc_OverflowError, "try sending as bytes");
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue