Fix "tinc start" on Windows when the path contains spaces.

When invoking "tinc start" with spaces in the path, the following
happens:

    > "c:\Program Files (x86)\tinc\tinc.exe" start
    c:\Program: unrecognized argument 'Files'
    Try `c:\Program --help' for more information.

This is caused by inconsistent handling of command line strings between
execvp() and the spawned process' CRT, as documented on MSDN:
http://msdn.microsoft.com/library/431x4c1w.aspx
This commit is contained in:
Etienne Dechamps 2014-07-12 18:37:56 +01:00
parent 5ffdff685a
commit b22499668a

View file

@ -810,7 +810,19 @@ static int cmd_start(int argc, char *argv[]) {
int nargc = 0;
char **nargv = xzalloc((optind + argc) * sizeof *nargv);
nargv[nargc++] = c;
char *arg0 = c;
#ifdef HAVE_MINGW
/*
Windows has no real concept of an "argv array". A command line is just one string.
The CRT of the new process will decode the command line string to generate argv before calling main(), and (by convention)
it uses quotes to handle spaces in arguments.
Therefore we need to quote all arguments that might contain spaces. No, execvp() won't do that for us (see MSDN).
If we don't do that, then execvp() will run fine but any spaces in the filename contained in arg0 will bleed
into the next arguments when the spawned process' CRT parses its command line, resulting in chaos.
*/
xasprintf(&arg0, "\"%s\"", arg0);
#endif
nargv[nargc++] = arg0;
for(int i = 1; i < optind; i++)
nargv[nargc++] = orig_argv[i];
for(int i = 1; i < argc; i++)