Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.

Bug 485018

Summary: NullPointerException in SiteListener.getFeatures()
Product: [Eclipse Project] Equinox Reporter: Eike Stepper <stepper>
Component: p2Assignee: P2 Inbox <equinox.p2-inbox>
Status: RESOLVED FIXED QA Contact:
Severity: critical    
Priority: P3 CC: dennis.huebner, error-reports-inbox, jfrantzius, pascal
Version: 4.5.0 Mars   
Target Milestone: Neon M6   
Hardware: PC   
OS: Windows 7   
See Also: https://git.eclipse.org/r/63382
https://git.eclipse.org/c/equinox/rt.equinox.p2.git/commit/?id=b44ba7bf8164efad35b7119cd963cd557d50d1cc
https://git.eclipse.org/r/65399
https://git.eclipse.org/c/equinox/rt.equinox.p2.git/commit/?id=555ebad33d80fb8336bcb074a7fa85cbed524d14
Whiteboard:

Description Eike Stepper CLA 2015-12-30 10:31:02 EST
In SiteListener.getFeatures() there's this code:

  File[] children = featureDir.listFiles();
  for (int i = 0; i < children.length; i++)

The children variable is used without the needed "not null" check and that can cause this exception:

  org.eclipse.oomph.util.ReflectUtil$ReflectionException: java.lang.NullPointerException
    at org.eclipse.oomph.util.ReflectUtil.invokeMethod(ReflectUtil.java:130)
    at org.eclipse.oomph.p2.internal.core.CachingRepositoryManager.addRepository(CachingRepositoryManager.java:353)
    at org.eclipse.oomph.p2.internal.core.CachingRepositoryManager.loadRepository(CachingRepositoryManager.java:154)
    at org.eclipse.oomph.p2.internal.core.CachingRepositoryManager$Artifact.loadRepository(CachingRepositoryManager.java:449)
    at org.eclipse.equinox.internal.p2.artifact.repository.ArtifactRepositoryManager.loadRepository(ArtifactRepositoryManager.java:104)
    at org.eclipse.equinox.internal.p2.artifact.repository.ArtifactRepositoryManager.loadRepository(ArtifactRepositoryManager.java:100)
    at org.eclipse.equinox.internal.p2.touchpoint.eclipse.Util.getAggregatedBundleRepository(Util.java:136)
    at org.eclipse.equinox.internal.p2.touchpoint.eclipse.Util.getAggregatedBundleRepository(Util.java:97)
    at org.eclipse.equinox.internal.p2.touchpoint.eclipse.actions.CollectAction.collect(CollectAction.java:74)
    at org.eclipse.equinox.internal.p2.touchpoint.eclipse.actions.CollectAction.execute(CollectAction.java:33)
    at org.eclipse.equinox.internal.p2.engine.Phase.mainPerform(Phase.java:183)
    at org.eclipse.equinox.internal.p2.engine.Phase.perform(Phase.java:95)
    at org.eclipse.equinox.internal.p2.engine.PhaseSet.perform(PhaseSet.java:47)
    at org.eclipse.equinox.internal.p2.engine.Engine.perform(Engine.java:75)
    at org.eclipse.equinox.internal.p2.engine.Engine.perform(Engine.java:44)
    at org.eclipse.equinox.internal.provisional.p2.director.PlanExecutionHelper.executePlan(PlanExecutionHelper.java:42)
    at org.eclipse.oomph.p2.internal.core.ProfileTransactionImpl$3.commit(ProfileTransactionImpl.java:520)
    at org.eclipse.oomph.p2.internal.core.ProfileTransactionImpl.commit(ProfileTransactionImpl.java:329)
    at org.eclipse.oomph.setup.p2.impl.P2TaskImpl.perform(P2TaskImpl.java:715)
    at org.eclipse.oomph.setup.internal.core.SetupTaskPerformer.doPerformNeededSetupTasks(SetupTaskPerformer.java:3025)
    at org.eclipse.oomph.setup.internal.core.SetupTaskPerformer.access$1(SetupTaskPerformer.java:2969)
    at org.eclipse.oomph.setup.internal.core.SetupTaskPerformer$WorkspaceUtil$1.run(SetupTaskPerformer.java:4149)
    at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2241)
    at org.eclipse.oomph.setup.internal.core.SetupTaskPerformer$WorkspaceUtil.performNeededSetupTasks(SetupTaskPerformer.java:4143)
    at org.eclipse.oomph.setup.internal.core.SetupTaskPerformer$WorkspaceUtil.access$0(SetupTaskPerformer.java:4141)
    at org.eclipse.oomph.setup.internal.core.SetupTaskPerformer.performNeededSetupTasks(SetupTaskPerformer.java:2960)
    at org.eclipse.oomph.setup.internal.core.SetupTaskPerformer.performTriggeredSetupTasks(SetupTaskPerformer.java:2935)
    at org.eclipse.oomph.setup.internal.core.SetupTaskPerformer.perform(SetupTaskPerformer.java:2829)
    at org.eclipse.oomph.setup.ui.wizards.ProgressPage$9.run(ProgressPage.java:552)
    at org.eclipse.oomph.setup.ui.wizards.ProgressPage$11$1.run(ProgressPage.java:671)
    at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55)
  Caused by: java.lang.NullPointerException
    at org.eclipse.equinox.internal.p2.extensionlocation.SiteListener.getFeatures(SiteListener.java:299)
    at org.eclipse.equinox.internal.p2.extensionlocation.SiteListener.getManagedFiles(SiteListener.java:272)
    at org.eclipse.equinox.internal.p2.extensionlocation.SiteListener.isInterested(SiteListener.java:141)
    at org.eclipse.equinox.internal.provisional.p2.directorywatcher.DirectoryWatcher.isInterested(DirectoryWatcher.java:176)
    at org.eclipse.equinox.internal.provisional.p2.directorywatcher.DirectoryWatcher.scanDirectories(DirectoryWatcher.java:159)
    at org.eclipse.equinox.internal.provisional.p2.directorywatcher.DirectoryWatcher.poll(DirectoryWatcher.java:108)
    at org.eclipse.equinox.internal.p2.extensionlocation.SiteListener.synchronizeRepositories(SiteListener.java:111)
    at org.eclipse.equinox.internal.p2.extensionlocation.ExtensionLocationArtifactRepository.ensureInitialized(ExtensionLocationArtifactRepository.java:66)
    at org.eclipse.equinox.internal.p2.extensionlocation.ExtensionLocationArtifactRepository.getProperties(ExtensionLocationArtifactRepository.java:259)
    at org.eclipse.equinox.internal.p2.repository.helpers.AbstractRepositoryManager.addRepository(AbstractRepositoryManager.java:129)
    at sun.reflect.GeneratedMethodAccessor69.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.eclipse.oomph.util.ReflectUtil.invokeMethod(ReflectUtil.java:116)
    at org.eclipse.oomph.p2.internal.core.CachingRepositoryManager.addRepository(CachingRepositoryManager.java:353)
    at org.eclipse.oomph.p2.internal.core.CachingRepositoryManager.loadRepository(CachingRepositoryManager.java:154)
    at org.eclipse.oomph.p2.internal.core.CachingRepositoryManager$Artifact.loadRepository(CachingRepositoryManager.java:449)
    at org.eclipse.equinox.internal.p2.artifact.repository.ArtifactRepositoryManager.loadRepository(ArtifactRepositoryManager.java:104)
    at org.eclipse.equinox.internal.p2.artifact.repository.ArtifactRepositoryManager.loadRepository(ArtifactRepositoryManager.java:100)
    at org.eclipse.equinox.internal.p2.touchpoint.eclipse.Util.getAggregatedBundleRepository(Util.java:136)
    at org.eclipse.equinox.internal.p2.touchpoint.eclipse.Util.getAggregatedBundleRepository(Util.java:97)
    at org.eclipse.equinox.internal.p2.touchpoint.eclipse.actions.CollectAction.collect(CollectAction.java:74)
    at org.eclipse.equinox.internal.p2.touchpoint.eclipse.actions.CollectAction.execute(CollectAction.java:33)
    at org.eclipse.equinox.internal.p2.engine.Phase.mainPerform(Phase.java:183)
    at org.eclipse.equinox.internal.p2.engine.Phase.perform(Phase.java:95)
    at org.eclipse.equinox.internal.p2.engine.PhaseSet.perform(PhaseSet.java:47)
    at org.eclipse.equinox.internal.p2.engine.Engine.perform(Engine.java:75)
    at org.eclipse.equinox.internal.p2.engine.Engine.perform(Engine.java:44)
    at org.eclipse.equinox.internal.provisional.p2.director.PlanExecutionHelper.executePlan(PlanExecutionHelper.java:42)
    at org.eclipse.oomph.p2.internal.core.ProfileTransactionImpl$3.commit(ProfileTransactionImpl.java:520)
    at org.eclipse.oomph.p2.internal.core.ProfileTransactionImpl.commit(ProfileTransactionImpl.java:329)
    at org.eclipse.oomph.setup.p2.impl.P2TaskImpl.perform(P2TaskImpl.java:715)
    at org.eclipse.oomph.setup.internal.core.SetupTaskPerformer.doPerformNeededSetupTasks(SetupTaskPerformer.java:3025)
    at org.eclipse.oomph.setup.internal.core.SetupTaskPerformer.access$1(SetupTaskPerformer.java:2969)
    at org.eclipse.oomph.setup.internal.core.SetupTaskPerformer$WorkspaceUtil$1.run(SetupTaskPerformer.java:4149)
    at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2241)
    at org.eclipse.oomph.setup.internal.core.SetupTaskPerformer$WorkspaceUtil.performNeededSetupTasks(SetupTaskPerformer.java:4143)
    at org.eclipse.oomph.setup.internal.core.SetupTaskPerformer$WorkspaceUtil.access$0(SetupTaskPerformer.java:4141)
    at org.eclipse.oomph.setup.internal.core.SetupTaskPerformer.performNeededSetupTasks(SetupTaskPerformer.java:2960)
    at org.eclipse.oomph.setup.internal.core.SetupTaskPerformer.performTriggeredSetupTasks(SetupTaskPerformer.java:2935)
    at org.eclipse.oomph.setup.internal.core.SetupTaskPerformer.perform(SetupTaskPerformer.java:2829)
    at org.eclipse.oomph.setup.ui.wizards.ProgressPage$9.run(ProgressPage.java:552)
    at org.eclipse.oomph.setup.ui.wizards.ProgressPage$11$1.run(ProgressPage.java:671)
    ... 1 more

