aboutsummaryrefslogtreecommitdiffstats
path: root/variable.c
diff options
context:
space:
mode:
authorAlan Wu <XrXr@users.noreply.github.com>2020-06-10 18:44:52 -0400
committerAlan Wu <XrXr@users.noreply.github.com>2020-06-11 14:46:08 -0400
commite100fcbdd1e81c23e3b4c87964aff210232903a8 (patch)
tree500c79c58a55359574d3008a8d9a0dce9cfe5492 /variable.c
parent631c01f5ae64d1034ec719c9f97da906e7f508b3 (diff)
downloadruby-e100fcbdd1e81c23e3b4c87964aff210232903a8.tar.gz
Prohibit setting class variable on frozen module through inheritance
Setting class varibles goes through the ancestor list which can contain iclasses. Iclasses share a lot of information with the module they are made from, but not the frozen status. Check the frozen status of the module instead of the iclass.
Diffstat (limited to 'variable.c')
-rw-r--r--variable.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/variable.c b/variable.c
index ebf23fab67..0d8a424438 100644
--- a/variable.c
+++ b/variable.c
@@ -3143,6 +3143,9 @@ rb_cvar_set(VALUE klass, ID id, VALUE val)
target = tmp;
}
+ if (RB_TYPE_P(target, T_ICLASS)) {
+ target = RBASIC(target)->klass;
+ }
check_before_mod_set(target, id, val, "class variable");
if (!RCLASS_IV_TBL(target)) {
RCLASS_IV_TBL(target) = st_init_numtable();