Bug 308150 - JAR with invalid Class-Path entry in MANIFEST.MF crashes the project
Summary: JAR with invalid Class-Path entry in MANIFEST.MF crashes the project
Status: VERIFIED FIXED
Alias: None
Product: JDT
Classification: Eclipse Project
Component: Core (show other bugs)
Version: 3.6   Edit
Hardware: PC Windows XP
: P3 normal (vote)
Target Milestone: 3.6 M7   Edit
Assignee: Jay Arthanareeswaran CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2010-04-06 03:05 EDT by Jay Arthanareeswaran CLA
Modified: 2010-04-28 03:16 EDT (History)
3 users (show)

See Also:


Attachments
JAR to reproduce the bug (479 bytes, application/octet-stream)
2010-04-06 03:05 EDT, Jay Arthanareeswaran CLA
no flags Details
Proposed Patch (3.41 KB, patch)
2010-04-06 09:58 EDT, Jay Arthanareeswaran CLA
no flags Details | Diff
Updated patch (3.41 KB, patch)
2010-04-07 01:25 EDT, Jay Arthanareeswaran CLA
no flags Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Jay Arthanareeswaran CLA 2010-04-06 03:05:28 EDT
Created attachment 163859 [details]
JAR to reproduce the bug

Moving this bug report from bug 288700, comment 14.

If a lib has a Class-Path: entry with an invalid value (../.. in my case), it
crashes the project with the following exception:

Problems occurred when invoking code from plug-in: "org.eclipse.jface".

org.eclipse.core.runtime.AssertionFailedException: null argument:
    at org.eclipse.core.runtime.Assert.isNotNull(Assert.java:85)
    at org.eclipse.core.runtime.Assert.isNotNull(Assert.java:73)
    at org.eclipse.core.runtime.Path.initialize(Path.java:577)
    at org.eclipse.core.runtime.Path.<init>(Path.java:185)
    at
org.eclipse.core.internal.resources.WorkspaceRoot.getProject(WorkspaceRoot.java:179)
    at
org.eclipse.jdt.internal.core.ExternalFoldersManager.isExternalFolderPath(ExternalFoldersManager.java:77)
    at
org.eclipse.jdt.internal.core.JavaProject.addToResult(JavaProject.java:2634)
    at
org.eclipse.jdt.internal.core.JavaProject.resolveClasspath(JavaProject.java:2611)
    at
org.eclipse.jdt.internal.core.JavaProject.resolveClasspath(JavaProject.java:2662)
    at
org.eclipse.jdt.internal.core.JavaProject.getResolvedClasspath(JavaProject.java:1861)
    at
org.eclipse.jdt.internal.core.PackageFragmentRoot.getRawClasspathEntry(PackageFragmentRoot.java:547)
    at
org.eclipse.jdt.internal.ui.viewsupport.JavaElementLabelComposer.appendVariableLabel(JavaElementLabelComposer.java:1076)
    at
org.eclipse.jdt.internal.ui.viewsupport.JavaElementLabelComposer.appendPackageFragmentRootLabel(JavaElementLabelComposer.java:1058)
    at
org.eclipse.jdt.internal.ui.viewsupport.JavaElementLabelComposer.appendElementLabel(JavaElementLabelComposer.java:263)
    at
org.eclipse.jdt.ui.JavaElementLabels.getElementLabel(JavaElementLabels.java:521)
    at
org.eclipse.jdt.ui.JavaElementLabels.getStyledElementLabel(JavaElementLabels.java:496)
    at
org.eclipse.jdt.ui.JavaElementLabels.getStyledTextLabel(JavaElementLabels.java:424)
    at
org.eclipse.jdt.internal.ui.viewsupport.JavaUILabelProvider.getStyledText(JavaUILabelProvider.java:178)
    at
org.eclipse.jdt.internal.ui.packageview.PackageExplorerLabelProvider.getStyledText(PackageExplorerLabelProvider.java:70)
    at
