diff options
| author | Johannes Schindelin <johannes.schindelin@gmx.de> | 2021-02-24 12:49:59 +0100 |
|---|---|---|
| committer | Ron Yorston <rmy@pobox.com> | 2021-03-01 09:30:29 +0000 |
| commit | 367f583cffcabdeebc3c27a42eba1926b5ea9819 (patch) | |
| tree | 8cae79bb2d7cb5e194e4e5229f1e29e4d89c7917 | |
| parent | 35e32c2a7176c6add799440b642cef3fa6a70045 (diff) | |
| download | busybox-w32-367f583cffcabdeebc3c27a42eba1926b5ea9819.tar.gz busybox-w32-367f583cffcabdeebc3c27a42eba1926b5ea9819.tar.bz2 busybox-w32-367f583cffcabdeebc3c27a42eba1926b5ea9819.zip | |
win32: let `resolve_symlinks()` _really_ resolve symbolic links
When one tries to call `CreateFile()` with a reparse point, it will
trigger an `ERROR_INVALID_NAME` unless `FILE_FLAG_OPEN_REPARSE_POINT` is
passed. However, _when_ that flag is passed, it does not open a handle
to the symlink _target_, but to the symlink itself.
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
| -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 | ||
