diff options
| author | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2025-11-22 23:41:23 +0900 |
|---|---|---|
| committer | Nobuyoshi Nakada <nobu.nakada@gmail.com> | 2025-12-17 12:35:38 +0900 |
| commit | 9519d16381c8a8ddf7e1128a08fd80dfac8ed327 (patch) | |
| tree | 329cb17994651dacfd8d6635129beca87447af73 /io_buffer.c | |
| parent | f430fbbfacea5690d790dd9060ca4118431fc2fb (diff) | |
IO::Buffer: Guard arguments from GC
At least, `string` in `io_buffer_set_string` can be different from
`argv[0]` after `rb_str_to_str` call. The other cases may not be
necessary.
Diffstat (limited to 'io_buffer.c')
| -rw-r--r-- | io_buffer.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/io_buffer.c b/io_buffer.c index 55f1933194..c2e1c0ca5f 100644 --- a/io_buffer.c +++ b/io_buffer.c @@ -2569,7 +2569,9 @@ rb_io_buffer_initialize_copy(VALUE self, VALUE source) io_buffer_initialize(self, buffer, NULL, source_size, io_flags_for_size(source_size), Qnil); - return io_buffer_copy_from(buffer, source_base, source_size, 0, NULL); + VALUE result = io_buffer_copy_from(buffer, source_base, source_size, 0, NULL); + RB_GC_GUARD(source); + return result; } /* @@ -2654,7 +2656,9 @@ io_buffer_copy(int argc, VALUE *argv, VALUE self) rb_io_buffer_get_bytes_for_reading(source, &source_base, &source_size); - return io_buffer_copy_from(buffer, source_base, source_size, argc-1, argv+1); + VALUE result = io_buffer_copy_from(buffer, source_base, source_size, argc-1, argv+1); + RB_GC_GUARD(source); + return result; } /* @@ -2732,7 +2736,9 @@ io_buffer_set_string(int argc, VALUE *argv, VALUE self) const void *source_base = RSTRING_PTR(string); size_t source_size = RSTRING_LEN(string); - return io_buffer_copy_from(buffer, source_base, source_size, argc-1, argv+1); + VALUE result = io_buffer_copy_from(buffer, source_base, source_size, argc-1, argv+1); + RB_GC_GUARD(string); + return result; } void |
