Project

General

Profile

Feature #2715 ยป remove-shell-invocation-optimization.patch

akr (Akira Tanaka), 06/04/2012 10:34 PM

View differences:

process.c (working copy)
e->prog = prog ? RSTRING_PTR(prog) : 0;
e->progname = prog;
#ifndef _WIN32
if (e->use_shell) {
char *p;
int has_meta = 0;
int has_nonspace = 0;
for (p = RSTRING_PTR(prog); *p; p++) {
if (*p != ' ' && *p != '\t')
has_nonspace = 1;
if (strchr("*?{}[]<>()~&|\\$;'`\"\n", *p))
has_meta = 1;
}
if (has_nonspace && !has_meta) {
/* avoid shell since no shell meta charactor found. */
e->use_shell = 0;
}
if (!e->use_shell) {
VALUE argv_buf;
argv_buf = hide_obj(rb_str_buf_new(0));
p = RSTRING_PTR(prog);
while (*p) {
while (*p == ' ' || *p == '\t')
p++;
if (*p) {
char *w = p;
while (*p && *p != ' ' && *p != '\t')
p++;
rb_str_buf_cat(argv_buf, w, p-w);
rb_str_buf_cat(argv_buf, "", 1); /* append '\0' */
}
}
e->argv_buf = argv_buf;
e->progname = hide_obj(rb_str_new_cstr(RSTRING_PTR(argv_buf)));
e->prog = RSTRING_PTR(e->progname);
}
}
#endif
if (!e->use_shell && !e->argv_buf) {
int i;
VALUE argv_buf;
test/ruby/test_io.rb (working copy)
assert_equal(nil, r.pid)
assert_equal(nil, w.pid)
pipe = IO.popen(EnvUtil.rubybin, "r+")
pipe = IO.popen([['ruby', EnvUtil.rubybin]], "r+")
pid1 = pipe.pid
pipe.puts "p $$"
pipe.close_write
test/ruby/test_process.rb (working copy)
with_tmpchdir {|d|
prog = "#{d}/notexist"
e = assert_raise(Errno::ENOENT) {
Process.wait Process.spawn({"FOO"=>"BAR"}, prog)
assert_nothing_raised {
Process.wait Process.spawn({"FOO"=>"BAR"}, prog,
:err => 'shell-error')
}
assert_equal(prog, e.message.sub(/.* - /, ''))
assert_not_equal('', File.read('shell-error'))
e = assert_raise(Errno::ENOENT) {
Process.wait Process.spawn({"FOO"=>"BAR"}, [prog, "blar"])
}
......
unless windows?
# passing non-stdio fds is not supported on Windows
assert_raise(Errno::ENOENT) {
Process.wait Process.spawn("non-existing-command", (3..60).to_a=>["err", File::WRONLY|File::CREAT])
assert_nothing_raised {
Process.wait Process.spawn("non-existing-command",
:err => 'shell-error',
(3..60).to_a=>["err", File::WRONLY|File::CREAT])
}
assert_not_equal("", File.read("shell-error"))
assert_equal("", File.read("err"))
end
......
File.open("result", "w") {|t| t << "haha pid=#{$$} ppid=#{Process.ppid}" }
exit 5
End
str = "#{RUBY} script"
str = "exec #{RUBY} script"
ret = system(str)
status = $?
assert_equal(false, ret)
......
File.open("result", "w") {|t| t << "hihi pid=#{$$} ppid=#{Process.ppid}" }
exit 6
End
str = "#{RUBY} script"
str = "exec #{RUBY} script"
pid = spawn(str)
Process.wait pid
status = $?
......
print "fufu pid=#{$$} ppid=#{Process.ppid}"
exit 7
End
str = "#{RUBY} script"
str = "exec #{RUBY} script"
io = IO.popen(str)
pid = io.pid
result = io.read
......
End
write_file("s", <<-"End")
ruby = #{RUBY.dump}
exec "\#{ruby} script"
exec ruby, "script"
End
pid = spawn(RUBY, "s")
Process.wait pid
test/test_pty.rb (working copy)
bug3672 = '[ruby-dev:41965]'
Dir.mktmpdir do |tmpdir|
assert_raise(Errno::ENOENT, bug3672) {
command = File.join(tmpdir, "no-such-command")
begin
PTY.getpty(File.join(tmpdir, "no-such-command"))
PTY.getpty(command, 'arg')
rescue RuntimeError
skip $!
end
    (1-1/1)