From 7917fdff2598714493e927d03bc0a293410dc421 Mon Sep 17 00:00:00 2001 From: srosse <stephane.rosse@frentix.com> Date: Wed, 9 Sep 2020 15:31:36 +0200 Subject: [PATCH] no-jira: hard defense against infinite loop in parent line Defense against infinite loop in calculation of the parent line in the flexi tree table, prevent OOM if the tree is not consistent (element which is a parent of itself) --- .../impl/elements/table/FlexiTreeNodeComparator.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTreeNodeComparator.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTreeNodeComparator.java index c80f795494b..911fae46da2 100644 --- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTreeNodeComparator.java +++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTreeNodeComparator.java @@ -24,6 +24,8 @@ import java.util.Collections; import java.util.Comparator; import java.util.List; +import org.olat.core.logging.AssertException; + /** * * Initial date: 15 nov. 2017<br> @@ -102,7 +104,8 @@ public class FlexiTreeNodeComparator implements Comparator<FlexiTreeTableNode> { private FlexiTreeTableNode root(FlexiTreeTableNode node) { FlexiTreeTableNode root = node; - for(FlexiTreeTableNode parent=node.getParent(); parent != null; parent = parent.getParent()) { + int i = 0; + for(FlexiTreeTableNode parent=node.getParent(); parent != null && i < 100; parent = parent.getParent(), i++) { root = parent; } return root; @@ -112,6 +115,9 @@ public class FlexiTreeNodeComparator implements Comparator<FlexiTreeTableNode> { List<FlexiTreeTableNode> nodes = new ArrayList<>(); for(FlexiTreeTableNode parent=node; parent != null; parent = parent.getParent()) { nodes.add(parent); + if(nodes.size() > 255) { + throw new AssertException("Flexi tree parent line in an infinite loop"); + } } Collections.reverse(nodes); return nodes; -- GitLab