Correct completely broken os.stat behavior on Windows XP.

After 1a3e8db28d49, Windows XP could not os.stat at all due to raising
immediately when GetFinalPathNameByHandle wasn't available (pre-Vista).
The proper behavior in that situation is to just not attempt a traversal
rather than outright rejecting.

This change additionally handles a failed malloc by setting the error code
and returning false.

Patch by Hirokazu Yamamoto.
This commit is contained in:
Brian Curtin 2011-06-14 09:52:50 -05:00
parent a87d586fd6
commit c8be84077b

View file

@ -1102,6 +1102,11 @@ get_target_path(HANDLE hdl, wchar_t **target_path)
return FALSE;
buf = (wchar_t *)malloc((buf_size+1)*sizeof(wchar_t));
if (!buf) {
SetLastError(ERROR_OUTOFMEMORY);
return FALSE;
}
result_length = Py_GetFinalPathNameByHandleW(hdl,
buf, buf_size, VOLUME_NAME_DOS);
@ -1136,11 +1141,9 @@ win32_xstat_impl(const char *path, struct win32_stat *result,
const char *dot;
if(!check_GetFinalPathNameByHandle()) {
/* If the OS doesn't have GetFinalPathNameByHandle, return a
NotImplementedError. */
PyErr_SetString(PyExc_NotImplementedError,
"GetFinalPathNameByHandle not available on this platform");
return -1;
/* If the OS doesn't have GetFinalPathNameByHandle, don't
traverse reparse point. */
traverse = FALSE;
}
hFile = CreateFileA(
@ -1234,11 +1237,9 @@ win32_xstat_impl_w(const wchar_t *path, struct win32_stat *result,
const wchar_t *dot;
if(!check_GetFinalPathNameByHandle()) {
/* If the OS doesn't have GetFinalPathNameByHandle, return a
NotImplementedError. */
PyErr_SetString(PyExc_NotImplementedError,
"GetFinalPathNameByHandle not available on this platform");
return -1;
/* If the OS doesn't have GetFinalPathNameByHandle, don't
traverse reparse point. */
traverse = FALSE;
}
hFile = CreateFileW(