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