-
Notifications
You must be signed in to change notification settings - Fork 140
mingw: handle non-ASCII PATH components correctly #135
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
If Git were installed in a path containing non-ASCII characters, commands such as `git am` and `git submodule`, which are implemented as externals, would fail to launch with the following error: > fatal: 'am' appears to be a git command, but we were not > able to execute it. Maybe git-am is broken? This was due to lookup_prog not being Unicode-aware. It was somehow missed in 85faec9 (Win32: Unicode file name support (except dirent), 2012-03-15). 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. 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 <[email protected]> Signed-off-by: Johannes Schindelin <[email protected]>
/submit |
Submitted as [email protected] |
@@ -1161,14 +1161,21 @@ static char *lookup_prog(const char *dir, int dirlen, const char *cmd, | |||
int isexe, int exe_only) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
On the Git mailing list, Junio C Hamano wrote (reply to this):
"Adam Roben via GitGitGadget" <[email protected]> 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 <[email protected]>
> Signed-off-by: Johannes Schindelin <[email protected]>
> ---
> 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;
> }
This branch is now known as |
This patch series was integrated into pu via git@dddb330. |
This patch series was integrated into pu via git@90b217d. |
This patch series was integrated into pu via git@d1a68cd. |
This patch series was integrated into pu via git@5dadc96. |
This patch series was integrated into pu via git@0b18aac. |
This patch series was integrated into pu via git@6d6706b. |
This patch series was integrated into next via git@1973826. |
This patch series was integrated into pu via git@a616121. |
This patch series was integrated into pu via git@f8a13c3. |
This patch series was integrated into pu via git@b38f69d. |
This patch series was integrated into pu via git@ae43462. |
This patch series was integrated into pu via git@6f21347. |
This patch series was integrated into master via git@6f21347. |
Closed via 6f21347. |
We need to be careful on Windows: there are "ANSI" versions of the API functions that take
char *
, and "Unicode" versions that take "wchar_t *strings as parameters. The ANSI versions are subject to the current codepage, i.e. almost guaranteed to *not* handle UTF-8. Internally, we do want to use UTF-8, though, at least in
compat/mingw.c`, so we really have to use the Unicode versions of the Win32 API.