Commit 1f4fc097 authored by Mark Dickinson's avatar Mark Dickinson

Fix potential signed-overflow bug in _PyLong_Format; also fix

a couple of whitespace issues.
parent 3d85454b
...@@ -1371,7 +1371,7 @@ _PyLong_Format(PyObject *aa, int base, int addL, int newstyle) ...@@ -1371,7 +1371,7 @@ _PyLong_Format(PyObject *aa, int base, int addL, int newstyle)
{ {
register PyLongObject *a = (PyLongObject *)aa; register PyLongObject *a = (PyLongObject *)aa;
PyStringObject *str; PyStringObject *str;
Py_ssize_t i, j, sz; Py_ssize_t i, sz;
Py_ssize_t size_a; Py_ssize_t size_a;
char *p; char *p;
int bits; int bits;
...@@ -1392,20 +1392,21 @@ _PyLong_Format(PyObject *aa, int base, int addL, int newstyle) ...@@ -1392,20 +1392,21 @@ _PyLong_Format(PyObject *aa, int base, int addL, int newstyle)
i >>= 1; i >>= 1;
} }
i = 5 + (addL ? 1 : 0); i = 5 + (addL ? 1 : 0);
j = size_a*PyLong_SHIFT + bits-1; /* ensure we don't get signed overflow in sz calculation */
sz = i + j / bits; if (size_a > (PY_SSIZE_T_MAX - i) / PyLong_SHIFT) {
if (j / PyLong_SHIFT < size_a || sz < i) {
PyErr_SetString(PyExc_OverflowError, PyErr_SetString(PyExc_OverflowError,
"long is too large to format"); "long is too large to format");
return NULL; return NULL;
} }
sz = i + 1 + (size_a * PyLong_SHIFT - 1) / bits;
assert(sz >= 0);
str = (PyStringObject *) PyString_FromStringAndSize((char *)0, sz); str = (PyStringObject *) PyString_FromStringAndSize((char *)0, sz);
if (str == NULL) if (str == NULL)
return NULL; return NULL;
p = PyString_AS_STRING(str) + sz; p = PyString_AS_STRING(str) + sz;
*p = '\0'; *p = '\0';
if (addL) if (addL)
*--p = 'L'; *--p = 'L';
if (a->ob_size < 0) if (a->ob_size < 0)
sign = '-'; sign = '-';
...@@ -1433,7 +1434,7 @@ _PyLong_Format(PyObject *aa, int base, int addL, int newstyle) ...@@ -1433,7 +1434,7 @@ _PyLong_Format(PyObject *aa, int base, int addL, int newstyle)
accumbits -= basebits; accumbits -= basebits;
accum >>= basebits; accum >>= basebits;
} while (i < size_a-1 ? accumbits >= basebits : } while (i < size_a-1 ? accumbits >= basebits :
accum > 0); accum > 0);
} }
} }
else { else {
...@@ -1448,7 +1449,8 @@ _PyLong_Format(PyObject *aa, int base, int addL, int newstyle) ...@@ -1448,7 +1449,8 @@ _PyLong_Format(PyObject *aa, int base, int addL, int newstyle)
int power = 1; int power = 1;
for (;;) { for (;;) {
twodigits newpow = powbase * (twodigits)base; twodigits newpow = powbase * (twodigits)base;
if (newpow >> PyLong_SHIFT) /* doesn't fit in a digit */ if (newpow >> PyLong_SHIFT)
/* doesn't fit in a digit */
break; break;
powbase = (digit)newpow; powbase = (digit)newpow;
++power; ++power;
...@@ -1498,7 +1500,7 @@ _PyLong_Format(PyObject *aa, int base, int addL, int newstyle) ...@@ -1498,7 +1500,7 @@ _PyLong_Format(PyObject *aa, int base, int addL, int newstyle)
*--p = '0'; *--p = '0';
} }
else if (base == 8) { else if (base == 8) {
if (newstyle) { if (newstyle) {
*--p = 'o'; *--p = 'o';
*--p = '0'; *--p = '0';
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment