diff options
author | Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp> | 2008-08-17 09:19:52 (GMT) |
---|---|---|
committer | Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp> | 2008-08-17 09:19:52 (GMT) |
commit | a0fdd72f8e83cc9f3bd5c78094d3f57d4f6defbe (patch) | |
tree | c532a133dc09184081c9657f7bbd719394603836 /Modules | |
parent | 047e4a915d899b31dcb49fd820914df6a9991870 (diff) | |
download | cpython-a0fdd72f8e83cc9f3bd5c78094d3f57d4f6defbe.zip cpython-a0fdd72f8e83cc9f3bd5c78094d3f57d4f6defbe.tar.gz cpython-a0fdd72f8e83cc9f3bd5c78094d3f57d4f6defbe.tar.bz2 |
Issue #2222: Fixed reference leak when occured os.rename()
fails unicode conversion on 2nd parameter. (windows only)
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/posixmodule.c | 54 |
1 files changed, 26 insertions, 28 deletions
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 8104ccd..79c3a44 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -478,24 +478,18 @@ static PyObject *_PyUnicode_FromFileSystemEncodedObject(register PyObject *obj) { } -/* 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 @@ posix_rename(PyObject *self, PyObject *args) 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; |