diff options
| author | Hiroshi SHIBATA <hsbt@ruby-lang.org> | 2025-03-13 13:26:38 +0900 |
|---|---|---|
| committer | Hiroshi SHIBATA <hsbt@ruby-lang.org> | 2025-03-13 14:27:06 +0900 |
| commit | f89a334b555d9f91f0bb5a7c58b3097960dd7fb8 (patch) | |
| tree | 56d82266863cb679e57820bc5986bfdd71ab5743 /spec/ruby | |
| parent | 2c4951329122143b5e0375caf1d4481173e403cb (diff) | |
merge revision(s) bccec7fb468ad977be75e7e4c2644b4ea845ab0c, 5f8ebcada099351acbc22db264e7cd3773c2bdc4, e13575bb7938e9e5b6a79bfca1b3793123f479da, 4adcfc8cd7a17593a6590025da2b03eebf4fd63c: [Backport #19584]
Fix crash in rb_gc_register_address
[Bug #19584]
Some C extensions pass a pointer to a global variable to
rb_gc_register_address. However, if a GC is triggered inside of
rb_gc_register_address, then the object could get swept since it does
not exist on the stack.
[Bug #19584] Register global variable address before assignment
[Bug #19584] Register global variables before assignment
[Bug #19584] [DOC] Tweek description of `rb_gc_register_address`
Diffstat (limited to 'spec/ruby')
| -rw-r--r-- | spec/ruby/optional/capi/ext/gc_spec.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/spec/ruby/optional/capi/ext/gc_spec.c b/spec/ruby/optional/capi/ext/gc_spec.c index 082e4af59c..b323c2456d 100644 --- a/spec/ruby/optional/capi/ext/gc_spec.c +++ b/spec/ruby/optional/capi/ext/gc_spec.c @@ -28,8 +28,8 @@ static VALUE get_registered_before_rb_global_variable(VALUE self) { } static VALUE gc_spec_rb_gc_register_address(VALUE self) { - rb_gc_register_address_outside_init = rb_str_new_cstr("rb_gc_register_address() outside Init_"); rb_gc_register_address(&rb_gc_register_address_outside_init); + rb_gc_register_address_outside_init = rb_str_new_cstr("rb_gc_register_address() outside Init_"); return rb_gc_register_address_outside_init; } @@ -67,14 +67,14 @@ static VALUE gc_spec_rb_gc_register_mark_object(VALUE self, VALUE obj) { void Init_gc_spec(void) { VALUE cls = rb_define_class("CApiGCSpecs", rb_cObject); - registered_tagged_value = INT2NUM(10); - registered_reference_value = rb_str_new2("Globally registered data"); rb_gc_register_address(®istered_tagged_value); rb_gc_register_address(®istered_reference_value); rb_gc_register_address(®istered_before_rb_gc_register_address); rb_global_variable(®istered_before_rb_global_variable); + registered_tagged_value = INT2NUM(10); + registered_reference_value = rb_str_new2("Globally registered data"); registered_before_rb_gc_register_address = rb_str_new_cstr("registered before rb_gc_register_address()"); registered_before_rb_global_variable = rb_str_new_cstr("registered before rb_global_variable()"); |
