From 6ddebc088836d44b88088ced024f07d69d2f0991 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Thu, 9 Jan 2025 18:19:53 +0100 Subject: [PATCH] Fix #132831: memory leak when deleting simulation zone The leak happened because the bake data of the removed zone was only partially freed. Pull Request: https://projects.blender.org/blender/blender/pulls/132867 --- source/blender/modifiers/MOD_nodes.hh | 2 ++ source/blender/modifiers/intern/MOD_nodes.cc | 35 ++++++++++++-------- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/source/blender/modifiers/MOD_nodes.hh b/source/blender/modifiers/MOD_nodes.hh index 827c4476d1d..5bf64a80507 100644 --- a/source/blender/modifiers/MOD_nodes.hh +++ b/source/blender/modifiers/MOD_nodes.hh @@ -10,6 +10,7 @@ struct NodesModifierData; struct NodesModifierDataBlock; struct Object; struct NodesModifierPackedBake; +struct NodesModifierBake; namespace blender::bke::bake { struct ModifierCache; @@ -45,5 +46,6 @@ struct NodesModifierRuntime { void nodes_modifier_data_block_destruct(NodesModifierDataBlock *data_block, bool do_id_user); void nodes_modifier_packed_bake_free(NodesModifierPackedBake *packed_bake); +void nodes_modifier_bake_destruct(NodesModifierBake *bake, bool do_id_user); } // namespace blender diff --git a/source/blender/modifiers/intern/MOD_nodes.cc b/source/blender/modifiers/intern/MOD_nodes.cc index 0998e07eba8..2ddb93e87c9 100644 --- a/source/blender/modifiers/intern/MOD_nodes.cc +++ b/source/blender/modifiers/intern/MOD_nodes.cc @@ -378,8 +378,11 @@ static void update_bakes_from_node_group(NodesModifierData &nmd) NodesModifierBake &new_bake = new_bake_data[i]; if (old_bake) { new_bake = *old_bake; - /* The ownership of the string was moved to `new_bake`. */ + /* The ownership of this data was moved to `new_bake`. */ old_bake->directory = nullptr; + old_bake->data_blocks = nullptr; + old_bake->data_blocks_num = 0; + old_bake->packed = nullptr; } else { new_bake.id = id; @@ -390,7 +393,7 @@ static void update_bakes_from_node_group(NodesModifierData &nmd) } for (NodesModifierBake &old_bake : MutableSpan(nmd.bakes, nmd.bakes_num)) { - MEM_SAFE_FREE(old_bake.directory); + nodes_modifier_bake_destruct(&old_bake, true); } MEM_SAFE_FREE(nmd.bakes); @@ -2751,6 +2754,21 @@ void nodes_modifier_packed_bake_free(NodesModifierPackedBake *packed_bake) MEM_SAFE_FREE(packed_bake); } +void nodes_modifier_bake_destruct(NodesModifierBake *bake, const bool do_id_user) +{ + MEM_SAFE_FREE(bake->directory); + + for (NodesModifierDataBlock &data_block : MutableSpan(bake->data_blocks, bake->data_blocks_num)) + { + nodes_modifier_data_block_destruct(&data_block, do_id_user); + } + MEM_SAFE_FREE(bake->data_blocks); + + if (bake->packed) { + nodes_modifier_packed_bake_free(bake->packed); + } +} + static void free_data(ModifierData *md) { NodesModifierData *nmd = reinterpret_cast(md); @@ -2760,18 +2778,7 @@ static void free_data(ModifierData *md) } for (NodesModifierBake &bake : MutableSpan(nmd->bakes, nmd->bakes_num)) { - MEM_SAFE_FREE(bake.directory); - - for (NodesModifierDataBlock &data_block : MutableSpan(bake.data_blocks, bake.data_blocks_num)) - { - MEM_SAFE_FREE(data_block.id_name); - MEM_SAFE_FREE(data_block.lib_name); - } - MEM_SAFE_FREE(bake.data_blocks); - - if (bake.packed) { - nodes_modifier_packed_bake_free(bake.packed); - } + nodes_modifier_bake_destruct(&bake, false); } MEM_SAFE_FREE(nmd->bakes);