Author: markt
Date: Thu Jul 30 14:12:17 2015
New Revision: 1693429

URL: http://svn.apache.org/r1693429
Log:
Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=58125
Avoid a possible ClassCircularityError when running under a security manager

Modified:
    tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoaderBase.java

Modified: 
tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoaderBase.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoaderBase.java?rev=1693429&r1=1693428&r2=1693429&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoaderBase.java 
(original)
+++ tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoaderBase.java Thu 
Jul 30 14:12:17 2015
@@ -1228,8 +1228,25 @@ public abstract class WebappClassLoaderB
             //       the webapp from overriding Java SE classes. This 
implements
             //       SRV.10.7.2
             String resourceName = binaryNameToPath(name, false);
+
             ClassLoader javaseLoader = getJavaseClassLoader();
-            if (javaseLoader.getResource(resourceName) != null) {
+            boolean tryLoadingFromJavaseLoader;
+            try {
+                // Use getResource as it won't trigger an expensive
+                // ClassNotFoundException if the resource is not available from
+                // the Java SE class loader. However (see
+                // https://bz.apache.org/bugzilla/show_bug.cgi?id=58125 for
+                // details) when running under a security manager in rare cases
+                // this call may trigger a ClassCircularityError.
+                tryLoadingFromJavaseLoader = 
(javaseLoader.getResource(resourceName) != null);
+            } catch (ClassCircularityError cce) {
+                // The getResource() trick won't work for this class. We have 
to
+                // try loading it directly and accept that we might get a
+                // ClassNotFoundException.
+                tryLoadingFromJavaseLoader = true;
+            }
+
+            if (tryLoadingFromJavaseLoader) {
                 try {
                     clazz = javaseLoader.loadClass(name);
                     if (clazz != null) {



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

Reply via email to