CreateProcess can modify its second (lpCommandLine) argument. Don't
pass it the output of utf_8to16.
Constify the return value of utf_8to16.
Change-Id: I0d4361396e90c88a4ab2a3f2f0e058230e897fdf
Reviewed-on: https://code.wireshark.org/review/15155
Petri-Dish: Gerald Combs <gerald@wireshark.org>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Gerald Combs <gerald@wireshark.org>
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;
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;
SECURITY_ATTRIBUTES sa;
STARTUPINFO si;
PROCESS_INFORMATION pi;
g_string_append(args, quoted_arg);
g_free(quoted_arg);
}
g_string_append(args, quoted_arg);
g_free(quoted_arg);
}
+ wcommandline = g_utf8_to_utf16(args->str, (glong)args->len, NULL, NULL, NULL);
- 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()));
CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi)) {
report_failure("Couldn't run %s in child process: %s",
args->str, win32strerror(GetLastError()));
g_free( (gpointer) argv[i]);
}
g_free( (gpointer) argv);
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);
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);
cap_session->signal_pipe_write_fd = signal_pipe_write_fd;
cap_session->signal_pipe_write_fd = signal_pipe_write_fd;
HANDLE data_pipe[2]; /* pipe used to send data from child to parent */
GString *args = g_string_sized_new(200);
gchar *quoted_arg;
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;
SECURITY_ATTRIBUTES sa;
STARTUPINFO si;
PROCESS_INFORMATION pi;
g_string_append(args, quoted_arg);
g_free(quoted_arg);
}
g_string_append(args, quoted_arg);
g_free(quoted_arg);
}
+ wcommandline = g_utf8_to_utf16(args->str, (glong)args->len, NULL, NULL, NULL);
- 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()));
CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi)) {
*msg = g_strdup_printf("Couldn't run %s in child process: %s",
args->str, win32strerror(GetLastError()));
g_free( (gpointer) argv[i]);
}
g_free( (gpointer) argv);
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);
return -1;
}
*fork_child = pi.hProcess;
/* We may need to store this and close it later */
CloseHandle(pi.hThread);
g_string_free(args, TRUE);
#else /* _WIN32 */
/* Create a pipe for the child process to send us messages */
if (pipe(sync_pipe) < 0) {
#else /* _WIN32 */
/* Create a pipe for the child process to send us messages */
if (pipe(sync_pipe) < 0) {
GString* description_str = g_string_new("");
gchar sep;
GSList *extensions_list, *extension;
GString* description_str = g_string_new("");
gchar sep;
GSList *extensions_list, *extension;
guint16 zero = 0;
/* Construct the list of patterns. */
guint16 zero = 0;
/* Construct the list of patterns. */
static TCHAR *
build_file_open_type_list(void) {
static TCHAR *
build_file_open_type_list(void) {
int et;
GArray* sa;
static const guint16 zero = 0;
int et;
GArray* sa;
static const guint16 zero = 0;
GString* description_str = g_string_new("");
gchar sep;
GSList *extensions_list, *extension;
GString* description_str = g_string_new("");
gchar sep;
GSList *extensions_list, *extension;
guint16 zero = 0;
extensions_list = wtap_get_file_extensions_list(ft, TRUE);
guint16 zero = 0;
extensions_list = wtap_get_file_extensions_list(ft, TRUE);
*/
/* Convert from UTF-8 to UTF-16. */
*/
/* Convert from UTF-8 to UTF-16. */
utf_8to16(const char *utf8str)
{
static wchar_t *utf16buf[3];
utf_8to16(const char *utf8str)
{
static wchar_t *utf16buf[3];
* NULL. The return value should NOT be freed by the caller.
*/
WS_DLL_PUBLIC
* 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.
*
/** Create a UTF-16 string (in place) according to the format string.
*