Browse Source

Merge pull request #88943 from lawnjelly/fix_scenedock_filter_crash

[3.x] Fix SceneTree dock filter crash
Rémi Verschelde 1 year ago
parent
commit
60ff43b7ce
1 changed files with 12 additions and 3 deletions
  1. 12 3
      editor/scene_tree_editor.cpp

+ 12 - 3
editor/scene_tree_editor.cpp

@@ -594,9 +594,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<TreeItem *> 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.
@@ -617,8 +624,6 @@ bool SceneTreeEditor::_update_filter(TreeItem *p_parent, bool p_scroll_to_select
 				}
 			}
 		}
-	} else {
-		memdelete(p_parent);
 	}
 
 	if (editor_selection) {
@@ -635,6 +640,10 @@ bool SceneTreeEditor::_update_filter(TreeItem *p_parent, bool p_scroll_to_select
 		}
 	}
 
+	if (!(keep || keep_for_children)) {
+		memdelete(p_parent);
+	}
+
 	return keep || keep_for_children;
 }