From e8d486e119ac254cf2438d2b5bd9de2ec5af8ebc Mon Sep 17 00:00:00 2001 From: nobu Date: Fri, 27 Aug 2004 01:14:30 +0000 Subject: [PATCH] * process.c (rb_proc_exec): strip trailing spaces. [ruby-dev:24143] * win32/win32.c (CreateChild): ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@6823 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 6 ++++++ process.c | 12 +++++++++++- win32/win32.c | 35 +++++++++++++++++++++++++++-------- 3 files changed, 44 insertions(+), 9 deletions(-) diff --git a/ChangeLog b/ChangeLog index 82c2b96945..564afd52a0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Fri Aug 27 10:14:21 2004 Nobuyoshi Nakada + + * process.c (rb_proc_exec): strip trailing spaces. [ruby-dev:24143] + + * win32/win32.c (CreateChild): ditto. + Thu Aug 26 04:38:29 2004 Dave Thomas * eval.c (return_jump): Minor typo in error message. Now reads diff --git a/process.c b/process.c index 0132c31606..620513c8f8 100644 --- a/process.c +++ b/process.c @@ -1027,8 +1027,17 @@ rb_proc_exec(str) after_exec(); #else for (s=str; *s; s++) { + if (ISSPACE(*s)) { + const char *p, *nl = NULL; + for (p = s; ISSPACE(*p); p++) { + if (*p == '\n') nl = p; + } + if (!*p) break; + if (nl) goto via_shell; + } if (*s != ' ' && !ISALPHA(*s) && strchr("*?{}[]<>()~&|\\$;'`\"\n",*s)) { int status; + via_shell: #if defined(MSDOS) before_exec(); status = system(str); @@ -1056,7 +1065,8 @@ rb_proc_exec(str) } a = argv = ALLOCA_N(char*, (s-str)/2+2); ss = ALLOCA_N(char, s-str+1); - strcpy(ss, str); + memcpy(ss, str, s-str); + ss[s-str] = '\0'; if (*a++ = strtok(ss, " \t")) { while (t = strtok(NULL, " \t")) { *a++ = t; diff --git a/win32/win32.c b/win32/win32.c index 1f4b5472fe..4203ca2aba 100644 --- a/win32/win32.c +++ b/win32/win32.c @@ -936,18 +936,29 @@ CreateChild(const char *cmd, const char *prog, SECURITY_ATTRIBUTES *psa, } else { int redir = -1; + int len = 0; + while (ISSPACE(*cmd)) cmd++; + for (prog = cmd; *prog; prog = CharNext(prog)) { + if (ISSPACE(*prog)) { + len = prog - cmd; + do ++prog; while (ISSPACE(*prog)); + if (!*prog) break; + } + else { + len = 0; + } + } + if (!len) len = strlen(cmd); if ((shell = getenv("RUBYSHELL")) && (redir = has_redirection(cmd))) { - char *tmp = ALLOCA_N(char, strlen(shell) + strlen(cmd) + - sizeof (" -c ") + 2); - sprintf(tmp, "%s -c \"%s\"", shell, cmd); + char *tmp = ALLOCA_N(char, strlen(shell) + len + sizeof(" -c ") + 2); + sprintf(tmp, "%s -c \"%.*s\"", shell, len, cmd); cmd = tmp; } else if ((shell = getenv("COMSPEC")) && ((redir < 0 ? has_redirection(cmd) : redir) || isInternalCmd(cmd, shell))) { - char *tmp = ALLOCA_N(char, strlen(shell) + strlen(cmd) + - sizeof (" /c ")); - sprintf(tmp, "%s /c %s", shell, cmd); + char *tmp = ALLOCA_N(char, strlen(shell) + len + sizeof(" /c ")); + sprintf(tmp, "%s /c %.*s", shell, len, cmd); cmd = tmp; } else { @@ -958,9 +969,17 @@ CreateChild(const char *cmd, const char *prog, SECURITY_ATTRIBUTES *psa, p = dln_find_exe(cmd, NULL); break; } - if (strchr(".:*?\"/\\", *prog)) break; + if (strchr(".:*?\"/\\", *prog)) { + if (cmd[len]) { + char *tmp = ALLOCA_N(char, len + 1); + memcpy(tmp, cmd, len); + tmp[len] = 0; + cmd = tmp; + } + break; + } if (ISSPACE(*prog) || strchr("<>|", *prog)) { - int len = prog - cmd; + len = prog - cmd; p = ALLOCA_N(char, len + 1); memcpy(p, cmd, len); p[len] = 0;