org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.getStyledText(DelegatingStyledCellLabelProvider.java:195)
    at
org.eclipse.jface.viewers.DecoratingStyledCellLabelProvider.getStyledText(DecoratingStyledCellLabelProvider.java:192)
    at
org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.update(DelegatingStyledCellLabelProvider.java:103)
    at
org.eclipse.jface.viewers.DecoratingStyledCellLabelProvider.update(DecoratingStyledCellLabelProvider.java:134)
    at org.eclipse.jface.viewers.ViewerColumn.refresh(ViewerColumn.java:145)
    at
org.eclipse.jface.viewers.AbstractTreeViewer.doUpdateItem(AbstractTreeViewer.java:932)
    at
org.eclipse.jface.viewers.AbstractTreeViewer$UpdateItemSafeRunnable.run(AbstractTreeViewer.java:102)
    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
    at org.eclipse.core.runtime.Platform.run(Platform.java:888)
    at org.eclipse.ui.internal.JFaceUtil$1.run(JFaceUtil.java:48)
    at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:175)
    at
org.eclipse.jface.viewers.AbstractTreeViewer.doUpdateItem(AbstractTreeViewer.java:1012)
    at
org.eclipse.jface.viewers.StructuredViewer$UpdateItemSafeRunnable.run(StructuredViewer.java:481)
    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
    at org.eclipse.core.runtime.Platform.run(Platform.java:888)
    at org.eclipse.ui.internal.JFaceUtil$1.run(JFaceUtil.java:48)
    at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:175)
    at
org.eclipse.jface.viewers.StructuredViewer.updateItem(StructuredViewer.java:2111)
    at
org.eclipse.jface.viewers.AbstractTreeViewer.createTreeItem(AbstractTreeViewer.java:827)
    at
org.eclipse.jface.viewers.AbstractTreeViewer$1.run(AbstractTreeViewer.java:802)
    at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
    at
org.eclipse.jface.viewers.AbstractTreeViewer.createChildren(AbstractTreeViewer.java:776)
    at org.eclipse.jface.viewers.TreeViewer.createChildren(TreeViewer.java:639)
    at
org.eclipse.jface.viewers.AbstractTreeViewer.handleTreeExpand(AbstractTreeViewer.java:1442)
    at
org.eclipse.jface.viewers.TreeViewer.handleTreeExpand(TreeViewer.java:937)
    at
org.eclipse.jface.viewers.AbstractTreeViewer$4.treeExpanded(AbstractTreeViewer.java:1453)
    at
org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:126)
    at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1176)
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1200)
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1185)
    at org.eclipse.swt.widgets.Tree.gtk_test_expand_row(Tree.java:2062)
    at org.eclipse.swt.widgets.Widget.windowProc(Widget.java:1601)
    at org.eclipse.swt.widgets.Display.windowProc(Display.java:4197)
    at org.eclipse.swt.internal.gtk.OS._gtk_main_do_event(Native Method)
    at org.eclipse.swt.internal.gtk.OS.gtk_main_do_event(OS.java:7586)
    at org.eclipse.swt.widgets.Display.eventProc(Display.java:1185)
    at org.eclipse.swt.internal.gtk.OS._g_main_context_iteration(Native Method)
    at org.eclipse.swt.internal.gtk.OS.g_main_context_iteration(OS.java:1858)
    at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3110)
    at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2405)
    at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2369)
    at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2221)
    at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:500)
    at
org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
    at
org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:493)
    at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
    at
org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:113)
    at
org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:194)
    at
org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
    at
org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
    at
org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:368)
    at
org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:559)
    at org.eclipse.equinox.launcher.Main.basicRun(Main.java:514)
    at org.eclipse.equinox.launcher.Main.run(Main.java:1311)


I tried to create a .zip with a buggy jar, but the problem didn't happen when I
imported it. But it can be reproduced by using the attached jar and following
the steps below:

