Skip to content

Commit 98c18f7

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 c504da5 commit 98c18f7

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
@@ -1235,18 +1235,16 @@ char *mingw_getcwd(char *pointer, int len)
12351235
{
12361236
wchar_t cwd[MAX_PATH], wpointer[MAX_PATH];
12371237
DWORD ret = GetCurrentDirectoryW(ARRAY_SIZE(cwd), cwd);
1238+
HANDLE hnd;
12381239

12391240
if (!ret || ret >= ARRAY_SIZE(cwd)) {
12401241
errno = ret ? ENAMETOOLONG : err_win_to_posix(GetLastError());
12411242
return NULL;
12421243
}
1243-
ret = GetLongPathNameW(cwd, wpointer, ARRAY_SIZE(wpointer));
1244-
if (!ret && GetLastError() == ERROR_ACCESS_DENIED) {
1245-
HANDLE hnd = CreateFileW(cwd, 0,
1246-
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL,
1247-
OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
1248-
if (hnd == INVALID_HANDLE_VALUE)
1249-
return NULL;
1244+
hnd = CreateFileW(cwd, 0,
1245+
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL,
1246+
OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
1247+
if (hnd != INVALID_HANDLE_VALUE) {
12501248
ret = GetFinalPathNameByHandleW(hnd, wpointer, ARRAY_SIZE(wpointer), 0);
12511249
CloseHandle(hnd);
12521250
if (!ret || ret >= ARRAY_SIZE(wpointer))
@@ -1255,13 +1253,11 @@ char *mingw_getcwd(char *pointer, int len)
12551253
return NULL;
12561254
return pointer;
12571255
}
1258-
if (!ret || ret >= ARRAY_SIZE(wpointer))
1259-
return NULL;
1260-
if (GetFileAttributesW(wpointer) == INVALID_FILE_ATTRIBUTES) {
1256+
if (GetFileAttributesW(cwd) == INVALID_FILE_ATTRIBUTES) {
12611257
errno = ENOENT;
12621258
return NULL;
12631259
}
1264-
if (xwcstoutf(pointer, wpointer, len) < 0)
1260+
if (xwcstoutf(pointer, cwd, len) < 0)
12651261
return NULL;
12661262
convert_slashes(pointer);
12671263
return pointer;

0 commit comments

Comments
 (0)