diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-04-08-04-45-02.bpo-36552.X5p6-M.rst b/Misc/NEWS.d/next/Core and Builtins/2019-04-08-04-45-02.bpo-36552.X5p6-M.rst new file mode 100644 index 00000000000000..2db8e8ec2347ff --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-04-08-04-45-02.bpo-36552.X5p6-M.rst @@ -0,0 +1 @@ +Calculating the length of range objects whose length is larger than PY_SIZE_MAX will now raise a ValueError instead of an OverflowError. \ No newline at end of file diff --git a/Objects/rangeobject.c b/Objects/rangeobject.c index 4b8e5ed4cfd4cd..e0d1459d540208 100644 --- a/Objects/rangeobject.c +++ b/Objects/rangeobject.c @@ -212,7 +212,13 @@ compute_range_length(PyObject *start, PyObject *stop, PyObject *step) static Py_ssize_t range_length(rangeobject *r) { - return PyLong_AsSsize_t(r->length); + Py_ssize_t size = PyLong_AsSsize_t(r->length); + if (size < 0 && PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_OverflowError)) { + PyErr_Clear(); + PyErr_Format(PyExc_ValueError, "Range object too large to calculate length (Overflow Error)"); + return -1; + } + return size; } static PyObject *