You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by no...@apache.org on 2006/08/02 21:18:43 UTC

svn commit: r428097 - in /james/server: branches/v2.3/src/java/org/apache/james/smtpserver/ trunk/src/java/org/apache/james/smtpserver/ trunk/src/java/org/apache/james/smtpserver/core/

Author: noel
Date: Wed Aug  2 12:18:42 2006
New Revision: 428097

URL: http://svn.apache.org/viewvc?rev=428097&view=rev
Log:
Fix for JAMES-585.  Explicit cleanup for temporary files when exceptions occur.

Modified:
    james/server/branches/v2.3/src/java/org/apache/james/smtpserver/DataCmdHandler.java
    james/server/branches/v2.3/src/java/org/apache/james/smtpserver/SMTPHandler.java
    james/server/trunk/src/java/org/apache/james/smtpserver/SMTPHandler.java
    james/server/trunk/src/java/org/apache/james/smtpserver/core/DataCmdHandler.java

Modified: james/server/branches/v2.3/src/java/org/apache/james/smtpserver/DataCmdHandler.java
URL: http://svn.apache.org/viewvc/james/server/branches/v2.3/src/java/org/apache/james/smtpserver/DataCmdHandler.java?rev=428097&r1=428096&r2=428097&view=diff
==============================================================================
--- james/server/branches/v2.3/src/java/org/apache/james/smtpserver/DataCmdHandler.java (original)
+++ james/server/branches/v2.3/src/java/org/apache/james/smtpserver/DataCmdHandler.java Wed Aug  2 12:18:42 2006
@@ -278,6 +278,23 @@
                 mail.setAttribute(SMTP_AUTH_USER_ATTRIBUTE_NAME, session.getUser());
             }
             session.setMail(mail);
