Skip to content

Commit 9423885

Browse files
dschogitster
authored andcommitted
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 <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 39a98e9 commit 9423885

File tree

3 files changed

+8
-6
lines changed

3 files changed

+8
-6
lines changed

compat/mingw.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1407,7 +1407,7 @@ static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **deltaen
14071407
do_unset_environment_variables();
14081408

14091409
/* Determine whether or not we are associated to a console */
1410-
cons = CreateFile("CONOUT$", GENERIC_WRITE,
1410+
cons = CreateFileW(L"CONOUT$", GENERIC_WRITE,
14111411
FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
14121412
FILE_ATTRIBUTE_NORMAL, NULL);
14131413
if (cons == INVALID_HANDLE_VALUE) {

compat/poll/poll.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ win32_compute_revents (HANDLE h, int *p_sought)
150150
if (!once_only)
151151
{
152152
NtQueryInformationFile = (PNtQueryInformationFile)
153-
GetProcAddress (GetModuleHandle ("ntdll.dll"),
153+
GetProcAddress (GetModuleHandleW (L"ntdll.dll"),
154154
"NtQueryInformationFile");
155155
once_only = TRUE;
156156
}

compat/winansi.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -599,7 +599,7 @@ int winansi_isatty(int fd)
599599
void winansi_init(void)
600600
{
601601
int con1, con2;
602-
char name[32];
602+
wchar_t name[32];
603603

604604
/* check if either stdout or stderr is a console output screen buffer */
605605
con1 = is_console(1);
@@ -619,13 +619,15 @@ void winansi_init(void)
619619
}
620620

621621
/* 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,
624626
PIPE_TYPE_BYTE | PIPE_WAIT, 1, BUFFER_SIZE, 0, 0, NULL);
625627
if (hwrite == INVALID_HANDLE_VALUE)
626628
die_lasterr("CreateNamedPipe failed");
627629

628-
hread = CreateFile(name, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
630+
hread = CreateFileW(name, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
629631
if (hread == INVALID_HANDLE_VALUE)
630632
die_lasterr("CreateFile for named pipe failed");
631633

0 commit comments

Comments
 (0)