diff --git a/ChangeLog b/ChangeLog index 69dfc40c1e..fa82e9f9f2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Sat Apr 9 21:54:15 2011 Shota Fukumori + + * ext/stringio/stringio.c (strio_each, strio_readlines): + limit must not be zero. Fixes [ruby-dev:43392]. + + * test/stringio/test_stringio.rb: Add tests for above. + Sat Apr 9 18:01:36 2011 Tanaka Akira * include/ruby/util.h: parenthesize macro arguments. diff --git a/ext/stringio/stringio.c b/ext/stringio/stringio.c index da4eb964cb..609355a51b 100644 --- a/ext/stringio/stringio.c +++ b/ext/stringio/stringio.c @@ -1067,6 +1067,11 @@ strio_each(int argc, VALUE *argv, VALUE self) struct StringIO *ptr = StringIO(self); VALUE line; + if(argc > 0 && TYPE(argv[argc-1]) == T_FIXNUM && + FIX2INT(argv[argc-1]) == 0) { + rb_raise(rb_eArgError, "invalid limit: 0 for readlines"); + } + RETURN_ENUMERATOR(self, argc, argv); while (!NIL_P(line = strio_getline(argc, argv, readable(ptr)))) { @@ -1088,6 +1093,12 @@ strio_readlines(int argc, VALUE *argv, VALUE self) { struct StringIO *ptr = StringIO(self); VALUE ary = rb_ary_new(), line; + + if(argc > 0 && TYPE(argv[argc-1]) == T_FIXNUM && + FIX2INT(argv[argc-1]) == 0) { + rb_raise(rb_eArgError, "invalid limit: 0 for readlines"); + } + while (!NIL_P(line = strio_getline(argc, argv, readable(ptr)))) { rb_ary_push(ary, line); } diff --git a/test/stringio/test_stringio.rb b/test/stringio/test_stringio.rb index c581681817..8bf6c595a0 100644 --- a/test/stringio/test_stringio.rb +++ b/test/stringio/test_stringio.rb @@ -482,4 +482,12 @@ class TestStringIO < Test::Unit::TestCase assert_raise(RuntimeError, bug) {s.string = "foo"} assert_raise(RuntimeError, bug) {s.reopen("")} end + + def test_readlines_limit_0 + assert_raise(ArgumentError, "[ruby-dev:43392]") { StringIO.new.readlines(0) } + end + + def test_each_line_limit_0 + assert_raise(ArgumentError, "[ruby-dev:43392]") { StringIO.new.each_line(0) } + end end