]> granicus.if.org Git - python/commitdiff
Correct completely broken os.stat behavior on Windows XP.
authorBrian Curtin <brian@python.org>
Tue, 14 Jun 2011 14:52:50 +0000 (09:52 -0500)
committerBrian Curtin <brian@python.org>
Tue, 14 Jun 2011 14:52:50 +0000 (09:52 -0500)
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.

Modules/posixmodule.c

index b6f49b81e6cc623b312b18a3345f7000c0491a5b..a93aa6a4fa103818748a7c42aecb7c954ea11cdf 100644 (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(