From: Patrick Steinhardt Date: Wed, 17 Dec 2025 14:44:02 GMT Subject: Re: [PATCH 1/5] mingw: do resolve symlinks in `getcwd()` Message-ID: In-Reply-To: <1928738b464915e3fb796145688bbfcfcc0fee3c.1765899229.git.gitgitgadget@gmail.com> On Tue, Dec 16, 2025 at 03:33:45PM +0000, Johannes Schindelin via GitGitGadget wrote: > diff --git a/compat/mingw.c b/compat/mingw.c > index ba1b7b6dd1..7215b127cc 100644 > --- a/compat/mingw.c > +++ b/compat/mingw.c > @@ -1251,18 +1251,16 @@ char *mingw_getcwd(char *pointer, int len) > { > wchar_t cwd[MAX_PATH], wpointer[MAX_PATH]; > DWORD ret = GetCurrentDirectoryW(ARRAY_SIZE(cwd), cwd); > + HANDLE hnd; > > if (!ret || ret >= ARRAY_SIZE(cwd)) { > errno = ret ? ENAMETOOLONG : err_win_to_posix(GetLastError()); > return NULL; > } > - ret = GetLongPathNameW(cwd, wpointer, ARRAY_SIZE(wpointer)); > - if (!ret && GetLastError() == ERROR_ACCESS_DENIED) { > - HANDLE hnd = CreateFileW(cwd, 0, > - FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, > - OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); > - if (hnd == INVALID_HANDLE_VALUE) > - return NULL; > + hnd = CreateFileW(cwd, 0, > + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, > + OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); > + if (hnd != INVALID_HANDLE_VALUE) { > ret = GetFinalPathNameByHandleW(hnd, wpointer, ARRAY_SIZE(wpointer), 0); > CloseHandle(hnd); > if (!ret || ret >= ARRAY_SIZE(wpointer)) Okay. Due to the change we now also try calling `GetFileAttributesW()` in case `CreateFileW()` fails, which wasn't the case before. But I'd consider that to be a win -- if we cannot figure out the final path name, then we can at least return the unresolved current working directory. Patrick > @@ -1271,13 +1269,11 @@ char *mingw_getcwd(char *pointer, int len) > return NULL; > return pointer; > } > - if (!ret || ret >= ARRAY_SIZE(wpointer)) > - return NULL; > - if (GetFileAttributesW(wpointer) == INVALID_FILE_ATTRIBUTES) { > + if (GetFileAttributesW(cwd) == INVALID_FILE_ATTRIBUTES) { > errno = ENOENT; > return NULL; > } > - if (xwcstoutf(pointer, wpointer, len) < 0) > + if (xwcstoutf(pointer, cwd, len) < 0) > return NULL; > convert_slashes(pointer); > return pointer;