From 206110a2a8f5d14f8e462c81065673c1dae1c2ef Mon Sep 17 00:00:00 2001 From: Jean Boussier Date: Tue, 3 Jun 2025 15:52:29 +0200 Subject: [PATCH] Add missing lock in `rb_ivar_defined` If called on a class, we should acquire the lock. --- variable.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/variable.c b/variable.c index bef25c147f..b87cdd7986 100644 --- a/variable.c +++ b/variable.c @@ -2125,12 +2125,11 @@ rb_obj_field_set(VALUE obj, shape_id_t target_shape_id, VALUE val) } } -VALUE -rb_ivar_defined(VALUE obj, ID id) +static VALUE +ivar_defined0(VALUE obj, ID id) { attr_index_t index; - if (SPECIAL_CONST_P(obj)) return Qfalse; if (rb_shape_obj_too_complex_p(obj)) { VALUE idx; st_table *table = NULL; @@ -2164,6 +2163,26 @@ rb_ivar_defined(VALUE obj, ID id) } } +VALUE +rb_ivar_defined(VALUE obj, ID id) +{ + if (SPECIAL_CONST_P(obj)) return Qfalse; + + VALUE defined; + switch (BUILTIN_TYPE(obj)) { + case T_CLASS: + case T_MODULE: + RB_VM_LOCKING() { + defined = ivar_defined0(obj, id); + } + break; + default: + defined = ivar_defined0(obj, id); + break; + } + return defined; +} + struct iv_itr_data { VALUE obj; struct gen_fields_tbl *fields_tbl;