From 5c187b9385a6681b4d6b3bdd214de828f252f73a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A0=D1=83=D1=81=D0=BB=D0=B0=D0=BD=20=D0=98=D0=B6=D0=B1?= =?UTF-8?q?=D1=83=D0=BB=D0=B0=D1=82=D0=BE=D0=B2?= Date: Sat, 24 Apr 2021 20:50:10 +0000 Subject: [PATCH] Convert the crash handler to UTF-16, mostly --- glib/gwin32-private.c | 30 ++++++++++++++--------------- glib/gwin32.c | 44 +++++++++++++++++++++---------------------- 2 files changed, 37 insertions(+), 37 deletions(-) diff --git a/glib/gwin32-private.c b/glib/gwin32-private.c index f7913b553..c28e92baa 100644 --- a/glib/gwin32-private.c +++ b/glib/gwin32-private.c @@ -18,16 +18,16 @@ /* Copy @cmdline into @debugger, and substitute @pid for `%p` * and @event for `%e`. - * If @debugger_size (in bytes) is overflowed, return %FALSE. + * If @debugger_size (in wchar_ts) is overflowed, return %FALSE. * Also returns %FALSE when `%` is followed by anything other * than `e` or `p`. */ static gboolean -_g_win32_subst_pid_and_event (char *debugger, - gsize debugger_size, - const char *cmdline, - DWORD pid, - guintptr event) +_g_win32_subst_pid_and_event_w (wchar_t *debugger, + gsize debugger_size, + const wchar_t *cmdline, + DWORD pid, + guintptr event) { gsize i = 0, dbg_i = 0; /* These are integers, and they can't be longer than 20 characters @@ -35,31 +35,31 @@ _g_win32_subst_pid_and_event (char *debugger, * Use 30 just to be sure. */ #define STR_BUFFER_SIZE 30 - char pid_str[STR_BUFFER_SIZE] = {0}; + wchar_t pid_str[STR_BUFFER_SIZE] = {0}; gsize pid_str_len; - char event_str[STR_BUFFER_SIZE] = {0}; + wchar_t event_str[STR_BUFFER_SIZE] = {0}; gsize event_str_len; - _snprintf_s (pid_str, STR_BUFFER_SIZE, G_N_ELEMENTS (pid_str), "%lu", pid); + _snwprintf_s (pid_str, STR_BUFFER_SIZE, G_N_ELEMENTS (pid_str), L"%lu", pid); pid_str[G_N_ELEMENTS (pid_str) - 1] = 0; - pid_str_len = strlen (pid_str); - _snprintf_s (event_str, STR_BUFFER_SIZE, G_N_ELEMENTS (pid_str), "%Iu", event); + pid_str_len = wcslen (pid_str); + _snwprintf_s (event_str, STR_BUFFER_SIZE, G_N_ELEMENTS (pid_str), L"%Iu", event); event_str[G_N_ELEMENTS (pid_str) - 1] = 0; - event_str_len = strlen (event_str); + event_str_len = wcslen (event_str); #undef STR_BUFFER_SIZE while (cmdline[i] != 0 && dbg_i < debugger_size) { - if (cmdline[i] != '%') + if (cmdline[i] != L'%') debugger[dbg_i++] = cmdline[i++]; - else if (cmdline[i + 1] == 'p') + else if (cmdline[i + 1] == L'p') { gsize j = 0; while (j < pid_str_len && dbg_i < debugger_size) debugger[dbg_i++] = pid_str[j++]; i += 2; } - else if (cmdline[i + 1] == 'e') + else if (cmdline[i + 1] == L'e') { gsize j = 0; while (j < event_str_len && dbg_i < debugger_size) diff --git a/glib/gwin32.c b/glib/gwin32.c index 8d29f376a..c710ec603 100644 --- a/glib/gwin32.c +++ b/glib/gwin32.c @@ -1039,7 +1039,7 @@ static void *WinVEH_handle = NULL; #define DEBUGGER_BUFFER_SIZE (MAX_PATH + 1) /* This is the debugger that we'll run on crash */ -static char debugger[DEBUGGER_BUFFER_SIZE]; +static wchar_t debugger[DEBUGGER_BUFFER_SIZE]; static gsize number_of_exceptions_to_catch = 0; static DWORD *exceptions_to_catch = NULL; @@ -1101,14 +1101,14 @@ copy_chars (char *buffer, * as the handler is installed. Therefore, it's imperative that * it does as little as possible. Preferably, all the work that can be * done in advance (when the program is not crashing yet) should be done - * in advance. And this function certainly does not need to use Unicode. + * in advance. */ static LONG __stdcall g_win32_veh_handler (PEXCEPTION_POINTERS ExceptionInfo) { EXCEPTION_RECORD *er; gsize i; - STARTUPINFOA si; + STARTUPINFOW si; PROCESS_INFORMATION pi; #define ITOA_BUFFER_SIZE 100 char itoa_buffer[ITOA_BUFFER_SIZE]; @@ -1147,7 +1147,7 @@ g_win32_veh_handler (PEXCEPTION_POINTERS ExceptionInfo) si.cb = sizeof (si); /* Run the debugger */ - if (0 != CreateProcessA (NULL, debugger, NULL, NULL, TRUE, debugger_spawn_flags, NULL, NULL, &si, &pi)) + if (0 != CreateProcessW (NULL, debugger, NULL, NULL, TRUE, debugger_spawn_flags, NULL, NULL, &si, &pi)) { CloseHandle (pi.hProcess); CloseHandle (pi.hThread); @@ -1229,25 +1229,25 @@ g_win32_veh_handler (PEXCEPTION_POINTERS ExceptionInfo) } static gsize -parse_catch_list (const char *catch_buffer, - DWORD *exceptions, - gsize num_exceptions) +parse_catch_list (const wchar_t *catch_buffer, + DWORD *exceptions, + gsize num_exceptions) { - const char *catch_list = catch_buffer; - gsize result = 0; - gsize i = 0; + const wchar_t *catch_list = catch_buffer; + gsize result = 0; + gsize i = 0; while (catch_list != NULL && catch_list[0] != 0) { unsigned long catch_code; - char *end; + wchar_t *end; errno = 0; - catch_code = strtoul (catch_list, &end, 16); + catch_code = wcstoul (catch_list, &end, 16); if (errno != NO_ERROR) break; catch_list = end; - if (catch_list != NULL && catch_list[0] == ',') + if (catch_list != NULL && catch_list[0] == L',') catch_list++; if (exceptions && i < num_exceptions) exceptions[i++] = catch_code; @@ -1259,9 +1259,9 @@ parse_catch_list (const char *catch_buffer, void g_crash_handler_win32_init (void) { - char debugger_env[DEBUGGER_BUFFER_SIZE]; + wchar_t debugger_env[DEBUGGER_BUFFER_SIZE]; #define CATCH_BUFFER_SIZE 1024 - char catch_buffer[CATCH_BUFFER_SIZE]; + wchar_t catch_buffer[CATCH_BUFFER_SIZE]; SECURITY_ATTRIBUTES sa; if (WinVEH_handle != NULL) @@ -1273,7 +1273,7 @@ g_crash_handler_win32_init (void) * code. See: http://www.windows-tech.info/13/785f590867bd6316.php */ debugger_env[0] = 0; - if (!GetEnvironmentVariableA ("G_DEBUGGER", debugger_env, DEBUGGER_BUFFER_SIZE)) + if (!GetEnvironmentVariableW (L"G_DEBUGGER", debugger_env, DEBUGGER_BUFFER_SIZE)) return; /* Create an inheritable event */ @@ -1283,19 +1283,19 @@ g_crash_handler_win32_init (void) debugger_wakeup_event = CreateEvent (&sa, FALSE, FALSE, NULL); /* Put process ID and event handle into debugger commandline */ - if (!_g_win32_subst_pid_and_event (debugger, G_N_ELEMENTS (debugger), - debugger_env, GetCurrentProcessId (), - (guintptr) debugger_wakeup_event)) + if (!_g_win32_subst_pid_and_event_w (debugger, G_N_ELEMENTS (debugger), + debugger_env, GetCurrentProcessId (), + (guintptr) debugger_wakeup_event)) { CloseHandle (debugger_wakeup_event); debugger_wakeup_event = 0; debugger[0] = 0; return; } - debugger[MAX_PATH] = '\0'; + debugger[MAX_PATH] = L'\0'; catch_buffer[0] = 0; - if (GetEnvironmentVariableA ("G_VEH_CATCH", catch_buffer, CATCH_BUFFER_SIZE)) + if (GetEnvironmentVariableW (L"G_VEH_CATCH", catch_buffer, CATCH_BUFFER_SIZE)) { number_of_exceptions_to_catch = parse_catch_list (catch_buffer, NULL, 0); if (number_of_exceptions_to_catch > 0) @@ -1305,7 +1305,7 @@ g_crash_handler_win32_init (void) } } - if (GetEnvironmentVariableA ("G_DEBUGGER_OLD_CONSOLE", (char *) &debugger_spawn_flags, 1)) + if (GetEnvironmentVariableW (L"G_DEBUGGER_OLD_CONSOLE", (wchar_t *) &debugger_spawn_flags, 1)) debugger_spawn_flags = 0; else debugger_spawn_flags = CREATE_NEW_CONSOLE;