116 lines
4.0 KiB
Diff
116 lines
4.0 KiB
Diff
diff -Naur Python-3.5.2-orig/Modules/posixmodule.c Python-3.5.2/Modules/posixmodule.c
|
|
--- Python-3.5.2-orig/Modules/posixmodule.c 2016-07-12 14:22:01.940300700 +0300
|
|
+++ Python-3.5.2/Modules/posixmodule.c 2016-07-12 14:23:03.682800700 +0300
|
|
@@ -1464,6 +1464,31 @@
|
|
return TRUE;
|
|
}
|
|
|
|
+/* Grab GetFinalPathNameByHandle dynamically from kernel32 */
|
|
+static int has_GetFinalPathNameByHandle = -1;
|
|
+static DWORD (CALLBACK *Py_GetFinalPathNameByHandleW)(HANDLE, LPWSTR, DWORD,
|
|
+ DWORD);
|
|
+static int
|
|
+check_GetFinalPathNameByHandle()
|
|
+{
|
|
+ HINSTANCE hKernel32;
|
|
+ DWORD (CALLBACK *Py_GetFinalPathNameByHandleA)(HANDLE, LPSTR, DWORD,
|
|
+ DWORD);
|
|
+
|
|
+ /* only recheck */
|
|
+ if (-1 == has_GetFinalPathNameByHandle)
|
|
+ {
|
|
+ hKernel32 = GetModuleHandleW(L"KERNEL32");
|
|
+ *(FARPROC*)&Py_GetFinalPathNameByHandleA = GetProcAddress(hKernel32,
|
|
+ "GetFinalPathNameByHandleA");
|
|
+ *(FARPROC*)&Py_GetFinalPathNameByHandleW = GetProcAddress(hKernel32,
|
|
+ "GetFinalPathNameByHandleW");
|
|
+ has_GetFinalPathNameByHandle = Py_GetFinalPathNameByHandleA &&
|
|
+ Py_GetFinalPathNameByHandleW;
|
|
+ }
|
|
+ return has_GetFinalPathNameByHandle;
|
|
+}
|
|
+
|
|
static BOOL
|
|
get_target_path(HANDLE hdl, wchar_t **target_path)
|
|
{
|
|
@@ -1472,8 +1497,8 @@
|
|
|
|
/* We have a good handle to the target, use it to determine
|
|
the target path name (then we'll call lstat on it). */
|
|
- buf_size = GetFinalPathNameByHandleW(hdl, 0, 0,
|
|
- VOLUME_NAME_DOS);
|
|
+ buf_size = Py_GetFinalPathNameByHandleW(hdl, 0, 0,
|
|
+ VOLUME_NAME_DOS);
|
|
if(!buf_size)
|
|
return FALSE;
|
|
|
|
@@ -1483,7 +1508,7 @@
|
|
return FALSE;
|
|
}
|
|
|
|
- result_length = GetFinalPathNameByHandleW(hdl,
|
|
+ result_length = Py_GetFinalPathNameByHandleW(hdl,
|
|
buf, buf_size, VOLUME_NAME_DOS);
|
|
|
|
if(!result_length) {
|
|
@@ -1516,6 +1541,12 @@
|
|
wchar_t *target_path;
|
|
const char *dot;
|
|
|
|
+ if(!check_GetFinalPathNameByHandle()) {
|
|
+ /* If the OS doesn't have GetFinalPathNameByHandle, don't
|
|
+ traverse reparse point. */
|
|
+ traverse = FALSE;
|
|
+ }
|
|
+
|
|
hFile = CreateFileA(
|
|
path,
|
|
FILE_READ_ATTRIBUTES, /* desired access */
|
|
@@ -1606,6 +1637,12 @@
|
|
wchar_t *target_path;
|
|
const wchar_t *dot;
|
|
|
|
+ if(!check_GetFinalPathNameByHandle()) {
|
|
+ /* If the OS doesn't have GetFinalPathNameByHandle, don't
|
|
+ traverse reparse point. */
|
|
+ traverse = FALSE;
|
|
+ }
|
|
+
|
|
hFile = CreateFileW(
|
|
path,
|
|
FILE_READ_ATTRIBUTES, /* desired access */
|
|
@@ -3848,6 +3885,13 @@
|
|
if (path_wchar == NULL)
|
|
return NULL;
|
|
|
|
+ if(!check_GetFinalPathNameByHandle()) {
|
|
+ /* If the OS doesn't have GetFinalPathNameByHandle, return a
|
|
+ NotImplementedError. */
|
|
+ return PyErr_Format(PyExc_NotImplementedError,
|
|
+ "GetFinalPathNameByHandle not available on this platform");
|
|
+ }
|
|
+
|
|
hFile = CreateFileW(
|
|
path_wchar,
|
|
0, /* desired access */
|
|
@@ -3863,7 +3907,7 @@
|
|
|
|
/* We have a good handle to the target, use it to determine the
|
|
target path name. */
|
|
- buf_size = GetFinalPathNameByHandleW(hFile, 0, 0, VOLUME_NAME_NT);
|
|
+ buf_size = Py_GetFinalPathNameByHandleW(hFile, 0, 0, VOLUME_NAME_NT);
|
|
|
|
if(!buf_size)
|
|
return win32_error_object("GetFinalPathNameByHandle", path);
|
|
@@ -3872,8 +3916,8 @@
|
|
if(!target_path)
|
|
return PyErr_NoMemory();
|
|
|
|
- result_length = GetFinalPathNameByHandleW(hFile, target_path,
|
|
- buf_size, VOLUME_NAME_DOS);
|
|
+ result_length = Py_GetFinalPathNameByHandleW(hFile, target_path,
|
|
+ buf_size, VOLUME_NAME_DOS);
|
|
if(!result_length)
|
|
return win32_error_object("GetFinalPathNamyByHandle", path);
|
|
|