From b693c1cea0c994cd586e935cee12f75a4295a859 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Tue, 20 Sep 2005 16:36:07 +0000 Subject: - On 64-bit platforms, when __len__() returns a value that cannot be represented as a C int, raise OverflowError. (Will forward-port.) --- Misc/NEWS | 3 +++ Objects/classobject.c | 12 +++++++++++- Objects/typeobject.c | 12 +++++++++++- 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS index c368937..b77e6db 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -12,6 +12,9 @@ What's New in Python 2.4.2c1 Core and builtins ----------------- +- On 64-bit platforms, when __len__() returns a value that cannot be + represented as a C int, raise OverflowError. + - SF bug #893549: parsing keyword arguments was broken with a few format codes. diff --git a/Objects/classobject.c b/Objects/classobject.c index 68505f1..187f8d0 100644 --- a/Objects/classobject.c +++ b/Objects/classobject.c @@ -1013,7 +1013,17 @@ instance_length(PyInstanceObject *inst) if (res == NULL) return -1; if (PyInt_Check(res)) { - outcome = PyInt_AsLong(res); + long temp = PyInt_AsLong(res); + outcome = (int)temp; +#if SIZEOF_INT < SIZEOF_LONG + /* Overflow check -- range of PyInt is more than C int */ + if (outcome != temp) { + PyErr_SetString(PyExc_OverflowError, + "__len__() should return 0 <= outcome < 2**31"); + outcome = -1; + } + else +#endif if (outcome < 0) PyErr_SetString(PyExc_ValueError, "__len__() should return >= 0"); diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 391140c..41c660d 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -4071,14 +4071,24 @@ slot_sq_length(PyObject *self) { static PyObject *len_str; PyObject *res = call_method(self, "__len__", &len_str, "()"); + long temp; int len; if (res == NULL) return -1; - len = (int)PyInt_AsLong(res); + temp = PyInt_AsLong(res); + len = (int)temp; Py_DECREF(res); if (len == -1 && PyErr_Occurred()) return -1; +#if SIZEOF_INT < SIZEOF_LONG + /* Overflow check -- range of PyInt is more than C int */ + if (len != temp) { + PyErr_SetString(PyExc_OverflowError, + "__len__() should return 0 <= outcome < 2**31"); + return -1; + } +#endif if (len < 0) { PyErr_SetString(PyExc_ValueError, "__len__() should return >= 0"); -- cgit v0.12