Uploaded image for project: 'Bitbucket Data Center'
  1. Bitbucket Data Center
  2. BSERV-3819

ExternalProcessImpl.areOutputPumpsRunning is not thread-safe

    XMLWordPrintable

Details

    • Bug
    • Resolution: Fixed
    • Low
    • 2.8.0
    • None
    • SSH

    Description

      This causes a potential NPE when .finish() is called before .cancel() (likely in a separate thread).

      .finish() will loop, calling areOutputPumpsRunning() repeatedly, which does a

              return (outputPump != null && outputPump.isRunning()) || (errorPump != null && errorPump.isRunning());
      

      Since .cancel() nulls out the pumps, we can see NPEs when a context-switch occurs between outputPump != null and outputPump.isRunning()

      2013-08-28 00:48:15,138 ERROR [threadpool:thread-225047]  c.a.s.i.c.StateTransferringExecutor Error while processing asynchronous task
      java.lang.reflect.UndeclaredThrowableException: null
      	at $Proxy1274.handleRequest(Unknown Source) ~[na:na]
      	at com.atlassian.stash.internal.ssh.server.SshScmRequestCommandAdapter$ScmRequestRunnable$1.withRequest(SshScmRequestCommandAdapter.java:261) ~[na:na]
      	at com.atlassian.stash.internal.ssh.server.SshScmRequestCommandAdapter$ScmRequestRunnable$1.withRequest(SshScmRequestCommandAdapter.java:254) ~[na:na]
      	at com.atlassian.stash.internal.request.DefaultRequestManager.doAsRequest(DefaultRequestManager.java:72) ~[stash-service-impl-2.7.0.jar:na]
      	at sun.reflect.GeneratedMethodAccessor497.invoke(Unknown Source) ~[na:na]
      	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) ~[na:1.6.0_22]
      	at java.lang.reflect.Method.invoke(Method.java:597) ~[na:1.6.0_22]
      	at com.atlassian.plugin.osgi.hostcomponents.impl.DefaultComponentRegistrar$ContextClassLoaderSettingInvocationHandler.invoke(DefaultComponentRegistrar.java:129) ~[atlassian-plugins-osgi-3.0.0.jar:na]
      	at $Proxy244.doAsRequest(Unknown Source) ~[na:na]
      	at sun.reflect.GeneratedMethodAccessor497.invoke(Unknown Source) ~[na:na]
      	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) ~[na:1.6.0_22]
      	at java.lang.reflect.Method.invoke(Method.java:597) ~[na:1.6.0_22]
      	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307) ~[spring-aop-3.2.3.RELEASE.jar:3.2.3.RELEASE]
      	at org.springframework.osgi.service.importer.support.internal.aop.ServiceInvoker.doInvoke(ServiceInvoker.java:58) ~[na:na]
      	at org.springframework.osgi.service.importer.support.internal.aop.ServiceInvoker.invoke(ServiceInvoker.java:62) ~[na:na]
      	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) ~[spring-aop-3.2.3.RELEASE.jar:3.2.3.RELEASE]
      	at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:131) ~[spring-aop-3.2.3.RELEASE.jar:3.2.3.RELEASE]
      	at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:119) ~[spring-aop-3.2.3.RELEASE.jar:3.2.3.RELEASE]
      	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) ~[spring-aop-3.2.3.RELEASE.jar:3.2.3.RELEASE]
      	at org.springframework.osgi.service.util.internal.aop.ServiceTCCLInterceptor.invokeUnprivileged(ServiceTCCLInterceptor.java:56) ~[na:na]
      	at org.springframework.osgi.service.util.internal.aop.ServiceTCCLInterceptor.invoke(ServiceTCCLInterceptor.java:39) ~[na:na]
      	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) ~[spring-aop-3.2.3.RELEASE.jar:3.2.3.RELEASE]
      	at org.springframework.osgi.service.importer.support.LocalBundleContextAdvice.invoke(LocalBundleContextAdvice.java:59) ~[na:na]
      	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) ~[spring-aop-3.2.3.RELEASE.jar:3.2.3.RELEASE]
      	at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:131) ~[spring-aop-3.2.3.RELEASE.jar:3.2.3.RELEASE]
      	at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:119) ~[spring-aop-3.2.3.RELEASE.jar:3.2.3.RELEASE]
      	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) ~[spring-aop-3.2.3.RELEASE.jar:3.2.3.RELEASE]
      	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) ~[spring-aop-3.2.3.RELEASE.jar:3.2.3.RELEASE]
      	at $Proxy899.doAsRequest(Unknown Source) ~[na:na]
      	at com.atlassian.stash.internal.ssh.server.SshScmRequestCommandAdapter$ScmRequestRunnable.run(SshScmRequestCommandAdapter.java:254) ~[na:na]
      	at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:64) ~[na:na]
      	at com.atlassian.stash.internal.concurrent.StateTransferringExecutor$StateTransferringRunnable.run(StateTransferringExecutor.java:68) ~[stash-platform-2.7.0.jar:na]
      	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441) [na:1.6.0_22]
      	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) [na:1.6.0_22]
      	at java.util.concurrent.FutureTask.run(FutureTask.java:138) [na:1.6.0_22]
      	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:98) [na:1.6.0_22]
      	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:206) [na:1.6.0_22]
      	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) [na:1.6.0_22]
      	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) [na:1.6.0_22]
      	at java.lang.Thread.run(Thread.java:662) [na:1.6.0_22]
      Caused by: java.lang.reflect.InvocationTargetException: null
      	at sun.reflect.GeneratedMethodAccessor509.invoke(Unknown Source) ~[na:na]
      	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) ~[na:1.6.0_22]
      	at java.lang.reflect.Method.invoke(Method.java:597) ~[na:1.6.0_22]
      	at com.atlassian.stash.scm.throttle.ThrottledScmRequestFactory$ThrottlingInvocationHandler.invoke(ThrottledScmRequestFactory.java:93) ~[stash-spi-2.7.0.jar:na]
      	... 40 common frames omitted
      Caused by: java.lang.NullPointerException: null
      	at com.atlassian.utils.process.ExternalProcessImpl.areOutputPumpsRunning(ExternalProcessImpl.java:124) ~[atlassian-processutils-1.5.10.jar:na]
      	at com.atlassian.utils.process.ExternalProcessImpl.finish(ExternalProcessImpl.java:430) ~[atlassian-processutils-1.5.10.jar:na]
      	at com.atlassian.stash.scm.BaseCommand$CommandFuture.get(BaseCommand.java:222) ~[stash-spi-2.7.0.jar:na]
      	at com.atlassian.stash.internal.scm.git.ssh.GitSshScmRequest.handleRequest(GitSshScmRequest.java:145) ~[na:na]
      	... 44 common frames omitted
      

      Attachments

        Activity

          People

            mheemskerk Michael Heemskerk (Inactive)
            aahmed Adam Ahmed (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: