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 *