summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--io.c3
-rw-r--r--spec/ruby/core/io/read_spec.rb26
2 files changed, 28 insertions, 1 deletions
diff --git a/io.c b/io.c
index 28b5abb1c5..7ded212804 100644
--- a/io.c
+++ b/io.c
@@ -3276,9 +3276,10 @@ io_setstrbuf(VALUE *str, long len)
}
else {
VALUE s = StringValue(*str);
+ rb_str_modify(s);
+
long clen = RSTRING_LEN(s);
if (clen >= len) {
- rb_str_modify(s);
return FALSE;
}
len -= clen;
diff --git a/spec/ruby/core/io/read_spec.rb b/spec/ruby/core/io/read_spec.rb
index 996f70bf20..db11468ea4 100644
--- a/spec/ruby/core/io/read_spec.rb
+++ b/spec/ruby/core/io/read_spec.rb
@@ -299,6 +299,32 @@ describe "IO#read" do
@io.read(10, buf).should == nil
buf.should == ''
+
+ buf = 'non-empty string'
+
+ @io.read(nil, buf).should == ""
+
+ buf.should == ''
+
+ buf = 'non-empty string'
+
+ @io.read(0, buf).should == ""
+
+ buf.should == ''
+ end
+
+ it "raise FrozenError if the output buffer is frozen" do
+ @io.read
+ -> { @io.read(0, 'frozen-string'.freeze) }.should raise_error(FrozenError)
+ -> { @io.read(1, 'frozen-string'.freeze) }.should raise_error(FrozenError)
+ -> { @io.read(nil, 'frozen-string'.freeze) }.should raise_error(FrozenError)
+ end
+
+ ruby_bug "", ""..."3.3" do
+ it "raise FrozenError if the output buffer is frozen (2)" do
+ @io.read
+ -> { @io.read(1, ''.freeze) }.should raise_error(FrozenError)
+ end
end
it "consumes zero bytes when reading zero bytes" do