summaryrefslogtreecommitdiff
path: root/io_buffer.c
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2025-11-22 23:41:23 +0900
committerNobuyoshi Nakada <nobu.nakada@gmail.com>2025-12-17 12:35:38 +0900
commit9519d16381c8a8ddf7e1128a08fd80dfac8ed327 (patch)
tree329cb17994651dacfd8d6635129beca87447af73 /io_buffer.c
parentf430fbbfacea5690d790dd9060ca4118431fc2fb (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.c12
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