summaryrefslogtreecommitdiff
path: root/vm_method.c
diff options
context:
space:
mode:
authorPeter Zhu <peter@peterzhu.ca>2025-10-02 18:39:24 -0400
committerPeter Zhu <peter@peterzhu.ca>2025-10-03 09:20:53 -0400
commit14cdd88970a2f1ec07bf97a5de50a47f4f6e7e4f (patch)
treebfd423119e64ae202b42c7767cd7dc674bb3a537 /vm_method.c
parent52287c68abd696ee7808fa231873e917d74dae7b (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.c5
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);
}