1.Create a new java project
2.Outside eclipse, add baddie.jar to the project's directory
3.Refresh the project on Eclipse
4.Add baddie.jar to the classpath. If it doesn't complain right away, try to
refresh the project.


I know that this particular JAR has an invalid entry and it should be fixed,
but sometimes it's out of our control, and Eclipse should just issue a warning
reporting the problem (rather than making the whole project unusable).
Comment 1 Jay Arthanareeswaran CLA 2010-04-06 09:58:30 EDT
Created attachment 163892 [details]
Proposed Patch

Fix addresses cases where the referenced library entry is invalid or has zero segments. Tests added in ClasspathTests#testBug308150()
Comment 2 Jay Arthanareeswaran CLA 2010-04-07 01:25:38 EDT
Created attachment 163990 [details]
Updated patch

Fixed an error with the previous patch.
Comment 3 Jay Arthanareeswaran CLA 2010-04-08 00:55:31 EDT
Released in HEAD for 3.6M7.
Comment 4 Ayushman Jain CLA 2010-04-26 05:23:24 EDT
Just came across a related issue.
In the above steps to reproduce, I omit step 2 and 3, and use "add external jars" to add the baddie.jar from my downloads folder directly into the classpath, and hit OK - I get the following error message - 

"Setting build path has encountered a problem"
'C:\Documents and Settings\Administrator' is not a valid location for linked resources.

Now, I can see baddie.jar added to the referenced libraries of my project. But checking out the build path or .classpath, I cannot find baddie.jar. This means that even though Eclipse has removed it, the referenced libraries is still showing it.
Again, I go to build path -> add external jars and again add baddie.jar. This fails via an exception

eclipse.buildId=I20100424-2000
java.version=1.6.0_17
java.vendor=Sun Microsystems Inc.
BootLoader constants: OS=win32, ARCH=x86, WS=win32, NL=en_US
Command-line arguments:  -os win32 -ws win32 -arch x86

Exception while updating external folders

org.eclipse.core.internal.resources.ResourceException: 'C:\Documents and Settings\Administrator' is not a valid location for linked resources.
	at org.eclipse.core.internal.resources.Resource.assertLinkRequirements(Resource.java:166)
	at org.eclipse.core.internal.resources.Resource.createLink(Resource.java:655)
	at org.eclipse.core.internal.resources.Resource.createLink(Resource.java:629)
	at org.eclipse.jdt.internal.core.ExternalFoldersManager.createLinkFolder(ExternalFoldersManager.java:113)
	at org.eclipse.jdt.internal.core.ExternalFolderChange.updateExternalFoldersIfNecessary(ExternalFolderChange.java:47)
	at org.eclipse.jdt.internal.core.DeltaProcessor.resourceChanged(DeltaProcessor.java:1981)
	at org.eclipse.jdt.internal.core.DeltaProcessingState.resourceChanged(DeltaProcessingState.java:470)
	at org.eclipse.core.internal.events.NotificationManager$2.run(NotificationManager.java:291)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
	at org.eclipse.core.internal.events.NotificationManager.notify(NotificationManager.java:285)
	at org.eclipse.core.internal.events.NotificationManager.broadcastChanges(NotificationManager.java:149)
	at org.eclipse.core.internal.resources.Workspace.broadcastBuildEvent(Workspace.java:311)
	at org.eclipse.core.internal.events.AutoBuildJob.doBuild(AutoBuildJob.java:136)
	at org.eclipse.core.internal.events.AutoBuildJob.run(AutoBuildJob.java:238)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54)

After this if i go the build path I can see baddie.jar added there and can remove it. But all this seems a bit ambiguous. Jay, can you clarify?
Comment 5 Ayushman Jain CLA 2010-04-28 03:03:49 EDT
Raised bug 310764 as a follow up for comment 4.
Comment 6 Ayushman Jain CLA 2010-04-28 03:05:05 EDT
Verified for 3.6M7 using build I20100424-2000.
Comment 7 Srikanth Sankaran CLA 2010-04-28 03:16:38 EDT
Verified.