[ruby-trunk - Bug #5952][Open] コマンドラインモードで CGI.new を 2 回実行すると IOError が発生する

Issue #5952 has been reported by Hiroshi SHIBATA.


Bug #5952: コマンドラインモードで CGI.new を 2 回実行すると IOError が発生する

Author: Hiroshi SHIBATA
Status: Open
Priority: Normal
Assignee:
Category:
Target version: 1.9.3
ruby -v: ruby 1.9.3p28 (2012-01-28 revision 34386) [x86_64-darwin11.2.0]

=begin
1.9.3p28, trunk で以下のスクリプトを実行すると2回目の CGI.new で パラメータを受け取る時に IOError
が発生します。
% cat cli.rb
require ‘cgi’
CGI.new
CGI.new

% ruby cli.rb
(offline mode: enter name=value pairs on standard input)
/Users/hsbt/.rbenv/versions/2.0.0-dev/lib/ruby/2.0.0/cgi/core.rb:595:in
tty?': closed stream (IOError) from /Users/hsbt/.rbenv/versions/2.0.0-dev/lib/ruby/2.0.0/cgi/core.rb:595:in read_from_cmdline’
from
/Users/hsbt/.rbenv/versions/2.0.0-dev/lib/ruby/2.0.0/cgi/core.rb:645:in
initialize_query' from /Users/hsbt/.rbenv/versions/2.0.0-dev/lib/ruby/2.0.0/cgi/core.rb:806:in initialize’
from cli.rb:4:in new' from cli.rb:4:in

1.9.2p290 や 1.8.7p357 ではエラーなく2回パラメータを入力可能です。
=end

Issue #5952 has been updated by Tomoyuki C…

Category set to core

r29781 以降 Kernel#readlines (ARGF.readlines) で EOF を検出すると stdin を close
するようになっていたようです。以下のようなサンプルで現象を確認できます。

readlines.rb:
p STDIN.closed? # => false
p readlines # => [] ← Ctrl-D で EOF を送出
p STDIN.closed? # => true
p readlines # => [] ← すぐにかえってくる

1.9.2 では最後の STDIN.closed? は false のままで、2度目の readlines は入力を待ちます。

ARGF.current_file が標準入力だったら close しないようにするととりあえずこの現象は直りました。これでどうでしょう。

diff --git a/io.c b/io.c
index a3a45c0…e877f13 100644
— a/io.c
+++ b/io.c
@@ -7684,7 +7684,8 @@ argf_readlines(int argc, VALUE *argv, VALUE argf)
}
else {
lines = rb_io_readlines(argc, argv, ARGF.current_file);

  •       argf_close(ARGF.current_file);
    
  •       if ( ARGF.current_file != rb_stdin )
    
  •           argf_close(ARGF.current_file);
      }
      ARGF.next_p = 1;
      rb_ary_concat(ary, lines);
    

Bug #5952: コマンドラインモードで CGI.new を 2 回実行すると IOError が発生する

Author: Hiroshi SHIBATA
Status: Open
Priority: Normal
Assignee:
Category: core
Target version: 1.9.3
ruby -v: ruby 1.9.3p28 (2012-01-28 revision 34386) [x86_64-darwin11.2.0]

=begin
1.9.3p28, trunk で以下のスクリプトを実行すると2回目の CGI.new で パラメータを受け取る時に IOError
が発生します。
% cat cli.rb
require ‘cgi’
CGI.new
CGI.new

% ruby cli.rb
(offline mode: enter name=value pairs on standard input)
/Users/hsbt/.rbenv/versions/2.0.0-dev/lib/ruby/2.0.0/cgi/core.rb:595:in
tty?': closed stream (IOError) from /Users/hsbt/.rbenv/versions/2.0.0-dev/lib/ruby/2.0.0/cgi/core.rb:595:in read_from_cmdline’
from
/Users/hsbt/.rbenv/versions/2.0.0-dev/lib/ruby/2.0.0/cgi/core.rb:645:in
initialize_query' from /Users/hsbt/.rbenv/versions/2.0.0-dev/lib/ruby/2.0.0/cgi/core.rb:806:in initialize’
from cli.rb:4:in new' from cli.rb:4:in

