[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