From: ngotogenome@... Date: 2015-07-14T14:31:30+00:00 Subject: [ruby-core:69967] [Ruby trunk - Bug #11350] When Process.exec failed, redirections were still changed and not restored Issue #11350 has been updated by Naohisa Goto. On UNIX-like systems, native_stop_timer_thread(int close_anyway) in thread_pthread.c stops the timer thread, and if "int close_anyway" is true, it should close the communication pipe. However, currently, it does not close the pipe even if close_anyway is true. TODO is described in the comment lines of the source. ~~~ /* close communication pipe */ if (close_anyway) { /* TODO: Uninstall all signal handlers or mask all signals. * This pass is cleaning phase (terminate ruby process). * To avoid such race, we skip to close communication * pipe. OS will close it at process termination. * It may not good practice, but pragmatic. * We remain it is TODO. */ /* close_communication_pipe(); */ } ~~~ ---------------------------------------- Bug #11350: When Process.exec failed, redirections were still changed and not restored https://bugs.ruby-lang.org/issues/11350#change-53399 * Author: Naohisa Goto * Status: Open * Priority: Normal * Assignee: * ruby -v: * Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN ---------------------------------------- When Process.exec failed, redirections of file descriptors were changed and not restored. When redirecting fd 3 or 5, ASYNC BUG occurred as below. ~~~ $ ruby -e 'begin; Process.exec("/does_not_exist", "arg", { 3=>["/dev/null", "w"]}); rescue Errno::ENOENT => e; $stdout.print "stdout: ", e.inspect, "\n"; $stderr.print "stderr: ", e.inspect, "\n"; end' [ASYNC BUG] consume_communication_pipe: read EBADF ruby 2.3.0dev (2015-07-13) [sparc64-solaris2.10] [NOTE] You may have encountered a bug in the Ruby interpreter or extension libraries. Bug reports are welcome. For details: http://www.ruby-lang.org/bugreport.html stdout: # stderr: #Abort ~~~ ~~~ $ ruby -e 'begin; Process.exec("/does_not_exist", "arg", { 5=>["/dev/null", "w"]}); rescue Errno::ENOENT => e; $stdout.print "stdout: ", e.inspect, "\n"; $stderr.print "stderr: ", e.inspect, "\n"; end' [ASYNC BUG] consume_communication_pipe: read EBADF ruby 2.3.0dev (2015-07-13) [sparc64-solaris2.10] stdout: [NOTE] You may have encountered a bug in the Ruby interpreter or extension libraries. Bug reports are welcome. For details: http://www.ruby-lang.org/bugreport.html # stderr: #Abort ~~~ When redirecting fd 1 or 2 to /dev/null, stdout or stderr is still redirected to /dev/null and the printed contents are not shown. ~~~ % ruby -e 'begin; Process.exec("/does_not_exist", "arg", { 1=>["/dev/null", "w"]}); rescue Errno::ENOENT => e; $stdout.print "stdout: ", e.inspect, "\n"; $stderr.print "stderr: ", e.inspect, "\n"; end' stderr: # ~~~ ~~~ % ruby -e 'begin; Process.exec("/does_not_exist", "arg", { 2=>["/dev/null", "w"]}); rescue Errno::ENOENT => e; $stdout.print "stdout: ", e.inspect, "\n"; $stderr.print "stderr: ", e.inspect, "\n"; end' stdout: # ~~~ All of the above are observed both on x86_64 Linux and sparc Solaris. Is this spec or bug? -- https://bugs.ruby-lang.org/