From: Guido van Rossum Date: Mon, 19 Sep 2005 22:42:41 +0000 (+0000) Subject: A minor fix for 64-bit platforms: when __len__() returns Python int X-Git-Tag: v2.5a0~1358 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ba3e6ec0c9928000e796090b6df70cccd0d6f385;p=thirdparty%2FPython%2Fcpython.git A minor fix for 64-bit platforms: when __len__() returns Python int containing a value that doesn't fit in a C int, raise OverflowError rather than truncating silently (and having 50% chance of hitting the "it should be >= 0" error). --- diff --git a/Objects/classobject.c b/Objects/classobject.c index ce2c073db960..f77838756721 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**32"); + outcome = -1; + } + else +#endif if (outcome < 0) PyErr_SetString(PyExc_ValueError, "__len__() should return >= 0");