Details
-
Bug
-
Resolution: Fixed
-
Low
-
None
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