diff options
author | Xiang Zhang <angwerzx@126.com> | 2017-01-10 02:54:19 (GMT) |
---|---|---|
committer | Xiang Zhang <angwerzx@126.com> | 2017-01-10 02:54:19 (GMT) |
commit | 95403d74d7d17f51b50e68a10e0a0972ed77aa2a (patch) | |
tree | 280fd643d0e10bc7ca5db8da6cffd0beca0d2c74 /Objects/unicodeobject.c | |
parent | 1e6499c19c3251c8e85dc8009f219004958113c0 (diff) | |
parent | b0541f4cdf1bb0ed1fc24fe14e9acf3f81fd8c80 (diff) | |
download | cpython-95403d74d7d17f51b50e68a10e0a0972ed77aa2a.zip cpython-95403d74d7d17f51b50e68a10e0a0972ed77aa2a.tar.gz cpython-95403d74d7d17f51b50e68a10e0a0972ed77aa2a.tar.bz2 |
Issue #29145: Merge 3.5.
Diffstat (limited to 'Objects/unicodeobject.c')
-rw-r--r-- | Objects/unicodeobject.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index b0c410c..a5ae454 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -9988,7 +9988,7 @@ _PyUnicode_JoinArray(PyObject *separator, PyObject **items, Py_ssize_t seqlen) use_memcpy = 1; #endif for (i = 0; i < seqlen; i++) { - const Py_ssize_t old_sz = sz; + size_t add_sz; item = items[i]; if (!PyUnicode_Check(item)) { PyErr_Format(PyExc_TypeError, @@ -9999,16 +9999,18 @@ _PyUnicode_JoinArray(PyObject *separator, PyObject **items, Py_ssize_t seqlen) } if (PyUnicode_READY(item) == -1) goto onError; - sz += PyUnicode_GET_LENGTH(item); + add_sz = PyUnicode_GET_LENGTH(item); item_maxchar = PyUnicode_MAX_CHAR_VALUE(item); maxchar = Py_MAX(maxchar, item_maxchar); - if (i != 0) - sz += seplen; - if (sz < old_sz || sz > PY_SSIZE_T_MAX) { + if (i != 0) { + add_sz += seplen; + } + if (add_sz > (size_t)(PY_SSIZE_T_MAX - sz)) { PyErr_SetString(PyExc_OverflowError, "join() result is too long for a Python string"); goto onError; } + sz += add_sz; if (use_memcpy && last_obj != NULL) { if (PyUnicode_KIND(last_obj) != PyUnicode_KIND(item)) use_memcpy = 0; @@ -10646,7 +10648,7 @@ replace(PyObject *self, PyObject *str1, u = unicode_empty; goto done; } - if (new_size > (PY_SSIZE_T_MAX >> (rkind-1))) { + if (new_size > (PY_SSIZE_T_MAX / rkind)) { PyErr_SetString(PyExc_OverflowError, "replace string is too long"); goto error; |