diff options
author | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2022-08-09 02:15:10 +0900 |
---|---|---|
committer | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2022-08-09 20:11:48 +0900 |
commit | ff07e5c264c82f73b0368dd0bc2ae39f78678519 (patch) | |
tree | 342478725bb48ae3f31f6b0de7d01f5c309f2bc6 | |
parent | 44264b4fee1e208e759710c39271186ff9856b40 (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.c | 3 |
1 files changed, 2 insertions, 1 deletions
@@ -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; } |