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]
