From a607ec65459e47cdec1b708534500dd0c95e3006 Mon Sep 17 00:00:00 2001 From: lawnjelly Date: Wed, 28 Feb 2024 05:38:33 +0000 Subject: [PATCH] Fix SceneTree dock filter crash The filter was crashing for two reasons: 1) Deleting a child invalidated the iteration of children 2) Child was accessed after deletion --- editor/scene_tree_editor.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/editor/scene_tree_editor.cpp b/editor/scene_tree_editor.cpp index 001c997df..841b61070 100644 --- a/editor/scene_tree_editor.cpp +++ b/editor/scene_tree_editor.cpp @@ -637,9 +637,16 @@ bool SceneTreeEditor::_update_filter(TreeItem *p_parent, bool p_scroll_to_select } bool keep_for_children = false; + + // Get the list of children ahead of time, as the list may be invalidated by deleting one of them. + LocalVector children; for (TreeItem *child = p_parent->get_children(); child; child = child->get_next()) { + children.push_back(child); + } + + for (uint32_t n = 0; n < children.size(); n++) { // Always keep if at least one of the children are kept. - keep_for_children = _update_filter(child, p_scroll_to_selected) || keep_for_children; + keep_for_children = _update_filter(children[n], p_scroll_to_selected) || keep_for_children; } // Now find other reasons to keep this Node, too.