diff --git a/io.c b/io.c index bbecc427db..4d5c3acd3a 100644 --- a/io.c +++ b/io.c @@ -12512,8 +12512,7 @@ argf_read(int argc, VALUE *argv, VALUE argf) else if (argc >= 1) { long slen = RSTRING_LEN(str); if (slen < len) { - len -= slen; - argv[0] = LONG2NUM(len); + argv[0] = LONG2NUM(len - slen); goto retry; } } diff --git a/test/ruby/test_argf.rb b/test/ruby/test_argf.rb index 7922e5ad07..76a2720d47 100644 --- a/test/ruby/test_argf.rb +++ b/test/ruby/test_argf.rb @@ -1110,4 +1110,13 @@ class TestArgf < Test::Unit::TestCase assert_raise(TypeError, bug11610) {gets} }; end + + def test_sized_read + [@t1, @t2, @t3].each { |t| + open(t.path, "wb") { |f| f.write "t" } + } + ruby('-e', "print ARGF.read(3).size", @t1.path, @t2.path, @t3.path) do |f| + assert_equal("3", f.read) + end + end end