diff options
author | Christian Grothoff <christian@grothoff.org> | 2012-02-21 19:08:08 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2012-02-21 19:08:08 +0000 |
commit | 7590a212861cd5cafeceba3c20c1e6c9528b880d (patch) | |
tree | 786dde5b1aa7ce44ca33e540ea447a8a911ed725 /src/util | |
parent | 49af729e1a919beeab18d29dc226c2fcb98499ed (diff) | |
download | gnunet-7590a212861cd5cafeceba3c20c1e6c9528b880d.tar.gz gnunet-7590a212861cd5cafeceba3c20c1e6c9528b880d.zip |
LRN: Escape-trailing-slash-when-spawning-W32-process:
Diffstat (limited to 'src/util')
-rw-r--r-- | src/util/os_priority.c | 21 |
1 files changed, 14 insertions, 7 deletions
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, | |||
638 | char *cmd, *idx; | 638 | char *cmd, *idx; |
639 | STARTUPINFOW start; | 639 | STARTUPINFOW start; |
640 | PROCESS_INFORMATION proc; | 640 | PROCESS_INFORMATION proc; |
641 | int argc; | 641 | int argc, arg_count; |
642 | HANDLE stdin_handle; | 642 | HANDLE stdin_handle; |
643 | HANDLE stdout_handle; | 643 | HANDLE stdout_handle; |
644 | 644 | ||
@@ -707,19 +707,24 @@ GNUNET_OS_start_process_vap (struct GNUNET_DISK_PipeHandle *pipe_stdin, | |||
707 | while (NULL != (arg = argv[argc++])) | 707 | while (NULL != (arg = argv[argc++])) |
708 | { | 708 | { |
709 | if (cmdlen == 0) | 709 | if (cmdlen == 0) |
710 | cmdlen = cmdlen + strlen (path) + 3; | 710 | cmdlen = cmdlen + strlen (path) + 4; |
711 | else | 711 | else |
712 | cmdlen = cmdlen + strlen (arg) + 3; | 712 | cmdlen = cmdlen + strlen (arg) + 4; |
713 | } | 713 | } |
714 | arg_count = argc; | ||
714 | 715 | ||
715 | cmd = idx = GNUNET_malloc (sizeof (char) * (cmdlen + 1)); | 716 | cmd = idx = GNUNET_malloc (sizeof (char) * (cmdlen + 1)); |
716 | argc = 0; | 717 | argc = 0; |
717 | while (NULL != (arg = argv[argc++])) | 718 | while (NULL != (arg = argv[argc++])) |
718 | { | 719 | { |
720 | /* This is to escape trailing slash */ | ||
721 | char arg_lastchar = arg[strlen (arg) - 1]; | ||
719 | if (idx == cmd) | 722 | if (idx == cmd) |
720 | idx += sprintf (idx, "\"%s\" ", path); | 723 | idx += sprintf (idx, "\"%s%s\"%s", path, |
724 | arg_lastchar == '\\' ? "\\" : "", argc + 1 == arg_count ? "" : " "); | ||
721 | else | 725 | else |
722 | idx += sprintf (idx, "\"%s\" ", arg); | 726 | idx += sprintf (idx, "\"%s%s\"%s", arg, |
727 | arg_lastchar == '\\' ? "\\" : "", argc + 1 == arg_count ? "" : " "); | ||
723 | } | 728 | } |
724 | 729 | ||
725 | memset (&start, 0, sizeof (start)); | 730 | memset (&start, 0, sizeof (start)); |
@@ -1103,7 +1108,7 @@ GNUNET_OS_start_process_v (const SOCKTYPE *lsocks, | |||
1103 | arg = non_const_argv; | 1108 | arg = non_const_argv; |
1104 | while (*arg) | 1109 | while (*arg) |
1105 | { | 1110 | { |
1106 | cmdlen = cmdlen + strlen (*arg) + 3; | 1111 | cmdlen = cmdlen + strlen (*arg) + 4; |
1107 | arg++; | 1112 | arg++; |
1108 | } | 1113 | } |
1109 | 1114 | ||
@@ -1112,7 +1117,9 @@ GNUNET_OS_start_process_v (const SOCKTYPE *lsocks, | |||
1112 | arg = non_const_argv; | 1117 | arg = non_const_argv; |
1113 | while (*arg) | 1118 | while (*arg) |
1114 | { | 1119 | { |
1115 | idx += sprintf (idx, "\"%s\" ", *arg); | 1120 | char arg_last_char = (*arg)[strlen (*arg) - 1]; |
1121 | idx += sprintf (idx, "\"%s%s\"%s", *arg, | ||
1122 | arg_last_char == '\\' ? "\\" : "", *(arg + 1) ? " " : ""); | ||
1116 | arg++; | 1123 | arg++; |
1117 | } | 1124 | } |
1118 | 1125 | ||