From d26eb6a54d4108397732e4ca68073c8af623509b Mon Sep 17 00:00:00 2001 From: Josh Micich Date: Sun, 15 Nov 2009 00:27:59 +0000 Subject: [PATCH] fixed bug in LittleEndianByteArrayInputStream.readFully() git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@836298 13f79535-47bb-0310-9956-ffa450edef68 --- .../LittleEndianByteArrayInputStream.java | 13 +++++---- .../poi/util/TestLittleEndianStreams.java | 27 +++++++++++++++++++ 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/src/java/org/apache/poi/util/LittleEndianByteArrayInputStream.java b/src/java/org/apache/poi/util/LittleEndianByteArrayInputStream.java index 984db5f8f3..7f509396a6 100644 --- a/src/java/org/apache/poi/util/LittleEndianByteArrayInputStream.java +++ b/src/java/org/apache/poi/util/LittleEndianByteArrayInputStream.java @@ -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) { diff --git a/src/testcases/org/apache/poi/util/TestLittleEndianStreams.java b/src/testcases/org/apache/poi/util/TestLittleEndianStreams.java index f2661b7273..26f9b4cf6b 100644 --- a/src/testcases/org/apache/poi/util/TestLittleEndianStreams.java +++ b/src/testcases/org/apache/poi/util/TestLittleEndianStreams.java @@ -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()); + } } -- 2.39.5