Mercurial > cpython-lru_cache-weakref
diff Objects/typeobject.c @ 35610:1f236e598ae9 legacy-trunk
- On 64-bit platforms, when __len__() returns a value that cannot be
represented as a C int, raise OverflowError.
(Forward port from 2.4.2; the patch to classobject.c was already in
but needed a correction in the error message text.)
| author | Guido van Rossum <guido@python.org> |
|---|---|
| date | Tue, 20 Sep 2005 18:49:54 +0000 |
| parents | 8880d91cdb09 |
| children | 7dd4e6cb9d27 |
line wrap: on
line diff
--- a/Objects/typeobject.c Tue Sep 20 18:34:01 2005 +0000 +++ b/Objects/typeobject.c Tue Sep 20 18:49:54 2005 +0000 @@ -4071,14 +4071,24 @@ { 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");
