From d86fa4e2c955f5845157d766abc8f0e0f137c927 Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Fri, 13 Mar 2015 11:51:13 +0100 Subject: [PATCH] more SOE checks to fix IDEA-136966 --- .../java/dependencyView/Mappings.java | 31 ++++++++++++------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/Mappings.java b/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/Mappings.java index 18cba3a5ef6d..dd87660bcd6b 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/Mappings.java +++ b/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/Mappings.java @@ -289,7 +289,9 @@ public class Mappings { } } - acc.add(reflcass); + if (!acc.add(reflcass)) { + return; // SOE prevention + } } final TIntHashSet subclasses = myClassToSubclasses.get(reflcass); @@ -354,7 +356,7 @@ public class Mappings { }; } - private void addOverridingMethods(final MethodRepr m, final ClassRepr fromClass, final MethodRepr.Predicate predicate, final Collection> container) { + private void addOverridingMethods(final MethodRepr m, final ClassRepr fromClass, final MethodRepr.Predicate predicate, final Collection> container, TIntHashSet visitedClasses) { if (m.name == myInitName) { return; // overriding is not defined for constructors } @@ -362,6 +364,13 @@ public class Mappings { if (subClasses == null) { return; } + if (visitedClasses == null) { + visitedClasses = new TIntHashSet(); + } + if (!visitedClasses.add(fromClass.name)) { + return; + } + final TIntHashSet _visitedClasses = visitedClasses; subClasses.forEach(new TIntProcedure() { @Override public boolean execute(int subClassName) { @@ -377,7 +386,7 @@ public class Mappings { } } if (cont) { - addOverridingMethods(m, r, predicate, container); + addOverridingMethods(m, r, predicate, container, _visitedClasses); } } return true; @@ -389,7 +398,7 @@ public class Mappings { final MethodRepr.Predicate predicate = lessSpecific(m); final Collection> result = new HashSet>(); addOverridenMethods(c, predicate, result, null); - addOverridingMethods(m, c, predicate, result); + addOverridingMethods(m, c, predicate, result, null); return result; } @@ -817,17 +826,15 @@ public class Mappings { } private TIntHashSet addAllSubclasses(final int root, final TIntHashSet acc) { + if (!acc.add(root)) { + return acc; + } final TIntHashSet directSubclasses = myClassToSubclasses.get(root); - - acc.add(root); - if (directSubclasses != null) { directSubclasses.forEach(new TIntProcedure() { @Override public boolean execute(int s) { - if (!acc.contains(s)) { - addAllSubclasses(s, acc); - } + addAllSubclasses(s, acc); return true; } }); @@ -1281,7 +1288,7 @@ public class Mappings { final Collection> overridingMethods = new HashSet>(); - myFuture.addOverridingMethods(m, it, MethodRepr.equalByJavaRules(m), overridingMethods); + myFuture.addOverridingMethods(m, it, MethodRepr.equalByJavaRules(m), overridingMethods, null); for (final Pair p : overridingMethods) { final Collection fNames = myClassToSourceFile.get(p.second.name); @@ -1400,7 +1407,7 @@ public class Mappings { final List> overridingMethods = new LinkedList>(); - myFuture.addOverridingMethods(m, it, MethodRepr.equalByJavaRules(m), overridingMethods); + myFuture.addOverridingMethods(m, it, MethodRepr.equalByJavaRules(m), overridingMethods, null); for(final Pair p : overridingMethods) { final ClassRepr aClass = p.getSecond();