Skip to content

Commit 4954197

Browse files
authored
[release-1.10] fix a race condition in jl_gc_realloc_string (#54967)
Fix #54963.
1 parent 48d4fd4 commit 4954197

File tree

1 file changed

+2
-29
lines changed

1 file changed

+2
-29
lines changed

src/gc.c

Lines changed: 2 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3897,35 +3897,8 @@ jl_value_t *jl_gc_realloc_string(jl_value_t *s, size_t sz)
38973897
{
38983898
size_t len = jl_string_len(s);
38993899
if (sz <= len) return s;
3900-
jl_taggedvalue_t *v = jl_astaggedvalue(s);
3901-
size_t strsz = len + sizeof(size_t) + 1;
3902-
if (strsz <= GC_MAX_SZCLASS ||
3903-
// TODO: because of issue #17971 we can't resize old objects
3904-
gc_marked(v->bits.gc)) {
3905-
// pool allocated; can't be grown in place so allocate a new object.
3906-
jl_value_t *snew = jl_alloc_string(sz);
3907-
memcpy(jl_string_data(snew), jl_string_data(s), len);
3908-
return snew;
3909-
}
3910-
size_t newsz = sz + sizeof(size_t) + 1;
3911-
size_t offs = sizeof(bigval_t);
3912-
size_t oldsz = LLT_ALIGN(strsz + offs, JL_CACHE_BYTE_ALIGNMENT);
3913-
size_t allocsz = LLT_ALIGN(newsz + offs, JL_CACHE_BYTE_ALIGNMENT);
3914-
if (allocsz < sz) // overflow in adding offs, size was "negative"
3915-
jl_throw(jl_memory_exception);
3916-
bigval_t *hdr = bigval_header(v);
3917-
jl_ptls_t ptls = jl_current_task->ptls;
3918-
maybe_collect(ptls); // don't want this to happen during jl_gc_managed_realloc
3919-
gc_big_object_unlink(hdr);
3920-
// TODO: this is not safe since it frees the old pointer. ideally we'd like
3921-
// the old pointer to be left alone if we can't grow in place.
3922-
// for now it's up to the caller to make sure there are no references to the
3923-
// old pointer.
3924-
bigval_t *newbig = (bigval_t*)gc_managed_realloc_(ptls, hdr, allocsz, oldsz, 1, s, 0);
3925-
newbig->sz = allocsz;
3926-
gc_big_object_link(newbig, &ptls->heap.big_objects);
3927-
jl_value_t *snew = jl_valueof(&newbig->header);
3928-
*(size_t*)snew = sz;
3900+
jl_value_t *snew = jl_alloc_string(sz);
3901+
memcpy(jl_string_data(snew), jl_string_data(s), len);
39293902
return snew;
39303903
}
39313904

0 commit comments

Comments
 (0)