1.9.2p290 や 1.8.7p357 ではエラーなく2回パラメータを入力可能です。
=end

2012$BG/(B1$B7n(B31$BF|(B9:34 Tomoyuki C.
[email protected]:

p STDIN.closed? # => true
p readlines # => [] ← $B$9$0$K$+$($C$F$/$k(B

1.9.2 $B$G$O:G8e$N(B STDIN.closed? $B$O(B false $B$N$^$^$G!"(B2$BEYL$N(B
readlines $B$OF~NO$rBT$A$^$9!#(B

ARGF.current_file $B$,I8=`F~NO$@$C$?$i(B close
$B$7$J$$$h$&$K$9$k$H$H$j$"$($:$3$N8=>]$OD>$j$^$7$?!#$3$l$G$I$&$G$7$g$&!#(B

$B7P0^$r$h$/J,$+$C$F$$$J$$$N$G$9$,!“(Bstdin$B$O(Bclose$B$7$F$O$$$1$J$$$1$I!”(Bpipe$B$O(Bclose$B$7$F$$$$$H$$$&$N$O$J$K$+JQ$J46$8$,$7$^$9!#0l@Z(Bclose$B$7$F$O$$$1$J$$$N$G$O$J$$$G$7$g$&$+(B

Issue #5952 has been updated by Hiroshi SHIBATA.

r34409 で修正されているのを確認しました。ありがとうございます。

Bug #5952: コマンドラインモードで CGI.new を 2 回実行すると IOError が発生する

Author: Hiroshi SHIBATA
Status: Closed
Priority: Normal
Assignee:
Category: core
Target version: 1.9.3
ruby -v: ruby 1.9.3p28 (2012-01-28 revision 34386) [x86_64-darwin11.2.0]

=begin
1.9.3p28, trunk で以下のスクリプトを実行すると2回目の CGI.new で パラメータを受け取る時に IOError
が発生します。
% cat cli.rb
require ‘cgi’
CGI.new
CGI.new

% ruby cli.rb
(offline mode: enter name=value pairs on standard input)
/Users/hsbt/.rbenv/versions/2.0.0-dev/lib/ruby/2.0.0/cgi/core.rb:595:in
tty?': closed stream (IOError) from /Users/hsbt/.rbenv/versions/2.0.0-dev/lib/ruby/2.0.0/cgi/core.rb:595:in read_from_cmdline’
from
/Users/hsbt/.rbenv/versions/2.0.0-dev/lib/ruby/2.0.0/cgi/core.rb:645:in
initialize_query' from /Users/hsbt/.rbenv/versions/2.0.0-dev/lib/ruby/2.0.0/cgi/core.rb:806:in initialize’
from cli.rb:4:in new' from cli.rb:4:in

1.9.2p290 や 1.8.7p357 ではエラーなく2回パラメータを入力可能です。
=end

Issue #5952 has been updated by Yui NARUSE.

Status changed from Closed to Assigned
Assignee set to Nobuhiro I.

Linux で壊れてます。
http://u32.rubyci.org/~chkbuild/ruby-trunk/log/20120131T230102Z.diff.html.gz

Bug #5952: コマンドラインモードで CGI.new を 2 回実行すると IOError が発生する

Author: Hiroshi SHIBATA
Status: Assigned
Priority: Normal
Assignee: Nobuhiro I.
Category: core
Target version: 1.9.3
ruby -v: ruby 1.9.3p28 (2012-01-28 revision 34386) [x86_64-darwin11.2.0]

=begin
1.9.3p28, trunk で以下のスクリプトを実行すると2回目の CGI.new で パラメータを受け取る時に IOError
が発生します。
% cat cli.rb
require ‘cgi’
CGI.new
CGI.new

% ruby cli.rb
(offline mode: enter name=value pairs on standard input)
/Users/hsbt/.rbenv/versions/2.0.0-dev/lib/ruby/2.0.0/cgi/core.rb:595:in
tty?': closed stream (IOError) from /Users/hsbt/.rbenv/versions/2.0.0-dev/lib/ruby/2.0.0/cgi/core.rb:595:in read_from_cmdline’
from
/Users/hsbt/.rbenv/versions/2.0.0-dev/lib/ruby/2.0.0/cgi/core.rb:645:in
initialize_query' from /Users/hsbt/.rbenv/versions/2.0.0-dev/lib/ruby/2.0.0/cgi/core.rb:806:in initialize’
from cli.rb:4:in new' from cli.rb:4:in

1.9.2p290 や 1.8.7p357 ではエラーなく2回パラメータを入力可能です。
=end

Issue #5952 has been updated by Yui NARUSE.

Status changed from Assigned to Closed

The test is removed on r34412.

Bug #5952: コマンドラインモードで CGI.new を 2 回実行すると IOError が発生する

Author: Hiroshi SHIBATA
Status: Closed
Priority: Normal
Assignee: Nobuyoshi N.
Category: core
Target version: 1.9.3
ruby -v: ruby 1.9.3p28 (2012-01-28 revision 34386) [x86_64-darwin11.2.0]

=begin
1.9.3p28, trunk で以下のスクリプトを実行すると2回目の CGI.new で パラメータを受け取る時に IOError
が発生します。
% cat cli.rb
require ‘cgi’
CGI.new
CGI.new

% ruby cli.rb
(offline mode: enter name=value pairs on standard input)
/Users/hsbt/.rbenv/versions/2.0.0-dev/lib/ruby/2.0.0/cgi/core.rb:595:in
tty?': closed stream (IOError) from /Users/hsbt/.rbenv/versions/2.0.0-dev/lib/ruby/2.0.0/cgi/core.rb:595:in read_from_cmdline’
from
/Users/hsbt/.rbenv/versions/2.0.0-dev/lib/ruby/2.0.0/cgi/core.rb:645:in
initialize_query' from /Users/hsbt/.rbenv/versions/2.0.0-dev/lib/ruby/2.0.0/cgi/core.rb:806:in initialize’
from cli.rb:4:in new' from cli.rb:4:in

1.9.2p290 や 1.8.7p357 ではエラーなく2回パラメータを入力可能です。
=end

Issue #5952 has been updated by Yui NARUSE.

Assignee changed from Nobuhiro I. to Nobuyoshi N.


Bug #5952: コマンドラインモードで CGI.new を 2 回実行すると IOError が発生する

Author: Hiroshi SHIBATA
Status: Assigned
Priority: Normal
Assignee: Nobuyoshi N.
Category: core
Target version: 1.9.3
ruby -v: ruby 1.9.3p28 (2012-01-28 revision 34386) [x86_64-darwin11.2.0]

=begin
1.9.3p28, trunk で以下のスクリプトを実行すると2回目の CGI.new で パラメータを受け取る時に IOError
が発生します。
% cat cli.rb
require ‘cgi’
CGI.new
CGI.new

% ruby cli.rb
(offline mode: enter name=value pairs on standard input)
/Users/hsbt/.rbenv/versions/2.0.0-dev/lib/ruby/2.0.0/cgi/core.rb:595:in
tty?': closed stream (IOError) from /Users/hsbt/.rbenv/versions/2.0.0-dev/lib/ruby/2.0.0/cgi/core.rb:595:in read_from_cmdline’
from
/Users/hsbt/.rbenv/versions/2.0.0-dev/lib/ruby/2.0.0/cgi/core.rb:645:in
initialize_query' from /Users/hsbt/.rbenv/versions/2.0.0-dev/lib/ruby/2.0.0/cgi/core.rb:806:in initialize’
from cli.rb:4:in new' from cli.rb:4:in

1.9.2p290 や 1.8.7p357 ではエラーなく2回パラメータを入力可能です。
=end