Uploaded image for project: 'Jenkins'
  1. Jenkins
  2. JENKINS-72614

ScmContainer improperly assumes request context for @Extension instantiation

    • Icon: Bug Bug
    • Resolution: Unresolved
    • Icon: Minor Minor
    • blueocean-plugin
    • None

      https://github.com/jenkinsci/blueocean-plugin/blob/master/blueocean-pipeline-api-impl/src/main/java/io/jenkins/blueocean/rest/impl/pipeline/scm/ScmContainer.java is a class annotated with @Extension and calls Stapler#getCurrentRequest in the parameter-less constructor that will be called by extension lookup.

      It is an incorrect assumption that extension lookup (and therefore instantiation of annotated types) only happens during HTTP requests.

          [JENKINS-72614] ScmContainer improperly assumes request context for @Extension instantiation

          Daniel Beck created issue -
          Daniel Beck made changes -
          Description Original: [https://github.com/jenkinsci/blueocean-plugin/blob/master/blueocean-pipeline-api-impl/src/main/java/io/jenkins/blueocean/rest/impl/pipeline/scm/ScmContainer.java] is a class annotated with {{@Extension}} and calls {{Stapler#getCurrentRequest}} in the parameter-less constructor that will be called by extension lookup.

          It is an improper assumption that extension lookup (and therefore instantiation of annotated types) only happens during HTTP requests.
          New: [https://github.com/jenkinsci/blueocean-plugin/blob/master/blueocean-pipeline-api-impl/src/main/java/io/jenkins/blueocean/rest/impl/pipeline/scm/ScmContainer.java] is a class annotated with {{@Extension}} and calls {{Stapler#getCurrentRequest}} in the parameter-less constructor that will be called by extension lookup.

          It is an incorrect assumption that extension lookup (and therefore instantiation of annotated types) only happens during HTTP requests.

          Just for clarity and if somebody else was looking by the stacktrace, do you think this issue will clean up this NullPointerException?

          2024-01-26 13:02:18.762+0000 [id=30]  WARNING  h.ExtensionFinder$GuiceFinder$FaultTolerantScope$1#error: Failed to instantiate Key[type=io.jenkins.blueocean.rest.impl.pipeline.scm.ScmContainer, annotation=[none]]; skipping this component
          java.lang.NullPointerException
            at io.jenkins.blueocean.rest.impl.pipeline.scm.ScmContainer.<init>(ScmContainer.java:28)
            at io.jenkins.blueocean.rest.impl.pipeline.scm.ScmContainer$$FastClassByGuice$$5df71587.GUICE$TRAMPOLINE(<generated>)
            at io.jenkins.blueocean.rest.impl.pipeline.scm.ScmContainer$$FastClassByGuice$$5df71587.apply(<generated>)
            at com.google.inject.internal.DefaultConstructionProxyFactory$FastClassProxy.newInstance(DefaultConstructionProxyFactory.java:82)
            at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:114)
            at com.google.inject.internal.ConstructorInjector.access$000(ConstructorInjector.java:33)
            at com.google.inject.internal.ConstructorInjector$1.call(ConstructorInjector.java:98)
            at com.google.inject.internal.ProvisionListenerStackCallback$Provision.provision(ProvisionListenerStackCallback.java:109)
            at hudson.ExtensionFinder$GuiceFinder$SezpozModule.onProvision(ExtensionFinder.java:610)
            at com.google.inject.internal.ProvisionListenerStackCallback$Provision.provision(ProvisionListenerStackCallback.java:117)
            at com.google.inject.internal.ProvisionListenerStackCallback.provision(ProvisionListenerStackCallback.java:66)
            at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:93)
            at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:300)
            at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
          Caused: com.google.inject.ProvisionException: Unable to provision, see the following errors:
          
          1) [Guice/ErrorInjectingConstructor]: NullPointerException
            at ScmContainer.<init>(ScmContainer.java:27)
          
          Learn more:
            https://github.com/google/guice/wiki/ERROR_INJECTING_CONSTRUCTOR
          
          1 error
          
          ...
          
          ======================
          Full classname legend:
          ======================
          ScmContainer:         "io.jenkins.blueocean.rest.impl.pipeline.scm.ScmContainer"
          ========================
          End of classname legend:
          ========================
          
            at com.google.inject.internal.InternalProvisionException.toProvisionException(InternalProvisionException.java:251)
            at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:43)
            at com.google.inject.internal.SingletonScope$1.get(SingletonScope.java:169)
            at hudson.ExtensionFinder$GuiceFinder$FaultTolerantScope$1.get(ExtensionFinder.java:445)
            at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:45)
            at com.google.inject.internal.InjectorImpl$1.get(InjectorImpl.java:1148)
            at hudson.ExtensionFinder$GuiceFinder._find(ExtensionFinder.java:403)
            at hudson.ExtensionFinder$GuiceFinder.find(ExtensionFinder.java:394)
            at hudson.ClassicPluginStrategy.findComponents(ClassicPluginStrategy.java:344)
            at hudson.ExtensionList.load(ExtensionList.java:384)
            at hudson.ExtensionList.ensureLoaded(ExtensionList.java:320)
            at hudson.ExtensionList.iterator(ExtensionList.java:172)
            at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2110)
            at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2151)
            at org.codehaus.groovy.runtime.dgm$163.invoke(Unknown Source)
            at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoMetaMethodSiteNoUnwrapNoCoerce.invoke(PojoMetaMethodSite.java:274)
            at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:56)
            at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:128)
            at disable-cli$_run_closure1.doCall(disable-cli.groovy:4)
            at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
            at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.base/java.lang.reflect.Method.invoke(Method.java:566)
            at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:98)
            at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
            at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:264)
            at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1034)
            at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:41)
            at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
            at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
            at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:128)
            at disable-cli.run(disable-cli.groovy:13)
            at groovy.lang.GroovyShell.evaluate(GroovyShell.java:574)
            at jenkins.util.groovy.GroovyHookScript.execute(GroovyHookScript.java:136)
            at jenkins.util.groovy.GroovyHookScript.execute(GroovyHookScript.java:126)
            at jenkins.util.groovy.GroovyHookScript.run(GroovyHookScript.java:109)
            at hudson.init.impl.GroovyInitScript.init(GroovyInitScript.java:42)
            at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
            at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.base/java.lang.reflect.Method.invoke(Method.java:566)
            at hudson.init.TaskMethodFinder.invoke(TaskMethodFinder.java:109)
            at hudson.init.TaskMethodFinder$TaskImpl.run(TaskMethodFinder.java:185)
            at org.jvnet.hudson.reactor.Reactor.runTask(Reactor.java:305)
            at jenkins.model.Jenkins$5.runTask(Jenkins.java:1170)
            at org.jvnet.hudson.reactor.Reactor$2.run(Reactor.java:221)
            at org.jvnet.hudson.reactor.Reactor$Node.run(Reactor.java:120)
            at jenkins.security.ImpersonatingExecutorService$1.run(ImpersonatingExecutorService.java:68)
            at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
            at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
            at java.base/java.lang.Thread.run(Thread.java:829)
          2024-01-26 13:02:33.175+0000 [id=30]  INFO jenkins.InitReactorRunner$1#onAttained: Completed initialization 

           

          Mateusz Janczuk added a comment - Just for clarity and if somebody else was looking by the stacktrace, do you think this issue will clean up this NullPointerException? 2024-01-26 13:02:18.762+0000 [id=30] WARNING h.ExtensionFinder$GuiceFinder$FaultTolerantScope$1#error: Failed to instantiate Key[type=io.jenkins.blueocean. rest .impl.pipeline.scm.ScmContainer, annotation=[none]]; skipping this component java.lang.NullPointerException at io.jenkins.blueocean. rest .impl.pipeline.scm.ScmContainer.<init>(ScmContainer.java:28) at io.jenkins.blueocean. rest .impl.pipeline.scm.ScmContainer$$FastClassByGuice$$5df71587.GUICE$TRAMPOLINE(<generated>) at io.jenkins.blueocean. rest .impl.pipeline.scm.ScmContainer$$FastClassByGuice$$5df71587.apply(<generated>) at com.google.inject.internal.DefaultConstructionProxyFactory$FastClassProxy.newInstance(DefaultConstructionProxyFactory.java:82) at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:114) at com.google.inject.internal.ConstructorInjector.access$000(ConstructorInjector.java:33) at com.google.inject.internal.ConstructorInjector$1.call(ConstructorInjector.java:98) at com.google.inject.internal.ProvisionListenerStackCallback$Provision.provision(ProvisionListenerStackCallback.java:109) at hudson.ExtensionFinder$GuiceFinder$SezpozModule.onProvision(ExtensionFinder.java:610) at com.google.inject.internal.ProvisionListenerStackCallback$Provision.provision(ProvisionListenerStackCallback.java:117) at com.google.inject.internal.ProvisionListenerStackCallback.provision(ProvisionListenerStackCallback.java:66) at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:93) at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:300) at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40) Caused: com.google.inject.ProvisionException: Unable to provision, see the following errors: 1) [Guice/ErrorInjectingConstructor]: NullPointerException at ScmContainer.<init>(ScmContainer.java:27) Learn more: https: //github.com/google/guice/wiki/ERROR_INJECTING_CONSTRUCTOR 1 error ... ====================== Full classname legend: ====================== ScmContainer: "io.jenkins.blueocean. rest .impl.pipeline.scm.ScmContainer" ======================== End of classname legend: ======================== at com.google.inject.internal.InternalProvisionException.toProvisionException(InternalProvisionException.java:251) at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:43) at com.google.inject.internal.SingletonScope$1.get(SingletonScope.java:169) at hudson.ExtensionFinder$GuiceFinder$FaultTolerantScope$1.get(ExtensionFinder.java:445) at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:45) at com.google.inject.internal.InjectorImpl$1.get(InjectorImpl.java:1148) at hudson.ExtensionFinder$GuiceFinder._find(ExtensionFinder.java:403) at hudson.ExtensionFinder$GuiceFinder.find(ExtensionFinder.java:394) at hudson.ClassicPluginStrategy.findComponents(ClassicPluginStrategy.java:344) at hudson.ExtensionList.load(ExtensionList.java:384) at hudson.ExtensionList.ensureLoaded(ExtensionList.java:320) at hudson.ExtensionList.iterator(ExtensionList.java:172) at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2110) at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2151) at org.codehaus.groovy.runtime.dgm$163.invoke(Unknown Source) at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoMetaMethodSiteNoUnwrapNoCoerce.invoke(PojoMetaMethodSite.java:274) at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:56) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:128) at disable-cli$_run_closure1.doCall(disable-cli.groovy:4) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:98) at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325) at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:264) at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1034) at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:41) at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:128) at disable-cli.run(disable-cli.groovy:13) at groovy.lang.GroovyShell.evaluate(GroovyShell.java:574) at jenkins.util.groovy.GroovyHookScript.execute(GroovyHookScript.java:136) at jenkins.util.groovy.GroovyHookScript.execute(GroovyHookScript.java:126) at jenkins.util.groovy.GroovyHookScript.run(GroovyHookScript.java:109) at hudson.init.impl.GroovyInitScript.init(GroovyInitScript.java:42) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at hudson.init.TaskMethodFinder.invoke(TaskMethodFinder.java:109) at hudson.init.TaskMethodFinder$TaskImpl.run(TaskMethodFinder.java:185) at org.jvnet.hudson.reactor.Reactor.runTask(Reactor.java:305) at jenkins.model.Jenkins$5.runTask(Jenkins.java:1170) at org.jvnet.hudson.reactor.Reactor$2.run(Reactor.java:221) at org.jvnet.hudson.reactor.Reactor$Node.run(Reactor.java:120) at jenkins.security.ImpersonatingExecutorService$1.run(ImpersonatingExecutorService.java:68) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at java.base/java.lang. Thread .run( Thread .java:829) 2024-01-26 13:02:33.175+0000 [id=30] INFO jenkins.InitReactorRunner$1#onAttained: Completed initialization  

          Daniel Beck added a comment -

          do you think this issue will clean up this NullPointerException

          Yes. This is how I came to learn of this issue, having https://github.com/jenkinsci-cert/SECURITY-3314-3315/blob/main/disable-cli.groovy applied results in this error.

          Daniel Beck added a comment - do you think this issue will clean up this NullPointerException Yes. This is how I came to learn of this issue, having https://github.com/jenkinsci-cert/SECURITY-3314-3315/blob/main/disable-cli.groovy applied results in this error.

          Harsha added a comment -

          Any idea when this might be fixed?

          Harsha added a comment - Any idea when this might be fixed?

            Unassigned Unassigned
            danielbeck Daniel Beck
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

              Created:
              Updated: