From: Brian Curtin Date: Sun, 28 Nov 2010 23:59:46 +0000 (+0000) Subject: Fix for #8879. X-Git-Tag: v3.2b1~183 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=fc889c48edc17b9502c0aef416ce2d003dbef4e6;p=thirdparty%2FPython%2Fcpython.git Fix for #8879. Amaury noticed that this was originally written in a way that would fail on names that can't be encoded with the mbcs codec. Restructured the function to work with wide names first then narrow names second, to fall in line with the way other functions are written in posixmodule.c. --- diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index 978364c4789b..5a37522ad82e 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -887,6 +887,11 @@ class LinkTests(unittest.TestCase): self._test_link(bytes(self.file1, sys.getfilesystemencoding()), bytes(self.file2, sys.getfilesystemencoding())) + def test_mbcs_name(self): + self.file1 += "\u65e5\u672c" + self.file2 = self.file1 + "2" + self._test_link(self.file1, self.file2) + if sys.platform != 'win32': class Win32ErrorTests(unittest.TestCase): pass diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 3197a0d2d8df..48dbaa515c41 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -2252,6 +2252,22 @@ win32_link(PyObject *self, PyObject *args) char *src, *dst; BOOL rslt; + PyUnicodeObject *usrc, *udst; + if (PyArg_ParseTuple(args, "UU:link", &usrc, &udst)) { + Py_BEGIN_ALLOW_THREADS + rslt = CreateHardLinkW(PyUnicode_AS_UNICODE(udst), + PyUnicode_AS_UNICODE(usrc), NULL); + Py_END_ALLOW_THREADS + + if (rslt == 0) + return win32_error("link", NULL); + + Py_RETURN_NONE; + } + + /* Narrow strings also valid. */ + PyErr_Clear(); + if (!PyArg_ParseTuple(args, "O&O&:link", PyUnicode_FSConverter, &osrc, PyUnicode_FSConverter, &odst)) return NULL; @@ -2260,13 +2276,13 @@ win32_link(PyObject *self, PyObject *args) dst = PyBytes_AsString(odst); Py_BEGIN_ALLOW_THREADS - rslt = CreateHardLink(dst, src, NULL); + rslt = CreateHardLinkA(dst, src, NULL); Py_END_ALLOW_THREADS Py_DECREF(osrc); Py_DECREF(odst); if (rslt == 0) - return posix_error(); + return win32_error("link", NULL); Py_RETURN_NONE; }