summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2017-12-03 21:27:21 (GMT)
committerSerhiy Storchaka <storchaka@gmail.com>2017-12-03 21:27:21 (GMT)
commit30a6bc842945e3e9c9c7db887ab495c428ec7074 (patch)
tree67fcb60d50f240d5067744c46c9c274b1c89b4de
parentc8f32aae0aa173e122cf4c0592caec620d0d1de9 (diff)
downloadcpython-30a6bc842945e3e9c9c7db887ab495c428ec7074.zip
cpython-30a6bc842945e3e9c9c7db887ab495c428ec7074.tar.gz
cpython-30a6bc842945e3e9c9c7db887ab495c428ec7074.tar.bz2
bpo-31619: Fixed integer overflow in converting huge strings to int. (GH-3884) (#4690)
(cherry picked from commit 29ba688034fc4eef0693b86002cf7bee55d692af)
-rw-r--r--Objects/longobject.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/Objects/longobject.c b/Objects/longobject.c
index c0cd7c1..c3c0949 100644
--- a/Objects/longobject.c
+++ b/Objects/longobject.c
@@ -2016,7 +2016,7 @@ long_from_binary_base(const char **str, int base, PyLongObject **res)
const char *p = *str;
const char *start = p;
char prev = 0;
- int digits = 0;
+ Py_ssize_t digits = 0;
int bits_per_char;
Py_ssize_t n;
PyLongObject *z;
@@ -2259,8 +2259,9 @@ just 1 digit at the start, so that the copying code was exercised for every
digit beyond the first.
***/
twodigits c; /* current input character */
+ double fsize_z;
Py_ssize_t size_z;
- int digits = 0;
+ Py_ssize_t digits = 0;
int i;
int convwidth;
twodigits convmultmax, convmult;
@@ -2322,7 +2323,14 @@ digit beyond the first.
* need to initialize z->ob_digit -- no slot is read up before
* 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 */
/* size_z = 1; */
assert(size_z > 0);