Project

General

Profile

Actions

Bug #5237

closed

IO.copy_stream calls #read on an object infinitely many times

Added by brixen (Brian Shirai) over 12 years ago. Updated over 12 years ago.

Status:
Closed
Assignee:
-
Target version:
-
ruby -v:
-
Backport:
[ruby-core:39134]

Description

The code for IO.copy_stream appears to support passing any object that implements #readpartial or #read. For example, passing an instance of StringIO works just fine:

sasha:rubinius2.0 brian$ irb
ruby-1.9.2-p290 :001 > puts RUBY_DESCRIPTION
ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-darwin10.8.0]
=> nil
ruby-1.9.2-p290 :002 > require 'stringio'
=> true
ruby-1.9.2-p290 :003 > s = StringIO.new "this is a test"
=> #StringIO:0x00000100851190
ruby-1.9.2-p290 :004 > IO.copy_stream s, "copy_stream_stringio"
=> 14
ruby-1.9.2-p290 :005 > IO.read "copy_stream_stringio"
=> "this is a test"
ruby-1.9.2-p290 :006 >

However, passing an object that implements eg #read according to the specification of IO#read, causes IO.copy_stream to endlessly call #read on the object:

class A
def initialize
@count = 0
end

def read(bytes, buffer)
print "read: #{@count += 1}\r"
buffer.replace "this is a test"
return nil
end
end

a = A.new
IO.copy_stream a, "copy_stream_test"

ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-darwin10.8.0]
copy_stream_bug.rb:7:in write': Interrupt from copy_stream_bug.rb:7:in print'
from copy_stream_bug.rb:7:in read' from copy_stream_bug.rb:14:in copy_stream'
from copy_stream_bug.rb:14:in `'

Thanks,
Brian


Files

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0