Skip to content

Commit 8f98384

Browse files
committed
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.
1 parent 791acc5 commit 8f98384

File tree

1 file changed

+9
-4
lines changed

1 file changed

+9
-4
lines changed

struct.c

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -826,12 +826,17 @@ struct_alloc(VALUE klass)
826826
}
827827

828828
NEWOBJ_OF(st, struct RStruct, klass, flags, embedded_size, 0);
829-
if (RCLASS_MAX_IV_COUNT(klass) == 0
830-
&& !rb_shape_obj_has_fields((VALUE)st)
831-
&& embedded_size < rb_gc_obj_slot_size((VALUE)st)) {
832-
FL_UNSET_RAW((VALUE)st, RSTRUCT_GEN_FIELDS);
829+
if (RCLASS_MAX_IV_COUNT(klass) == 0) {
830+
if (!rb_shape_obj_has_fields((VALUE)st)
831+
&& embedded_size < rb_gc_obj_slot_size((VALUE)st)) {
832+
FL_UNSET_RAW((VALUE)st, RSTRUCT_GEN_FIELDS);
833+
RSTRUCT_SET_FIELDS_OBJ((VALUE)st, 0);
834+
}
835+
}
836+
else {
833837
RSTRUCT_SET_FIELDS_OBJ((VALUE)st, 0);
834838
}
839+
835840
rb_mem_clear((VALUE *)st->as.ary, n);
836841

837842
return (VALUE)st;

0 commit comments

Comments
 (0)