From 2599d1a8dff29a2376f36c8cc301839b454fc064 Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Tue, 6 Jul 2021 15:11:49 -0700 Subject: [PATCH] Store the dup'd CDHASH in the object list during IBF load Since b2fc592c304 nothing was holding a reference to the dup'd CDHASH during IBF loading. If a GC happened to run during IBF load then the copied hash wouldn't have anything to keep it alive. We don't really want to keep the originally loaded CDHASH hash, so this patch just overwrites the original hash with the copied / modified hash. [Bug #17984] [ruby-core:104259] --- compile.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/compile.c b/compile.c index a73a5be9a1..a7862194c0 100644 --- a/compile.c +++ b/compile.c @@ -10797,6 +10797,11 @@ ibf_load_code(const struct ibf_load *load, rb_iseq_t *iseq, ibf_offset_t bytecod rb_hash_rehash(v); // hash function changed freeze_hide_obj(v); + // Overwrite the existing hash in the object list. This + // is to keep the object alive during load time. + // [Bug #17984] [ruby-core:104259] + pinned_list_store(load->current_buffer->obj_list, (long)op, v); + code[code_index] = v; RB_OBJ_WRITTEN(iseqv, Qundef, v); FL_SET(iseqv, ISEQ_MARKABLE_ISEQ);