mirror of
https://github.com/ruby/ruby.git
synced 2026-01-26 20:19:19 +00:00
Fix fields object in embedded struct
We don't set RSTRUCT_GEN_FIELDS when RCLASS_MAX_IV_COUNT(klass) != 0, so we need to set RSTRUCT_SET_FIELDS_OBJ to 0 otherwise it may have an invalid value and crash.
This commit is contained in:
parent
791acc5697
commit
8f9838476d
Notes:
git
2025-12-05 23:41:09 +00:00
13
struct.c
13
struct.c
@ -826,12 +826,17 @@ struct_alloc(VALUE klass)
|
||||
}
|
||||
|
||||
NEWOBJ_OF(st, struct RStruct, klass, flags, embedded_size, 0);
|
||||
if (RCLASS_MAX_IV_COUNT(klass) == 0
|
||||
&& !rb_shape_obj_has_fields((VALUE)st)
|
||||
&& embedded_size < rb_gc_obj_slot_size((VALUE)st)) {
|
||||
FL_UNSET_RAW((VALUE)st, RSTRUCT_GEN_FIELDS);
|
||||
if (RCLASS_MAX_IV_COUNT(klass) == 0) {
|
||||
if (!rb_shape_obj_has_fields((VALUE)st)
|
||||
&& embedded_size < rb_gc_obj_slot_size((VALUE)st)) {
|
||||
FL_UNSET_RAW((VALUE)st, RSTRUCT_GEN_FIELDS);
|
||||
RSTRUCT_SET_FIELDS_OBJ((VALUE)st, 0);
|
||||
}
|
||||
}
|
||||
else {
|
||||
RSTRUCT_SET_FIELDS_OBJ((VALUE)st, 0);
|
||||
}
|
||||
|
||||
rb_mem_clear((VALUE *)st->as.ary, n);
|
||||
|
||||
return (VALUE)st;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user