From 950c60623b83fb778df6b928ccbe46b2e54b18b6 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Thu, 29 Feb 2024 09:36:01 -0500 Subject: [PATCH] Delete from finalizer_table before running finalizer The finalizer could trigger a GC, which would cause FL_FINALIZE to be out of sync with the finalizer table. --- gc.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gc.c b/gc.c index 56ef075c5a..9d0f332ff5 100644 --- a/gc.c +++ b/gc.c @@ -4304,11 +4304,11 @@ rb_objspace_call_finalizer(rb_objspace_t *objspace) while (list) { struct force_finalize_list *curr = list; - FL_UNSET(curr->obj, FL_FINALIZE); - run_finalizer(objspace, curr->obj, curr->table); - st_data_t obj = (st_data_t)curr->obj; st_delete(finalizer_table, &obj, 0); + FL_UNSET(curr->obj, FL_FINALIZE); + + run_finalizer(objspace, curr->obj, curr->table); list = curr->next; xfree(curr);