jfarcand 2004/11/18 14:13:36 Modified: catalina/src/share/org/apache/catalina/core Tag: TOMCAT_5_0 ApplicationContextFacade.java ApplicationDispatcher.java ApplicationFilterChain.java StandardWrapper.java catalina/src/share/org/apache/catalina/security Tag: TOMCAT_5_0 SecurityUtil.java catalina/src/share/org/apache/catalina/session Tag: TOMCAT_5_0 PersistentManagerBase.java StandardManager.java StandardSession.java Log: When the package protection is not used, do not create the doPrivileged objects so we don't suffer the performance hit (15% faster with trade2 and this change). Also fixed a memory leak when security manager is turned on. Revision Changes Path No revision No revision 1.10.2.3 +32 -25 jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core/ApplicationContextFacade.java Index: ApplicationContextFacade.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core/ApplicationContextFacade.java,v retrieving revision 1.10.2.2 retrieving revision 1.10.2.3 diff -u -r1.10.2.2 -r1.10.2.3 --- ApplicationContextFacade.java 1 Oct 2004 01:10:17 -0000 1.10.2.2 +++ ApplicationContextFacade.java 18 Nov 2004 22:13:36 -0000 1.10.2.3 @@ -35,6 +35,8 @@ import javax.servlet.ServletContext; import javax.servlet.ServletException; +import org.apache.catalina.security.SecurityUtil; + /** * Facade object which masks the internal <code>ApplicationContext</code> @@ -118,7 +120,7 @@ public ServletContext getContext(String uripath) { ServletContext theContext = null; - if (System.getSecurityManager() != null) { + if (SecurityUtil.isPackageProtectionEnabled()) { theContext = (ServletContext) doPrivileged("getContext", new Object[]{uripath}); } else { @@ -143,7 +145,7 @@ public String getMimeType(String file) { - if (System.getSecurityManager() != null) { + if (SecurityUtil.isPackageProtectionEnabled()) { return (String)doPrivileged("getMimeType", new Object[]{file}); } else { return context.getMimeType(file); @@ -152,7 +154,7 @@ public Set getResourcePaths(String path) { - if (System.getSecurityManager() != null){ + if (SecurityUtil.isPackageProtectionEnabled()){ return (Set)doPrivileged("getResourcePaths", new Object[]{path}); } else { return context.getResourcePaths(path); @@ -179,7 +181,7 @@ public InputStream getResourceAsStream(String path) { - if (System.getSecurityManager() != null) { + if (SecurityUtil.isPackageProtectionEnabled()) { return (InputStream) doPrivileged("getResourceAsStream", new Object[]{path}); } else { @@ -189,7 +191,7 @@ public RequestDispatcher getRequestDispatcher(final String path) { - if (System.getSecurityManager() != null) { + if (SecurityUtil.isPackageProtectionEnabled()) { return (RequestDispatcher) doPrivileged("getRequestDispatcher", new Object[]{path}); } else { @@ -199,7 +201,7 @@ public RequestDispatcher getNamedDispatcher(String name) { - if (System.getSecurityManager() != null) { + if (SecurityUtil.isPackageProtectionEnabled()) { return (RequestDispatcher) doPrivileged("getNamedDispatcher", new Object[]{name}); } else { @@ -210,7 +212,7 @@ public Servlet getServlet(String name) throws ServletException { - if (System.getSecurityManager() != null) { + if (SecurityUtil.isPackageProtectionEnabled()) { try { return (Servlet) invokeMethod(context, "getServlet", new Object[]{name}); @@ -227,7 +229,7 @@ public Enumeration getServlets() { - if (System.getSecurityManager() != null) { + if (SecurityUtil.isPackageProtectionEnabled()) { return (Enumeration) doPrivileged("getServlets", null); } else { return context.getServlets(); @@ -236,7 +238,7 @@ public Enumeration getServletNames() { - if (System.getSecurityManager() != null) { + if (SecurityUtil.isPackageProtectionEnabled()) { return (Enumeration) doPrivileged("getServletNames", null); } else { return context.getServletNames(); @@ -245,7 +247,7 @@ public void log(String msg) { - if (System.getSecurityManager() != null) { + if (SecurityUtil.isPackageProtectionEnabled()) { doPrivileged("log", new Object[]{msg} ); } else { context.log(msg); @@ -254,7 +256,7 @@ public void log(Exception exception, String msg) { - if (System.getSecurityManager() != null) { + if (SecurityUtil.isPackageProtectionEnabled()) { doPrivileged("log", new Class[]{Exception.class, String.class}, new Object[]{exception,msg}); } else { @@ -264,7 +266,7 @@ public void log(String message, Throwable throwable) { - if (System.getSecurityManager() != null) { + if (SecurityUtil.isPackageProtectionEnabled()) { doPrivileged("log", new Class[]{String.class, Throwable.class}, new Object[]{message, throwable}); } else { @@ -274,7 +276,7 @@ public String getRealPath(String path) { - if (System.getSecurityManager() != null) { + if (SecurityUtil.isPackageProtectionEnabled()) { return (String) doPrivileged("getRealPath", new Object[]{path}); } else { return context.getRealPath(path); @@ -283,7 +285,7 @@ public String getServerInfo() { - if (System.getSecurityManager() != null) { + if (SecurityUtil.isPackageProtectionEnabled()) { return (String) doPrivileged("getServerInfo", null); } else { return context.getServerInfo(); @@ -292,7 +294,7 @@ public String getInitParameter(String name) { - if (System.getSecurityManager() != null) { + if (SecurityUtil.isPackageProtectionEnabled()) { return (String) doPrivileged("getInitParameter", new Object[]{name}); } else { @@ -302,7 +304,7 @@ public Enumeration getInitParameterNames() { - if (System.getSecurityManager() != null) { + if (SecurityUtil.isPackageProtectionEnabled()) { return (Enumeration) doPrivileged("getInitParameterNames", null); } else { return context.getInitParameterNames(); @@ -311,7 +313,7 @@ public Object getAttribute(String name) { - if (System.getSecurityManager() != null) { + if (SecurityUtil.isPackageProtectionEnabled()) { return doPrivileged("getAttribute", new Object[]{name}); } else { return context.getAttribute(name); @@ -320,7 +322,7 @@ public Enumeration getAttributeNames() { - if (System.getSecurityManager() != null) { + if (SecurityUtil.isPackageProtectionEnabled()) { return (Enumeration) doPrivileged("getAttributeNames", null); } else { return context.getAttributeNames(); @@ -329,7 +331,7 @@ public void setAttribute(String name, Object object) { - if (System.getSecurityManager() != null) { + if (SecurityUtil.isPackageProtectionEnabled()) { doPrivileged("setAttribute", new Object[]{name,object}); } else { context.setAttribute(name, object); @@ -338,7 +340,7 @@ public void removeAttribute(String name) { - if (System.getSecurityManager() != null) { + if (SecurityUtil.isPackageProtectionEnabled()) { doPrivileged("removeAttribute", new Object[]{name}); } else { context.removeAttribute(name); @@ -347,7 +349,7 @@ public String getServletContextName() { - if (System.getSecurityManager() != null) { + if (SecurityUtil.isPackageProtectionEnabled()) { return (String) doPrivileged("getServletContextName", null); } else { return context.getServletContextName(); @@ -401,7 +403,7 @@ */ private Object invokeMethod(ApplicationContext appContext, final String methodName, - final Object[] params) + Object[] params) throws Throwable{ try{ @@ -416,6 +418,8 @@ } catch (Exception ex){ handleException(ex, methodName); return null; + } finally { + params = null; } } @@ -428,7 +432,7 @@ */ private Object doPrivileged(final String methodName, final Class[] clazz, - final Object[] params){ + Object[] params){ try{ Method method = context.getClass() @@ -441,6 +445,8 @@ throw new RuntimeException(t.getMessage()); } return null; + } finally { + params = null; } } @@ -459,7 +465,7 @@ IllegalAccessException, InvocationTargetException { - if (System.getSecurityManager() != null){ + if (SecurityUtil.isPackageProtectionEnabled()){ return AccessController.doPrivileged(new PrivilegedExceptionAction(){ public Object run() throws IllegalAccessException, InvocationTargetException{ return method.invoke(context, params); @@ -472,6 +478,7 @@ /** + * * Throw the real exception. * @param ex The current exception */ 1.34.2.2 +2 -2 jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core/ApplicationDispatcher.java Index: ApplicationDispatcher.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core/ApplicationDispatcher.java,v retrieving revision 1.34.2.1 retrieving revision 1.34.2.2 diff -u -r1.34.2.1 -r1.34.2.2 --- ApplicationDispatcher.java 28 Sep 2004 13:23:11 -0000 1.34.2.1 +++ ApplicationDispatcher.java 18 Nov 2004 22:13:36 -0000 1.34.2.2 @@ -53,7 +53,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; - +import org.apache.catalina.security.SecurityUtil; /** * Standard implementation of <code>RequestDispatcher</code> that allows a * request to be forwarded to a different resource to create the ultimate 1.10.2.3 +23 -8 jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core/ApplicationFilterChain.java Index: ApplicationFilterChain.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core/ApplicationFilterChain.java,v retrieving revision 1.10.2.2 retrieving revision 1.10.2.3 diff -u -r1.10.2.2 -r1.10.2.3 --- ApplicationFilterChain.java 1 Oct 2004 01:10:17 -0000 1.10.2.2 +++ ApplicationFilterChain.java 18 Nov 2004 22:13:36 -0000 1.10.2.3 @@ -111,6 +111,22 @@ */ private InstanceSupport support = null; + + /** + * Static class array used when the SecurityManager is turned on and + * <code>doFilter</code is invoked. + */ + private static Class[] classType = new Class[]{ServletRequest.class, + ServletResponse.class, + FilterChain.class}; + + /** + * Static class array used when the SecurityManager is turned on and + * <code>service</code is invoked. + */ + private static Class[] classTypeUsedInService = new Class[]{ + ServletRequest.class, + ServletResponse.class}; // ---------------------------------------------------- FilterChain Methods @@ -176,12 +192,12 @@ final ServletResponse res = response; Principal principal = ((HttpServletRequest) req).getUserPrincipal(); - Class[] classType = new Class[]{ServletRequest.class, - ServletResponse.class, - FilterChain.class}; + Object[] args = new Object[]{req, res, this}; SecurityUtil.doAsPrivilege ("doFilter", filter, classType, args); + + args = null; } else { filter.doFilter(request, response, this); } @@ -225,14 +241,13 @@ final ServletResponse res = response; Principal principal = ((HttpServletRequest) req).getUserPrincipal(); - Class[] classType = new Class[]{ServletRequest.class, - ServletResponse.class}; Object[] args = new Object[]{req, res}; SecurityUtil.doAsPrivilege("service", servlet, - classType, + classTypeUsedInService, args, - principal); + principal); + args = null; } else { servlet.service((HttpServletRequest) request, (HttpServletResponse) response); 1.43.2.3 +21 -7 jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core/StandardWrapper.java Index: StandardWrapper.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core/StandardWrapper.java,v retrieving revision 1.43.2.2 retrieving revision 1.43.2.3 diff -u -r1.43.2.2 -r1.43.2.3 --- StandardWrapper.java 1 Oct 2004 01:10:17 -0000 1.43.2.2 +++ StandardWrapper.java 18 Nov 2004 22:13:36 -0000 1.43.2.3 @@ -239,7 +239,21 @@ private StandardWrapperValve swValve; private long loadTime=0; private int classLoadTime=0; - + + /** + * Static class array used when the SecurityManager is turned on and + * <code>Servlet.init</code> is invoked. + */ + private static Class[] classType = new Class[]{ServletConfig.class}; + + + /** + * Static class array used when the SecurityManager is turned on and + * <code>Servlet.service</code> is invoked. + */ + private static Class[] classTypeUsedInService = new Class[]{ + ServletRequest.class, + ServletResponse.class}; // ------------------------------------------------------------- Properties @@ -936,7 +950,7 @@ // Load the specified servlet class from the appropriate class loader Class classClass = null; try { - if (System.getSecurityManager() != null){ + if (SecurityUtil.isPackageProtectionEnabled()){ final ClassLoader fclassLoader = classLoader; final String factualClass = actualClass; try{ @@ -1019,12 +1033,13 @@ servlet); if( System.getSecurityManager() != null) { - Class[] classType = new Class[]{ServletConfig.class}; + Object[] args = new Object[]{((ServletConfig)facade)}; SecurityUtil.doAsPrivilege("init", servlet, classType, args); + args = null; } else { servlet.init(facade); } @@ -1038,13 +1053,12 @@ DummyResponse res = new DummyResponse(); if( System.getSecurityManager() != null) { - Class[] classType = new Class[]{ServletRequest.class, - ServletResponse.class}; Object[] args = new Object[]{req, res}; SecurityUtil.doAsPrivilege("service", servlet, - classType, + classTypeUsedInService, args); + args = null; } else { servlet.service(req, res); } No revision No revision 1.11.2.2 +18 -0 jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/security/SecurityUtil.java Index: SecurityUtil.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/security/SecurityUtil.java,v retrieving revision 1.11.2.1 retrieving revision 1.11.2.2 diff -u -r1.11.2.1 -r1.11.2.2 --- SecurityUtil.java 20 Aug 2004 14:28:38 -0000 1.11.2.1 +++ SecurityUtil.java 18 Nov 2004 22:13:36 -0000 1.11.2.2 @@ -68,6 +68,10 @@ private static String PACKAGE = "org.apache.catalina.security"; + private static boolean packageDefinitionEnabled = + (System.getProperty("package.definition") == null && + System.getProperty("package.access") == null) ? false : true; + /** * The string resources for this package. */ @@ -360,4 +364,18 @@ public static void remove(Object cachedObject){ objectCache.remove(cachedObject); } + + + /** + * Return the <code>SecurityManager</code> only if Security is enabled AND + * package protection mechanism is enabled. + */ + public static boolean isPackageProtectionEnabled(){ + if (packageDefinitionEnabled && System.getSecurityManager() != null){ + return true; + } + return false; + } + + } No revision No revision 1.19.2.1 +11 -9 jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/session/PersistentManagerBase.java Index: PersistentManagerBase.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/session/PersistentManagerBase.java,v retrieving revision 1.19 retrieving revision 1.19.2.1 diff -u -r1.19 -r1.19.2.1 --- PersistentManagerBase.java 26 May 2004 16:14:04 -0000 1.19 +++ PersistentManagerBase.java 18 Nov 2004 22:13:36 -0000 1.19.2.1 @@ -34,7 +34,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; - +import org.apache.catalina.security.SecurityUtil; /** * Extends the <b>ManagerBase</b> class to implement most of the * functionality required by a Manager which supports any kind of @@ -556,7 +556,7 @@ return; try { - if (System.getSecurityManager() != null){ + if (SecurityUtil.isPackageProtectionEnabled()){ try{ AccessController.doPrivileged(new PrivilegedStoreClear()); }catch(PrivilegedActionException ex){ @@ -661,9 +661,10 @@ String[] ids = null; try { - if (System.getSecurityManager() != null){ + if (SecurityUtil.isPackageProtectionEnabled()){ try{ - ids = (String[])AccessController.doPrivileged(new PrivilegedStoreKeys()); + ids = (String[]) + AccessController.doPrivileged(new PrivilegedStoreKeys()); }catch(PrivilegedActionException ex){ Exception exception = ex.getException(); log.error("Exception clearing the Store: " + exception); @@ -718,7 +719,7 @@ */ protected void removeSession(String id){ try { - if (System.getSecurityManager() != null){ + if (SecurityUtil.isPackageProtectionEnabled()){ try{ AccessController.doPrivileged(new PrivilegedStoreRemove(id)); }catch(PrivilegedActionException ex){ @@ -785,9 +786,10 @@ Session session = null; try { - if (System.getSecurityManager() != null){ + if (SecurityUtil.isPackageProtectionEnabled()){ try{ - session = (Session) AccessController.doPrivileged(new PrivilegedStoreLoad(id)); + session = (Session) + AccessController.doPrivileged(new PrivilegedStoreLoad(id)); }catch(PrivilegedActionException ex){ Exception exception = ex.getException(); log.error("Exception clearing the Store: " + exception); @@ -865,7 +867,7 @@ } try { - if (System.getSecurityManager() != null){ + if (SecurityUtil.isPackageProtectionEnabled()){ try{ AccessController.doPrivileged(new PrivilegedStoreSave(session)); }catch(PrivilegedActionException ex){ 1.22.2.1 +4 -4 jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/session/StandardManager.java Index: StandardManager.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/session/StandardManager.java,v retrieving revision 1.22 retrieving revision 1.22.2.1 diff -u -r1.22 -r1.22.2.1 --- StandardManager.java 26 May 2004 16:14:10 -0000 1.22 +++ StandardManager.java 18 Nov 2004 22:13:36 -0000 1.22.2.1 @@ -45,7 +45,7 @@ import org.apache.catalina.util.CustomObjectInputStream; import org.apache.catalina.util.LifecycleSupport; - +import org.apache.catalina.security.SecurityUtil; /** * Standard implementation of the <b>Manager</b> interface that provides * simple session persistence across restarts of this component (such as @@ -325,7 +325,7 @@ * @exception IOException if an input/output error occurs */ public void load() throws ClassNotFoundException, IOException { - if (System.getSecurityManager() != null){ + if (SecurityUtil.isPackageProtectionEnabled()){ try{ AccessController.doPrivileged( new PrivilegedDoLoad() ); } catch (PrivilegedActionException ex){ @@ -469,7 +469,7 @@ * @exception IOException if an input/output error occurs */ public void unload() throws IOException { - if (System.getSecurityManager() != null){ + if (SecurityUtil.isPackageProtectionEnabled()){ try{ AccessController.doPrivileged( new PrivilegedDoUnload() ); } catch (PrivilegedActionException ex){ 1.44.2.2 +3 -3 jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/session/StandardSession.java Index: StandardSession.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/session/StandardSession.java,v retrieving revision 1.44.2.1 retrieving revision 1.44.2.2 diff -u -r1.44.2.1 -r1.44.2.2 --- StandardSession.java 28 Aug 2004 12:54:08 -0000 1.44.2.1 +++ StandardSession.java 18 Nov 2004 22:13:36 -0000 1.44.2.2 @@ -52,7 +52,7 @@ import org.apache.catalina.util.Enumerator; import org.apache.catalina.util.StringManager; - +import org.apache.catalina.security.SecurityUtil; /** * Standard implementation of the <b>Session</b> interface. This object is * serializable, so that it can be stored in persistent storage or transferred @@ -529,7 +529,7 @@ public HttpSession getSession() { if (facade == null){ - if (System.getSecurityManager() != null){ + if (SecurityUtil.isPackageProtectionEnabled()){ final StandardSession fsession = this; facade = (StandardSessionFacade)AccessController.doPrivileged(new PrivilegedAction(){ public Object run(){
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]