]> source.dussan.org Git - poi.git/commitdiff
fixed bug in LittleEndianByteArrayInputStream.readFully()
authorJosh Micich <josh@apache.org>
Sun, 15 Nov 2009 00:27:59 +0000 (00:27 +0000)
committerJosh Micich <josh@apache.org>
Sun, 15 Nov 2009 00:27:59 +0000 (00:27 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@836298 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/poi/util/LittleEndianByteArrayInputStream.java
src/testcases/org/apache/poi/util/TestLittleEndianStreams.java

index 984db5f8f3618dcf93628f90464e3f070fc4afaa..7f509396a64246cee906de8bd58e0e89115f2737 100644 (file)
@@ -18,9 +18,8 @@
 package org.apache.poi.util;
 
 /**
- * Adapts a plain byte array to {@link LittleEndianInput} 
- * 
- * 
+ * Adapts a plain byte array to {@link LittleEndianInput}
+ *
  * @author Josh Micich
  */
 public final class LittleEndianByteArrayInputStream implements LittleEndianInput {
@@ -60,7 +59,7 @@ public final class LittleEndianByteArrayInputStream implements LittleEndianInput
        public int readInt() {
                checkPosition(4);
                int i = _readIndex;
-               
+
                int b0 = _buf[i++] & 0xFF;
                int b1 = _buf[i++] & 0xFF;
                int b2 = _buf[i++] & 0xFF;
@@ -71,7 +70,7 @@ public final class LittleEndianByteArrayInputStream implements LittleEndianInput
        public long readLong() {
                checkPosition(8);
                int i = _readIndex;
-               
+
                int b0 = _buf[i++] & 0xFF;
                int b1 = _buf[i++] & 0xFF;
                int b2 = _buf[i++] & 0xFF;
@@ -100,7 +99,7 @@ public final class LittleEndianByteArrayInputStream implements LittleEndianInput
        public int readUShort() {
                checkPosition(2);
                int i = _readIndex;
-               
+
                int b0 = _buf[i++] & 0xFF;
                int b1 = _buf[i++] & 0xFF;
                _readIndex = i;
@@ -108,7 +107,7 @@ public final class LittleEndianByteArrayInputStream implements LittleEndianInput
        }
        public void readFully(byte[] buf, int off, int len) {
                checkPosition(len);
-               System.arraycopy(_buf, _readIndex, _buf, off, len);
+               System.arraycopy(_buf, _readIndex, buf, off, len);
                _readIndex+=len;
        }
        public void readFully(byte[] buf) {
index f2661b72731c21d70b8d077ea811014c6434ffb1..26f9b4cf6b372ba1cc23f1fde40d9dec5e7e1bf2 100644 (file)
@@ -19,7 +19,9 @@ package org.apache.poi.util;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
+import java.util.Arrays;
 
+import junit.framework.AssertionFailedError;
 import junit.framework.TestCase;
 
 /**
@@ -50,4 +52,29 @@ public final class TestLittleEndianStreams extends TestCase {
                assertEquals(1234567890123456789L, lei.readLong());
                assertEquals(123.456, lei.readDouble(), 0.0);
        }
+
+       /**
+        * Up until svn r836101 {@link LittleEndianByteArrayInputStream#readFully(byte[], int, int)}
+        * had an error which resulted in the data being read and written back to the source byte
+        * array.
+        */
+       public void testReadFully() {
+               byte[] srcBuf = HexRead.readFromString("99 88 77 66 55 44 33");
+               LittleEndianInput lei = new LittleEndianByteArrayInputStream(srcBuf);
+
+               // do initial read to increment the read index beyond zero
+               assertEquals(0x8899, lei.readUShort());
+
+               byte[] actBuf = new byte[4];
+               lei.readFully(actBuf);
+
+               if (actBuf[0] == 0x00 && srcBuf[0] == 0x77 && srcBuf[3] == 0x44) {
+                       throw new AssertionFailedError("Identified bug in readFully() - source buffer was modified");
+               }
+
+               byte[] expBuf = HexRead.readFromString("77 66 55 44");
+               assertTrue(Arrays.equals(actBuf, expBuf));
+               assertEquals(0x33, lei.readUByte());
+               assertEquals(0, lei.available());
+       }
 }