Mercurial > cpython-lru_cache-weakref
diff Objects/rangeobject.c @ 25208:2490cf7e68a4 legacy-trunk
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).
| author | Guido van Rossum <guido@python.org> |
|---|---|
| date | Wed, 11 Sep 2002 15:55:48 +0000 |
| parents | 1598a1e473e2 |
| children | e526365ddccd |
line wrap: on
line diff
--- a/Objects/rangeobject.c Wed Sep 11 15:36:32 2002 +0000 +++ b/Objects/rangeobject.c Wed Sep 11 15:55:48 2002 +0000 @@ -130,7 +130,14 @@ static int 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 *
