Discussion:
[Python-3000-checkins] r65746 - in python/branches/py3k: Modules/posixmodule.c
hirokazu.yamamoto
2008-08-17 09:30:16 UTC
Permalink
Author: hirokazu.yamamoto
Date: Sun Aug 17 11:30:15 2008
New Revision: 65746

Log:
Merged revisions 65745 via svnmerge from
svn+ssh://pythondev at svn.python.org/python/trunk

........
r65745 | hirokazu.yamamoto | 2008-08-17 18:19:52 +0900 | 2 lines

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


Modified:
python/branches/py3k/ (props changed)
python/branches/py3k/Modules/posixmodule.c

Modified: python/branches/py3k/Modules/posixmodule.c
==============================================================================
--- python/branches/py3k/Modules/posixmodule.c (original)
+++ python/branches/py3k/Modules/posixmodule.c Sun Aug 17 11:30:15 2008
@@ -503,24 +503,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;
@@ -2568,22 +2562,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;

Loading...