merge revision(s) 35e124832e: [Backport #20755]

[Bug #20755] Frozen string should not be writable via IO::Buffer
This commit is contained in:
nagachika 2024-10-18 13:03:48 +09:00
parent d85516eab5
commit 087e4ed6cc
3 changed files with 28 additions and 2 deletions

View file

@ -1340,7 +1340,8 @@ rb_io_buffer_get_bytes(VALUE self, void **base, size_t *size)
static inline void
io_buffer_get_bytes_for_writing(struct rb_io_buffer *buffer, void **base, size_t *size)
{
if (buffer->flags & RB_IO_BUFFER_READONLY) {
if (buffer->flags & RB_IO_BUFFER_READONLY ||
(!NIL_P(buffer->source) && OBJ_FROZEN(buffer->source))) {
rb_raise(rb_eIOBufferAccessError, "Buffer is not writable!");
}

View file

@ -221,6 +221,31 @@ class TestIOBuffer < Test::Unit::TestCase
assert_equal "Hello World", hello
end
def test_transfer
hello = %w"Hello World".join(" ")
buffer = IO::Buffer.for(hello)
transferred = buffer.transfer
assert_equal "Hello World", transferred.get_string
assert_predicate buffer, :null?
assert_raise IO::Buffer::AccessError do
transferred.set_string("Goodbye")
end
assert_equal "Hello World", hello
end
def test_transfer_in_block
hello = %w"Hello World".join(" ")
buffer = IO::Buffer.for(hello, &:transfer)
assert_equal "Hello World", buffer.get_string
buffer.set_string("Ciao!")
assert_equal "Ciao! World", hello
hello.freeze
assert_raise IO::Buffer::AccessError do
buffer.set_string("Hola")
end
assert_equal "Ciao! World", hello
end
def test_locked
buffer = IO::Buffer.new(128, IO::Buffer::INTERNAL|IO::Buffer::LOCKED)

View file

@ -11,7 +11,7 @@
# define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR
#define RUBY_VERSION_TEENY 5
#define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR
#define RUBY_PATCHLEVEL 227
#define RUBY_PATCHLEVEL 228
#include "ruby/version.h"
#include "ruby/internal/abi.h"