This is an automated email from the ASF dual-hosted git repository.

markt pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tomcat.git

commit eb91c3e64b327c19cd406338185100f0b5dfd74b
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Mon Feb 17 11:42:30 2025 +0000

    Align resource lookup with standard class loader behaviour
    
    When searching the web application class loader for a resource or
    resources by name, align the behaviour with the JRE class loaders and
    always return null if the provided name starts with "/".
---
 .../org/apache/catalina/loader/WebappClassLoaderBase.java | 14 +++++++++++---
 .../org/apache/catalina/loader/TestWebappClassLoader.java | 15 +++++++++++++++
 webapps/docs/changelog.xml                                |  6 ++++++
 3 files changed, 32 insertions(+), 3 deletions(-)

diff --git a/java/org/apache/catalina/loader/WebappClassLoaderBase.java 
b/java/org/apache/catalina/loader/WebappClassLoaderBase.java
index a34223a0b7..dfa13e814a 100644
--- a/java/org/apache/catalina/loader/WebappClassLoaderBase.java
+++ b/java/org/apache/catalina/loader/WebappClassLoaderBase.java
@@ -711,6 +711,10 @@ public abstract class WebappClassLoaderBase extends 
URLClassLoader
 
         URL url = null;
 
+        if (name.startsWith("/")) {
+            return null;
+        }
+
         String path = nameToPath(name);
 
         if (!notFoundClassResources.contains(path)) {
@@ -763,6 +767,10 @@ public abstract class WebappClassLoaderBase extends 
URLClassLoader
 
         LinkedHashSet<URL> result = new LinkedHashSet<>();
 
+        if (name.startsWith("/")) {
+            return null;
+        }
+
         String path = nameToPath(name);
 
         WebResource[] webResources = resources.getClassLoaderResources(path);
@@ -912,6 +920,9 @@ public abstract class WebappClassLoaderBase extends 
URLClassLoader
         if (log.isTraceEnabled()) {
             log.trace("  Searching local repositories");
         }
+        if (name.startsWith("/")) {
+            return null;
+        }
         String path = nameToPath(name);
         if (!notFoundClassResources.contains(path)) {
             WebResource resource = resources.getClassLoaderResource(path);
@@ -2154,9 +2165,6 @@ public abstract class WebappClassLoaderBase extends 
URLClassLoader
 
 
     private String nameToPath(String name) {
-        if (name.startsWith("/")) {
-            return name;
-        }
         StringBuilder path = new StringBuilder(1 + name.length());
         path.append('/');
         path.append(name);
diff --git a/test/org/apache/catalina/loader/TestWebappClassLoader.java 
b/test/org/apache/catalina/loader/TestWebappClassLoader.java
index 11b53ab7e3..14c96db3cf 100644
--- a/test/org/apache/catalina/loader/TestWebappClassLoader.java
+++ b/test/org/apache/catalina/loader/TestWebappClassLoader.java
@@ -24,6 +24,7 @@ import java.net.URLClassLoader;
 import org.junit.Assert;
 import org.junit.Test;
 
+import org.apache.catalina.Context;
 import org.apache.catalina.core.StandardContext;
 import org.apache.catalina.startup.Tomcat;
 import org.apache.catalina.startup.TomcatBaseTest;
@@ -172,4 +173,18 @@ public class TestWebappClassLoader extends TomcatBaseTest {
             }
         }
     }
+
+
+    @Test
+    public void testResourceName() throws Exception {
+        Tomcat tomcat = getTomcatInstanceTestWebapp(false, true);
+
+        ClassLoader cl = ((Context) 
tomcat.getHost().findChildren()[0]).getLoader().getClassLoader();
+
+        URL u1 = cl.getResource("org/apache/tomcat/Bug58096.java");
+        Assert.assertNotNull(u1);
+
+        URL u2 = cl.getResource("/org/apache/tomcat/Bug58096.java");
+        Assert.assertNull(u2);
+    }
 }
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index 60fa73cea2..0c17363a69 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -143,6 +143,12 @@
         of <strong>Context</strong> from <code>decode</code> to
         <code>reject</code>. (markt)
       </update>
+      <fix>
+        When searching the web application class loader for a resource or
+        resources by name, align the behaviour with the JRE class loaders and
+        always return <code>null</code> if the provided name starts with
+        <code>/</code>. (markt)
+      </fix>
       <!-- Entries for backport and removal before 12.0.0-M1 below this line 
-->
     </changelog>
   </subsection>


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to