[Python-checkins] r65745 - python/trunk/Modules/posixmodule.c

hirokazu.yamamoto python-checkins at python.org
Sun Aug 17 11:19:53 CEST 2008


Author: hirokazu.yamamoto
Date: Sun Aug 17 11:19:52 2008
New Revision: 65745

Log:
Issue #2222: Fixed reference leak when occured os.rename()
fails unicode conversion on 2nd parameter. (windows only)

Modified:
   python/trunk/Modules/posixmodule.c

Modified: python/trunk/Modules/posixmodule.c
==============================================================================
--- python/trunk/Modules/posixmodule.c	(original)
+++ python/trunk/Modules/posixmodule.c	Sun Aug 17 11:19:52 2008
@@ -478,24 +478,18 @@
 {
 }
 
-/* Function suitable for O& conversion */
 static int
-convert_to_unicode(PyObject *arg, void* _param)
+convert_to_unicode(PyObject **param)
 {
-	PyObject **param = (PyObject**)_param;
-	if (PyUnicode_CheckExact(arg)) {
-		Py_INCREF(arg);
-		*param = arg;
-	} 
-	else if (PyUnicode_Check(arg)) {
+	if (PyUnicode_CheckExact(*param))
+		Py_INCREF(*param);
+	else if (PyUnicode_Check(*param))
 		/* For a Unicode subtype that's not a Unicode object,
 		   return a true Unicode object with the same data. */
-		*param = PyUnicode_FromUnicode(PyUnicode_AS_UNICODE(arg),
-					       PyUnicode_GET_SIZE(arg));
-		return *param != NULL;
-	}
+		*param = PyUnicode_FromUnicode(PyUnicode_AS_UNICODE(*param),
+					       PyUnicode_GET_SIZE(*param));
 	else
-		*param = PyUnicode_FromEncodedObject(arg,
+		*param = PyUnicode_FromEncodedObject(*param,
 				                     Py_FileSystemDefaultEncoding,
 					             "strict");
 	return (*param) != NULL;
@@ -2542,22 +2536,26 @@
 	char *p1, *p2;
 	BOOL result;
 	if (unicode_file_names()) {
-	    if (!PyArg_ParseTuple(args, "O&O&:rename", 
-		convert_to_unicode, &o1,
-		convert_to_unicode, &o2))
-		    PyErr_Clear();
-	    else {
-		    Py_BEGIN_ALLOW_THREADS
-		    result = MoveFileW(PyUnicode_AsUnicode(o1),
-				       PyUnicode_AsUnicode(o2));
-		    Py_END_ALLOW_THREADS
-		    Py_DECREF(o1);
-		    Py_DECREF(o2);
-		    if (!result)
-			    return win32_error("rename", NULL);
-		    Py_INCREF(Py_None);
-		    return Py_None;
+	    if (!PyArg_ParseTuple(args, "OO:rename", &o1, &o2))
+		goto error;
+	    if (!convert_to_unicode(&o1))
+		goto error;
+	    if (!convert_to_unicode(&o2)) {
+		Py_DECREF(o1);
+		goto error;
 	    }
+	    Py_BEGIN_ALLOW_THREADS
+	    result = MoveFileW(PyUnicode_AsUnicode(o1),
+			       PyUnicode_AsUnicode(o2));
+	    Py_END_ALLOW_THREADS
+	    Py_DECREF(o1);
+	    Py_DECREF(o2);
+	    if (!result)
+		    return win32_error("rename", NULL);
+	    Py_INCREF(Py_None);
+	    return Py_None;
+error:
+	    PyErr_Clear();
 	}
 	if (!PyArg_ParseTuple(args, "ss:rename", &p1, &p2))
 		return NULL;


More information about the Python-checkins mailing list