android: Properly handle shorter types in BufferedByteWriter
authorTobias Brunner <tobias@strongswan.org>
Wed, 11 Nov 2015 18:30:04 +0000 (19:30 +0100)
committerTobias Brunner <tobias@strongswan.org>
Thu, 12 Nov 2015 13:12:13 +0000 (14:12 +0100)
In Java all integer types are signed, when a negative integer is casted
to a larger type (e.g. int to long) then due to sign extension the upper
bytes are not 0.  So writing that value to a byte array does not produce
the expected result.  By overloading the putX() methods we make sure to
upcast the values correctly.

src/frontends/android/app/src/main/java/org/strongswan/android/utils/BufferedByteWriter.java

index efc7283..b31951c 100644 (file)
@@ -127,6 +127,16 @@ public class BufferedByteWriter
         * @param value
         * @return the writer
         */
+       public BufferedByteWriter put16(byte value)
+       {
+               return this.put16((short)(value & 0xFF));
+       }
+
+       /**
+        * Write the given short value (16-bit) in big-endian order to the buffer
+        * @param value
+        * @return the writer
+        */
        public BufferedByteWriter put16(short value)
        {
                ensureCapacity(2);
@@ -139,6 +149,32 @@ public class BufferedByteWriter
         * @param value
         * @return the writer
         */
+       public BufferedByteWriter put24(byte value)
+       {
+               ensureCapacity(3);
+               mWriter.putShort((short)0);
+               mWriter.put(value);
+               return this;
+       }
+
+       /**
+        * Write 24-bit of the given value in big-endian order to the buffer
+        * @param value
+        * @return the writer
+        */
+       public BufferedByteWriter put24(short value)
+       {
+               ensureCapacity(3);
+               mWriter.put((byte)0);
+               mWriter.putShort(value);
+               return this;
+       }
+
+       /**
+        * Write 24-bit of the given value in big-endian order to the buffer
+        * @param value
+        * @return the writer
+        */
        public BufferedByteWriter put24(int value)
        {
                ensureCapacity(3);
@@ -152,6 +188,26 @@ public class BufferedByteWriter
         * @param value
         * @return the writer
         */
+       public BufferedByteWriter put32(byte value)
+       {
+               return put32(value & 0xFF);
+       }
+
+       /**
+        * Write the given int value (32-bit) in big-endian order to the buffer
+        * @param value
+        * @return the writer
+        */
+       public BufferedByteWriter put32(short value)
+       {
+               return put32(value & 0xFFFF);
+       }
+
+       /**
+        * Write the given int value (32-bit) in big-endian order to the buffer
+        * @param value
+        * @return the writer
+        */
        public BufferedByteWriter put32(int value)
        {
                ensureCapacity(4);
@@ -164,6 +220,36 @@ public class BufferedByteWriter
         * @param value
         * @return the writer
         */
+       public BufferedByteWriter put64(byte value)
+       {
+               return put64(value & 0xFFL);
+       }
+
+       /**
+        * Write the given long value (64-bit) in big-endian order to the buffer
+        * @param value
+        * @return the writer
+        */
+       public BufferedByteWriter put64(short value)
+       {
+               return put64(value & 0xFFFFL);
+       }
+
+       /**
+        * Write the given long value (64-bit) in big-endian order to the buffer
+        * @param value
+        * @return the writer
+        */
+       public BufferedByteWriter put64(int value)
+       {
+               return put64(value & 0xFFFFFFFFL);
+       }
+
+       /**
+        * Write the given long value (64-bit) in big-endian order to the buffer
+        * @param value
+        * @return the writer
+        */
        public BufferedByteWriter put64(long value)
        {
                ensureCapacity(8);