Merged revisions 74769 via svnmerge from

svn+ssh://pythondev@svn.python.org/python/trunk

........
  r74769 | mark.dickinson | 2009-09-13 12:56:13 +0100 (Sun, 13 Sep 2009) | 3 lines

  Fix potential signed-overflow bug in _PyLong_Format;  also fix
  a couple of whitespace issues.
........
This commit is contained in:
Mark Dickinson 2009-09-13 11:59:41 +00:00
parent ae33becf0b
commit 429e34a3a5
1 changed files with 11 additions and 9 deletions

View File

@ -1201,7 +1201,7 @@ _PyLong_Format(PyObject *aa, int base, int addL, int newstyle)
{
register PyLongObject *a = (PyLongObject *)aa;
PyStringObject *str;
Py_ssize_t i, j, sz;
Py_ssize_t i, sz;
Py_ssize_t size_a;
char *p;
int bits;
@ -1222,13 +1222,14 @@ _PyLong_Format(PyObject *aa, int base, int addL, int newstyle)
i >>= 1;
}
i = 5 + (addL ? 1 : 0);
j = size_a*PyLong_SHIFT + bits-1;
sz = i + j / bits;
if (j / PyLong_SHIFT < size_a || sz < i) {
/* ensure we don't get signed overflow in sz calculation */
if (size_a > (PY_SSIZE_T_MAX - i) / PyLong_SHIFT) {
PyErr_SetString(PyExc_OverflowError,
"long is too large to format");
return NULL;
}
sz = i + 1 + (size_a * PyLong_SHIFT - 1) / bits;
assert(sz >= 0);
str = (PyStringObject *) PyString_FromStringAndSize((char *)0, sz);
if (str == NULL)
return NULL;
@ -1278,7 +1279,8 @@ _PyLong_Format(PyObject *aa, int base, int addL, int newstyle)
int power = 1;
for (;;) {
unsigned long newpow = powbase * (unsigned long)base;
if (newpow >> PyLong_SHIFT) /* doesn't fit in a digit */
if (newpow >> PyLong_SHIFT)
/* doesn't fit in a digit */
break;
powbase = (digit)newpow;
++power;