mingw: use Unicode functions explicitly

Many Win32 API functions actually exist in two variants: one with the `A` suffix that takes ANSI parameters (`char *` or `const char *`) and one with the `W` suffix that takes Unicode parameters (`wchar_t *` or `const wchar_t *`). The ANSI variant assumes that the strings are encoded according to whatever is the current locale. This is not what Git wants to use on Windows: we assume that `char *` variables point to strings encoded in UTF-8. There is a pseudo UTF-8 locale on Windows, but it does not work as one might expect. In addition, if we overrode the user's locale, that would modify the behavior of programs spawned by Git (such as editors, difftools, etc), therefore we cannot use that pseudo locale. Further, it is actually highly encouraged to use the Unicode versions instead of the ANSI versions, so let's do precisely that. Note: when calling the Win32 API functions _without_ any suffix, it depends whether the `UNICODE` constant is defined before the relevant headers are #include'd. Without that constant, the ANSI variants are used. Let's be explicit and avoid that ambiguity. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Johannes Schindelin committed Jun 27, 2019 at 02:37 UTC 94238859b9809afc806919cb7022a45cdc8e6748
3 files changed +8 -6
compat/mingw.c
+1 -1
@@ -1407,7 +1407,7 @@ static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **deltaen
1407 do_unset_environment_variables();
1408
1409 /* Determine whether or not we are associated to a console */
1410 - cons = CreateFile("CONOUT$", GENERIC_WRITE,
1410 + cons = CreateFileW(L"CONOUT$", GENERIC_WRITE,
1411 FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
1412 FILE_ATTRIBUTE_NORMAL, NULL);
1413 if (cons == INVALID_HANDLE_VALUE) {
compat/poll/poll.c
+1 -1
@@ -150,7 +150,7 @@ win32_compute_revents (HANDLE h, int *p_sought)
150 if (!once_only)
151 {
152 NtQueryInformationFile = (PNtQueryInformationFile)
153 - GetProcAddress (GetModuleHandle ("ntdll.dll"),
153 + GetProcAddress (GetModuleHandleW (L"ntdll.dll"),
154 "NtQueryInformationFile");
155 once_only = TRUE;
156 }
compat/winansi.c
+6 -4
@@ -599,7 +599,7 @@ int winansi_isatty(int fd)
599 void winansi_init(void)
600 {
601 int con1, con2;
602 - char name[32];
602 + wchar_t name[32];
603
604 /* check if either stdout or stderr is a console output screen buffer */
605 con1 = is_console(1);
@@ -619,13 +619,15 @@ void winansi_init(void)
619 }
620
621 /* create a named pipe to communicate with the console thread */
622 - xsnprintf(name, sizeof(name), "\\\\.\\pipe\\winansi%lu", GetCurrentProcessId());
623 - hwrite = CreateNamedPipe(name, PIPE_ACCESS_OUTBOUND,
622 + if (swprintf(name, ARRAY_SIZE(name) - 1, L"\\\\.\\pipe\\winansi%lu",
623 + GetCurrentProcessId()) < 0)
624 + die("Could not initialize winansi pipe name");
625 + hwrite = CreateNamedPipeW(name, PIPE_ACCESS_OUTBOUND,
626 PIPE_TYPE_BYTE | PIPE_WAIT, 1, BUFFER_SIZE, 0, 0, NULL);
627 if (hwrite == INVALID_HANDLE_VALUE)
628 die_lasterr("CreateNamedPipe failed");
629
628 - hread = CreateFile(name, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
630 + hread = CreateFileW(name, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
631 if (hread == INVALID_HANDLE_VALUE)
632 die_lasterr("CreateFile for named pipe failed");
633