mirror of
https://github.com/python/cpython.git
synced 2025-07-23 11:15:24 +00:00
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:
parent
a87d586fd6
commit
c8be84077b
1 changed files with 11 additions and 10 deletions
|
@ -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(
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue