diff options
| -rw-r--r-- | win32/mingw.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/win32/mingw.c b/win32/mingw.c index e8152c87e..50ab92f0d 100644 --- a/win32/mingw.c +++ b/win32/mingw.c | |||
| @@ -1134,9 +1134,16 @@ static char *resolve_symlinks(char *path) | |||
| 1134 | char *ptr = NULL; | 1134 | char *ptr = NULL; |
| 1135 | DECLARE_PROC_ADDR(DWORD, GetFinalPathNameByHandleA, HANDLE, | 1135 | DECLARE_PROC_ADDR(DWORD, GetFinalPathNameByHandleA, HANDLE, |
| 1136 | LPSTR, DWORD, DWORD); | 1136 | LPSTR, DWORD, DWORD); |
| 1137 | char *resolve = NULL; | ||
| 1138 | |||
| 1139 | if (GetFileAttributesA(path) & FILE_ATTRIBUTE_REPARSE_POINT) { | ||
| 1140 | resolve = xmalloc_follow_symlinks(path); | ||
| 1141 | if (!resolve) | ||
| 1142 | return NULL; | ||
| 1143 | } | ||
| 1137 | 1144 | ||
| 1138 | /* need a file handle to resolve symlinks */ | 1145 | /* need a file handle to resolve symlinks */ |
| 1139 | h = CreateFileA(path, 0, 0, NULL, OPEN_EXISTING, | 1146 | h = CreateFileA(resolve ?: path, 0, 0, NULL, OPEN_EXISTING, |
| 1140 | FILE_FLAG_BACKUP_SEMANTICS, NULL); | 1147 | FILE_FLAG_BACKUP_SEMANTICS, NULL); |
| 1141 | if (h != INVALID_HANDLE_VALUE) { | 1148 | if (h != INVALID_HANDLE_VALUE) { |
| 1142 | if (!INIT_PROC_ADDR(kernel32.dll, GetFinalPathNameByHandleA)) { | 1149 | if (!INIT_PROC_ADDR(kernel32.dll, GetFinalPathNameByHandleA)) { |
| @@ -1155,6 +1162,7 @@ static char *resolve_symlinks(char *path) | |||
| 1155 | errno = err_win_to_posix(); | 1162 | errno = err_win_to_posix(); |
| 1156 | end: | 1163 | end: |
| 1157 | CloseHandle(h); | 1164 | CloseHandle(h); |
| 1165 | free(resolve); | ||
| 1158 | return ptr; | 1166 | return ptr; |
| 1159 | } | 1167 | } |
| 1160 | 1168 | ||
