diff -r 3ee15bd35902 Modules/posixmodule.c --- a/Modules/posixmodule.c Sat Oct 08 16:15:15 2016 +0300 +++ b/Modules/posixmodule.c Sat Oct 08 16:17:26 2016 +0000 @@ -1337,27 +1337,37 @@ #endif /* MS_WINDOWS */ static PyObject * +path_object_error(PyObject *path) +{ +#ifdef MS_WINDOWS + return PyErr_SetExcFromWindowsErrWithFilenameObject( + PyExc_OSError, 0, path); +#else + return PyErr_SetFromErrnoWithFilenameObject(PyExc_OSError, path); +#endif +} + +static PyObject * +path_object_error2(PyObject *path, PyObject *path2) +{ +#ifdef MS_WINDOWS + return PyErr_SetExcFromWindowsErrWithFilenameObjects( + PyExc_OSError, 0, path, path2); +#else + return PyErr_SetFromErrnoWithFilenameObjects(PyExc_OSError, path, path2); +#endif +} + +static PyObject * path_error(path_t *path) { -#ifdef MS_WINDOWS - return PyErr_SetExcFromWindowsErrWithFilenameObject(PyExc_OSError, - 0, path->object); -#else - return PyErr_SetFromErrnoWithFilenameObject(PyExc_OSError, path->object); -#endif -} - + return path_object_error(path->object); +} static PyObject * path_error2(path_t *path, path_t *path2) { -#ifdef MS_WINDOWS - return PyErr_SetExcFromWindowsErrWithFilenameObjects(PyExc_OSError, - 0, path->object, path2->object); -#else - return PyErr_SetFromErrnoWithFilenameObjects(PyExc_OSError, - path->object, path2->object); -#endif + return path_object_error2(path->object, path2->object); } @@ -11152,41 +11162,26 @@ DirEntry_fetch_stat(DirEntry *self, int follow_symlinks) { int result; - struct _Py_stat_struct st; - -#ifdef MS_WINDOWS - const wchar_t *path; - - path = PyUnicode_AsUnicode(self->path); - if (!path) - return NULL; - - if (follow_symlinks) - result = win32_stat(path, &st); - else - result = win32_lstat(path, &st); - - if (result != 0) { - return PyErr_SetExcFromWindowsErrWithFilenameObject(PyExc_OSError, - 0, self->path); - } + STRUCT_STAT st; + PyObject *ub; + +#ifdef MS_WINDOWS + if (PyUnicode_FSDecoder(self->path, &ub)) { + const wchar_t *path = PyUnicode_AsUnicode(ub); #else /* POSIX */ - PyObject *bytes; - const char *path; - - if (!PyUnicode_FSConverter(self->path, &bytes)) - return NULL; - path = PyBytes_AS_STRING(bytes); - - if (follow_symlinks) - result = STAT(path, &st); - else - result = LSTAT(path, &st); - Py_DECREF(bytes); - + if (PyUnicode_FSConverter(self->path, &ub)) { + const char *path = PyBytes_AS_STRING(ub); +#endif + if (follow_symlinks) + result = STAT(path, &st); + else + result = LSTAT(path, &st); + Py_DECREF(ub); + } else + return NULL; + if (result != 0) - return PyErr_SetFromErrnoWithFilenameObject(PyExc_OSError, self->path); -#endif + return path_object_error(self->path); return _pystat_fromstructstat(&st); } @@ -11356,17 +11351,19 @@ { #ifdef MS_WINDOWS if (!self->got_file_index) { + PyObject *unicode; const wchar_t *path; - struct _Py_stat_struct stat; - - path = PyUnicode_AsUnicode(self->path); - if (!path) + STRUCT_STAT stat; + int result; + + if (!PyUnicode_FSDecoder(self->path, &unicode)) return NULL; - - if (win32_lstat(path, &stat) != 0) { - return PyErr_SetExcFromWindowsErrWithFilenameObject(PyExc_OSError, - 0, self->path); - } + path = PyUnicode_AsUnicode(unicode); + result = LSTAT(path, &stat); + Py_DECREF(unicode); + + if (result != 0) + return path_object_error(self->path); self->win32_file_index = stat.st_ino; self->got_file_index = 1;