[Python-checkins] r43374 - python/branches/release24-maint/Objects/unicodeobject.c

neal.norwitz python-checkins at python.org
Tue Mar 28 08:05:22 CEST 2006


Author: neal.norwitz
Date: Tue Mar 28 08:05:21 2006
New Revision: 43374

Modified:
   python/branches/release24-maint/Objects/unicodeobject.c
Log:
Fix the refleak from test_unicode.
Backport 42973 (lots of whitespace changes intermixed):

 - Reindent a confusingly indented piece of code (no intended code changes
    there)
 - Add missing DECREFs of inner-scope 'temp' variable
 - Add various missing DECREFs by changing 'return NULL' into 'goto onError'
 - Avoid double DECREF when last _PyUnicode_Resize() fails

Coverity found one of the missing DECREFs, but oddly enough not the others.


Modified: python/branches/release24-maint/Objects/unicodeobject.c
==============================================================================
--- python/branches/release24-maint/Objects/unicodeobject.c	(original)
+++ python/branches/release24-maint/Objects/unicodeobject.c	Tue Mar 28 08:05:21 2006
@@ -7013,15 +7013,15 @@
                         /* nothing to do */;
                     else if (PyString_Check(temp)) {
                         /* convert to string to Unicode */
-		    unicode = PyUnicode_Decode(PyString_AS_STRING(temp),
+		        unicode = PyUnicode_Decode(PyString_AS_STRING(temp),
 						   PyString_GET_SIZE(temp),
-					       NULL,
+						   NULL,
 						   "strict");
-		    Py_DECREF(temp);
-		    temp = unicode;
-		    if (temp == NULL)
-			goto onError;
-		}
+		        Py_DECREF(temp);
+		        temp = unicode;
+		        if (temp == NULL)
+			    goto onError;
+		    }
 		    else {
 			Py_DECREF(temp);
 			PyErr_SetString(PyExc_TypeError,
@@ -7117,11 +7117,13 @@
 		reslen += rescnt;
 		if (reslen < 0) {
 		    Py_XDECREF(temp);
-		    Py_DECREF(result);
-		    return PyErr_NoMemory();
+		    PyErr_NoMemory();
+		    goto onError;
+		}
+		if (_PyUnicode_Resize(&result, reslen) < 0) {
+		    Py_XDECREF(temp);
+		    goto onError;
 		}
-		if (_PyUnicode_Resize(&result, reslen) < 0)
-		    return NULL;
 		res = PyUnicode_AS_UNICODE(result)
 		    + reslen - rescnt;
 	    }
@@ -7171,6 +7173,7 @@
 	    if (dict && (argidx < arglen) && c != '%') {
 		PyErr_SetString(PyExc_TypeError,
 				"not all arguments converted during string formatting");
+                Py_XDECREF(temp);
 		goto onError;
 	    }
 	    Py_XDECREF(temp);
@@ -7182,12 +7185,12 @@
 	goto onError;
     }
 
+    if (_PyUnicode_Resize(&result, reslen - rescnt) < 0)
+	goto onError;
     if (args_owned) {
 	Py_DECREF(args);
     }
     Py_DECREF(uformat);
-    if (_PyUnicode_Resize(&result, reslen - rescnt) < 0)
-	goto onError;
     return (PyObject *)result;
 
  onError:


More information about the Python-checkins mailing list