You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2014/03/23 10:36:32 UTC

svn commit: r1580479 - in /tomcat/tc6.0.x/trunk: STATUS.txt java/org/apache/catalina/core/ApplicationFilterConfig.java java/org/apache/catalina/core/LocalStrings.properties webapps/docs/changelog.xml

Author: markt
Date: Sun Mar 23 09:36:32 2014
New Revision: 1580479

URL: http://svn.apache.org/r1580479
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=56275
Fix memory leak if a Filter throws an exception during its destroy() method

Modified:
    tomcat/tc6.0.x/trunk/STATUS.txt
    tomcat/tc6.0.x/trunk/java/org/apache/catalina/core/ApplicationFilterConfig.java
    tomcat/tc6.0.x/trunk/java/org/apache/catalina/core/LocalStrings.properties
    tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml

Modified: tomcat/tc6.0.x/trunk/STATUS.txt
URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/STATUS.txt?rev=1580479&r1=1580478&r2=1580479&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/STATUS.txt (original)
+++ tomcat/tc6.0.x/trunk/STATUS.txt Sun Mar 23 09:36:32 2014
@@ -64,12 +64,6 @@ PATCHES PROPOSED TO BACKPORT:
          Thus I am OK with this change.
   -1:
 
-* Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=56275
-  Fix memory leak if a Filter throws an exception during its destroy() method
-  http://people.apache.org/~markt/patches/2014-03-19-bug56275-tc6-v1.patch
-  +1: markt, schultz, kkolinko, remm
-  -1:
-
 * Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=54475
   Add Java 8 support to SMAP generation for JSPs.
   Patch by Robbie Gibson.

Modified: tomcat/tc6.0.x/trunk/java/org/apache/catalina/core/ApplicationFilterConfig.java
URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/core/ApplicationFilterConfig.java?rev=1580479&r1=1580478&r2=1580479&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/catalina/core/ApplicationFilterConfig.java (original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/core/ApplicationFilterConfig.java Sun Mar 23 09:36:32 2014
@@ -44,6 +44,7 @@ import org.apache.catalina.security.Secu
 import org.apache.catalina.util.Enumerator;
 import org.apache.catalina.util.StringManager;
 import org.apache.juli.logging.LogFactory;
+import org.apache.tomcat.util.ExceptionUtils;
 import org.apache.tomcat.util.log.SystemLogHandler;
 import org.apache.tomcat.util.modeler.Registry;
 
@@ -112,8 +113,10 @@ public final class ApplicationFilterConf
         }
         
         this.context = context;
-        setFilterDef(filterDef);
+        this.filterDef = filterDef;
 
+        // Allocate a new filter instance
+        getFilter();
     }
 
 
@@ -346,16 +349,22 @@ public final class ApplicationFilterConf
         
         if (this.filter != null)
         {
-            if (Globals.IS_SECURITY_ENABLED) {
-                try {
-                    SecurityUtil.doAsPrivilege("destroy", filter); 
-                } catch(java.lang.Exception ex){                    
-                    context.getLogger().error("ApplicationFilterConfig.doAsPrivilege", ex);
-                } finally {
-                    SecurityUtil.remove(filter);
+            try {
+                if (Globals.IS_SECURITY_ENABLED) {
+                    try {
+                        SecurityUtil.doAsPrivilege("destroy", filter); 
+                    } finally {
+                        SecurityUtil.remove(filter);
+                    }
+                } else { 
+                    filter.destroy();
                 }
-            } else { 
-                filter.destroy();
+            } catch (Throwable t) {
+                ExceptionUtils.handleThrowable(t);
+                context.getLogger().error(sm.getString(
+                        "applicationFilterConfig.release",
+                        filterDef.getFilterName(),
+                        filterDef.getFilterClass()), t);
             }
             if (!context.getIgnoreAnnotations()) {
                 try {
@@ -370,64 +379,6 @@ public final class ApplicationFilterConf
      }
 
 
-    /**
-     * Set the filter definition we are configured for.  This has the side
-     * effect of instantiating an instance of the corresponding filter class.
-     *
-     * @param filterDef The new filter definition
-     *
-     * @exception ClassCastException if the specified class does not implement
-     *  the <code>javax.servlet.Filter</code> interface
-     * @exception ClassNotFoundException if the filter class cannot be found
-     * @exception IllegalAccessException if the filter class cannot be
-     *  publicly instantiated
-     * @exception InstantiationException if an exception occurs while
-     *  instantiating the filter object
-     * @exception ServletException if thrown by the filter's init() method
-     * @throws NamingException 
-     * @throws InvocationTargetException 
-     */
-    void setFilterDef(FilterDef filterDef)
-        throws ClassCastException, ClassNotFoundException,
-               IllegalAccessException, InstantiationException,
-               ServletException, InvocationTargetException, NamingException {
-
-        this.filterDef = filterDef;
-        if (filterDef == null) {
-
-            // Release any previously allocated filter instance
-            if (this.filter != null){
-                if (Globals.IS_SECURITY_ENABLED) {
-                    try{
-                        SecurityUtil.doAsPrivilege("destroy", filter);  
-                    } catch(java.lang.Exception ex){    
-                        context.getLogger().error("ApplicationFilterConfig.doAsPrivilege", ex);
-                    } finally {
-                        SecurityUtil.remove(filter);
-                    }
-                } else { 
-                    filter.destroy();
-                }
-                if (!context.getIgnoreAnnotations()) {
-                    try {
-                        ((StandardContext)context).getAnnotationProcessor().preDestroy(this.filter);
-                    } catch (Exception e) {
-                        context.getLogger().error("ApplicationFilterConfig.preDestroy", e);
-                    }
-                }
-            }
-            this.filter = null;
-
-        } else {
-
-            // Allocate a new filter instance
-            Filter filter = getFilter();
-
-        }
-
-    }
-
-
     // -------------------------------------------------------- Private Methods
 
 

Modified: tomcat/tc6.0.x/trunk/java/org/apache/catalina/core/LocalStrings.properties
URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/core/LocalStrings.properties?rev=1580479&r1=1580478&r2=1580479&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/catalina/core/LocalStrings.properties (original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/core/LocalStrings.properties Sun Mar 23 09:36:32 2014
@@ -31,6 +31,7 @@ applicationDispatcher.specViolation.resp
 applicationFilterConfig.jmxRegisterFail=JMX registration failed for filter of type [{0}] and name [{1}]
 applicationFilterConfig.jmxUnregister=JMX de-registration complete for filter of type [{0}] and name [{1}]
 applicationFilterConfig.jmxUnregisterFail=JMX de-registration failed for filter of type [{0}] and name [{1}]
+applicationFilterConfig.release=Failed to destroy the filter named [{0}] of type [{1}]
 applicationRequest.badParent=Cannot locate parent Request implementation
 applicationRequest.badRequest=Request is not a javax.servlet.ServletRequestWrapper
 applicationResponse.badParent=Cannot locate parent Response implementation

Modified: tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml
URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml?rev=1580479&r1=1580478&r2=1580479&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml Sun Mar 23 09:36:32 2014
@@ -66,6 +66,11 @@
       <scode>
         Use StringBuilder in DefaultServlet. (kkolinko)
       </scode>
+      <fix>
+        <bug>56275</bug>: Allow web applications to be stopped cleanly even if
+        filters throw exceptions when their destroy() method is called.
+        (markt/kkolinko)
+      </fix>
     </changelog>
   </subsection>
   <subsection name="Coyote">



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