mirror of https://github.com/python/cpython
Untested code for 64-bit platforms. range_length() is declared as int
but returns r->len which is a long. This doesn't even cause a warning on 32-bit platforms, but can return bogus values on 64-bit platforms (and should cause a compiler warning). Fix this by inserting a range check when LONG_MAX != INT_MAX, and adding an explicit cast to (int) when the test passes. When r->len is out of range, PySequence_Size() and hence len() will report an error (but an iterator will still work).
This commit is contained in:
parent
02ff6a9952
commit
d4774fb6ef
|
@ -130,7 +130,14 @@ range_item(rangeobject *r, int i)
|
||||||
static int
|
static int
|
||||||
range_length(rangeobject *r)
|
range_length(rangeobject *r)
|
||||||
{
|
{
|
||||||
return r->len;
|
#if LONG_MAX != INT_MAX
|
||||||
|
if (r->len > INT_MAX) {
|
||||||
|
PyErr_SetString(PyExc_ValueError,
|
||||||
|
"xrange object size cannot be reported");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return (int)(r->len);
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
|
|
Loading…
Reference in New Issue