mirror of https://github.com/python/cpython
Issue #2222: Fixed reference leak when occured os.rename()
fails unicode conversion on 2nd parameter. (windows only)
This commit is contained in:
parent
047e4a915d
commit
a0fdd72f8e
|
@ -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,11 +2536,14 @@ 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 {
|
||||
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));
|
||||
|
@ -2557,7 +2554,8 @@ posix_rename(PyObject *self, PyObject *args)
|
|||
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…
Reference in New Issue