diff options
author | Peter Zhu <[email protected]> | 2022-01-28 09:43:46 -0500 |
---|---|---|
committer | Peter Zhu <[email protected]> | 2022-01-31 09:42:20 -0500 |
commit | 605f226142a47c4f9e4cc88717c5d6170bc3d7f1 (patch) | |
tree | 8c6871e4c9441edd4c4bce324ceef354c489a2a2 /gc.c | |
parent | b01657c4707eadd9de9573ce9818d0b5f0fe3047 (diff) |
Fix heap page iteration in gc_verify_heap_page
The for loops are not correctly iterating heap pages in
gc_verify_heap_page.
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/5503
Diffstat (limited to 'gc.c')
-rw-r--r-- | gc.c | 14 |
1 files changed, 8 insertions, 6 deletions
@@ -7653,16 +7653,18 @@ verify_internal_consistency_i(void *page_start, void *page_end, size_t stride, static int gc_verify_heap_page(rb_objspace_t *objspace, struct heap_page *page, VALUE obj) { - int i; unsigned int has_remembered_shady = FALSE; unsigned int has_remembered_old = FALSE; int remembered_old_objects = 0; int free_objects = 0; int zombie_objects = 0; - int stride = page->slot_size / sizeof(RVALUE); - for (i=0; i<page->total_slots; i+=stride) { - VALUE val = (VALUE)&page->start[i]; + short slot_size = page->slot_size; + uintptr_t start = (uintptr_t)page->start; + uintptr_t end = start + page->total_slots * slot_size; + + for (uintptr_t ptr = start; ptr < end; ptr += slot_size) { + VALUE val = (VALUE)ptr; void *poisoned = asan_poisoned_object_p(val); asan_unpoison_object(val, false); @@ -7685,8 +7687,8 @@ gc_verify_heap_page(rb_objspace_t *objspace, struct heap_page *page, VALUE obj) if (!is_incremental_marking(objspace) && page->flags.has_remembered_objects == FALSE && has_remembered_old == TRUE) { - for (i=0; i<page->total_slots; i++) { - VALUE val = (VALUE)&page->start[i]; + for (uintptr_t ptr = start; ptr < end; ptr += slot_size) { + VALUE val = (VALUE)ptr; if (RVALUE_PAGE_MARKING(page, val)) { fprintf(stderr, "marking -> %s\n", obj_info(val)); } |