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

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

commit fc63185a77c678b4adbb106e1302a808cc980bd3
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Wed Nov 20 20:20:59 2024 +0000

    Fix BZ 69447 notFoundClassResources should allow for external resources
---
 .../catalina/loader/WebappClassLoaderBase.java     | 64 +++++++++++++---------
 webapps/docs/changelog.xml                         |  6 ++
 2 files changed, 44 insertions(+), 26 deletions(-)

diff --git a/java/org/apache/catalina/loader/WebappClassLoaderBase.java 
b/java/org/apache/catalina/loader/WebappClassLoaderBase.java
index 3da0ab4898..b06fefa61b 100644
--- a/java/org/apache/catalina/loader/WebappClassLoaderBase.java
+++ b/java/org/apache/catalina/loader/WebappClassLoaderBase.java
@@ -783,6 +783,12 @@ public abstract class WebappClassLoaderBase extends 
URLClassLoader
 
         checkStateForClassLoading(name);
 
+        if (name == null) {
+            throw new ClassNotFoundException("null");
+        }
+
+        String path = binaryNameToPath(name, true);
+
         // (1) Permission to define this class when using a SecurityManager
         if (securityManager != null) {
             int i = name.lastIndexOf('.');
@@ -808,25 +814,14 @@ public abstract class WebappClassLoaderBase extends 
URLClassLoader
             if (log.isTraceEnabled()) {
                 log.trace("      findClassInternal(" + name + ")");
             }
-            try {
-                if (securityManager != null) {
-                    PrivilegedAction<Class<?>> dp = new 
PrivilegedFindClassByName(name);
-                    clazz = AccessController.doPrivileged(dp);
-                } else {
-                    clazz = findClassInternal(name);
-                }
-            } catch (AccessControlException ace) {
-                log.warn(sm.getString("webappClassLoader.securityException", 
name, ace.getMessage()), ace);
-                throw new ClassNotFoundException(name, ace);
-            } catch (RuntimeException e) {
-                if (log.isTraceEnabled()) {
-                    log.trace("      -->RuntimeException Rethrown", e);
-                }
-                throw e;
-            }
-            if (clazz == null && hasExternalRepositories) {
+            if (!notFoundClassResources.contains(path)) {
                 try {
-                    clazz = super.findClass(name);
+                    if (securityManager != null) {
+                        PrivilegedAction<Class<?>> dp = new 
PrivilegedFindClassByName(name);
+                        clazz = AccessController.doPrivileged(dp);
+                    } else {
+                        clazz = findClassInternal(name);
+                    }
                 } catch (AccessControlException ace) {
                     
log.warn(sm.getString("webappClassLoader.securityException", name, 
ace.getMessage()), ace);
                     throw new ClassNotFoundException(name, ace);
@@ -836,17 +831,32 @@ public abstract class WebappClassLoaderBase extends 
URLClassLoader
                     }
                     throw e;
                 }
+                if (clazz == null && hasExternalRepositories) {
+                    try {
+                        clazz = super.findClass(name);
+                    } catch (AccessControlException ace) {
+                        
log.warn(sm.getString("webappClassLoader.securityException", name, 
ace.getMessage()), ace);
+                        throw new ClassNotFoundException(name, ace);
+                    } catch (RuntimeException e) {
+                        if (log.isTraceEnabled()) {
+                            log.trace("      -->RuntimeException Rethrown", e);
+                        }
+                        throw e;
+                    }
+                }
             }
         } catch (ClassNotFoundException e) {
             if (log.isTraceEnabled()) {
                 log.trace("    --> Passing on ClassNotFoundException");
             }
+            notFoundClassResources.add(path);
             throw e;
         }
         if (clazz == null) {
             if (log.isTraceEnabled()) {
                 log.trace("    --> Returning ClassNotFoundException");
             }
+            notFoundClassResources.add(path);
             throw new ClassNotFoundException(name);
         }
 
@@ -2195,17 +2205,23 @@ public abstract class WebappClassLoaderBase extends 
URLClassLoader
         }
         String path = binaryNameToPath(name, true);
 
+        return findClassInternal(name, path);
+    }
+
+
+    /*
+     * The use of getPackage() is appropriate given that the code is checking 
if the package is sealed. Therefore,
+     * parent class loaders need to be checked.
+     */
+    @SuppressWarnings("deprecation")
+    private Class<?> findClassInternal(String name, String path) {
         ResourceEntry entry = resourceEntries.get(path);
         WebResource resource = null;
 
         if (entry == null) {
-            if (notFoundClassResources.contains(path)) {
-                return null;
-            }
             resource = resources.getClassLoaderResource(path);
 
             if (!resource.exists()) {
-                notFoundClassResources.add(path);
                 return null;
             }
 
@@ -2238,14 +2254,10 @@ public abstract class WebappClassLoaderBase extends 
URLClassLoader
             }
 
             if (resource == null) {
-                if (notFoundClassResources.contains(path)) {
-                    return null;
-                }
                 resource = resources.getClassLoaderResource(path);
             }
 
             if (!resource.exists()) {
-                notFoundClassResources.add(path);
                 return null;
             }
 
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index 34a5894ca4..958c4c34a3 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -155,6 +155,12 @@
         <code>Cache-Control</code> headers in the <code>ExpiresFilter</code>.
         Based on pull request <pr>777</pr> by Chenjp. (markt)
       </fix>
+      <fix>
+        <bug>69447</bug>: Update the support for caching classes the web
+        application class loader cannot find to take account of classes loaded
+        from external repositories. Prior to this fix, these classes could be
+        incorrectly marked as not found. (markt)
+      </fix>
     </changelog>
   </subsection>
   <subsection name="Coyote">


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

Reply via email to