Skip to content
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

mingw: handle non-ASCII PATH components correctly #135

Closed
wants to merge 1 commit into from

Conversation

dscho
Copy link
Member

@dscho dscho commented Feb 24, 2019

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 incompat/mingw.c`, so we really have to use the Unicode versions of the Win32 API.

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 <adam@roben.org>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
@dscho dscho added the ready to submit Has commits that have not been submitted yet label Feb 24, 2019
@dscho
Copy link
Member Author

dscho commented Aug 24, 2019

/submit

@gitgitgadget
Copy link

gitgitgadget bot commented Aug 24, 2019

Submitted as pull.135.git.gitgitgadget@gmail.com

@dscho dscho removed the ready to submit Has commits that have not been submitted yet label Aug 24, 2019
@@ -1161,14 +1161,21 @@ static char *lookup_prog(const char *dir, int dirlen, const char *cmd,
int isexe, int exe_only)
Copy link

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" <gitgitgadget@gmail.com> 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@roben.org>
> Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
> ---
>  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;
>  }

@gitgitgadget
Copy link

gitgitgadget bot commented Aug 26, 2019

This branch is now known as ar/mingw-run-external-with-non-ascii-path.

@gitgitgadget
Copy link

gitgitgadget bot commented Aug 26, 2019

This patch series was integrated into pu via git@dddb330.

@gitgitgadget gitgitgadget bot added the pu label Aug 26, 2019
@gitgitgadget
Copy link

gitgitgadget bot commented Aug 30, 2019

This patch series was integrated into pu via git@90b217d.

@gitgitgadget
Copy link

gitgitgadget bot commented Sep 3, 2019

This patch series was integrated into pu via git@d1a68cd.

@gitgitgadget
Copy link

gitgitgadget bot commented Sep 5, 2019

This patch series was integrated into pu via git@5dadc96.

@gitgitgadget
Copy link

gitgitgadget bot commented Sep 7, 2019

This patch series was integrated into pu via git@0b18aac.

@gitgitgadget
Copy link

gitgitgadget bot commented Sep 9, 2019

This patch series was integrated into pu via git@6d6706b.

@gitgitgadget
Copy link

gitgitgadget bot commented Sep 9, 2019

This patch series was integrated into next via git@1973826.

@gitgitgadget
Copy link

gitgitgadget bot commented Sep 16, 2019

This patch series was integrated into pu via git@a616121.

@gitgitgadget
Copy link

gitgitgadget bot commented Sep 17, 2019

This patch series was integrated into pu via git@f8a13c3.

@gitgitgadget
Copy link

gitgitgadget bot commented Sep 18, 2019

This patch series was integrated into pu via git@b38f69d.

@gitgitgadget
Copy link

gitgitgadget bot commented Sep 18, 2019

This patch series was integrated into pu via git@ae43462.

@gitgitgadget
Copy link

gitgitgadget bot commented Sep 30, 2019

This patch series was integrated into pu via git@6f21347.

@gitgitgadget
Copy link

gitgitgadget bot commented Sep 30, 2019

This patch series was integrated into master via git@6f21347.

@gitgitgadget gitgitgadget bot added the master label Sep 30, 2019
@gitgitgadget gitgitgadget bot closed this Sep 30, 2019
@gitgitgadget
Copy link

gitgitgadget bot commented Sep 30, 2019

Closed via 6f21347.

@dscho dscho deleted the fix-externals branch September 30, 2019 09:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants