Skip to content

Commit 3da2c52

Browse files
authored
fix #35708, GC seeing uninitialized struct in jl_new_struct* (#35737)
1 parent 5a06515 commit 3da2c52

File tree

1 file changed

+12
-10
lines changed

1 file changed

+12
-10
lines changed

src/datatype.c

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -901,20 +901,16 @@ JL_DLLEXPORT jl_value_t *jl_new_structv(jl_datatype_t *type, jl_value_t **args,
901901
jl_type_error("new", (jl_value_t*)jl_datatype_type, (jl_value_t*)type);
902902
if (type->ninitialized > na || na > jl_datatype_nfields(type))
903903
jl_error("invalid struct allocation");
904-
if (type->instance != NULL) {
905-
for (size_t i = 0; i < na; i++) {
906-
jl_value_t *ft = jl_field_type(type, i);
907-
if (!jl_isa(args[i], ft))
908-
jl_type_error("new", ft, args[i]);
909-
}
910-
return type->instance;
911-
}
912-
jl_value_t *jv = jl_gc_alloc(ptls, jl_datatype_size(type), type);
913-
JL_GC_PUSH1(&jv);
914904
for (size_t i = 0; i < na; i++) {
915905
jl_value_t *ft = jl_field_type(type, i);
916906
if (!jl_isa(args[i], ft))
917907
jl_type_error("new", ft, args[i]);
908+
}
909+
if (type->instance != NULL)
910+
return type->instance;
911+
jl_value_t *jv = jl_gc_alloc(ptls, jl_datatype_size(type), type);
912+
JL_GC_PUSH1(&jv);
913+
for (size_t i = 0; i < na; i++) {
918914
set_nth_field(type, (void*)jv, i, args[i]);
919915
}
920916
init_struct_tail(type, jv, na);
@@ -946,6 +942,12 @@ JL_DLLEXPORT jl_value_t *jl_new_structt(jl_datatype_t *type, jl_value_t *tup)
946942
jl_value_t *jv = jl_gc_alloc(ptls, jl_datatype_size(type), type);
947943
jl_value_t *fi = NULL;
948944
JL_GC_PUSH2(&jv, &fi);
945+
if (type->layout->npointers > 0) {
946+
// if there are references, zero the space first to prevent the GC
947+
// from seeing uninitialized references during jl_get_nth_field and jl_isa,
948+
// which can allocate.
949+
memset(jl_data_ptr(jv), 0, jl_datatype_size(type));
950+
}
949951
for (size_t i = 0; i < nargs; i++) {
950952
jl_value_t *ft = jl_field_type(type, i);
951953
fi = jl_get_nth_field(tup, i);

0 commit comments

Comments
 (0)