From: Christian Grothoff Date: Tue, 21 Feb 2012 19:08:08 +0000 (+0000) Subject: LRN: Escape-trailing-slash-when-spawning-W32-process: X-Git-Tag: initial-import-from-subversion-38251~14759 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=7590a212861cd5cafeceba3c20c1e6c9528b880d;p=oweals%2Fgnunet.git LRN: Escape-trailing-slash-when-spawning-W32-process: --- diff --git a/src/util/os_priority.c b/src/util/os_priority.c index b1cf2fbff..64dce4ba3 100644 --- a/src/util/os_priority.c +++ b/src/util/os_priority.c @@ -638,7 +638,7 @@ GNUNET_OS_start_process_vap (struct GNUNET_DISK_PipeHandle *pipe_stdin, char *cmd, *idx; STARTUPINFOW start; PROCESS_INFORMATION proc; - int argc; + int argc, arg_count; HANDLE stdin_handle; HANDLE stdout_handle; @@ -707,19 +707,24 @@ GNUNET_OS_start_process_vap (struct GNUNET_DISK_PipeHandle *pipe_stdin, while (NULL != (arg = argv[argc++])) { if (cmdlen == 0) - cmdlen = cmdlen + strlen (path) + 3; + cmdlen = cmdlen + strlen (path) + 4; else - cmdlen = cmdlen + strlen (arg) + 3; + cmdlen = cmdlen + strlen (arg) + 4; } + arg_count = argc; cmd = idx = GNUNET_malloc (sizeof (char) * (cmdlen + 1)); argc = 0; while (NULL != (arg = argv[argc++])) { + /* This is to escape trailing slash */ + char arg_lastchar = arg[strlen (arg) - 1]; if (idx == cmd) - idx += sprintf (idx, "\"%s\" ", path); + idx += sprintf (idx, "\"%s%s\"%s", path, + arg_lastchar == '\\' ? "\\" : "", argc + 1 == arg_count ? "" : " "); else - idx += sprintf (idx, "\"%s\" ", arg); + idx += sprintf (idx, "\"%s%s\"%s", arg, + arg_lastchar == '\\' ? "\\" : "", argc + 1 == arg_count ? "" : " "); } memset (&start, 0, sizeof (start)); @@ -1103,7 +1108,7 @@ GNUNET_OS_start_process_v (const SOCKTYPE *lsocks, arg = non_const_argv; while (*arg) { - cmdlen = cmdlen + strlen (*arg) + 3; + cmdlen = cmdlen + strlen (*arg) + 4; arg++; } @@ -1112,7 +1117,9 @@ GNUNET_OS_start_process_v (const SOCKTYPE *lsocks, arg = non_const_argv; while (*arg) { - idx += sprintf (idx, "\"%s\" ", *arg); + char arg_last_char = (*arg)[strlen (*arg) - 1]; + idx += sprintf (idx, "\"%s%s\"%s", *arg, + arg_last_char == '\\' ? "\\" : "", *(arg + 1) ? " " : ""); arg++; }