Skip to content

Commit ce16057

Browse files
committed
mingw: do resolve symlinks in getcwd()
As pointed out in #1676, the `git rev-parse --is-inside-work-tree` command currently fails when the current directory's path contains symbolic links. The underlying reason for this bug is that `getcwd()` is supposed to resolve symbolic links, but our `mingw_getcwd()` implementation did not. We do have all the building blocks for that, though: the `GetFinalPathByHandleW()` function will resolve symbolic links. However, we only called that function if `GetLongPathNameW()` failed, for historical reasons: the latter function was supported for a long time, but the former API function was introduced only with Windows Vista, and we used to support also Windows XP. With that support having been dropped, we are free to call the symbolic link-resolving function right away. Signed-off-by: Johannes Schindelin <[email protected]>
1 parent 9028643 commit ce16057

File tree

1 file changed

+7
-11
lines changed

1 file changed

+7
-11
lines changed

compat/mingw.c

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1210,18 +1210,16 @@ char *mingw_getcwd(char *pointer, int len)
12101210
{
12111211
wchar_t cwd[MAX_PATH], wpointer[MAX_PATH];
12121212
DWORD ret = GetCurrentDirectoryW(ARRAY_SIZE(cwd), cwd);
1213+
HANDLE hnd;
12131214

12141215
if (!ret || ret >= ARRAY_SIZE(cwd)) {
12151216
errno = ret ? ENAMETOOLONG : err_win_to_posix(GetLastError());
12161217
return NULL;
12171218
}
1218-
ret = GetLongPathNameW(cwd, wpointer, ARRAY_SIZE(wpointer));
1219-
if (!ret && GetLastError() == ERROR_ACCESS_DENIED) {
1220-
HANDLE hnd = CreateFileW(cwd, 0,
1221-
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL,
1222-
OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
1223-
if (hnd == INVALID_HANDLE_VALUE)
1224-
return NULL;
1219+
hnd = CreateFileW(cwd, 0,
1220+
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL,
1221+
OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
1222+
if (hnd != INVALID_HANDLE_VALUE) {
12251223
ret = GetFinalPathNameByHandleW(hnd, wpointer, ARRAY_SIZE(wpointer), 0);
12261224
CloseHandle(hnd);
12271225
if (!ret || ret >= ARRAY_SIZE(wpointer))
@@ -1230,13 +1228,11 @@ char *mingw_getcwd(char *pointer, int len)
12301228
return NULL;
12311229
return pointer;
12321230
}
1233-
if (!ret || ret >= ARRAY_SIZE(wpointer))
1234-
return NULL;
1235-
if (GetFileAttributesW(wpointer) == INVALID_FILE_ATTRIBUTES) {
1231+
if (GetFileAttributesW(cwd) == INVALID_FILE_ATTRIBUTES) {
12361232
errno = ENOENT;
12371233
return NULL;
12381234
}
1239-
if (xwcstoutf(pointer, wpointer, len) < 0)
1235+
if (xwcstoutf(pointer, cwd, len) < 0)
12401236
return NULL;
12411237
convert_slashes(pointer);
12421238
return pointer;

0 commit comments

Comments
 (0)