summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--ext/stringio/stringio.c11
-rw-r--r--test/stringio/test_stringio.rb8
3 files changed, 26 insertions, 0 deletions
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 <sorah@tubusu.net>
+
+ * 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 <akr@fsij.org>
* 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