diff options
| author | Peter Zhu <peter@peterzhu.ca> | 2025-10-02 18:39:24 -0400 |
|---|---|---|
| committer | Peter Zhu <peter@peterzhu.ca> | 2025-10-03 09:20:53 -0400 |
| commit | 14cdd88970a2f1ec07bf97a5de50a47f4f6e7e4f (patch) | |
| tree | bfd423119e64ae202b42c7767cd7dc674bb3a537 /vm_method.c | |
| parent | 52287c68abd696ee7808fa231873e917d74dae7b (diff) | |
[Bug #21620] Fix strict aliasing in rb_managed_id_table_lookup
We cannot pass &ccs into rb_managed_id_table_lookup because rb_managed_id_table_lookup
takes in a VALUE*, so it violates strict aliasing in C. This causes segfaults
when compiling with LTO enabled.
Diffstat (limited to 'vm_method.c')
| -rw-r--r-- | vm_method.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/vm_method.c b/vm_method.c index 16f402e893..60c273ff2f 100644 --- a/vm_method.c +++ b/vm_method.c @@ -195,8 +195,9 @@ rb_vm_ccs_invalidate_and_free(struct rb_class_cc_entries *ccs) void rb_vm_cc_table_delete(VALUE table, ID mid) { - struct rb_class_cc_entries *ccs; - if (rb_managed_id_table_lookup(table, mid, (VALUE *)&ccs)) { + VALUE ccs_obj; + if (rb_managed_id_table_lookup(table, mid, &ccs_obj)) { + struct rb_class_cc_entries *ccs = (struct rb_class_cc_entries *)ccs_obj; rb_managed_id_table_delete(table, mid); rb_vm_ccs_invalidate_and_free(ccs); } |
