ruby-changes:21466
From: akr <ko1@a...>
Date: Mon, 24 Oct 2011 08:19:27 +0900 (JST)
Subject: [ruby-changes:21466] akr:r33515 (trunk): * io.c (copy_stream_fallback_body): check nil for EOF of read method.
akr 2011-10-24 08:19:14 +0900 (Mon, 24 Oct 2011) New Revision: 33515 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=33515 Log: * io.c (copy_stream_fallback_body): check nil for EOF of read method. patch by Eric Wong. [ruby-core:39134] [Bug #5237] Modified files: trunk/ChangeLog trunk/io.c trunk/test/ruby/test_io.rb Index: ChangeLog =================================================================== --- ChangeLog (revision 33514) +++ ChangeLog (revision 33515) @@ -1,3 +1,8 @@ +Mon Oct 24 08:18:14 2011 Tanaka Akira <akr@f...> + + * io.c (copy_stream_fallback_body): check nil for EOF of read method. + patch by Eric Wong. [ruby-core:39134] [Bug #5237] + Sun Oct 23 18:21:23 2011 Kazuki Tsujimoto <kazuki@c...> * ext/tk/MANUAL_tcltklib.eng: fix typo. Index: io.c =================================================================== --- io.c (revision 33514) +++ io.c (revision 33515) @@ -8998,7 +8998,10 @@ l = buflen < rest ? buflen : (long)rest; } if (stp->src_fd == -1) { - rb_funcall(stp->src, read_method, 2, INT2FIX(l), buf); + VALUE rc = rb_funcall(stp->src, read_method, 2, INT2FIX(l), buf); + + if (read_method == id_read && NIL_P(rc)) + break; } else { ssize_t ss; Index: test/ruby/test_io.rb =================================================================== --- test/ruby/test_io.rb (revision 33514) +++ test/ruby/test_io.rb (revision 33515) @@ -826,6 +826,28 @@ } end + class Bug5237 + attr_reader :count + def initialize + @count = 0 + end + + def read(bytes, buffer) + @count += 1 + buffer.replace "this is a test" + nil + end + end + + def test_copy_stream_broken_src_read_eof + src = Bug5237.new + dst = StringIO.new + assert_equal 0, src.count + th = Thread.new { IO.copy_stream(src, dst) } + flunk("timeout") unless th.join(10) + assert_equal 1, src.count + end + def test_copy_stream_dst_rbuf mkcdtmpdir { pipe(proc do |w| -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/