summaryrefslogtreecommitdiffstats
path: root/Objects/rangeobject.c
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>2002-09-11 15:55:48 (GMT)
committerGuido van Rossum <guido@python.org>2002-09-11 15:55:48 (GMT)
commitd4774fb6efde8facccfe0b60a37e3ecd4a943bd9 (patch)
tree2c7134cfec6a7a3bb6c23fc5de0e911a7e955166 /Objects/rangeobject.c
parent02ff6a99522bf0c734831841661ebd385ae8c417 (diff)
downloadcpython-d4774fb6efde8facccfe0b60a37e3ecd4a943bd9.zip
cpython-d4774fb6efde8facccfe0b60a37e3ecd4a943bd9.tar.gz
cpython-d4774fb6efde8facccfe0b60a37e3ecd4a943bd9.tar.bz2
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).
Diffstat (limited to 'Objects/rangeobject.c')
-rw-r--r--Objects/rangeobject.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/Objects/rangeobject.c b/Objects/rangeobject.c
index 3080252..6c9daad 100644
--- a/Objects/rangeobject.c
+++ b/Objects/rangeobject.c
@@ -130,7 +130,14 @@ range_item(rangeobject *r, int i)
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 *