summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2022-08-09 02:15:10 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2022-08-09 20:11:48 +0900
commitff07e5c264c82f73b0368dd0bc2ae39f78678519 (patch)
tree342478725bb48ae3f31f6b0de7d01f5c309f2bc6
parent44264b4fee1e208e759710c39271186ff9856b40 (diff)
Skip poisoned regions
Poisoned regions cannot be accessed without unpoisoning outside gc.c. Specifically, debug.gem is terminated by AddressSanitizer. ``` SUMMARY: AddressSanitizer: use-after-poison iseq_collector.c:39 in iseq_i ```
-rw-r--r--gc.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/gc.c b/gc.c
index df4c99b15b..ecb4aa7e20 100644
--- a/gc.c
+++ b/gc.c
@@ -3904,7 +3904,8 @@ objspace_each_objects_try(VALUE arg)
uintptr_t pstart = (uintptr_t)page->start;
uintptr_t pend = pstart + (page->total_slots * size_pool->slot_size);
- if ((*data->callback)((void *)pstart, (void *)pend, size_pool->slot_size, data->data)) {
+ if (!__asan_region_is_poisoned((void *)pstart, pend - pstart) &&
+ (*data->callback)((void *)pstart, (void *)pend, size_pool->slot_size, data->data)) {
break;
}