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