You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by rg...@apache.org on 2012/11/19 17:15:20 UTC

svn commit: r1411272 - in /qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/codec: CompositeWritableBuffer.java WritableBuffer.java

Author: rgodfrey
Date: Mon Nov 19 16:15:19 2012
New Revision: 1411272

URL: http://svn.apache.org/viewvc?rev=1411272&view=rev
Log:
PROTON-146 : Simplified CompositeWritableBuffer impl to avoid help buffer overflow exceptions.

Modified:
    qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/codec/CompositeWritableBuffer.java
    qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/codec/WritableBuffer.java

Modified: qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/codec/CompositeWritableBuffer.java
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/codec/CompositeWritableBuffer.java?rev=1411272&r1=1411271&r2=1411272&view=diff
==============================================================================
--- qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/codec/CompositeWritableBuffer.java (original)
+++ qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/codec/CompositeWritableBuffer.java Mon Nov 19 16:15:19 2012
@@ -49,40 +49,17 @@ public class CompositeWritableBuffer imp
         putLong(Double.doubleToRawLongBits(d));
     }
 
-    public void put(byte[] src, int offset, int length)
+    public void putShort(short s)
     {
-        final int remaining = _first.remaining();
-        if(length > remaining)
+        if(_first.remaining() >= 2)
         {
-            if(remaining == 0)
-            {
-                 _second.put(src,offset,length);
-            }
-            else
-            {
-                _first.put(src,offset, remaining);
-                _second.put(src,offset+ remaining,length - remaining);
-            }
+            _first.putShort(s);
         }
         else
         {
-            _first.put(src,offset,length);
-        }
-    }
-
-    public void putShort(short s)
-    {
-        switch(_first.remaining())
-        {
-            case 0:
-                _second.putShort(s);
-                break;
-            case 1:
-                _first.put((byte)(s >>> 8));
-                _second.put((byte)s);
-                break;
-            default:
-                _first.putShort(s);
+            ByteBuffer wrap = ByteBuffer.wrap(new byte[2]);
+            wrap.putShort(s);
+            put(wrap);
         }
     }
 
@@ -94,16 +71,9 @@ public class CompositeWritableBuffer imp
         }
         else
         {
-            int j = 3;
-            while(_first.hasRemaining() && j != 0)
-            {
-                _first.put((byte)(i >>> (8*j)));
-                j--;
-            }
-            while(j != 0)
-            {
-                _second.put((byte)(i >>> (8*j)));
-            }
+            ByteBuffer wrap = ByteBuffer.wrap(new byte[4]);
+            wrap.putInt(i);
+            put(wrap);
         }
     }
 
@@ -115,16 +85,9 @@ public class CompositeWritableBuffer imp
         }
         else
         {
-            int j = 7;
-            while(_first.hasRemaining() && j != 0)
-            {
-                _first.put((byte)(l >>> (8*j)));
-                j--;
-            }
-            while(j != 0)
-            {
-                _second.put((byte)(l >>> (8*j)));
-            }
+            ByteBuffer wrap = ByteBuffer.wrap(new byte[8]);
+            wrap.putLong(l);
+            put(wrap);
         }
     }
 
@@ -143,71 +106,68 @@ public class CompositeWritableBuffer imp
         return _first.position()+_second.position();
     }
 
+    public int limit()
+    {
+        return _first.limit() + _second.limit();
+    }
+
     public void position(int position)
     {
-        int currentPosition = position();
-        if(position > currentPosition)
+        int first_limit = _first.limit();
+        if( position <= first_limit )
         {
-            int relativePosition = position - currentPosition;
-            if(_first.hasRemaining())
-            {
-                final int firstRemaining = _first.remaining();
-                if(relativePosition > firstRemaining)
-                {
-                    _first.position(_first.position()+ firstRemaining);
-                    relativePosition -= firstRemaining;
-                }
-                else
-                {
-                    _first.position(_first.position()+relativePosition);
-                    return;
-                }
-            }
-            _second.position(_second.position()+relativePosition);
+            _first.position(position);
+            _second.position(0);
         }
-        else if(position < currentPosition)
+        else
         {
-            if(_first.hasRemaining())
+            _first.position(first_limit);
+            _second.position(position - first_limit);
+        }
+    }
+
+    public void put(byte[] src, int offset, int length)
+    {
+        final int firstRemaining = _first.remaining();
+        if(firstRemaining > 0)
+        {
+            if(firstRemaining >= length)
             {
-                _first.position(position);
+                _first.put(src, offset, length);
+                return;
             }
             else
             {
-                int relativePosition = currentPosition-position;
-                if(relativePosition <= _second.position())
-                {
-                    _second.position(_second.position()-relativePosition);
-                }
-                else
-                {
-                    relativePosition -= _second.position();
-                    _second.position(0);
-                    _first.position(_first.position()-relativePosition);
-                }
+                _first.put(src,offset, firstRemaining);
             }
         }
+        _second.put(src, offset+firstRemaining, length-firstRemaining);
     }
 
     public void put(ByteBuffer payload)
     {
-        if(_first.hasRemaining())
+        int firstRemaining = _first.remaining();
+        if(firstRemaining > 0)
         {
-            if(_first.remaining() >= payload.remaining())
+            if(firstRemaining >= payload.remaining())
             {
                 _first.put(payload);
+                return;
             }
             else
             {
                 int limit = payload.limit();
-                payload.limit(payload.position()+_first.remaining());
+                payload.limit(payload.position()+firstRemaining);
                 _first.put(payload);
                 payload.limit(limit);
-                _second.put(payload);
             }
         }
-        else
-        {
-            _second.put(payload);
-        }
+        _second.put(payload);
+    }
+
+    @Override
+    public String toString()
+    {
+        return _first.toString() + " + "+_second.toString();
     }
 }

Modified: qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/codec/WritableBuffer.java
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/codec/WritableBuffer.java?rev=1411272&r1=1411271&r2=1411272&view=diff
==============================================================================
--- qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/codec/WritableBuffer.java (original)
+++ qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/codec/WritableBuffer.java Mon Nov 19 16:15:19 2012
@@ -49,6 +49,8 @@ public interface WritableBuffer
 
     void put(ByteBuffer payload);
 
+    int limit();
+
     class ByteBufferWrapper implements WritableBuffer
     {
         private final ByteBuffer _buf;
@@ -117,5 +119,16 @@ public interface WritableBuffer
         {
             _buf.put(src);
         }
+
+        public int limit()
+        {
+            return _buf.limit();
+        }
+
+        @Override
+        public String toString()
+        {
+            return String.format("[pos: %d, limit: %d, remaining:%d]", _buf.position(), _buf.limit(), _buf.remaining());
+        }
     }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org