Author: rjung
Date: Mon Jan 25 16:00:42 2016
New Revision: 1726648

URL: http://svn.apache.org/viewvc?rev=1726648&view=rev
Log:
Split filter() in class loading and resource
loading cases. Deprecate unified filter(String)
method and suggest using filter(String, boolean)
instead.

For now the patterns for permit and deny are the
same (except for replacing the class name dots
by resource path slashes).

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=1726648&r1=1726647&r2=1726648&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoaderBase.java 
(original)
+++ tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoaderBase.java Mon 
Jan 25 16:00:42 2016
@@ -275,22 +275,42 @@ public abstract class WebappClassLoaderB
 
     /**
      * Regular expression of package names which are not allowed to be loaded
-     * from a webapp class loader without delegating first.
+     * from a webapp class loader as classes without delegating first.
      */
-    private final Matcher packageTriggersDeny = Pattern.compile(
-            
"^(?:javax[./](?:el|security[./]auth[./]message|servlet|websocket)|" +
-            
"org[./]apache[./](?:catalina|coyote|el|jasper|juli|naming|tomcat))[./]"
+    private final Matcher classPackageTriggersDeny = Pattern.compile(
+            "^(?:javax\\.(?:el|security\\.auth\\.message|servlet|websocket)|" +
+            
"org\\.apache\\.(?:catalina|coyote|el|jasper|juli|naming|tomcat))\\."
             ).matcher("");
 
 
     /**
+     * Regular expression of package names which are not allowed to be loaded
+     * from a webapp class loader as resources without delegating first.
+     */
+    private final Matcher resourcePackageTriggersDeny = Pattern.compile(
+            "^(?:javax/(?:el|security/auth/message|servlet|websocket)|" +
+            "org/apache/(?:catalina|coyote|el|jasper|juli|naming|tomcat))/"
+            ).matcher("");
+
+
+    /**
+     * Regular expression of package names which are allowed to be loaded from 
a
+     * webapp class loader as classes without delegating first.
+     * These take precedence over those set via {@link 
#classPackageTriggersDeny}.
+     */
+    private final Matcher classPackageTriggersPermit =
+            Pattern.compile("^(?:javax\\.servlet\\.jsp\\.jstl|" +
+                    "org\\.apache\\.tomcat\\.jdbc)\\.").matcher("");
+
+
+    /**
      * Regular expression of package names which are allowed to be loaded from 
a
-     * webapp class loader without delegating first and override any set by
-     * {@link #packageTriggersDeny}.
+     * webapp class loader as resources without delegating first.
+     * These take precedence over those set via {@link 
#resourcePackageTriggersDeny}.
      */
-    private final Matcher packageTriggersPermit =
-            Pattern.compile("^(?:javax[./]servlet[./]jsp[./]jstl|" +
-                    "org[./]apache[./]tomcat[./]jdbc)[./]").matcher("");
+    private final Matcher resourcePackageTriggersPermit =
+            Pattern.compile("^(?:javax/servlet/jsp/jstl|" +
+                    "org/apache/tomcat/jdbc)/").matcher("");
 
 
     /**
@@ -1038,7 +1058,7 @@ public abstract class WebappClassLoaderB
 
         URL url = null;
 
-        boolean delegateFirst = delegate || filter(name);
+        boolean delegateFirst = delegate || filter(name, false);
 
         // (1) Delegate to parent if requested
         if (delegateFirst) {
@@ -1105,7 +1125,7 @@ public abstract class WebappClassLoaderB
             return (stream);
         }
 
-        boolean delegateFirst = delegate || filter(name);
+        boolean delegateFirst = delegate || filter(name, false);
 
         // (1) Delegate to parent if requested
         if (delegateFirst) {
@@ -1283,7 +1303,7 @@ public abstract class WebappClassLoaderB
                 }
             }
 
-            boolean delegateLoad = delegate || filter(name);
+            boolean delegateLoad = delegate || filter(name, true);
 
             // (1) Delegate to our parent if requested
             if (delegateLoad) {
@@ -2783,28 +2803,53 @@ public abstract class WebappClassLoaderB
      * Filter classes.
      *
      * @param name class name
+     * @param isClassName <code>true</code> if name is a class name,
+     *                <code>false</code> if name is a resource name
      * @return <code>true</code> if the class should be filtered
      */
-    protected boolean filter(String name) {
+    protected boolean filter(String name, boolean isClassName) {
 
         if (name == null)
             return false;
 
         synchronized(packageTriggerLock) {
-            packageTriggersPermit.reset(name);
-            if (packageTriggersPermit.lookingAt()) {
-                return false;
-            }
-            packageTriggersDeny.reset(name);
-            if (packageTriggersDeny.lookingAt()) {
-                return true;
+            if (isClassName) {
+                classPackageTriggersPermit.reset(name);
+                if (classPackageTriggersPermit.lookingAt()) {
+                    return false;
+                }
+                classPackageTriggersDeny.reset(name);
+                if (classPackageTriggersDeny.lookingAt()) {
+                    return true;
+                }
+            } else {
+                resourcePackageTriggersPermit.reset(name);
+                if (resourcePackageTriggersPermit.lookingAt()) {
+                    return false;
+                }
+                resourcePackageTriggersDeny.reset(name);
+                if (resourcePackageTriggersDeny.lookingAt()) {
+                    return true;
+                }
             }
         }
-
         return false;
     }
 
 
+    /**
+     * Filter classes.
+     *
+     * @param name class name
+     * @return <code>true</code> if the class should be filtered
+     * @deprecated Use {@link #filter(String, boolean)}
+     */
+    @Deprecated
+    protected boolean filter(String name) {
+        return filter(name, true) || filter(name, false);
+    }
+
+
     @Override
     protected void addURL(URL url) {
         super.addURL(url);



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

Reply via email to