diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/UtilTests.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/UtilTests.java
index e6a36d396e2..47c4396edfa 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/UtilTests.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/UtilTests.java
@@ -115,4 +115,30 @@ public void testTypeSignature() {
assertEquals("Qqualifier.id;", Util.getSignature(type));
}
+ public void testGetSafeName() {
+ assertGetSafeNamePass("simple");
+ assertGetSafeNamePass("dir1/dir2/normal");
+ assertGetSafeNamePass("dir1/../unnormal");
+ assertGetSafeNamePass("dir1/dir2/.../unnormalTripple");
+ assertGetSafeNameFail("../slipped");
+ assertGetSafeNameFail("dir1/../../slipped");
+
+ // https://github.com/eclipse-jdt/eclipse.jdt.core/pull/2015#issuecomment-2009162226
+ assertGetSafeNamePass("overrides/..ROOT...override");
+ }
+
+ private void assertGetSafeNamePass(String entryName) {
+ String zipfileName = "any";
+ assertEquals(entryName, Util.getEntryName(zipfileName, new java.util.zip.ZipEntry(entryName)));
+ }
+
+ private void assertGetSafeNameFail(String entryName) {
+ String zipfileName = "any";
+ try {
+ String n = Util.getEntryName(zipfileName, new java.util.zip.ZipEntry(entryName));
+ assertFalse("Expected IllegalArgumentException but got " + n, true);
+ } catch (IllegalArgumentException expected) {
+ // expected
+ }
+ }
}
\ No newline at end of file
diff --git a/org.eclipse.jdt.core/META-INF/MANIFEST.MF b/org.eclipse.jdt.core/META-INF/MANIFEST.MF
index bef66a8e77d..9722a37e26f 100644
--- a/org.eclipse.jdt.core/META-INF/MANIFEST.MF
+++ b/org.eclipse.jdt.core/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.jdt.core; singleton:=true
-Bundle-Version: 3.37.0.qualifier
+Bundle-Version: 3.37.1.qualifier
Bundle-Activator: org.eclipse.jdt.core.JavaCore
Bundle-Vendor: %providerName
Bundle-Localization: plugin
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JarPackageFragmentRoot.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JarPackageFragmentRoot.java
index f331d97f3d2..f370b3cb58e 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JarPackageFragmentRoot.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JarPackageFragmentRoot.java
@@ -150,10 +150,7 @@ protected boolean computeChildren(OpenableElementInfo info, IResource underlying
int length = version.length();
for (Enumeration extends ZipEntry> e= jar.entries(); e.hasMoreElements();) {
ZipEntry member= e.nextElement();
- String name = member.getName();
- if (name.contains("..")) { //$NON-NLS-1$
- throw new IllegalArgumentException("Bad zip entry: "+name+" in "+jar.getName()); //$NON-NLS-1$ //$NON-NLS-2$
- }
+ String name = Util.getEntryName(jar.getName(), member);
if (this.multiVersion && name.length() > (length + 2) && name.startsWith(version)) {
int end = name.indexOf('/', length);
if (end >= name.length()) continue;
@@ -194,6 +191,7 @@ protected boolean computeChildren(OpenableElementInfo info, IResource underlying
((JarPackageFragmentRootInfo) info).overriddenClasses = overridden;
return true;
}
+
protected IJavaElement[] createChildren(final HashtableOfArrayToObject rawPackageInfo) {
IJavaElement[] children;
// loop through all of referenced packages, creating package fragments if necessary
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/Util.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/Util.java
index 395719f8d65..3a4028d4fc1 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/Util.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/Util.java
@@ -3341,4 +3341,13 @@ public static IMethod findMethod(IType type, char[] selector, String[] paramType
}
return method;
}
+
+ public static String getEntryName(String zipfileName, ZipEntry entry) {
+ String entryName = entry.getName();
+ if (!java.nio.file.Path.of(zipfileName, entryName).normalize()
+ .startsWith(java.nio.file.Path.of(zipfileName).normalize())) {
+ throw new IllegalArgumentException("Bad zip entry: " + entryName + " in " + zipfileName); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ return entryName; // did not escape
+ }
}
diff --git a/org.eclipse.jdt.core/pom.xml b/org.eclipse.jdt.core/pom.xml
index 9961471b423..2bc09978701 100644
--- a/org.eclipse.jdt.core/pom.xml
+++ b/org.eclipse.jdt.core/pom.xml
@@ -17,7 +17,7 @@
4.31.0-SNAPSHOT
org.eclipse.jdt.core
- 3.37.0-SNAPSHOT
+ 3.37.1-SNAPSHOT
eclipse-plugin