From: Tim Peters Date: Thu, 21 Nov 2002 22:26:37 +0000 (+0000) Subject: float_int(): Some systems raise an exception if a double is cast to X-Git-Tag: v2.3c1~3322 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=7d791240c0858f9cf508234c255d2ca4dabd6088;p=thirdparty%2FPython%2Fcpython.git float_int(): Some systems raise an exception if a double is cast to long but the double is too big to fit in a long. Prevent that. This closes some recent bug or patch on SF, but SF is down now so I can't say which. Bugfix candidate. --- diff --git a/Objects/floatobject.c b/Objects/floatobject.c index 129f5bdc5f89..cd283493ba7f 100644 --- a/Objects/floatobject.c +++ b/Objects/floatobject.c @@ -653,23 +653,25 @@ float_int(PyObject *v) { double x = PyFloat_AsDouble(v); double wholepart; /* integral portion of x, rounded toward 0 */ - long aslong; /* (long)wholepart */ (void)modf(x, &wholepart); -#ifdef RISCOS - /* conversion from floating to integral type would raise exception */ - if (wholepart>LONG_MAX || wholepart= and <= LONG_{MIN,MAX} would + * still be vulnerable: if a long has more bits of precision than + * a double, casting MIN/MAX to double may yield an approximation, + * and if that's rounded up, then, e.g., wholepart=LONG_MAX+1 would + * yield true from the C expression wholepart<=LONG_MAX, despite + * that wholepart is actually greater than LONG_MAX. + */ + if (LONG_MIN < wholepart && wholepart < LONG_MAX) { + const long aslong = (long)wholepart; return PyInt_FromLong(aslong); - return float_long(v); + } + return PyLong_FromDouble(wholepart); } static PyObject *