You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@deltaspike.apache.org by "Gerhard Petracek (JIRA)" <ji...@apache.org> on 2015/01/31 19:53:34 UTC
[jira] [Resolved] (DELTASPIKE-828) Infinite recursive loop
navigating through annoations
[ https://issues.apache.org/jira/browse/DELTASPIKE-828?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Gerhard Petracek resolved DELTASPIKE-828.
-----------------------------------------
Resolution: Fixed
Fix Version/s: 1.2.2
> Infinite recursive loop navigating through annoations
> -----------------------------------------------------
>
> Key: DELTASPIKE-828
> URL: https://issues.apache.org/jira/browse/DELTASPIKE-828
> Project: DeltaSpike
> Issue Type: Bug
> Components: JSF-Module
> Affects Versions: 1.2.1
> Environment: Irrelavant for this bug - Windows 7, maven 3.0.4 and eclipse as well
> Reporter: Nuno G. de M
> Assignee: Gerhard Petracek
> Fix For: 1.2.2
>
>
> Recursive algorithm under org.apache.deltaspike.security.impl.util.SecurityUtils.getAllAnnotations suffers from the potential of entering an infinite loop, as demonstrated in the following stack trace.
> In Our case, we have an annotation called Versionprops that is present in every class. The annotation is itself annotated with it.
> For example:
> @Target({ ElementType.TYPE, ElementType.PACKAGE })
> @Retention(RetentionPolicy.RUNTIME)
> @Documented
> @Versionprops ( url = "javaDocURL)
> public @interface Versionprops {
> String url() default "htpp://whatever";
> }
> Here the cyclic recusion is obvious in a single class.
> More complicated scenarios could be if Annotaiton A uses annotation B.
> Annotation B uses annotation C and annotation C uses A again.
> Does not really matter, as long as their is a cycic annotation dependency it seems that the following algorithm will go to infinite loop.
> public static List<Annotation> getAllAnnotations(Annotation[] annotations)
> {
> List<Annotation> result = new ArrayList<Annotation>();
> String annotationName;
> for (Annotation annotation : annotations)
> {
> annotationName = annotation.annotationType().getName();
> if (annotationName.startsWith("java.") || annotationName.startsWith("javax."))
> {
> continue;
> }
> result.add(annotation);
> result.addAll(getAllAnnotations(annotation.annotationType().getAnnotations()));
> }
> return result;
> }
> Here is a slice of an infinite recursive stack.
> at org.apache.deltaspike.security.impl.util.SecurityUtils.getAllAnnotations(SecurityUtils.java:134)
> at org.apache.deltaspike.security.impl.util.SecurityUtils.getAllAnnotations(SecurityUtils.java:134)
> at org.apache.deltaspike.security.impl.util.SecurityUtils.getAllAnnotations(SecurityUtils.java:134)
> at org.apache.deltaspike.security.impl.util.SecurityUtils.getAllAnnotations(SecurityUtils.java:134)
> at org.apache.deltaspike.security.impl.util.SecurityUtils.getAllAnnotations(SecurityUtils.java:134)
> at org.apache.deltaspike.security.impl.util.SecurityUtils.getAllAnnotations(SecurityUtils.java:134)
> at org.apache.deltaspike.security.impl.util.SecurityUtils.getAllAnnotations(SecurityUtils.java:134)
> at org.apache.deltaspike.security.impl.util.SecurityUtils.getAllAnnotations(SecurityUtils.java:134)
> at org.apache.deltaspike.security.impl.util.SecurityUtils.getAllAnnotations(SecurityUtils.java:134)
> at org.apache.deltaspike.security.impl.util.SecurityUtils.getAllAnnotations(SecurityUtils.java:134)
> at org.apache.deltaspike.security.impl.util.SecurityUtils.getAllAnnotations(SecurityUtils.java:134)
> at org.apache.deltaspike.security.impl.util.SecurityUtils.getAllAnnotations(SecurityUtils.java:134)
> at org.apache.deltaspike.security.impl.util.SecurityUtils.getAllAnnotations(SecurityUtils.java:134)
> at org.apache.deltaspike.security.impl.util.SecurityUtils.getAllAnnotations(SecurityUtils.java:134)
> at org.apache.deltaspike.security.impl.util.SecurityUtils.getAllAnnotations(SecurityUtils.java:134)
> at org.apache.deltaspike.security.impl.util.SecurityUtils.getAllAnnotations(SecurityUtils.java:134)
> at org.apache.deltaspike.security.impl.util.SecurityUtils.getAllAnnotations(SecurityUtils.java:134)
> at org.apache.deltaspike.security.impl.util.SecurityUtils.getAllAnnotations(SecurityUtils.java:134)
> at org.apache.deltaspike.security.impl.util.SecurityUtils.getAllAnnotations(SecurityUtils.java:134)
> at org.jboss.weld.bootstrap.events.AbstractDefinitionContainerEvent.fire(AbstractDefinitionContainerEvent.java:40)
> at org.jboss.weld.bootstrap.events.ProcessAnnotatedTypeImpl.fire(ProcessAnnotatedTypeImpl.java:41)
> at org.jboss.weld.bootstrap.BeanDeployer.addClass(BeanDeployer.java:81)
> at org.jboss.weld.bootstrap.BeanDeployer.addClasses(BeanDeployer.java:135)
> at org.jboss.weld.bootstrap.BeanDeployment.createBeans(BeanDeployment.java:184)
> at org.jboss.weld.bootstrap.WeldBootstrap.deployBeans(WeldBootstrap.java:357)
> at org.jboss.weld.bootstrap.api.helpers.ForwardingBootstrap.deployBeans(ForwardingBootstrap.java:70)
> at org.jboss.weld.environment.se.Weld.initialize(Weld.java:137)
> at com.somePackage.test.WeldJUnit4Runner.<init>(WeldJUnit4Runner.java:70)
> at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
> at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
> at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
> at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
> at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:31)
> at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24)
> at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
> at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29)
> at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
> at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24)
> at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:250)
> at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141)
> at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
> at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> at java.lang.reflect.Method.invoke(Method.java:606)
> at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)
> at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165)
> at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)
> at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115)
> at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75)
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)