[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]