diff -r b127046831e2 Python/errors.c --- a/Python/errors.c Mon Jul 23 00:24:24 2012 -0500 +++ b/Python/errors.c Wed Jul 25 15:40:52 2012 +0200 @@ -463,11 +463,22 @@ PyErr_SetFromErrnoWithFilenameObject(PyO return NULL; } +static PyObject * +decode_filename(const char *filename) +{ + if (!filename) + return NULL; +#ifdef HAVE_MBCS + return PyUnicode_DecodeMBCS(filename, strlen(filename), "replace"); +#else + return PyUnicode_DecodeFSDefault(filename); +#endif +} 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 +569,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 +606,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 +903,7 @@ PyErr_SyntaxLocationEx(const char *filen } } if (filename != NULL) { - tmp = PyUnicode_DecodeFSDefault(filename); + tmp = decode_filename(filename); if (tmp == NULL) PyErr_Clear(); else {