From 4ec5292e7810123b480254004d1acf587a60e9ed Mon Sep 17 00:00:00 2001 From: Sander Mertens Date: Tue, 9 May 2023 12:07:40 -0700 Subject: [PATCH] #951 Fix issue where id record could get deleted twice during world cleanup --- flecs.c | 8 ++++++-- src/id_record.c | 8 ++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/flecs.c b/flecs.c index 5488de3ea..3b7ef2877 100644 --- a/flecs.c +++ b/flecs.c @@ -60863,8 +60863,12 @@ void flecs_init_id_records( void flecs_fini_id_records( ecs_world_t *world) { - ecs_map_iter_t it = ecs_map_iter(&world->id_index_hi); - while (ecs_map_next(&it)) { + /* Loop & delete first element until there are no elements left. Id records + * can recursively delete each other, this ensures we always have a + * valid iterator. */ + while (ecs_map_count(&world->id_index_hi) > 0) { + ecs_map_iter_t it = ecs_map_iter(&world->id_index_hi); + ecs_map_next(&it); flecs_id_record_release(world, ecs_map_ptr(&it)); } diff --git a/src/id_record.c b/src/id_record.c index 462a2cec5..99ffa1480 100644 --- a/src/id_record.c +++ b/src/id_record.c @@ -601,8 +601,12 @@ void flecs_init_id_records( void flecs_fini_id_records( ecs_world_t *world) { - ecs_map_iter_t it = ecs_map_iter(&world->id_index_hi); - while (ecs_map_next(&it)) { + /* Loop & delete first element until there are no elements left. Id records + * can recursively delete each other, this ensures we always have a + * valid iterator. */ + while (ecs_map_count(&world->id_index_hi) > 0) { + ecs_map_iter_t it = ecs_map_iter(&world->id_index_hi); + ecs_map_next(&it); flecs_id_record_release(world, ecs_map_ptr(&it)); }