791e0f1
From c3c9db89273fabc62ea1b48389d9a3000c1c03ae Mon Sep 17 00:00:00 2001
791e0f1
From: Jay Bosamiya <jaybosamiya@gmail.com>
791e0f1
Date: Sun, 18 Jun 2017 22:11:03 +0530
791e0f1
Subject: [PATCH] [2.7] bpo-30657: Check & prevent integer overflow in
791e0f1
 PyString_DecodeEscape (#2174)
791e0f1
791e0f1
diff --git a/Objects/stringobject.c b/Objects/stringobject.c
791e0f1
index c78e19316a0..59d22e76946 100644
791e0f1
--- a/Objects/stringobject.c
791e0f1
+++ b/Objects/stringobject.c
791e0f1
@@ -612,7 +612,13 @@ PyObject *PyString_DecodeEscape(const char *s,
791e0f1
     char *p, *buf;
791e0f1
     const char *end;
791e0f1
     PyObject *v;
791e0f1
-    Py_ssize_t newlen = recode_encoding ? 4*len:len;
791e0f1
+    Py_ssize_t newlen;
791e0f1
+    /* Check for integer overflow */
791e0f1
+    if (recode_encoding && (len > PY_SSIZE_T_MAX / 4)) {
791e0f1
+        PyErr_SetString(PyExc_OverflowError, "string is too large");
791e0f1
+        return NULL;
791e0f1
+    }
791e0f1
+    newlen = recode_encoding ? 4*len:len;
791e0f1
     v = PyString_FromStringAndSize((char *)NULL, newlen);
791e0f1
     if (v == NULL)
791e0f1
         return NULL;