From: akr@...
Date: 2015-07-14T04:54:22+00:00
Subject: [ruby-core:69962] [Ruby trunk - Bug #11350] [Feedback] When Process.exec failed, redirections were still changed and not restored
Issue #11350 has been updated by Akira Tanaka.
Status changed from Open to Feedback
It is an example of the documented behavior described as follows.
```
* The modified attributes may be retained when exec(2)
system
* call fails.
*
* For example, hard resource limits are not restorable.
*
* Consider to create a child process using ::spawn or Kernel#system if this
* is not acceptable.
```
It is possible to restore FDs if there are free FDs enough.
But It is a tired task.
----------------------------------------
Bug #11350: When Process.exec failed, redirections were still changed and not restored
https://bugs.ruby-lang.org/issues/11350#change-53394
* Author: Naohisa Goto
* Status: Feedback
* Priority: Normal
* Assignee: Nobuyoshi Nakada
* 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/