summaryrefslogtreecommitdiff
path: root/process.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-06-13 00:55:31 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-06-13 00:55:31 +0000
commite6a6561121ef4475a0fd136524983bb22afbb3dc (patch)
treecf9233d705f964bfdfad43ef31c8a1d702a7e48b /process.c
parentfe5a15251fb931fad3823b5aacb297ccc2335d61 (diff)
process.c: treat '=' only in the first word
* process.c (rb_exec_fillarg): treat '=' only in the first word. if the first word does not contain '=', it is the command name and environment assignments cannot be anymore. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@36048 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'process.c')
-rw-r--r--process.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/process.c b/process.c
index 7cfbaf466c..a0ea94ec85 100644
--- a/process.c
+++ b/process.c
@@ -1851,6 +1851,7 @@ rb_exec_fillarg(VALUE prog, int argc, VALUE *argv, VALUE env, VALUE opthash, str
#ifndef _WIN32
if (e->use_shell) {
const char *p;
+ int first = 1;
int has_meta = 0;
int has_nonspace = 0;
/*
@@ -1880,8 +1881,12 @@ rb_exec_fillarg(VALUE prog, int argc, VALUE *argv, VALUE env, VALUE opthash, str
for (p = RSTRING_PTR(prog); *p; p++) {
if (!has_nonspace && *p != ' ' && *p != '\t')
has_nonspace = 1;
- if (!has_meta && strchr("*?{}[]<>()~&|\\$;'`\"\n#=", *p))
+ if (has_nonspace && (*p == ' ' || *p == '\t'))
+ first = 0;
+ if (!has_meta && strchr("*?{}[]<>()~&|\\$;'`\"\n#", *p))
has_meta = 1;
+ if (first && *p == '=')
+ has_meta = 1;
if (has_nonspace && has_meta)
break;
}