You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by lq...@apache.org on 2016/10/06 09:58:04 UTC
svn commit: r1763547 - in
/qpid/java/trunk/common/src/main/java/org/apache/qpid/codec:
AMQDecoder.java ClientDecoder.java
Author: lquack
Date: Thu Oct 6 09:58:04 2016
New Revision: 1763547
URL: http://svn.apache.org/viewvc?rev=1763547&view=rev
Log:
QPID-7448: [Java Client] Stop ClientDecoder from doing deep recursion recursion
Modified:
qpid/java/trunk/common/src/main/java/org/apache/qpid/codec/AMQDecoder.java
qpid/java/trunk/common/src/main/java/org/apache/qpid/codec/ClientDecoder.java
Modified: qpid/java/trunk/common/src/main/java/org/apache/qpid/codec/AMQDecoder.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/common/src/main/java/org/apache/qpid/codec/AMQDecoder.java?rev=1763547&r1=1763546&r2=1763547&view=diff
==============================================================================
--- qpid/java/trunk/common/src/main/java/org/apache/qpid/codec/AMQDecoder.java (original)
+++ qpid/java/trunk/common/src/main/java/org/apache/qpid/codec/AMQDecoder.java Thu Oct 6 09:58:04 2016
@@ -124,7 +124,7 @@ public abstract class AMQDecoder<T exten
}
}
- return required;
+ return buf.hasRemaining() ? required : 0;
}
Modified: qpid/java/trunk/common/src/main/java/org/apache/qpid/codec/ClientDecoder.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/common/src/main/java/org/apache/qpid/codec/ClientDecoder.java?rev=1763547&r1=1763546&r2=1763547&view=diff
==============================================================================
--- qpid/java/trunk/common/src/main/java/org/apache/qpid/codec/ClientDecoder.java (original)
+++ qpid/java/trunk/common/src/main/java/org/apache/qpid/codec/ClientDecoder.java Thu Oct 6 09:58:04 2016
@@ -39,62 +39,52 @@ public class ClientDecoder extends AMQDe
super(false, methodProcessor);
}
- public void decodeBuffer(ByteBuffer buf)
- throws AMQFrameDecodingException, AMQProtocolVersionException
+ public void decodeBuffer(ByteBuffer incomingBuffer) throws AMQFrameDecodingException, AMQProtocolVersionException
{
-
- buf = buf.slice();
-
- if(_incompleteBuffer != null)
+ if (_incompleteBuffer == null)
+ {
+ QpidByteBuffer qpidByteBuffer = QpidByteBuffer.wrap(incomingBuffer);
+ final int required = decode(qpidByteBuffer);
+ if (required != 0)
+ {
+ _incompleteBuffer = QpidByteBuffer.allocate(qpidByteBuffer.remaining() + required);
+ _incompleteBuffer.put(qpidByteBuffer);
+ }
+ qpidByteBuffer.dispose();
+ }
+ else
{
- if(buf.remaining() < _incompleteBuffer.remaining())
+ if (incomingBuffer.remaining() < _incompleteBuffer.remaining())
{
- _incompleteBuffer.put(buf);
- return;
+ _incompleteBuffer.put(incomingBuffer);
}
else
{
- final ByteBuffer start = buf.duplicate();
- start.limit(_incompleteBuffer.remaining());
- buf.position(buf.position()+_incompleteBuffer.remaining());
- _incompleteBuffer.put(start);
_incompleteBuffer.flip();
- final int required = decode(_incompleteBuffer);
+ final QpidByteBuffer aggregatedBuffer =
+ QpidByteBuffer.allocate(_incompleteBuffer.remaining() + incomingBuffer.remaining());
+ aggregatedBuffer.put(_incompleteBuffer);
+ aggregatedBuffer.put(incomingBuffer);
+ aggregatedBuffer.flip();
+ final int required = decode(aggregatedBuffer);
- if(required != 0)
+ _incompleteBuffer.dispose();
+ if (required != 0)
{
- QpidByteBuffer newBuffer = QpidByteBuffer.allocate(required + _incompleteBuffer.remaining());
- newBuffer.put(_incompleteBuffer);
- _incompleteBuffer.dispose();
- _incompleteBuffer = newBuffer;
- if(buf.hasRemaining())
- {
- decodeBuffer(buf);
- }
- return;
+ _incompleteBuffer = QpidByteBuffer.allocate(aggregatedBuffer.remaining() + required);
+ _incompleteBuffer.put(aggregatedBuffer);
}
else
{
- _incompleteBuffer.dispose();
_incompleteBuffer = null;
- if(!buf.hasRemaining())
- {
- return;
- }
}
+ aggregatedBuffer.dispose();
}
}
-
- QpidByteBuffer qpidByteBuffer = QpidByteBuffer.wrap(buf);
- final int required = decode(qpidByteBuffer);
- if(required != 0)
- {
- _incompleteBuffer = QpidByteBuffer.allocate(qpidByteBuffer.remaining()+required);
- _incompleteBuffer.put(qpidByteBuffer);
- }
-
+ // post-condition: assert(!incomingBuffer.hasRemaining());
}
+ @Override
void processMethod(int channelId,
QpidByteBuffer in)
throws AMQFrameDecodingException
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org