Skip to content

Commit eb95a74

Browse files
committed
mingw: do resolve symlinks in getcwd()
As pointed out in git-for-windows#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 ef6dd00 commit eb95a74

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
@@ -1251,18 +1251,16 @@ char *mingw_getcwd(char *pointer, int len)
12511251
{
12521252
wchar_t cwd[MAX_PATH], wpointer[MAX_PATH];
12531253
DWORD ret = GetCurrentDirectoryW(ARRAY_SIZE(cwd), cwd);
1254+
HANDLE hnd;
12541255

12551256
if (!ret || ret >= ARRAY_SIZE(cwd)) {
12561257
errno = ret ? ENAMETOOLONG : err_win_to_posix(GetLastError());
12571258
return NULL;
12581259
}
1259-
ret = GetLongPathNameW(cwd, wpointer, ARRAY_SIZE(wpointer));
1260-
if (!ret && GetLastError() == ERROR_ACCESS_DENIED) {
1261-
HANDLE hnd = CreateFileW(cwd, 0,
1262-
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL,
1263-
OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
1264-
if (hnd == INVALID_HANDLE_VALUE)
1265-
return NULL;
1260+
hnd = CreateFileW(cwd, 0,
1261+
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL,
1262+
OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
1263+
if (hnd != INVALID_HANDLE_VALUE) {
12661264
ret = GetFinalPathNameByHandleW(hnd, wpointer, ARRAY_SIZE(wpointer), 0);
12671265
CloseHandle(hnd);
12681266
if (!ret || ret >= ARRAY_SIZE(wpointer))
@@ -1271,13 +1269,11 @@ char *mingw_getcwd(char *pointer, int len)
12711269
return NULL;
12721270
return pointer;
12731271
}
1274-
if (!ret || ret >= ARRAY_SIZE(wpointer))
1275-
return NULL;
1276-
if (GetFileAttributesW(wpointer) == INVALID_FILE_ATTRIBUTES) {
1272+
if (GetFileAttributesW(cwd) == INVALID_FILE_ATTRIBUTES) {
12771273
errno = ENOENT;
12781274
return NULL;
12791275
}
1280-
if (xwcstoutf(pointer, wpointer, len) < 0)
1276+
if (xwcstoutf(pointer, cwd, len) < 0)
12811277
return NULL;
12821278
convert_slashes(pointer);
12831279
return pointer;

0 commit comments

Comments
 (0)