From f5d7875a37ba128b2ce5ced92598a4602d08739c Mon Sep 17 00:00:00 2001 From: yilianhuaixiao <85142297@qq.com> Date: Mon, 20 Jul 2020 17:30:25 +0800 Subject: [PATCH] Avoid infinite loop in AnnotationScanner Prior to this commit, scanning for annotations resulted in an infinite loop when using the INHERITED_ANNOTATIONS search strategy and a class filter that filters out visited classes. This commit avoids an infinite loop in AnnotationsScanner's processClassInheritedAnnotations(...) method by skipping the current level of the class hierarchy when the current source class has been filtered out. Closes gh-25429 --- .../core/annotation/AnnotationsScanner.java | 2 ++ .../core/annotation/AnnotationsScannerTests.java | 16 ++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/spring-core/src/main/java/org/springframework/core/annotation/AnnotationsScanner.java b/spring-core/src/main/java/org/springframework/core/annotation/AnnotationsScanner.java index 67ccd303244f..795c7a036c0e 100644 --- a/spring-core/src/main/java/org/springframework/core/annotation/AnnotationsScanner.java +++ b/spring-core/src/main/java/org/springframework/core/annotation/AnnotationsScanner.java @@ -151,6 +151,8 @@ private static R processClassInheritedAnnotations(C context, Class sou return result; } if (isFiltered(source, context, classFilter)) { + source = source.getSuperclass(); + aggregateIndex++; continue; } Annotation[] declaredAnnotations = diff --git a/spring-core/src/test/java/org/springframework/core/annotation/AnnotationsScannerTests.java b/spring-core/src/test/java/org/springframework/core/annotation/AnnotationsScannerTests.java index 635452343b23..80a621930ccc 100644 --- a/spring-core/src/test/java/org/springframework/core/annotation/AnnotationsScannerTests.java +++ b/spring-core/src/test/java/org/springframework/core/annotation/AnnotationsScannerTests.java @@ -499,6 +499,22 @@ public String finish(String result) { assertThat(result).isEqualTo("OK"); } + @Test + void scanWithFilteredAll() { + List indexes = new ArrayList<>(); + String result = AnnotationsScanner.scan(this, WithSingleSuperclass.class, + SearchStrategy.INHERITED_ANNOTATIONS, + (context, aggregateIndex, source, annotations) -> { + indexes.add(aggregateIndex); + return ""; + }, + (context,cls)->{ + return true; + } + ); + assertThat(result).isNull(); + } + private Method methodFrom(Class type) { return ReflectionUtils.findMethod(type, "method");