From b34a80275556b5a6ce61a8dafa6960187fa09b57 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); -- 2.30.2