summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenoit Daloze <eregontp@gmail.com>2026-01-29 20:48:08 +0100
committergit <svn-admin@ruby-lang.org>2026-02-03 15:09:23 +0000
commitebef4dbae6cbbe636499c93d7ff0bf31dab88d18 (patch)
tree184073dd5369bf98ffc3d5a200ec4f0b3accb571
parent4bf1cb087bc8ff065b6226037329d7464fa3e96c (diff)
[ruby/prism] RB_GC_GUARD() the VALUE for RSTRING_PTR() to ensure the char* does not move
* See https://github.com/ruby/prism/pull/3886#discussion_r2741579984. https://github.com/ruby/prism/commit/98603ce8cc
-rw-r--r--prism/extension.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/prism/extension.c b/prism/extension.c
index cde10bf360..ecfc960d61 100644
--- a/prism/extension.c
+++ b/prism/extension.c
@@ -201,12 +201,16 @@ build_options_i(VALUE key, VALUE value, VALUE argument) {
const char *version = check_string(value);
if (RSTRING_LEN(value) == 7 && strncmp(version, "current", 7) == 0) {
- const char *ruby_version = RSTRING_PTR(rb_const_get(rb_cObject, rb_intern("RUBY_VERSION")));
+ VALUE ruby_version_string = rb_const_get(rb_cObject, rb_intern("RUBY_VERSION"));
+ const char *ruby_version = RSTRING_PTR(ruby_version_string);
if (!pm_options_version_set(options, ruby_version, 3)) {
- rb_exc_raise(rb_exc_new_cstr(rb_cPrismCurrentVersionError, ruby_version));
+ rb_exc_raise(rb_exc_new_str(rb_cPrismCurrentVersionError, ruby_version_string));
}
+
+ RB_GC_GUARD(ruby_version_string); // Do not move ruby_version while running the code above
} else if (RSTRING_LEN(value) == 7 && strncmp(version, "nearest", 7) == 0) {
- const char *ruby_version = RSTRING_PTR(rb_const_get(rb_cObject, rb_intern("RUBY_VERSION")));
+ VALUE ruby_version_string = rb_const_get(rb_cObject, rb_intern("RUBY_VERSION"));
+ const char *ruby_version = RSTRING_PTR(ruby_version_string);
const char *nearest_version;
if (ruby_version[0] < '3' || (ruby_version[0] == '3' && ruby_version[2] < '3')) {
@@ -220,6 +224,8 @@ build_options_i(VALUE key, VALUE value, VALUE argument) {
if (!pm_options_version_set(options, nearest_version, 3)) {
rb_raise(rb_eArgError, "invalid nearest version: %s", nearest_version);
}
+
+ RB_GC_GUARD(ruby_version_string); // Do not move ruby_version while running the code above
} else if (!pm_options_version_set(options, version, RSTRING_LEN(value))) {
rb_raise(rb_eArgError, "invalid version: %" PRIsVALUE, value);
}