diff -r 43ae2a243eca Lib/test/test_genericpath.py --- a/Lib/test/test_genericpath.py Thu Jul 26 00:47:15 2012 +0200 +++ b/Lib/test/test_genericpath.py Thu Jul 26 12:51:23 2012 +0200 @@ -299,8 +299,7 @@ class CommonTest(GenericTest): unicwd = '\xe7w\xf0' try: - fsencoding = support.TESTFN_ENCODING or "ascii" - unicwd.encode(fsencoding) + os.fsencode(unicwd) except (AttributeError, UnicodeEncodeError): # FS encoding is probably ASCII pass @@ -312,10 +311,19 @@ class CommonTest(GenericTest): @unittest.skipIf(sys.platform == 'darwin', "Mac OS X denies the creation of a directory with an invalid utf8 name") def test_nonascii_abspath(self): + name = b'\xe7w\xf0' + if sys.platform == 'win32': + try: + os.fsdecode(name) + except UnicodeDecodeError: + self.skipTest("the filename %a is not decodable " + "from the ANSI code page %s" + % (name, sys.getfilesystemencoding())) + # Test non-ASCII, non-UTF8 bytes in the path. with warnings.catch_warnings(): warnings.simplefilter("ignore", DeprecationWarning) - with support.temp_cwd(b'\xe7w\xf0'): + with support.temp_cwd(name): self.test_abspath() diff -r 43ae2a243eca Modules/posixmodule.c --- a/Modules/posixmodule.c Thu Jul 26 00:47:15 2012 +0200 +++ b/Modules/posixmodule.c Thu Jul 26 12:51:23 2012 +0200 @@ -1129,20 +1129,15 @@ win32_error_object(char* function, PyObj static PyObject * path_posix_error(char *function_name, path_t *path) { - if (path->narrow) - return posix_error_with_filename(path->narrow); - return posix_error(); + return PyErr_SetFromErrnoWithFilenameObject(PyExc_OSError, path->object); } static PyObject * path_error(char *function_name, path_t *path) { #ifdef MS_WINDOWS - if (path->narrow) - return win32_error(function_name, path->narrow); - if (path->wide) - return win32_error_unicode(function_name, path->wide); - return win32_error(function_name, NULL); + return PyErr_SetExcFromWindowsErrWithFilenameObject(PyExc_OSError, + 0, path->object); #else return path_posix_error(function_name, path); #endif diff -r 43ae2a243eca Python/errors.c --- a/Python/errors.c Thu Jul 26 00:47:15 2012 +0200 +++ b/Python/errors.c Thu Jul 26 12:51:23 2012 +0200 @@ -463,11 +463,24 @@ PyErr_SetFromErrnoWithFilenameObject(PyO return NULL; } +static PyObject * +decode_filename(const char *filename) +{ + PyObject *obj; + if (!filename) + return NULL; + obj = PyUnicode_DecodeFSDefault(filename); + if (obj == NULL) { + PyErr_Clear(); + obj = PyBytes_FromString(filename); + } + return obj; +} PyObject * PyErr_SetFromErrnoWithFilename(PyObject *exc, const char *filename) { - PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL; + PyObject *name = decode_filename(filename); PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name); Py_XDECREF(name); return result; @@ -558,7 +571,7 @@ PyObject *PyErr_SetExcFromWindowsErrWith int ierr, const char *filename) { - PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL; + PyObject *name = decode_filename(filename); PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc, ierr, name); @@ -595,7 +608,7 @@ PyObject *PyErr_SetFromWindowsErrWithFil int ierr, const char *filename) { - PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL; + PyObject *name = decode_filename(filename); PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject( PyExc_WindowsError, ierr, name); @@ -892,7 +905,7 @@ PyErr_SyntaxLocationEx(const char *filen } } if (filename != NULL) { - tmp = PyUnicode_DecodeFSDefault(filename); + tmp = decode_filename(filename); if (tmp == NULL) PyErr_Clear(); else {