2010/2/18  <[email protected]>:
> Author: norman
> Date: Thu Feb 18 18:19:52 2010
> New Revision: 911507
>
> URL: http://svn.apache.org/viewvc?rev=911507&view=rev
> Log:
> Make sure to only check for max line length while processing not the DATA 
> command

Hi Norman, as far as I know the 1000 bytes limit per row in the RFC is
valid also in the DATA command and also for 8BITMIME. The only
extension breaking this limit is BINARY, not 8BITMIME.

Here is an excerpt from rfc:
----
Finally, although the
   content body contains arbitrary lines of octet-aligned material, the
   length of each line (number of octets between two CR-LF pairs), is
   still subject to SMTP server line length restrictions (which may
   allow as few as 1000 octets on a single line).

Read more: http://www.faqs.org/rfcs/rfc1652.html#ixzz0fxKhlkGx
-----

If we use a line based processor we also have to enforce a line length
limit everywhere or we'll go OOM on very long lines.

Stefano

> Modified:
>    
> james/server/trunk/mina-socket/src/main/java/org/apache/james/socket/mina/codec/CRLFTerminatedLineDecoder.java
>    
> james/server/trunk/mina-socket/src/main/java/org/apache/james/socket/mina/codec/JamesProtocolCodecFactory.java
>    
> james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/mina/SMTPSessionImpl.java
>
> Modified: 
> james/server/trunk/mina-socket/src/main/java/org/apache/james/socket/mina/codec/CRLFTerminatedLineDecoder.java
> URL: 
> http://svn.apache.org/viewvc/james/server/trunk/mina-socket/src/main/java/org/apache/james/socket/mina/codec/CRLFTerminatedLineDecoder.java?rev=911507&r1=911506&r2=911507&view=diff
> ==============================================================================
> --- 
> james/server/trunk/mina-socket/src/main/java/org/apache/james/socket/mina/codec/CRLFTerminatedLineDecoder.java
>  (original)
> +++ 
> james/server/trunk/mina-socket/src/main/java/org/apache/james/socket/mina/codec/CRLFTerminatedLineDecoder.java
>  Thu Feb 18 18:19:52 2010
> @@ -33,6 +33,8 @@
>  public class CRLFTerminatedLineDecoder extends CumulativeProtocolDecoder {
>
>     private int maxLineLength;
> +
> +    private boolean check = true;
>
>     public static int DEFAULT_MAX_LINE_LENTH = 2048;
>
> @@ -52,7 +54,11 @@
>     public CRLFTerminatedLineDecoder() {
>         this(DEFAULT_MAX_LINE_LENTH);
>     }
> +
>
> +    public synchronized void checkLineLengthLimit(boolean check) {
> +        this.check = check;
> +    }
>
>     /*
>      * (non-Javadoc)
> @@ -69,7 +75,7 @@
>         // Now find the first CRLF in the buffer.
>         byte previous = 0;
>
> -        if (maxLineLength != -1 && in.remaining() > maxLineLength) {
> +        if (check && maxLineLength != -1 && in.remaining() > maxLineLength) {
>
>             // clear the buffer before throw exception
>             in.clear();
>
> Modified: 
> james/server/trunk/mina-socket/src/main/java/org/apache/james/socket/mina/codec/JamesProtocolCodecFactory.java
> URL: 
> http://svn.apache.org/viewvc/james/server/trunk/mina-socket/src/main/java/org/apache/james/socket/mina/codec/JamesProtocolCodecFactory.java?rev=911507&r1=911506&r2=911507&view=diff
> ==============================================================================
> --- 
> james/server/trunk/mina-socket/src/main/java/org/apache/james/socket/mina/codec/JamesProtocolCodecFactory.java
>  (original)
> +++ 
> james/server/trunk/mina-socket/src/main/java/org/apache/james/socket/mina/codec/JamesProtocolCodecFactory.java
>  Thu Feb 18 18:19:52 2010
> @@ -21,6 +21,7 @@
>
>  import java.nio.charset.Charset;
>
> +import org.apache.mina.core.session.AttributeKey;
>  import org.apache.mina.core.session.IoSession;
>  import org.apache.mina.filter.codec.ProtocolCodecFactory;
>  import org.apache.mina.filter.codec.ProtocolDecoder;
> @@ -34,7 +35,9 @@
>  *
>  */
>  public class JamesProtocolCodecFactory  implements ProtocolCodecFactory {
> -
> +    public static final AttributeKey DECODER_KEY = new 
> AttributeKey(CRLFTerminatedLineDecoder.class,"decoder");
> +    public static final AttributeKey ENCODER_KEY = new 
> AttributeKey(TextLineEncoder.class,"encoder");
> +
>     private final ProtocolEncoder encoder = new 
> TextLineEncoder(Charset.forName("US-ASCII"), LineDelimiter.CRLF);
>     private final ProtocolDecoder decoder = new CRLFTerminatedLineDecoder();
>
> @@ -43,6 +46,8 @@
>      * @see 
> org.apache.mina.filter.codec.ProtocolCodecFactory#getEncoder(org.apache.mina.core.session.IoSession)
>      */
>     public ProtocolEncoder getEncoder(IoSession arg0) throws Exception {
> +        arg0.setAttribute(ENCODER_KEY,encoder);
> +
>         return encoder;
>     }
>
> @@ -51,6 +56,7 @@
>      * @see 
> org.apache.mina.filter.codec.ProtocolCodecFactory#getDecoder(org.apache.mina.core.session.IoSession)
>      */
>     public ProtocolDecoder getDecoder(IoSession arg0) throws Exception {
> +        arg0.setAttribute(DECODER_KEY,decoder);
>         return decoder;
>     }
>  }
>
> Modified: 
> james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/mina/SMTPSessionImpl.java
> URL: 
> http://svn.apache.org/viewvc/james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/mina/SMTPSessionImpl.java?rev=911507&r1=911506&r2=911507&view=diff
> ==============================================================================
> --- 
> james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/mina/SMTPSessionImpl.java
>  (original)
> +++ 
> james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/mina/SMTPSessionImpl.java
>  Thu Feb 18 18:19:52 2010
> @@ -33,6 +33,8 @@
>  import org.apache.james.smtpserver.mina.filter.SMTPResponseFilter;
>  import org.apache.james.smtpserver.mina.filter.TarpitFilter;
>  import org.apache.james.socket.mina.AbstractMINASession;
> +import org.apache.james.socket.mina.codec.CRLFTerminatedLineDecoder;
> +import org.apache.james.socket.mina.codec.JamesProtocolCodecFactory;
>  import org.apache.james.socket.mina.filter.FilterLineHandlerAdapter;
>  import org.apache.mina.core.session.IoSession;
>
> @@ -113,6 +115,7 @@
>             if (currentHeloMode != null) {
>                 getState().put(CURRENT_HELO_MODE, currentHeloMode);
>             }
> +
>         }
>
>         /**
> @@ -122,6 +125,9 @@
>             getIoSession().getFilterChain()
>                     .remove("lineHandler" + lineHandlerCount);
>             lineHandlerCount--;
> +            if (lineHandlerCount == 0) {
> +                
> ((CRLFTerminatedLineDecoder)getIoSession().getAttribute(JamesProtocolCodecFactory.DECODER_KEY)).checkLineLengthLimit(true);
> +            }
>         }
>
>         /**
> @@ -132,6 +138,10 @@
>             getIoSession().getFilterChain().addAfter(SMTPResponseFilter.NAME,
>                     "lineHandler" + lineHandlerCount,
>                     new 
> FilterLineHandlerAdapter<SMTPSession>(overrideCommandHandler,SMTP_SESSION));
> +            // disable the line length limit because we are processing the 
> data
> +            // not sure if this is the right place todo this
> +            
> ((CRLFTerminatedLineDecoder)getIoSession().getAttribute(JamesProtocolCodecFactory.DECODER_KEY)).checkLineLengthLimit(false);
> +
>         }
>
>
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to