Project

General

Profile

Actions

Bug #5952

closed

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

Added by hsbt (Hiroshi SHIBATA) almost 13 years ago. Updated over 12 years ago.

Status:
Closed
Target version:
ruby -v:
ruby 1.9.3p28 (2012-01-28 revision 34386) [x86_64-darwin11.2.0]
Backport:
[ruby-dev:45160]

Description

=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


Related issues 1 (0 open1 closed)

Related to Backport193 - Backport #5955: Please backport r34409(io.c: skip stdin, which should be readable again.)Closed02/01/2012Actions

Updated by nagachika (Tomoyuki Chikanaga) almost 13 years ago

  • 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);
    
Actions #2

Updated by nobu (Nobuyoshi Nakada) almost 13 years ago

  • Status changed from Open to Closed
  • % Done changed from 0 to 100

This issue was solved with changeset r34409.
Hiroshi, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.


  • io.c (argf_close): skip stdin, which should be readable again.
    [ruby-dev:45160] [Bug #5952]
  • io.c (argf_readlines): reinitialize after all read to be
    readable again.

Updated by hsbt (Hiroshi SHIBATA) almost 13 years ago

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

Updated by naruse (Yui NARUSE) almost 13 years ago

  • Status changed from Closed to Assigned
  • Assignee set to iwamatsu (Nobuhiro Iwamatsu)

Updated by naruse (Yui NARUSE) almost 13 years ago

  • Assignee changed from iwamatsu (Nobuhiro Iwamatsu) to nobu (Nobuyoshi Nakada)

Updated by naruse (Yui NARUSE) almost 13 years ago

  • Status changed from Assigned to Closed

The test is removed on r34412.

Updated by kosaki (Motohiro KOSAKI) over 12 years ago

2012年1月31日9:34 Tomoyuki Chikanaga :

Issue #5952 has been updated by Tomoyuki Chikanaga.

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 しないようにするととりあえずこの現象は直りました。これでどうでしょう。

経緯をよく分かっていないのですが、stdinはcloseしてはいけないけど、pipeはcloseしていいというのはなにか変な感じがします。一切closeしてはいけないのではないでしょうか

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0