Note that the SiteListener.getPlugins() *does have* the needed "not null" check:

  File[] plugins = new File(location, PLUGINS).listFiles();
  for (int i = 0; plugins != null && i < plugins.length; i++)

I'm going to submit a Gerrit review in a minute...
Comment 1 Eclipse Genie CLA 2015-12-30 10:32:06 EST
New Gerrit change created: https://git.eclipse.org/r/63382
Comment 2 Jonathan Drapeau CLA 2016-01-13 13:52:49 EST
Same exception than https://bugs.eclipse.org/bugs/show_bug.cgi?id=480722
Comment 3 Eike Stepper CLA 2016-01-14 01:53:34 EST
*** Bug 480722 has been marked as a duplicate of this bug. ***
Comment 4 Dennis Huebner CLA 2016-01-28 11:39:59 EST
Getting the same exception as described, is there a chance to merge the gerrit change created by Eike? For Mars 2 maybe?
Comment 6 Eclipse Genie CLA 2016-01-28 13:47:25 EST
New Gerrit change created: https://git.eclipse.org/r/65399
Comment 7 Eclipse Genie CLA 2016-01-28 13:47:58 EST
Gerrit change https://git.eclipse.org/r/65399 was merged to [R4_5_maintenance].
Commit: http://git.eclipse.org/c/equinox/rt.equinox.p2.git/commit/?id=555ebad33d80fb8336bcb074a7fa85cbed524d14
Comment 8 Pascal Rapicault CLA 2016-01-28 13:48:34 EST
I've pushed the patch to both master and 4_5 maintenance.
Thanks for the contrib