diff --git a/src/alloc.c b/src/alloc.c index a51d93b1..6b6c5945 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -302,8 +302,8 @@ static void _mi_show_block_trace(const mi_page_t* page, const mi_block_t* block, static const mi_block_t* mi_block_predecessor(const mi_page_t* page, const mi_block_t* block) { const size_t bsize = page->xblock_size; - mi_assert_internal(bsize > 0); - if (bsize >= MI_HUGE_BLOCK_SIZE) return NULL; + mi_assert_internal(bsize > 0 || page->used == 0); + if (bsize == 0 /* if page is freed */|| bsize >= MI_HUGE_BLOCK_SIZE) return NULL; const mi_block_t* prev = (const mi_block_t*)((uint8_t*)block - bsize); uint8_t* pstart = _mi_segment_page_start(_mi_page_segment(page), page, NULL); if (pstart > (uint8_t*)prev) return NULL; diff --git a/test/main-override-static.c b/test/main-override-static.c index b22e996e..5887b388 100644 --- a/test/main-override-static.c +++ b/test/main-override-static.c @@ -27,15 +27,15 @@ int main() { mi_version(); mi_stats_reset(); // detect double frees and heap corruption - double_free1(); + // double_free1(); // double_free2(); - // double_free3(); + double_free3(); // corrupt_free1(); // corrupt_free2(); // block_overflow1(); // block_overflow2(); // test_aslr(); - invalid_free(); + // invalid_free(); // test_reserved(); // negative_stat(); // alloc_huge();