diff --git a/platform/util/src/com/intellij/util/lang/UrlClassLoader.java b/platform/util/src/com/intellij/util/lang/UrlClassLoader.java index 4afc12c457f3..f4317b6d037c 100644 --- a/platform/util/src/com/intellij/util/lang/UrlClassLoader.java +++ b/platform/util/src/com/intellij/util/lang/UrlClassLoader.java @@ -18,6 +18,7 @@ package com.intellij.util.lang; import com.intellij.openapi.application.PathManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.SystemInfo; +import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.io.win32.IdeaWin32; import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.Function; @@ -281,8 +282,7 @@ public class UrlClassLoader extends ClassLoader { @Nullable private Resource _getResource(final String name) { - String n = name; - n = StringUtil.trimStart(n, "/"); + String n = StringUtil.trimStart(FileUtil.toCanonicalUriPath(name), "/"); return getClassPath().getResource(n, true); } diff --git a/platform/util/testSrc/com/intellij/util/lang/UrlClassLoaderTest.java b/platform/util/testSrc/com/intellij/util/lang/UrlClassLoaderTest.java index f3c0ea5a3f08..b9d3b47b4a7d 100644 --- a/platform/util/testSrc/com/intellij/util/lang/UrlClassLoaderTest.java +++ b/platform/util/testSrc/com/intellij/util/lang/UrlClassLoaderTest.java @@ -52,6 +52,17 @@ public class UrlClassLoaderTest { assertNotNull(UrlClassLoader.build().allowBootstrapResources().get().getResourceAsStream(name)); } + @Test + public void testNonCanonicalPaths() throws IOException { + File root = FileUtil.createTempDirectory("testNonCanonicalPaths", ""); + File subDir = createTestDir(root, "dir"); + createTestFile(subDir, "a.txt"); + + UrlClassLoader loader = UrlClassLoader.build().urls(root.toURI().toURL()).get(); + assertNotNull(loader.getResourceAsStream("/dir/a.txt")); + assertNotNull(loader.getResourceAsStream("/dir/a.txt/../a.txt")); + } + @Test public void testConcurrentResourceLoading() throws Exception { List resourceNames = ContainerUtil.newArrayList();