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

          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: