diff options
author | Jonathan Chambers <joncham@gmail.com> | 2020-05-27 16:20:16 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-27 16:20:16 +0300 |
commit | 44c4c0a38e0d954e9653185fd4e76ceb71e95828 (patch) | |
tree | febfd2849a5061b9913e40c9c5c5f8c4959ed687 | |
parent | 876a56777d9fb8ca559c8889c586cc88eb120d75 (diff) | |
parent | 0159688c7c0d5cc0bf01bf09fa2b43d611da2016 (diff) |
Merge pull request #55 from Unity-Technologies/unity-master-precise-array-marking-stack-limit
Avoid exceeding the mark stack limit (case 1235202)
-rw-r--r-- | include/gc_vector.h | 1 | ||||
-rw-r--r-- | vector_mlc.c | 15 |
2 files changed, 15 insertions, 1 deletions
diff --git a/include/gc_vector.h b/include/gc_vector.h index e0a6cb44..64b8594a 100644 --- a/include/gc_vector.h +++ b/include/gc_vector.h @@ -53,6 +53,7 @@ GC_API GC_ATTR_MALLOC void * GC_CALL GC_gcj_vector_malloc(size_t /* lb */, GC_API struct GC_ms_entry *GC_CALL GC_gcj_vector_mark_proc (struct GC_ms_entry *mark_stack_ptr, + struct GC_ms_entry* mark_stack_limit, GC_descr element_desc, GC_word*start, GC_word*end, diff --git a/vector_mlc.c b/vector_mlc.c index ba5c28b5..e5ac1760 100644 --- a/vector_mlc.c +++ b/vector_mlc.c @@ -142,7 +142,7 @@ GC_API void GC_CALL GC_init_gcj_vector (int mp_index, #define ELEMENT_CHUNK_SIZE 256 GC_API mse *GC_CALL -GC_gcj_vector_mark_proc (mse *mark_stack_ptr, GC_descr element_desc, word *start, word *end, int words_per_element) +GC_gcj_vector_mark_proc (mse *mark_stack_ptr, mse* mark_stack_limit, GC_descr element_desc, word *start, word *end, int words_per_element) { /* create new descriptor that is shifted two bits to account * for lack of object header. Descriptors for value types include @@ -162,6 +162,8 @@ GC_gcj_vector_mark_proc (mse *mark_stack_ptr, GC_descr element_desc, word *start /* attempt to bulk process multiple elements with single descriptor */ size_t elements_per_desc = (CPP_WORDSZ - GC_DS_TAG_BITS) / words_per_element; + if (mark_stack_ptr >= mark_stack_limit) + return GC_signal_mark_stack_overflow (mark_stack_ptr); /* setup bulk processing */ if (elements_per_desc > 1) { @@ -188,12 +190,16 @@ GC_gcj_vector_mark_proc (mse *mark_stack_ptr, GC_descr element_desc, word *start remainder_count = 0; mark_stack_ptr++; + if (mark_stack_ptr >= mark_stack_limit) + mark_stack_ptr = GC_signal_mark_stack_overflow (mark_stack_ptr); mark_stack_ptr->mse_descr.w = GC_MAKE_PROC (GC_gcj_vector_mp_index, 1 /* continue processing */); mark_stack_ptr->mse_start = (ptr_t)end; } while (bulk_count > 0) { mark_stack_ptr++; + if (mark_stack_ptr >= mark_stack_limit) + mark_stack_ptr = GC_signal_mark_stack_overflow (mark_stack_ptr); mark_stack_ptr->mse_start = (ptr_t) (current); mark_stack_ptr->mse_descr.w = bulk_desc; @@ -206,6 +212,8 @@ GC_gcj_vector_mark_proc (mse *mark_stack_ptr, GC_descr element_desc, word *start while (remainder_count > 0) { mark_stack_ptr++; + if (mark_stack_ptr >= mark_stack_limit) + mark_stack_ptr = GC_signal_mark_stack_overflow (mark_stack_ptr); mark_stack_ptr->mse_start = (ptr_t) (current); mark_stack_ptr->mse_descr.w = element_desc_shifted; @@ -224,6 +232,9 @@ GC_gcj_vector_mark_proc (mse *mark_stack_ptr, GC_descr element_desc, word *start end = start + remainder_count * words_per_element; mark_stack_ptr++; + if (mark_stack_ptr >= mark_stack_limit) + mark_stack_ptr = GC_signal_mark_stack_overflow (mark_stack_ptr); + mark_stack_ptr->mse_descr.w = GC_MAKE_PROC (GC_gcj_vector_mp_index, 1 /* continue processing */); mark_stack_ptr->mse_start = (ptr_t)end; } @@ -231,6 +242,8 @@ GC_gcj_vector_mark_proc (mse *mark_stack_ptr, GC_descr element_desc, word *start word *current = start; while (remainder_count > 0) { mark_stack_ptr++; + if (mark_stack_ptr >= mark_stack_limit) + mark_stack_ptr = GC_signal_mark_stack_overflow (mark_stack_ptr); mark_stack_ptr->mse_start = (ptr_t) (current); mark_stack_ptr->mse_descr.w = element_desc_shifted; |