From e6e8c387d5d4c691b83e1e6b6a1f86134b21ccb1 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Sat, 4 Jan 2020 20:14:13 -0500 Subject: [PATCH] Prevent endless recursion in SezpozModule.resolve. --- core/src/main/java/hudson/ExtensionFinder.java | 13 +++++++++---- .../test/java/hudson/ExtensionFinderTest.java | 17 +++++++++++++++++ 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/hudson/ExtensionFinder.java b/core/src/main/java/hudson/ExtensionFinder.java index fda89201be..ef5cfe1237 100644 --- a/core/src/main/java/hudson/ExtensionFinder.java +++ b/core/src/main/java/hudson/ExtensionFinder.java @@ -36,8 +36,6 @@ import com.google.inject.Module; import com.google.inject.Provider; import com.google.inject.Scope; import com.google.inject.Scopes; -import com.google.inject.TypeLiteral; -import com.google.inject.internal.Errors; import com.google.inject.matcher.Matchers; import com.google.inject.name.Names; import com.google.inject.spi.ProvisionListener; @@ -65,6 +63,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -484,7 +483,13 @@ public abstract class ExtensionFinder implements ExtensionPoint { * So this is an attempt to detect subset of problems eagerly, by invoking various reflection * operations and try to find non-existent classes early. */ - private void resolve(Class c) { + private void resolve(Class c) { + resolve(c, new HashSet<>()); + } + private void resolve(Class c, Set> encountered) { + if (!encountered.add(c)) { + return; + } try { ClassLoader ecl = c.getClassLoader(); if (ecl != null) { // Not bootstrap classloader @@ -502,7 +507,7 @@ public abstract class ExtensionFinder implements ExtensionPoint { cc.getDeclaredMethods(); for (Field f : cc.getDeclaredFields()) { if (f.getAnnotation(javax.inject.Inject.class) != null || f.getAnnotation(com.google.inject.Inject.class) != null) { - resolve(f.getType()); + resolve(f.getType(), encountered); } } } diff --git a/test/src/test/java/hudson/ExtensionFinderTest.java b/test/src/test/java/hudson/ExtensionFinderTest.java index 860d5d1a39..b323070128 100644 --- a/test/src/test/java/hudson/ExtensionFinderTest.java +++ b/test/src/test/java/hudson/ExtensionFinderTest.java @@ -128,4 +128,21 @@ public class ExtensionFinderTest { throw new Error(); } } + + @Test + public void injectMutualRecursion() { + A a = ExtensionList.lookupSingleton(A.class); + B b = ExtensionList.lookupSingleton(B.class); + assertEquals(b, a.b); + assertEquals(a, b.a); + } + @TestExtension("injectMutualRecursion") + public static final class A { + @Inject B b; + } + @TestExtension("injectMutualRecursion") + public static final class B { + @Inject A a; + } + } -- GitLab