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.
This commit is contained in:
parent
1de911592e
commit
fc889c48ed
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue