From cdb486fe233ffc5345f58070bcd8b4732c9ba0cd Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Tue, 30 Jul 2019 13:39:22 +0200 Subject: [PATCH 1/2] Fix NRE in VisualNode.SortChildren. `_children` may be null. In addition if there are < 2 children, there's no sorting to be done. --- src/Avalonia.Visuals/Rendering/SceneGraph/VisualNode.cs | 5 +++++ .../Rendering/SceneGraph/VisualNodeTests.cs | 9 +++++++++ 2 files changed, 14 insertions(+) diff --git a/src/Avalonia.Visuals/Rendering/SceneGraph/VisualNode.cs b/src/Avalonia.Visuals/Rendering/SceneGraph/VisualNode.cs index 709a935450..c3dfe12b2d 100644 --- a/src/Avalonia.Visuals/Rendering/SceneGraph/VisualNode.cs +++ b/src/Avalonia.Visuals/Rendering/SceneGraph/VisualNode.cs @@ -179,6 +179,11 @@ namespace Avalonia.Rendering.SceneGraph /// The scene that the node is a part of. public void SortChildren(Scene scene) { + if (_children == null || _children.Count <= 1) + { + return; + } + var keys = new List(); for (var i = 0; i < Visual.VisualChildren.Count; ++i) diff --git a/tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/VisualNodeTests.cs b/tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/VisualNodeTests.cs index 1101ccacba..24ba2d1c48 100644 --- a/tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/VisualNodeTests.cs +++ b/tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/VisualNodeTests.cs @@ -92,5 +92,14 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph Assert.Same(node1.DrawOperations[0].Item, node2.DrawOperations[0].Item); Assert.NotSame(node1.DrawOperations[0], node2.DrawOperations[0]); } + + [Fact] + public void SortChildren_Does_Not_Throw_On_Null_Children() + { + var node = new VisualNode(Mock.Of(), null); + var scene = new Scene(Mock.Of()); + + node.SortChildren(scene); + } } } From 0dce4cfc6f3bea9d74e86b3a74e40a36cac3564a Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Tue, 30 Jul 2019 17:17:52 +0200 Subject: [PATCH 2/2] Set capacity seeing as we know it. --- src/Avalonia.Visuals/Rendering/SceneGraph/VisualNode.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Avalonia.Visuals/Rendering/SceneGraph/VisualNode.cs b/src/Avalonia.Visuals/Rendering/SceneGraph/VisualNode.cs index c3dfe12b2d..f579bf0a62 100644 --- a/src/Avalonia.Visuals/Rendering/SceneGraph/VisualNode.cs +++ b/src/Avalonia.Visuals/Rendering/SceneGraph/VisualNode.cs @@ -184,7 +184,7 @@ namespace Avalonia.Rendering.SceneGraph return; } - var keys = new List(); + var keys = new List(Visual.VisualChildren.Count); for (var i = 0; i < Visual.VisualChildren.Count; ++i) {