]> granicus.if.org Git - python/commitdiff
Merged revisions 65745 via svnmerge from
authorHirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
Sun, 17 Aug 2008 09:30:15 +0000 (09:30 +0000)
committerHirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
Sun, 17 Aug 2008 09:30:15 +0000 (09:30 +0000)
svn+ssh://pythondev@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)
........

Modules/posixmodule.c

index b499b47817737a8608959843d1791cd892e0894d..8931ea295fa7039b1e35a3d6eb0718181b725576 100644 (file)
@@ -503,24 +503,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;
@@ -2568,22 +2562,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;