diff --git a/Ghidra/Framework/DB/src/main/java/db/ChainedBuffer.java b/Ghidra/Framework/DB/src/main/java/db/ChainedBuffer.java index d209c94408..dbc6548b3a 100644 --- a/Ghidra/Framework/DB/src/main/java/db/ChainedBuffer.java +++ b/Ghidra/Framework/DB/src/main/java/db/ChainedBuffer.java @@ -1117,7 +1117,7 @@ public class ChainedBuffer implements Buffer { /** * Fill the buffer over the specified range with a byte value. * @param startOffset starting offset, inclusive - * @param endOffset ending offset, exclusive + * @param endOffset ending offset, inclusive * @param fillByte byte value * @throws IOException thrown if an IO error occurs */ @@ -1126,10 +1126,10 @@ public class ChainedBuffer implements Buffer { if (readOnly) { throw new UnsupportedOperationException("Read-only buffer"); } - if (endOffset <= startOffset) { + if (endOffset < startOffset) { throw new IllegalArgumentException(); } - if (startOffset < 0 || endOffset > size) { + if (startOffset < 0 || endOffset >= size) { throw new ArrayIndexOutOfBoundsException(); } byte[] fillData = new byte[dataSpace]; diff --git a/Ghidra/Framework/DB/src/test/java/db/AbstractChainedBufferTest.java b/Ghidra/Framework/DB/src/test/java/db/AbstractChainedBufferTest.java index 4ca46ad066..44204255b5 100644 --- a/Ghidra/Framework/DB/src/test/java/db/AbstractChainedBufferTest.java +++ b/Ghidra/Framework/DB/src/test/java/db/AbstractChainedBufferTest.java @@ -100,7 +100,7 @@ public abstract class AbstractChainedBufferTest extends AbstractGenericTest { } @Test - public void testFillChainnedBuffer() throws IOException { + public void testFillChainedBuffer() throws IOException { ChainedBuffer cb = new ChainedBuffer(BIG_DATA_SIZE, obfuscated, sourceData, sourceDataOffset, mgr); @@ -126,7 +126,42 @@ public abstract class AbstractChainedBufferTest extends AbstractGenericTest { } @Test - public void testBigChainnedBuffer() throws IOException { + public void testSmallFillChainedBuffer() throws IOException { + + ChainedBuffer cb = new ChainedBuffer(1, obfuscated, sourceData, sourceDataOffset, mgr); + + // Fill + cb.fill(0, 0, (byte) 0x12); + + // Verify data + assertEquals(cb.getByte(0), (byte) 0x12); + + // Re-instantiate buffer + int id = cb.getId(); + cb = new ChainedBuffer(mgr, id); + + // Re-verify data + assertEquals(cb.getByte(0), (byte) 0x12); + } + + @Test + public void testChainedBufferOverflow() throws IOException { + + ChainedBuffer cb = new ChainedBuffer(1, obfuscated, sourceData, sourceDataOffset, mgr); + + // Fill too much by 1 byte to test generated exception bounds + try { + cb.fill(0, 1, (byte) 0x12); + } + catch (ArrayIndexOutOfBoundsException e) { + return; + } + + fail("Overflow was not correctly detected"); + } + + @Test + public void testBigChainedBuffer() throws IOException { ChainedBuffer cb = new ChainedBuffer(BIG_DATA_SIZE, obfuscated, sourceData, sourceDataOffset, mgr);