"Adam Roben via GitGitGadget" <gitgitgadget@xxxxxxxxx> writes: > Note that the only problem in this function was calling > `GetFileAttributes()` instead of `GetFileAttributesW()`. The calls to > `access()` were fine because `access()` is a macro which resolves to > `mingw_access()`, which already handles Unicode correctly. But > `lookup_prog()` was changed to use `_waccess()` directly so that we only > convert the path to UTF-16 once. Nicely explained. Thanks. > > To make things work correctly, we have to maintain UTF-8 and UTF-16 > versions in tandem in `lookup_prog()`. > > Signed-off-by: Adam Roben <adam@xxxxxxxxx> > Signed-off-by: Johannes Schindelin <johannes.schindelin@xxxxxx> > --- > compat/mingw.c | 15 +++++++++++---- > 1 file changed, 11 insertions(+), 4 deletions(-) > > diff --git a/compat/mingw.c b/compat/mingw.c > index 8141f77189..9f02403ebf 100644 > --- a/compat/mingw.c > +++ b/compat/mingw.c > @@ -1161,14 +1161,21 @@ static char *lookup_prog(const char *dir, int dirlen, const char *cmd, > int isexe, int exe_only) > { > char path[MAX_PATH]; > + wchar_t wpath[MAX_PATH]; > snprintf(path, sizeof(path), "%.*s\\%s.exe", dirlen, dir, cmd); > > - if (!isexe && access(path, F_OK) == 0) > + if (xutftowcs_path(wpath, path) < 0) > + return NULL; > + > + if (!isexe && _waccess(wpath, F_OK) == 0) > return xstrdup(path); > - path[strlen(path)-4] = '\0'; > - if ((!exe_only || isexe) && access(path, F_OK) == 0) > - if (!(GetFileAttributes(path) & FILE_ATTRIBUTE_DIRECTORY)) > + wpath[wcslen(wpath)-4] = '\0'; > + if ((!exe_only || isexe) && _waccess(wpath, F_OK) == 0) { > + if (!(GetFileAttributesW(wpath) & FILE_ATTRIBUTE_DIRECTORY)) { > + path[strlen(path)-4] = '\0'; > return xstrdup(path); > + } > + } > return NULL; > }