summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2014-11-26 10:11:40 (GMT)
committerSerhiy Storchaka <storchaka@gmail.com>2014-11-26 10:11:40 (GMT)
commitaacfcccdc39b074521d3e5d4b5a1b1e020662366 (patch)
tree05bd095a05568fb97d53ff8df7e4020beb2ad2e9
parent8dcaa4b1c6d98797120ce0a96d458f923505418d (diff)
downloadcpython-aacfcccdc39b074521d3e5d4b5a1b1e020662366.zip
cpython-aacfcccdc39b074521d3e5d4b5a1b1e020662366.tar.gz
cpython-aacfcccdc39b074521d3e5d4b5a1b1e020662366.tar.bz2
Issue #19676: Fixed integer overflow issue in "namereplace" error handler.
-rw-r--r--Python/codecs.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/Python/codecs.c b/Python/codecs.c
index b09ea3a..8ffa80b 100644
--- a/Python/codecs.c
+++ b/Python/codecs.c
@@ -947,7 +947,8 @@ PyObject *PyCodec_NameReplaceErrors(PyObject *exc)
Py_ssize_t end;
PyObject *res;
unsigned char *outp;
- int ressize;
+ Py_ssize_t ressize;
+ int replsize;
Py_UCS4 c;
char buffer[256]; /* NAME_MAXLEN */
if (PyUnicodeEncodeError_GetStart(exc, &start))
@@ -967,17 +968,21 @@ PyObject *PyCodec_NameReplaceErrors(PyObject *exc)
c = PyUnicode_READ_CHAR(object, i);
if (ucnhash_CAPI &&
ucnhash_CAPI->getname(NULL, c, buffer, sizeof(buffer), 1)) {
- ressize += 1+1+1+strlen(buffer)+1;
+ replsize = 1+1+1+strlen(buffer)+1;
}
else if (c >= 0x10000) {
- ressize += 1+1+8;
+ replsize = 1+1+8;
}
else if (c >= 0x100) {
- ressize += 1+1+4;
+ replsize = 1+1+4;
}
else
- ressize += 1+1+2;
+ replsize = 1+1+2;
+ if (ressize > PY_SSIZE_T_MAX - replsize)
+ break;
+ ressize += replsize;
}
+ end = i;
res = PyUnicode_New(ressize, 127);
if (res==NULL)
return NULL;
@@ -1014,6 +1019,7 @@ PyObject *PyCodec_NameReplaceErrors(PyObject *exc)
*outp++ = Py_hexdigits[c&0xf];
}
+ assert(out == start + ressize);
assert(_PyUnicode_CheckConsistency(res, 1));
restuple = Py_BuildValue("(Nn)", res, end);
Py_DECREF(object);