]> granicus.if.org Git - python/commitdiff
merge 3.2
authorBenjamin Peterson <benjamin@python.org>
Sun, 30 Mar 2014 23:52:22 +0000 (19:52 -0400)
committerBenjamin Peterson <benjamin@python.org>
Sun, 30 Mar 2014 23:52:22 +0000 (19:52 -0400)
1  2 
Objects/stringlib/transmogrify.h

index 90fa129b32b8ac75a81e01453340804b4ef1f91a,be595a62ef4b401de7d5e50e6bf25b8f4c2819db..cbd7144b0ef92af05084fd1db2ea5a3587764d8a
@@@ -15,13 -15,13 +15,13 @@@ stringlib_expandtabs(PyObject *self, Py
  {
      const char *e, *p;
      char *q;
-     size_t i, j;
+     Py_ssize_t i, j;
      PyObject *u;
      int tabsize = 8;
 -    
 +
      if (!PyArg_ParseTuple(args, "|i:expandtabs", &tabsize))
          return NULL;
 -    
 +
      /* First pass: determine size of output string */
      i = j = 0;
      e = STRINGLIB_STR(self) + STRINGLIB_LEN(self);
              }
          }
          else {
+             if (j > PY_SSIZE_T_MAX - 1)
+                 goto overflow;
              j++;
              if (*p == '\n' || *p == '\r') {
+                 if (i > PY_SSIZE_T_MAX - j)
+                     goto overflow;
                  i += j;
                  j = 0;
-                 if (i > PY_SSIZE_T_MAX) {
-                     PyErr_SetString(PyExc_OverflowError,
-                                     "result is too long");
-                     return NULL;
-                 }
              }
          }
-     if ((i + j) > PY_SSIZE_T_MAX) {
-         PyErr_SetString(PyExc_OverflowError, "result is too long");
-         return NULL;
      }
 -    
 +
+     if (i > PY_SSIZE_T_MAX - j)
+         goto overflow;
 -    
++
      /* Second pass: create output string and fill it */
      u = STRINGLIB_NEW(NULL, i + j);
      if (!u)
          return NULL;
 -    
 +
      j = 0;
      q = STRINGLIB_STR(u);
-     for (p = STRINGLIB_STR(self); p < e; p++)
+     
+     for (p = STRINGLIB_STR(self); p < e; p++) {
          if (*p == '\t') {
              if (tabsize > 0) {
                  i = tabsize - (j % tabsize);