Commit 29ba6880 authored by Serhiy Storchaka's avatar Serhiy Storchaka Committed by GitHub

bpo-31619: Fixed integer overflow in converting huge strings to int. (#3884)

parent 1fb72d2a
...@@ -2024,7 +2024,7 @@ long_from_binary_base(const char **str, int base, PyLongObject **res) ...@@ -2024,7 +2024,7 @@ long_from_binary_base(const char **str, int base, PyLongObject **res)
const char *p = *str; const char *p = *str;
const char *start = p; const char *start = p;
char prev = 0; char prev = 0;
int digits = 0; Py_ssize_t digits = 0;
int bits_per_char; int bits_per_char;
Py_ssize_t n; Py_ssize_t n;
PyLongObject *z; PyLongObject *z;
...@@ -2267,8 +2267,9 @@ just 1 digit at the start, so that the copying code was exercised for every ...@@ -2267,8 +2267,9 @@ just 1 digit at the start, so that the copying code was exercised for every
digit beyond the first. digit beyond the first.
***/ ***/
twodigits c; /* current input character */ twodigits c; /* current input character */
double fsize_z;
Py_ssize_t size_z; Py_ssize_t size_z;
int digits = 0; Py_ssize_t digits = 0;
int i; int i;
int convwidth; int convwidth;
twodigits convmultmax, convmult; twodigits convmultmax, convmult;
...@@ -2330,7 +2331,14 @@ digit beyond the first. ...@@ -2330,7 +2331,14 @@ digit beyond the first.
* need to initialize z->ob_digit -- no slot is read up before * need to initialize z->ob_digit -- no slot is read up before
* being stored into. * being stored into.
*/ */
size_z = (Py_ssize_t)(digits * log_base_BASE[base]) + 1; fsize_z = digits * log_base_BASE[base] + 1;
if (fsize_z > MAX_LONG_DIGITS) {
/* The same exception as in _PyLong_New(). */
PyErr_SetString(PyExc_OverflowError,
"too many digits in integer");
return NULL;
}
size_z = (Py_ssize_t)fsize_z;
/* Uncomment next line to test exceedingly rare copy code */ /* Uncomment next line to test exceedingly rare copy code */
/* size_z = 1; */ /* size_z = 1; */
assert(size_z > 0); assert(size_z > 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