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

NPE if file parameter empty with remote build only

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Fixed
    • Icon: Minor Minor
    • core
    • None
    • Jenkins v2.500
    • 367.vc2cc39fb_b_593

      edit: Somehow I cannot replicate this now with "legacy" File param... but I'm sure it didn't work for me last week. Unfortunately I'm not sure at the moment whether that was on LTS or on 2.500, I'll investigate further - this might in the end be related to File parameters plugin after all...

      When triggering a project with multiple file parameters (both "legacy" File param and Stashed File param) remotely, NPE drops when some of the files are not part of the request, and the caller gets a generic HTML error page instead of a parsable reply.

      This happens for remote triggers both via the authenticated path `job/<jobname>/buildWithParameters` and when using the Build Token Root plugin.

      This does not happen if the job is triggered manually via "Build with parameters" UI.

      Job type doesn't seem to make a difference (tried pipeline and freestyle).

      Expected result is triggering a job without the missing files, as happens when built manually via UI.

      Since remote triggers are usually machine-based, a response should also be machine-parseable, especially error messages.

      Basically, it looks like Jenkins is trying to iterate over File parameters and expects to find them in the input request without checking for its existence first.

      I think this is a core issue because the general behavior is the same regardless of the file parameter type.

      The caller sends the request as `multipart/form-data`. If all files are present, the job is triggered correctly. If some are missing, this NPE happens (with Stashed file params):

       java.lang.NullPointerException: Cannot invoke "org.apache.commons.fileupload2.core.FileItem.getInputStream()" because "this.val$from" is null
               at org.apache.commons.fileupload.FileItem$2.getInputStream(FileItem.java:338)
               at PluginClassLoader for file-parameters//io.jenkins.plugins.file_parameters.AbstractFileParameterDefinition.createValue(AbstractFileParameterDefinition.java:85)
               at PluginClassLoader for file-parameters//io.jenkins.plugins.file_parameters.StashedFileParameterDefinition.createValue(StashedFileParameterDefinition.java:33)
               at hudson.model.ParameterDefinition.lambda$createValue$3(ParameterDefinition.java:245)
               at hudson.Util.ifOverridden(Util.java:1553)
               at hudson.model.ParameterDefinition.createValue(ParameterDefinition.java:244)
               at PluginClassLoader for build-token-root//org.jenkinsci.plugins.build_token_root.BuildRootAction.doBuildWithParameters(BuildRootAction.java:111)
               at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:732)
               at org.kohsuke.stapler.Function$MethodFunction.invoke(Function.java:484)
               at org.kohsuke.stapler.Function$InstanceFunction.invoke(Function.java:497)
               at org.kohsuke.stapler.Function.bindAndInvoke(Function.java:218)
               at org.kohsuke.stapler.Function.bindAndInvokeAndServeResponse(Function.java:140)
               at org.kohsuke.stapler.MetaClass$12.doDispatch(MetaClass.java:686)
               at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:61)
               at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:800)
       Caused: jakarta.servlet.ServletException
               at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:851)
               at org.kohsuke.stapler.Stapler.invoke(Stapler.java:938)
               at org.kohsuke.stapler.MetaClass$10.dispatch(MetaClass.java:590)
               at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:800)
               at org.kohsuke.stapler.Stapler.invoke(Stapler.java:938)
               at org.kohsuke.stapler.Stapler.invoke(Stapler.java:721)
               at org.kohsuke.stapler.Stapler.service(Stapler.java:253)
               at Jenkins Main ClassLoader//jakarta.servlet.http.HttpServlet.service(HttpServlet.java:587)
               at Jenkins Main ClassLoader//org.eclipse.jetty.ee9.servlet.ServletHolder.handle(ServletHolder.java:765)
               at Jenkins Main ClassLoader//org.eclipse.jetty.ee9.servlet.ServletHandler$ChainEnd.doFilter(ServletHandler.java:1668)
               at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:204)
               at io.jenkins.servlet.FilterChainWrapper$2.doFilter(FilterChainWrapper.java:53)
       Caused: javax.servlet.ServletException
               at io.jenkins.servlet.ServletExceptionWrapper.fromJakartaServletException(ServletExceptionWrapper.java:14)
               at io.jenkins.servlet.FilterChainWrapper$2.doFilter(FilterChainWrapper.java:62)
               at PluginClassLoader for extended-security-settings//io.jenkins.plugins.extendedsecuritysettings.UnauthorizedUserHttpHeaderRestrictionFilter.doFilter(UnauthorizedUserHttpHeaderRestrictionFilter.java:84)
               at io.jenkins.servlet.FilterWrapper$1.doFilter(FilterWrapper.java:42)
       Caused: jakarta.servlet.ServletException
               at io.jenkins.servlet.ServletExceptionWrapper.toJakartaServletException(ServletExceptionWrapper.java:9)
               at io.jenkins.servlet.FilterWrapper$1.doFilter(FilterWrapper.java:53)
               at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:201)
               at PluginClassLoader for metrics//jenkins.metrics.impl.MetricsFilter.doFilter(MetricsFilter.java:125)
               at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:201)
               at jenkins.util.HttpServletFilter$1.doFilter(HttpServletFilter.java:77)
               at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:201)
               at hudson.util.PluginServletFilter.doFilter(PluginServletFilter.java:207)
               at Jenkins Main ClassLoader//org.eclipse.jetty.ee9.servlet.FilterHolder.doFilter(FilterHolder.java:202)
               at Jenkins Main ClassLoader//org.eclipse.jetty.ee9.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1638)
               at jenkins.ErrorAttributeFilter.doFilter(ErrorAttributeFilter.java:29)
               at Jenkins Main ClassLoader//org.eclipse.jetty.ee9.servlet.FilterHolder.doFilter(FilterHolder.java:202)
               at Jenkins Main ClassLoader//org.eclipse.jetty.ee9.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1638)
               at hudson.security.csrf.CrumbFilter.doFilter(CrumbFilter.java:160)
               at Jenkins Main ClassLoader//org.eclipse.jetty.ee9.servlet.FilterHolder.doFilter(FilterHolder.java:202)
               at Jenkins Main ClassLoader//org.eclipse.jetty.ee9.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1638)
               at hudson.security.ChainedServletFilter2$1.doFilter(ChainedServletFilter2.java:94)
               at jenkins.security.AcegiSecurityExceptionFilter.doFilter(AcegiSecurityExceptionFilter.java:52)
               at hudson.security.ChainedServletFilter2$1.doFilter(ChainedServletFilter2.java:99)
               at hudson.security.UnwrapSecurityExceptionFilter.doFilter(UnwrapSecurityExceptionFilter.java:54)
               at hudson.security.ChainedServletFilter2$1.doFilter(ChainedServletFilter2.java:99)
               at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:126)
               at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:120)
               at hudson.security.ChainedServletFilter2$1.doFilter(ChainedServletFilter2.java:99)
               at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:100)
               at hudson.security.ChainedServletFilter2$1.doFilter(ChainedServletFilter2.java:99)
               at org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:150)
               at org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:105)
               at hudson.security.ChainedServletFilter2$1.doFilter(ChainedServletFilter2.java:99)
               at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:227)
               at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:221)
               at hudson.security.ChainedServletFilter2$1.doFilter(ChainedServletFilter2.java:99)
               at jenkins.security.BasicHeaderProcessor.doFilter(BasicHeaderProcessor.java:98)
               at hudson.security.ChainedServletFilter2$1.doFilter(ChainedServletFilter2.java:99)
               at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:117)
               at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
               at hudson.security.HttpSessionContextIntegrationFilter2.doFilter(HttpSessionContextIntegrationFilter2.java:63)
               at hudson.security.ChainedServletFilter2$1.doFilter(ChainedServletFilter2.java:99)
               at hudson.security.ChainedServletFilter2.doFilter(ChainedServletFilter2.java:111)
               at hudson.security.HudsonFilter.doFilter(HudsonFilter.java:173)
               at Jenkins Main ClassLoader//org.eclipse.jetty.ee9.servlet.FilterHolder.doFilter(FilterHolder.java:202)
               at Jenkins Main ClassLoader//org.eclipse.jetty.ee9.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1638)
               at org.kohsuke.stapler.UncaughtExceptionFilter.doFilter(UncaughtExceptionFilter.java:26)
               at Jenkins Main ClassLoader//org.eclipse.jetty.ee9.servlet.FilterHolder.doFilter(FilterHolder.java:202)
               at Jenkins Main ClassLoader//org.eclipse.jetty.ee9.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1638)
               at hudson.util.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:86)
               at Jenkins Main ClassLoader//org.eclipse.jetty.ee9.servlet.FilterHolder.doFilter(FilterHolder.java:202)
               at Jenkins Main ClassLoader//org.eclipse.jetty.ee9.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1638)
               at org.kohsuke.stapler.DiagnosticThreadNameFilter.doFilter(DiagnosticThreadNameFilter.java:31)
               at Jenkins Main ClassLoader//org.eclipse.jetty.ee9.servlet.FilterHolder.doFilter(FilterHolder.java:202)
               at Jenkins Main ClassLoader//org.eclipse.jetty.ee9.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1638)
               at jenkins.security.SuspiciousRequestFilter.doFilter(SuspiciousRequestFilter.java:38)
               at Jenkins Main ClassLoader//org.eclipse.jetty.ee9.servlet.FilterHolder.doFilter(FilterHolder.java:202)
               at Jenkins Main ClassLoader//org.eclipse.jetty.ee9.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1638)
               at Jenkins Main ClassLoader//org.eclipse.jetty.ee9.servlet.ServletHandler.doHandle(ServletHandler.java:526)
               at Jenkins Main ClassLoader//org.eclipse.jetty.ee9.nested.ScopedHandler.handle(ScopedHandler.java:127)
               at Jenkins Main ClassLoader//org.eclipse.jetty.ee9.security.SecurityHandler.handle(SecurityHandler.java:574)
               at Jenkins Main ClassLoader//org.eclipse.jetty.ee9.nested.HandlerWrapper.handle(HandlerWrapper.java:124)
               at Jenkins Main ClassLoader//org.eclipse.jetty.ee9.nested.ScopedHandler.nextHandle(ScopedHandler.java:197)
               at Jenkins Main ClassLoader//org.eclipse.jetty.ee9.nested.SessionHandler.doHandle(SessionHandler.java:612)
               at Jenkins Main ClassLoader//org.eclipse.jetty.ee9.nested.ScopedHandler.nextHandle(ScopedHandler.java:195)
               at Jenkins Main ClassLoader//org.eclipse.jetty.ee9.nested.ContextHandler.doHandle(ContextHandler.java:1037)
               at Jenkins Main ClassLoader//org.eclipse.jetty.ee9.nested.ScopedHandler.nextScope(ScopedHandler.java:164)
               at Jenkins Main ClassLoader//org.eclipse.jetty.ee9.servlet.ServletHandler.doScope(ServletHandler.java:483)
               at Jenkins Main ClassLoader//org.eclipse.jetty.ee9.nested.ScopedHandler.nextScope(ScopedHandler.java:162)
               at Jenkins Main ClassLoader//org.eclipse.jetty.ee9.nested.SessionHandler.doScope(SessionHandler.java:589)
               at Jenkins Main ClassLoader//org.eclipse.jetty.ee9.nested.ScopedHandler.nextScope(ScopedHandler.java:162)
               at Jenkins Main ClassLoader//org.eclipse.jetty.ee9.nested.ContextHandler.doScope(ContextHandler.java:958)
               at Jenkins Main ClassLoader//org.eclipse.jetty.ee9.nested.ScopedHandler.handle(ScopedHandler.java:125)
               at Jenkins Main ClassLoader//org.eclipse.jetty.ee9.nested.ContextHandler.handle(ContextHandler.java:1696)
               at Jenkins Main ClassLoader//org.eclipse.jetty.ee9.nested.HttpChannel$RequestDispatchable.dispatch(HttpChannel.java:1564)
               at Jenkins Main ClassLoader//org.eclipse.jetty.ee9.nested.HttpChannel.dispatch(HttpChannel.java:723)
               at Jenkins Main ClassLoader//org.eclipse.jetty.ee9.nested.HttpChannel.handle(HttpChannel.java:511)
               at Jenkins Main ClassLoader//org.eclipse.jetty.ee9.nested.ContextHandler$CoreContextHandler$CoreToNestedHandler.handle(ContextHandler.java:2873)
               at Jenkins Main ClassLoader//org.eclipse.jetty.server.handler.ContextHandler.handle(ContextHandler.java:1060)
               at Jenkins Main ClassLoader//org.eclipse.jetty.server.handler.gzip.GzipHandler.handle(GzipHandler.java:563)
               at Jenkins Main ClassLoader//org.eclipse.jetty.server.Server.handle(Server.java:182)
               at Jenkins Main ClassLoader//org.eclipse.jetty.server.internal.HttpChannelState$HandlerInvoker.run(HttpChannelState.java:662)
               at Jenkins Main ClassLoader//org.eclipse.jetty.server.internal.HttpConnection.onFillable(HttpConnection.java:418)
               at Jenkins Main ClassLoader//org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:322)
               at Jenkins Main ClassLoader//org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:99)
               at Jenkins Main ClassLoader//org.eclipse.jetty.io.SelectableChannelEndPoint$1.run(SelectableChannelEndPoint.java:53)
               at Jenkins Main ClassLoader//org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.runTask(AdaptiveExecutionStrategy.java:480)
               at Jenkins Main ClassLoader//org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.consumeTask(AdaptiveExecutionStrategy.java:443)
               at Jenkins Main ClassLoader//org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.tryProduce(AdaptiveExecutionStrategy.java:293)
               at Jenkins Main ClassLoader//org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.run(AdaptiveExecutionStrategy.java:201)
               at Jenkins Main ClassLoader//org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:311)
               at Jenkins Main ClassLoader//org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:979)
               at Jenkins Main ClassLoader//org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.doRunJob(QueuedThreadPool.java:1209)
               at Jenkins Main ClassLoader//org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1164)
               at java.base/java.lang.Thread.run(Thread.java:840)
      

       

       

            basil Basil Crow
            jficz Jakub
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated:
              Resolved: