Author: kkolinko
Date: Tue Dec 12 10:15:59 2017
New Revision: 1817901

URL: http://svn.apache.org/viewvc?rev=1817901&view=rev
Log:
Fix bug 47214 and as a followup to bug 61886 fix: Use a loop to preload 
anonymous inner classes.

Modified:
    
tomcat/tc7.0.x/trunk/java/org/apache/catalina/security/SecurityClassLoad.java
    tomcat/tc7.0.x/trunk/java/org/apache/jasper/security/SecurityClassLoad.java
    tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml

Modified: 
tomcat/tc7.0.x/trunk/java/org/apache/catalina/security/SecurityClassLoad.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/security/SecurityClassLoad.java?rev=1817901&r1=1817900&r2=1817901&view=diff
==============================================================================
--- 
tomcat/tc7.0.x/trunk/java/org/apache/catalina/security/SecurityClassLoad.java 
(original)
+++ 
tomcat/tc7.0.x/trunk/java/org/apache/catalina/security/SecurityClassLoad.java 
Tue Dec 12 10:15:59 2017
@@ -52,51 +52,21 @@ public final class SecurityClassLoad {
     private static final void loadCorePackage(ClassLoader loader)
         throws Exception {
         final String basePackage = "org.apache.catalina.core.";
-        loader.loadClass
-            (basePackage +
-             "AccessLogAdapter");
-        loader.loadClass
-            (basePackage +
-             "ApplicationContextFacade$1");
-        loader.loadClass
-            (basePackage +
-             "ApplicationDispatcher$PrivilegedForward");
-        loader.loadClass
-            (basePackage +
-             "ApplicationDispatcher$PrivilegedInclude");
-        loader.loadClass
-            (basePackage +
-            "AsyncContextImpl");
-        loader.loadClass
-            (basePackage +
-            "AsyncContextImpl$DebugException");
-        loader.loadClass
-            (basePackage +
-            "AsyncContextImpl$1");
-        loader.loadClass
-            (basePackage +
-            "AsyncListenerWrapper");
-        loader.loadClass
-            (basePackage +
-             "ContainerBase$PrivilegedAddChild");
-        loader.loadClass
-            (basePackage +
-             "DefaultInstanceManager$1");
-        loader.loadClass
-            (basePackage +
-             "DefaultInstanceManager$2");
-        loader.loadClass
-            (basePackage +
-             "DefaultInstanceManager$3");
-        loader.loadClass
-            (basePackage +
-             "DefaultInstanceManager$AnnotationCacheEntry");
-        loader.loadClass
-            (basePackage +
-             "DefaultInstanceManager$AnnotationCacheEntryType");
-        loader.loadClass
-            (basePackage +
-             "ApplicationHttpRequest$AttributeNamesEnumerator");
+        loader.loadClass(basePackage + "AccessLogAdapter");
+        loadAnonymousInnerClasses(loader, basePackage + 
"ApplicationContextFacade");
+        loader.loadClass(basePackage + 
"ApplicationDispatcher$PrivilegedForward");
+        loader.loadClass(basePackage + 
"ApplicationDispatcher$PrivilegedInclude");
+        loader.loadClass(basePackage + "AsyncContextImpl");
+        loader.loadClass(basePackage + "AsyncContextImpl$DebugException");
+        loadAnonymousInnerClasses(loader, basePackage + "AsyncContextImpl");
+        loader.loadClass(basePackage + "AsyncListenerWrapper");
+        loader.loadClass(basePackage + "ContainerBase$PrivilegedAddChild");
+        loadAnonymousInnerClasses(loader, basePackage + 
"DefaultInstanceManager");
+        loader.loadClass(basePackage + "DefaultInstanceManager$2");
+        loader.loadClass(basePackage + "DefaultInstanceManager$3");
+        loader.loadClass(basePackage + 
"DefaultInstanceManager$AnnotationCacheEntry");
+        loader.loadClass(basePackage + 
"DefaultInstanceManager$AnnotationCacheEntryType");
+        loader.loadClass(basePackage + 
"ApplicationHttpRequest$AttributeNamesEnumerator");
     }
 
 
@@ -135,12 +105,9 @@ public final class SecurityClassLoad {
     private static final void loadSessionPackage(ClassLoader loader)
         throws Exception {
         final String basePackage = "org.apache.catalina.session.";
-        loader.loadClass
-            (basePackage + "StandardSession");
-        loader.loadClass
-            (basePackage + "StandardSession$1");
-        loader.loadClass
-            (basePackage + "StandardManager$PrivilegedDoUnload");
+        loader.loadClass(basePackage + "StandardSession");
+        loadAnonymousInnerClasses(loader, basePackage + "StandardSession");
+        loader.loadClass(basePackage + "StandardManager$PrivilegedDoUnload");
     }
 
 
@@ -163,11 +130,12 @@ public final class SecurityClassLoad {
     private static final void loadCoyotePackage(ClassLoader loader)
             throws Exception {
         final String basePackage = "org.apache.coyote.";
-        // Classes created by the Java 6 compiler because we use switch with 
an enum
-        loader.loadClass(basePackage + "http11.Http11Processor$1");
-        loader.loadClass(basePackage + "http11.Http11NioProcessor$1");
-        loader.loadClass(basePackage + "http11.Http11AprProcessor$1");
-        loader.loadClass(basePackage + "http11.AbstractOutputBuffer$1");
+        // Java 6 compiler creates helper *$1 classes because we use switch 
with an enum
+        loadAnonymousInnerClasses(loader, basePackage + 
"http11.AbstractHttp11Processor");
+        loadAnonymousInnerClasses(loader, basePackage + 
"http11.Http11Processor");
+        loadAnonymousInnerClasses(loader, basePackage + 
"http11.Http11NioProcessor");
+        loadAnonymousInnerClasses(loader, basePackage + 
"http11.Http11AprProcessor");
+        loadAnonymousInnerClasses(loader, basePackage + 
"http11.AbstractOutputBuffer");
         loader.loadClass(basePackage + "http11.Constants");
         // Make sure system property is read at this point
         Class<?> clazz = loader.loadClass(basePackage + "Constants");
@@ -184,84 +152,26 @@ public final class SecurityClassLoad {
     private static final void loadConnectorPackage(ClassLoader loader)
         throws Exception {
         final String basePackage = "org.apache.catalina.connector.";
-        loader.loadClass
-            (basePackage +
-             "RequestFacade$GetAttributePrivilegedAction");
-        loader.loadClass
-            (basePackage +
-             "RequestFacade$GetParameterMapPrivilegedAction");
-        loader.loadClass
-            (basePackage +
-             "RequestFacade$GetRequestDispatcherPrivilegedAction");
-        loader.loadClass
-            (basePackage +
-             "RequestFacade$GetParameterPrivilegedAction");
-        loader.loadClass
-            (basePackage +
-             "RequestFacade$GetParameterNamesPrivilegedAction");
-        loader.loadClass
-            (basePackage +
-             "RequestFacade$GetParameterValuePrivilegedAction");
-        loader.loadClass
-            (basePackage +
-             "RequestFacade$GetCharacterEncodingPrivilegedAction");
-        loader.loadClass
-            (basePackage +
-             "RequestFacade$GetHeadersPrivilegedAction");
-        loader.loadClass
-            (basePackage +
-             "RequestFacade$GetHeaderNamesPrivilegedAction");
-        loader.loadClass
-            (basePackage +
-             "RequestFacade$GetCookiesPrivilegedAction");
-        loader.loadClass
-            (basePackage +
-             "RequestFacade$GetLocalePrivilegedAction");
-        loader.loadClass
-            (basePackage +
-             "RequestFacade$GetLocalesPrivilegedAction");
-        loader.loadClass
-            (basePackage +
-             "ResponseFacade$SetContentTypePrivilegedAction");
-        loader.loadClass
-            (basePackage +
-             "ResponseFacade$DateHeaderPrivilegedAction");
-        loader.loadClass
-            (basePackage +
-             "RequestFacade$GetSessionPrivilegedAction");
-        loader.loadClass
-            (basePackage +
-             "ResponseFacade$1");
-        loader.loadClass
-            (basePackage +
-             "OutputBuffer$1");
-        loader.loadClass
-            (basePackage +
-             "CoyoteInputStream$1");
-        loader.loadClass
-            (basePackage +
-             "CoyoteInputStream$2");
-        loader.loadClass
-            (basePackage +
-             "CoyoteInputStream$3");
-        loader.loadClass
-            (basePackage +
-             "CoyoteInputStream$4");
-        loader.loadClass
-            (basePackage +
-             "CoyoteInputStream$5");
-        loader.loadClass
-            (basePackage +
-             "InputBuffer$1");
-        loader.loadClass
-            (basePackage +
-             "Response$1");
-        loader.loadClass
-            (basePackage +
-             "Response$2");
-        loader.loadClass
-            (basePackage +
-             "Response$3");
+        loader.loadClass(basePackage + 
"RequestFacade$GetAttributePrivilegedAction");
+        loader.loadClass(basePackage + 
"RequestFacade$GetParameterMapPrivilegedAction");
+        loader.loadClass(basePackage + 
"RequestFacade$GetRequestDispatcherPrivilegedAction");
+        loader.loadClass(basePackage + 
"RequestFacade$GetParameterPrivilegedAction");
+        loader.loadClass(basePackage + 
"RequestFacade$GetParameterNamesPrivilegedAction");
+        loader.loadClass(basePackage + 
"RequestFacade$GetParameterValuePrivilegedAction");
+        loader.loadClass(basePackage + 
"RequestFacade$GetCharacterEncodingPrivilegedAction");
+        loader.loadClass(basePackage + 
"RequestFacade$GetHeadersPrivilegedAction");
+        loader.loadClass(basePackage + 
"RequestFacade$GetHeaderNamesPrivilegedAction");
+        loader.loadClass(basePackage + 
"RequestFacade$GetCookiesPrivilegedAction");
+        loader.loadClass(basePackage + 
"RequestFacade$GetLocalePrivilegedAction");
+        loader.loadClass(basePackage + 
"RequestFacade$GetLocalesPrivilegedAction");
+        loader.loadClass(basePackage + 
"ResponseFacade$SetContentTypePrivilegedAction");
+        loader.loadClass(basePackage + 
"ResponseFacade$DateHeaderPrivilegedAction");
+        loader.loadClass(basePackage + 
"RequestFacade$GetSessionPrivilegedAction");
+        loadAnonymousInnerClasses(loader, basePackage + "ResponseFacade");
+        loadAnonymousInnerClasses(loader, basePackage + "OutputBuffer");
+        loadAnonymousInnerClasses(loader, basePackage + "CoyoteInputStream");
+        loadAnonymousInnerClasses(loader, basePackage + "InputBuffer");
+        loadAnonymousInnerClasses(loader, basePackage + "Response");
     }
 
     private static final void loadTomcatPackage(ClassLoader loader)
@@ -290,17 +200,22 @@ public final class SecurityClassLoad {
         loader.loadClass(basePackage + "jni.Status");
         // net
         loader.loadClass(basePackage + "util.net.Constants");
-        loader.loadClass(basePackage +
-                "util.net.NioBlockingSelector$BlockPoller$1");
-        loader.loadClass(basePackage +
-                "util.net.NioBlockingSelector$BlockPoller$2");
-        loader.loadClass(basePackage +
-                "util.net.NioBlockingSelector$BlockPoller$3");
+        loadAnonymousInnerClasses(loader, basePackage + 
"util.net.NioBlockingSelector$BlockPoller");
         loader.loadClass(basePackage + "util.net.SendfileState");
         loader.loadClass(basePackage + "util.net.SSLSupport$CipherData");
         // security
         loader.loadClass(basePackage + "util.security.PrivilegedGetTccl");
         loader.loadClass(basePackage + "util.security.PrivilegedSetTccl");
     }
+
+    private static final void loadAnonymousInnerClasses(ClassLoader loader, 
String enclosingClass) {
+        try {
+            for (int i = 1;; i++) {
+                loader.loadClass(enclosingClass + '$' + i);
+            }
+        } catch (ClassNotFoundException ignored) {
+            //
+        }
+    }
 }
 

Modified: 
tomcat/tc7.0.x/trunk/java/org/apache/jasper/security/SecurityClassLoad.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/jasper/security/SecurityClassLoad.java?rev=1817901&r1=1817900&r2=1817901&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/java/org/apache/jasper/security/SecurityClassLoad.java 
(original)
+++ tomcat/tc7.0.x/trunk/java/org/apache/jasper/security/SecurityClassLoad.java 
Tue Dec 12 10:15:59 2017
@@ -57,32 +57,8 @@ public final class SecurityClassLoad {
             loader.loadClass( basePackage +
                 "runtime.ProtectedFunctionMapper");
 
-            loader.loadClass( basePackage +
-                "runtime.PageContextImpl");      
-            loader.loadClass( basePackage +
-                "runtime.PageContextImpl$1");      
-            loader.loadClass( basePackage +
-                "runtime.PageContextImpl$2");      
-            loader.loadClass( basePackage +
-                "runtime.PageContextImpl$3");      
-            loader.loadClass( basePackage +
-                "runtime.PageContextImpl$4");      
-            loader.loadClass( basePackage +
-                "runtime.PageContextImpl$5");      
-            loader.loadClass( basePackage +
-                "runtime.PageContextImpl$6");      
-            loader.loadClass( basePackage +
-                "runtime.PageContextImpl$7");      
-            loader.loadClass( basePackage +
-                "runtime.PageContextImpl$8");      
-            loader.loadClass( basePackage +
-                "runtime.PageContextImpl$9");      
-            loader.loadClass( basePackage +
-                "runtime.PageContextImpl$10");      
-            loader.loadClass( basePackage +
-                "runtime.PageContextImpl$11");      
-            loader.loadClass( basePackage +
-                "runtime.PageContextImpl$12");      
+            loader.loadClass( basePackage + "runtime.PageContextImpl");
+            loadAnonymousInnerClasses(loader, basePackage + 
"runtime.PageContextImpl");
 
             loader.loadClass( basePackage +
                 "runtime.JspContextWrapper");   
@@ -93,10 +69,19 @@ public final class SecurityClassLoad {
             loader.loadClass( basePackage +
                 "servlet.JspServletWrapper");
 
-            loader.loadClass( basePackage +
-                "runtime.JspWriterImpl$1");
+            loadAnonymousInnerClasses(loader, "runtime.JspWriterImpl");
         } catch (ClassNotFoundException ex) {
             log.error("SecurityClassLoad", ex);
         }
     }
+
+    private static final void loadAnonymousInnerClasses(ClassLoader loader, 
String enclosingClass) {
+        try {
+            for (int i = 1;; i++) {
+                loader.loadClass(enclosingClass + '$' + i);
+            }
+        } catch (ClassNotFoundException ignored) {
+            //
+        }
+    }
 }

Modified: tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml?rev=1817901&r1=1817900&r2=1817901&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml Tue Dec 12 10:15:59 2017
@@ -61,6 +61,11 @@
   <subsection name="Catalina">
     <changelog>
       <fix>
+        <bug>47214</bug>: Use a loop to preload anonymous inner classes
+        when running under a <code>SecurityManager</code>, to be safe for
+        future changes in the code or using a different compiler. (kkolinko)
+      </fix>
+      <fix>
         <bug>61886</bug>: Pre-load additional classes to prevent
         <code>SecurityException</code>s if the first request received when
         running under a <code>SecurityManager</code> is an asynchronous 
Servlet.



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

Reply via email to