mirror of https://github.com/python/cpython.git
Trent Mick:
Fix overflow bug in ldexp(x, exp). The 'exp' argument maps to a C int for the math library call [double ldexp(double, int)], however the 'd' PyArg_ParseTuple formatter was used to yield a double, which was subsequently cast to an int. This could overflow. [GvR: mysteriously, on Solaris 2.7, ldexp(1, 2147483647) returns Inf while ldexp(1, 2147483646) raises OverflowError; this seems a bug in the math library (it also takes a real long time to compute the Inf outcome). Does this point to a bug in the CHECK() macro? It should have discovered that the result was outside the HUGE_VAL range.]
This commit is contained in:
parent
23ef82ffe3
commit
c554505ca1
|
@ -196,13 +196,13 @@ math_ldexp(self, args)
|
||||||
PyObject *self;
|
PyObject *self;
|
||||||
PyObject *args;
|
PyObject *args;
|
||||||
{
|
{
|
||||||
double x, y;
|
double x;
|
||||||
/* Cheat -- allow float as second argument */
|
int exp;
|
||||||
if (! PyArg_Parse(args, "(dd)", &x, &y))
|
if (! PyArg_Parse(args, "(di)", &x, &exp))
|
||||||
return NULL;
|
return NULL;
|
||||||
errno = 0;
|
errno = 0;
|
||||||
PyFPE_START_PROTECT("ldexp", return 0)
|
PyFPE_START_PROTECT("ldexp", return 0)
|
||||||
x = ldexp(x, (int)y);
|
x = ldexp(x, exp);
|
||||||
PyFPE_END_PROTECT(x)
|
PyFPE_END_PROTECT(x)
|
||||||
CHECK(x);
|
CHECK(x);
|
||||||
if (errno != 0)
|
if (errno != 0)
|
||||||
|
|
Loading…
Reference in New Issue