]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.5] bpo-22207: Add checks for possible integer overflows in unicodeobject.c. (GH...
authorSerhiy Storchaka <storchaka@gmail.com>
Tue, 11 Jul 2017 04:43:36 +0000 (07:43 +0300)
committerGitHub <noreply@github.com>
Tue, 11 Jul 2017 04:43:36 +0000 (07:43 +0300)
Based on patch by Victor Stinner.
(cherry picked from commit 64e461be09e23705ecbab43a8b01722186641f71)

Objects/unicodeobject.c

index 66cb4afbe0d3741ed7ac9ea65a64d4cb2ac1e935..571cd772b15d512b8ba709b85dc1a72f39321c6f 100644 (file)
@@ -5209,13 +5209,12 @@ _PyUnicode_EncodeUTF32(PyObject *str,
         /* four bytes are reserved for each surrogate */
         if (moreunits > 1) {
             Py_ssize_t outpos = out - (PY_UINT32_T*) PyBytes_AS_STRING(v);
-            Py_ssize_t morebytes = 4 * (moreunits - 1);
-            if (PyBytes_GET_SIZE(v) > PY_SSIZE_T_MAX - morebytes) {
+            if (moreunits >= (PY_SSIZE_T_MAX - PyBytes_GET_SIZE(v)) / 4) {
                 /* integer overflow */
                 PyErr_NoMemory();
                 goto error;
             }
-            if (_PyBytes_Resize(&v, PyBytes_GET_SIZE(v) + morebytes) < 0)
+            if (_PyBytes_Resize(&v, PyBytes_GET_SIZE(v) + 4 * (moreunits - 1)) < 0)
                 goto error;
             out = (PY_UINT32_T*) PyBytes_AS_STRING(v) + outpos;
         }
@@ -5552,13 +5551,12 @@ _PyUnicode_EncodeUTF16(PyObject *str,
         /* two bytes are reserved for each surrogate */
         if (moreunits > 1) {
             Py_ssize_t outpos = out - (unsigned short*) PyBytes_AS_STRING(v);
-            Py_ssize_t morebytes = 2 * (moreunits - 1);
-            if (PyBytes_GET_SIZE(v) > PY_SSIZE_T_MAX - morebytes) {
+            if (moreunits >= (PY_SSIZE_T_MAX - PyBytes_GET_SIZE(v)) / 2) {
                 /* integer overflow */
                 PyErr_NoMemory();
                 goto error;
             }
-            if (_PyBytes_Resize(&v, PyBytes_GET_SIZE(v) + morebytes) < 0)
+            if (_PyBytes_Resize(&v, PyBytes_GET_SIZE(v) + 2 * (moreunits - 1)) < 0)
                 goto error;
             out = (unsigned short*) PyBytes_AS_STRING(v) + outpos;
         }
@@ -6250,6 +6248,10 @@ _PyUnicode_DecodeUnicodeInternal(const char *s,
                      1))
         return NULL;
 
+    if (size < 0) {
+        PyErr_BadInternalCall();
+        return NULL;
+    }
     if (size == 0)
         _Py_RETURN_UNICODE_EMPTY();
 
@@ -7052,6 +7054,10 @@ decode_code_page_stateful(int code_page,
         PyErr_SetString(PyExc_ValueError, "invalid code page number");
         return NULL;
     }
+    if (size < 0) {
+        PyErr_BadInternalCall();
+        return NULL;
+    }
 
     if (consumed)
         *consumed = 0;