diff --git a/capchild/capture_sync.c b/capchild/capture_sync.c index edd0c5de7a..d1aceee5eb 100644 --- a/capchild/capture_sync.c +++ b/capchild/capture_sync.c @@ -367,6 +367,7 @@ sync_pipe_start(capture_options *capture_opts, capture_session *cap_session, inf HANDLE signal_pipe; /* named pipe used to send messages from parent to child (currently only stop) */ GString *args = g_string_sized_new(200); gchar *quoted_arg; + gunichar2 *wcommandline; SECURITY_ATTRIBUTES sa; STARTUPINFO si; PROCESS_INFORMATION pi; @@ -681,9 +682,10 @@ sync_pipe_start(capture_options *capture_opts, capture_session *cap_session, inf g_string_append(args, quoted_arg); g_free(quoted_arg); } + wcommandline = g_utf8_to_utf16(args->str, (glong)args->len, NULL, NULL, NULL); /* call dumpcap */ - if(!CreateProcess(utf_8to16(argv[0]), utf_8to16(args->str), NULL, NULL, TRUE, + if(!CreateProcess(utf_8to16(argv[0]), wcommandline, NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi)) { report_failure("Couldn't run %s in child process: %s", args->str, win32strerror(GetLastError())); @@ -694,12 +696,15 @@ sync_pipe_start(capture_options *capture_opts, capture_session *cap_session, inf g_free( (gpointer) argv[i]); } g_free( (gpointer) argv); + g_string_free(args, TRUE); + g_free(wcommandline); return FALSE; } cap_session->fork_child = pi.hProcess; /* We may need to store this and close it later */ CloseHandle(pi.hThread); g_string_free(args, TRUE); + g_free(wcommandline); cap_session->signal_pipe_write_fd = signal_pipe_write_fd; @@ -814,6 +819,7 @@ sync_pipe_open_command(char** argv, int *data_read_fd, HANDLE data_pipe[2]; /* pipe used to send data from child to parent */ GString *args = g_string_sized_new(200); gchar *quoted_arg; + gunichar2 *wcommandline; SECURITY_ATTRIBUTES sa; STARTUPINFO si; PROCESS_INFORMATION pi; @@ -934,9 +940,10 @@ sync_pipe_open_command(char** argv, int *data_read_fd, g_string_append(args, quoted_arg); g_free(quoted_arg); } + wcommandline = g_utf8_to_utf16(args->str, (glong)args->len, NULL, NULL, NULL); /* call dumpcap */ - if(!CreateProcess(utf_8to16(argv[0]), utf_8to16(args->str), NULL, NULL, TRUE, + if(!CreateProcess(utf_8to16(argv[0]), wcommandline, NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi)) { *msg = g_strdup_printf("Couldn't run %s in child process: %s", args->str, win32strerror(GetLastError())); @@ -948,12 +955,15 @@ sync_pipe_open_command(char** argv, int *data_read_fd, g_free( (gpointer) argv[i]); } g_free( (gpointer) argv); + g_string_free(args, TRUE); + g_free(wcommandline); return -1; } *fork_child = pi.hProcess; /* We may need to store this and close it later */ CloseHandle(pi.hThread); g_string_free(args, TRUE); + g_free(wcommandline); #else /* _WIN32 */ /* Create a pipe for the child process to send us messages */ if (pipe(sync_pipe) < 0) { diff --git a/ui/win32/file_dlg_win32.c b/ui/win32/file_dlg_win32.c index 15eca21a30..9d9526c382 100644 --- a/ui/win32/file_dlg_win32.c +++ b/ui/win32/file_dlg_win32.c @@ -1438,7 +1438,7 @@ append_file_extension_type(GArray *sa, int et) GString* description_str = g_string_new(""); gchar sep; GSList *extensions_list, *extension; - TCHAR *str16; + const TCHAR *str16; guint16 zero = 0; /* Construct the list of patterns. */ @@ -1471,7 +1471,7 @@ append_file_extension_type(GArray *sa, int et) static TCHAR * build_file_open_type_list(void) { - TCHAR *str16; + const TCHAR *str16; int et; GArray* sa; static const guint16 zero = 0; @@ -1565,7 +1565,7 @@ append_file_type(GArray *sa, int ft) GString* description_str = g_string_new(""); gchar sep; GSList *extensions_list, *extension; - TCHAR *str16; + const TCHAR *str16; guint16 zero = 0; extensions_list = wtap_get_file_extensions_list(ft, TRUE); diff --git a/wsutil/unicode-utils.c b/wsutil/unicode-utils.c index 688de92843..8ecf85b0c2 100644 --- a/wsutil/unicode-utils.c +++ b/wsutil/unicode-utils.c @@ -59,7 +59,7 @@ ws_utf8_char_len(guint8 ch) */ /* Convert from UTF-8 to UTF-16. */ -wchar_t * +const wchar_t * utf_8to16(const char *utf8str) { static wchar_t *utf16buf[3]; diff --git a/wsutil/unicode-utils.h b/wsutil/unicode-utils.h index 865563e231..902a4fb4b5 100644 --- a/wsutil/unicode-utils.h +++ b/wsutil/unicode-utils.h @@ -55,7 +55,7 @@ int ws_utf8_char_len(guint8 ch); * NULL. The return value should NOT be freed by the caller. */ WS_DLL_PUBLIC -wchar_t * utf_8to16(const char *utf8str); +const wchar_t * utf_8to16(const char *utf8str); /** Create a UTF-16 string (in place) according to the format string. *