From ba3e6ec0c9928000e796090b6df70cccd0d6f385 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Mon, 19 Sep 2005 22:42:41 +0000 Subject: [PATCH] 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). --- Objects/classobject.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/Objects/classobject.c b/Objects/classobject.c index ce2c073db9601c..f7783875672118 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");