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 2011/09/12 16:02:41 UTC
svn commit: r1169750 -
/james/server/trunk/imapserver/src/main/java/org/apache/james/imapserver/netty/ImapRequestFrameDecoder.java
Author: norman
Date: Mon Sep 12 14:02:41 2011
New Revision: 1169750
URL: http://svn.apache.org/viewvc?rev=1169750&view=rev
Log:
Fix harmless NPE when there are still bytes in the buffer but the connection was closed already. See JAMES-1312
Modified:
james/server/trunk/imapserver/src/main/java/org/apache/james/imapserver/netty/ImapRequestFrameDecoder.java
Modified: james/server/trunk/imapserver/src/main/java/org/apache/james/imapserver/netty/ImapRequestFrameDecoder.java
URL: http://svn.apache.org/viewvc/james/server/trunk/imapserver/src/main/java/org/apache/james/imapserver/netty/ImapRequestFrameDecoder.java?rev=1169750&r1=1169749&r2=1169750&view=diff
==============================================================================
--- james/server/trunk/imapserver/src/main/java/org/apache/james/imapserver/netty/ImapRequestFrameDecoder.java (original)
+++ james/server/trunk/imapserver/src/main/java/org/apache/james/imapserver/netty/ImapRequestFrameDecoder.java Mon Sep 12 14:02:41 2011
@@ -36,7 +36,9 @@ import org.apache.james.imap.decode.Imap
import org.apache.james.protocols.impl.ChannelAttributeSupport;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.buffer.ChannelBufferInputStream;
+import org.jboss.netty.buffer.ChannelBuffers;
import org.jboss.netty.channel.Channel;
+import org.jboss.netty.channel.ChannelFutureListener;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.ChannelStateEvent;
import org.jboss.netty.handler.codec.frame.FrameDecoder;
@@ -159,23 +161,37 @@ public class ImapRequestFrameDecoder ext
reader = new NettyImapRequestLineReader(channel, buffer, retry);
}
- try {
- ImapMessage message = decoder.decode(reader, (ImapSession) attributes.get(channel));
+ ImapSession session = (ImapSession) attributes.get(channel);
- // if size is != -1 the case was a literal. if thats the case we
- // should not consume the line
- // See JAMES-1199
- if (size == -1) {
- reader.consumeLine();
+ // check if the session was removed before to prevent a harmless NPE. See JAMES-1312
+ if (session != null) {
+ try {
+
+ ImapMessage message = decoder.decode(reader, session);
+
+ // if size is != -1 the case was a literal. if thats the case we
+ // should not consume the line
+ // See JAMES-1199
+ if (size == -1) {
+ reader.consumeLine();
+ }
+ attachment.clear();
+ return message;
+ } catch (NettyImapRequestLineReader.NotEnoughDataException e) {
+ // this exception was thrown because we don't have enough data
+ // yet
+ int neededData = e.getNeededSize();
+ // store the needed data size for later usage
+ attachment.put(NEEDED_DATA, neededData);
+ buffer.resetReaderIndex();
+ return null;
+ }
+ } else {
+ // The session was null so may be the case because the channel was already closed but there were still bytes in the buffer.
+ // We now try to disconnect the client if still connected
+ if (channel.isConnected()) {
+ channel.write(ChannelBuffers.EMPTY_BUFFER).addListener(ChannelFutureListener.CLOSE);
}
- attachment.clear();
- return message;
- } catch (NettyImapRequestLineReader.NotEnoughDataException e) {
- // this exception was thrown because we don't have enough data yet
- int neededData = e.getNeededSize();
- // store the needed data size for later usage
- attachment.put(NEEDED_DATA, neededData);
- buffer.resetReaderIndex();
return null;
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org