+        } catch (MessagingException me) {
+            // if we get here, it means that we received a
+            // MessagingException, which would happen BEFORE we call
+            // session.setMail, so the mail object is still strictly
+            // local to us, and we really should clean it up before
+            // re-throwing the MessagingException for our call chain
+            // to process.
+            //
+            // So why has this worked at all so far?  Initial
+            // conjecture is that it has depended upon finalize to
+            // call dispose.  Not in the MailImpl, which doesn't have
+            // one, but even further down in the MimeMessageInputStreamSource.
+
+            if (mail != null) {
+                mail.dispose();
+            }
+            throw me;
         } finally {
             if (recipientCollection != null) {
                 recipientCollection.clear();

Modified: james/server/branches/v2.3/src/java/org/apache/james/smtpserver/SMTPHandler.java
URL: http://svn.apache.org/viewvc/james/server/branches/v2.3/src/java/org/apache/james/smtpserver/SMTPHandler.java?rev=428097&r1=428096&r2=428097&view=diff
==============================================================================
--- james/server/branches/v2.3/src/java/org/apache/james/smtpserver/SMTPHandler.java (original)
+++ james/server/branches/v2.3/src/java/org/apache/james/smtpserver/SMTPHandler.java Wed Aug  2 12:18:42 2006
@@ -400,36 +400,37 @@
 
               //handle messages
               if(mode == MESSAGE_RECEIVED_MODE) {
-                  getLogger().debug("executing message handlers");
-                  List messageHandlers = handlerChain.getMessageHandlers();
-                  int count = messageHandlers.size();
-                  for(int i =0; i < count; i++) {
-                      ((MessageHandler)messageHandlers.get(i)).onMessage(this);
-                      //if the response is received, stop processing of command handlers
-                      if(mode == MESSAGE_ABORT_MODE) {
-                          break;
+                  try {
+                      getLogger().debug("executing message handlers");
+                      List messageHandlers = handlerChain.getMessageHandlers();
+                      int count = messageHandlers.size();
+                      for(int i =0; i < count; i++) {
+                          ((MessageHandler)messageHandlers.get(i)).onMessage(this);
+                          //if the response is received, stop processing of command handlers
+                          if(mode == MESSAGE_ABORT_MODE) {
+                              break;
+                          }
                       }
-                  }
-              }
-
-              //do the clean up
-              if(mail != null) {
-                  if (mail instanceof Disposable) {
-                      ((Disposable) mail).dispose();
-                  }
+                  } finally {
+                      //do the clean up
+                      if(mail != null) {
+                          if (mail instanceof Disposable) {
+                              ((Disposable) mail).dispose();
+                          }
                   
-                  // remember the ehlo mode
-                  Object currentHeloMode = state.get(CURRENT_HELO_MODE);
+                          // remember the ehlo mode
+                          Object currentHeloMode = state.get(CURRENT_HELO_MODE);
                   
-                  mail = null;
-                  resetState();
+                          mail = null;
+                          resetState();
 
-                  // start again with the old helo mode
-                  if (currentHeloMode != null) {
-                      state.put(CURRENT_HELO_MODE,currentHeloMode);
+                          // start again with the old helo mode
+                          if (currentHeloMode != null) {
+                              state.put(CURRENT_HELO_MODE,currentHeloMode);
+                          }
+                      }
                   }
               }
-
             }
             theWatchdog.stop();
             getLogger().debug("Closing socket.");

Modified: james/server/trunk/src/java/org/apache/james/smtpserver/SMTPHandler.java
URL: http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/smtpserver/SMTPHandler.java?rev=428097&r1=428096&r2=428097&view=diff
==============================================================================
--- james/server/trunk/src/java/org/apache/james/smtpserver/SMTPHandler.java (original)
+++ james/server/trunk/src/java/org/apache/james/smtpserver/SMTPHandler.java Wed Aug  2 12:18:42 2006
@@ -287,34 +287,35 @@
 
           //handle messages
           if(mode == MESSAGE_RECEIVED_MODE) {
-              getLogger().debug("executing message handlers");
-              List messageHandlers = handlerChain.getMessageHandlers();
-              int count = messageHandlers.size();
-              for(int i =0; i < count; i++) {
-                  ((MessageHandler)messageHandlers.get(i)).onMessage(this);
-                  //if the response is received, stop processing of command handlers
-                  if(mode == MESSAGE_ABORT_MODE) {
-                      break;
+              try {
+                  getLogger().debug("executing message handlers");
+                  List messageHandlers = handlerChain.getMessageHandlers();
+                  int count = messageHandlers.size();
+                  for(int i =0; i < count; i++) {
+                      ((MessageHandler)messageHandlers.get(i)).onMessage(this);
+                      //if the response is received, stop processing of command handlers
+                      if(mode == MESSAGE_ABORT_MODE) {
+                          break;
+                      }
                   }
-              }
-          }
-
-          //do the clean up
-          if(mail != null) {
-              ContainerUtil.dispose(mail);
+              } finally {
+                  //do the clean up
+                  if(mail != null) {
+                      ContainerUtil.dispose(mail);
               
-              // remember the ehlo mode
-              Object currentHeloMode = state.get(CURRENT_HELO_MODE);
+                      // remember the ehlo mode
+                      Object currentHeloMode = state.get(CURRENT_HELO_MODE);
               
-              mail = null;
-              resetState();
+                      mail = null;
+                      resetState();
 
-              // start again with the old helo mode
-              if (currentHeloMode != null) {
-                  state.put(CURRENT_HELO_MODE,currentHeloMode);
+                      // start again with the old helo mode
+                      if (currentHeloMode != null) {
+                          state.put(CURRENT_HELO_MODE,currentHeloMode);
+                      }
+                  }
               }
           }
-
         }
         theWatchdog.stop();
         getLogger().debug("Closing socket.");

Modified: james/server/trunk/src/java/org/apache/james/smtpserver/core/DataCmdHandler.java
URL: http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/smtpserver/core/DataCmdHandler.java?rev=428097&r1=428096&r2=428097&view=diff
==============================================================================
--- james/server/trunk/src/java/org/apache/james/smtpserver/core/DataCmdHandler.java (original)
+++ james/server/trunk/src/java/org/apache/james/smtpserver/core/DataCmdHandler.java Wed Aug  2 12:18:42 2006
@@ -290,6 +290,23 @@
             }
             
             session.setMail(mail);
+        } catch (MessagingException me) {
+            // if we get here, it means that we received a
+            // MessagingException, which would happen BEFORE we call
+            // session.setMail, so the mail object is still strictly
+            // local to us, and we really should clean it up before
+            // re-throwing the MessagingException for our call chain
+            // to process.
+            //
+            // So why has this worked at all so far?  Initial
+            // conjecture is that it has depended upon finalize to
+            // call dispose.  Not in the MailImpl, which doesn't have
+            // one, but even further down in the MimeMessageInputStreamSource.
+
+            if (mail != null) {
+                mail.dispose();
+            }
+            throw me;
         } finally {
             if (recipientCollection != null) {
                 recipientCollection.clear();



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