ref: f9c922149717242958f065c8718e7e7586c165a5
parent: 43b0dbd272da1d590797d2974e94413971131129
author: Simon Howard <fraggle@gmail.com>
date: Fri Nov 20 19:24:59 EST 2009
Fix crash with chocolate-setup under Windows (thanks Janizdreg). Subversion-branch: /trunk/chocolate-doom Subversion-revision: 1731
--- a/setup/execute.c
+++ b/setup/execute.c
@@ -172,61 +172,48 @@
}
}
-static wchar_t *GetFullExePath(const char *program)
+static void ConcatWCString(wchar_t *buf, const char *value)
{
+ MultiByteToWideChar(CP_OEMCP, 0,
+ value, strlen(value) + 1,
+ buf + wcslen(buf), strlen(value) + 1);
+}
+
+// Build the command line string, a wide character string of the form:
+//
+// "program" "arg"
+
+static wchar_t *BuildCommandLine(const char *program, const char *arg)
+{
wchar_t *result;
- unsigned int path_len;
char *sep;
- // Find the full path to the EXE to execute, by taking the path
- // to this program and concatenating the EXE name:
+ result = calloc(strlen(myargv[0]) + strlen(program) + strlen(arg) + 6,
+ sizeof(wchar_t));
+ wcscpy(result, L"\"");
+
sep = strrchr(myargv[0], DIR_SEPARATOR);
- if (sep == NULL)
+ if (sep != NULL)
{
- path_len = 0;
- result = calloc(strlen(program) + 1, sizeof(wchar_t));
- }
- else
- {
- path_len = sep - myargv[0] + 1;
+ ConcatWCString(result, myargv[0]);
- result = calloc(path_len + strlen(program) + 1,
- sizeof(wchar_t));
- MultiByteToWideChar(CP_OEMCP, 0,
- myargv[0], path_len,
- result, path_len);
+ // Cut off the string after the last directory separator,
+ // before appending the actual program.
+
+ result[sep - myargv[0] + 2] = '\0';
+
}
- MultiByteToWideChar(CP_OEMCP, 0,
- program, strlen(program) + 1,
- result + path_len, strlen(program) + 1);
+ ConcatWCString(result, program);
- return result;
-}
+ wcscat(result, L"\" \"");
-// Convert command line argument to wchar_t string and add surrounding
-// "" quotes:
+ ConcatWCString(result, arg);
-static wchar_t *GetPaddedWideArg(const char *arg)
-{
- wchar_t *result;
- unsigned int len = strlen(arg);
+ wcscat(result, L"\"");
- // Convert the command line arg to a wide char string:
-
- result = calloc(len + 3, sizeof(wchar_t));
- MultiByteToWideChar(CP_OEMCP, 0,
- arg, len + 1,
- result + 1, len + 1);
-
- // Surrounding quotes:
-
- result[0] = '"';
- result[len + 1] = '"';
- result[len + 2] = 0;
-
return result;
}
@@ -234,18 +221,18 @@
{
STARTUPINFOW startup_info;
PROCESS_INFORMATION proc_info;
- wchar_t *exe_path;
- wchar_t *warg;
+ wchar_t *command;
int result = 0;
- exe_path = GetFullExePath(program);
- warg = GetPaddedWideArg(arg);
+ command = BuildCommandLine(program, arg);
// Invoke the program:
memset(&proc_info, 0, sizeof(proc_info));
+ memset(&startup_info, 0, sizeof(startup_info));
+ startup_info.cb = sizeof(startup_info);
- if (!CreateProcessW(exe_path, warg,
+ if (!CreateProcessW(NULL, command,
NULL, NULL, FALSE, 0, NULL, NULL,
&startup_info, &proc_info))
{
@@ -261,8 +248,7 @@
CloseHandle(proc_info.hThread);
}
- free(exe_path);
- free(warg);
+ free(command);
return result;
}