mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-03 09:49:23 +02:00
Merge remote-tracking branch
'origin/GP-486_emteere_WrappedMemBuffer_Fix' into patch
This commit is contained in:
commit
06cc11f28f
2 changed files with 188 additions and 38 deletions
|
@ -87,30 +87,31 @@ public class WrappedMemoryBufferTest extends AbstractGhidraHeadedIntegrationTest
|
|||
|
||||
Address minAddr = program.getMinAddress();
|
||||
Address maxAddr = program.getMaxAddress();
|
||||
setBytes(minAddr, new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 });
|
||||
setBytes(minAddr,
|
||||
new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 });
|
||||
|
||||
memBuf = new MemoryBufferImpl(program.getMemory(), minAddr);
|
||||
memBuf = new WrappedMemBuffer(memBuf, 4, 0);
|
||||
byte[] bytes = new byte[6];
|
||||
// test get too many for cache
|
||||
assertEquals(6, memBuf.getBytes(bytes, 2));
|
||||
Assert.assertArrayEquals("Unexpected bytes read from memBuf", new byte[] { 2, 3, 4, 5, 6, 7 },
|
||||
bytes);
|
||||
Assert.assertArrayEquals("Unexpected bytes read from memBuf",
|
||||
new byte[] { 2, 3, 4, 5, 6, 7 }, bytes);
|
||||
|
||||
// test not in buffer
|
||||
memBuf = new WrappedMemBuffer(memBuf, 6, 0);
|
||||
assertEquals(6, memBuf.getBytes(bytes, 0));
|
||||
Assert.assertArrayEquals("Unexpected bytes read from memBuf", new byte[] { 0, 1, 2, 3, 4, 5 },
|
||||
bytes);
|
||||
Assert.assertArrayEquals("Unexpected bytes read from memBuf",
|
||||
new byte[] { 0, 1, 2, 3, 4, 5 }, bytes);
|
||||
assertEquals(6, memBuf.getBytes(bytes, 2));
|
||||
Assert.assertArrayEquals("Unexpected bytes read from memBuf", new byte[] { 2, 3, 4, 5, 6, 7 },
|
||||
bytes);
|
||||
Assert.assertArrayEquals("Unexpected bytes read from memBuf",
|
||||
new byte[] { 2, 3, 4, 5, 6, 7 }, bytes);
|
||||
assertEquals(6, memBuf.getBytes(bytes, 8));
|
||||
Assert.assertArrayEquals("Unexpected bytes read from memBuf", new byte[] { 8, 9, 10, 11, 12, 13 },
|
||||
bytes);
|
||||
Assert.assertArrayEquals("Unexpected bytes read from memBuf",
|
||||
new byte[] { 8, 9, 10, 11, 12, 13 }, bytes);
|
||||
assertEquals(6, memBuf.getBytes(bytes, 1));
|
||||
Assert.assertArrayEquals("Unexpected bytes read from memBuf", new byte[] { 1, 2, 3, 4, 5, 6 },
|
||||
bytes);
|
||||
Assert.assertArrayEquals("Unexpected bytes read from memBuf",
|
||||
new byte[] { 1, 2, 3, 4, 5, 6 }, bytes);
|
||||
|
||||
assertEquals(10, memBuf.getByte(10));
|
||||
assertEquals(0, memBuf.getByte(0));
|
||||
|
@ -124,30 +125,31 @@ public class WrappedMemoryBufferTest extends AbstractGhidraHeadedIntegrationTest
|
|||
|
||||
Address minAddr = program.getMinAddress();
|
||||
Address maxAddr = program.getMaxAddress();
|
||||
setBytes(minAddr, new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 });
|
||||
setBytes(minAddr,
|
||||
new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 });
|
||||
|
||||
memBuf = new MemoryBufferImpl(program.getMemory(), minAddr);
|
||||
memBuf = new WrappedMemBuffer(memBuf, 0, 0);
|
||||
byte[] bytes = new byte[6];
|
||||
// test get too many for cache
|
||||
assertEquals(6, memBuf.getBytes(bytes, 2));
|
||||
Assert.assertArrayEquals("Unexpected bytes read from memBuf", new byte[] { 2, 3, 4, 5, 6, 7 },
|
||||
bytes);
|
||||
Assert.assertArrayEquals("Unexpected bytes read from memBuf",
|
||||
new byte[] { 2, 3, 4, 5, 6, 7 }, bytes);
|
||||
|
||||
// test not in buffer
|
||||
memBuf = new WrappedMemBuffer(memBuf, 0, 0);
|
||||
assertEquals(6, memBuf.getBytes(bytes, 0));
|
||||
Assert.assertArrayEquals("Unexpected bytes read from memBuf", new byte[] { 0, 1, 2, 3, 4, 5 },
|
||||
bytes);
|
||||
Assert.assertArrayEquals("Unexpected bytes read from memBuf",
|
||||
new byte[] { 0, 1, 2, 3, 4, 5 }, bytes);
|
||||
assertEquals(6, memBuf.getBytes(bytes, 2));
|
||||
Assert.assertArrayEquals("Unexpected bytes read from memBuf", new byte[] { 2, 3, 4, 5, 6, 7 },
|
||||
bytes);
|
||||
Assert.assertArrayEquals("Unexpected bytes read from memBuf",
|
||||
new byte[] { 2, 3, 4, 5, 6, 7 }, bytes);
|
||||
assertEquals(6, memBuf.getBytes(bytes, 8));
|
||||
Assert.assertArrayEquals("Unexpected bytes read from memBuf", new byte[] { 8, 9, 10, 11, 12, 13 },
|
||||
bytes);
|
||||
Assert.assertArrayEquals("Unexpected bytes read from memBuf",
|
||||
new byte[] { 8, 9, 10, 11, 12, 13 }, bytes);
|
||||
assertEquals(6, memBuf.getBytes(bytes, 1));
|
||||
Assert.assertArrayEquals("Unexpected bytes read from memBuf", new byte[] { 1, 2, 3, 4, 5, 6 },
|
||||
bytes);
|
||||
Assert.assertArrayEquals("Unexpected bytes read from memBuf",
|
||||
new byte[] { 1, 2, 3, 4, 5, 6 }, bytes);
|
||||
|
||||
assertEquals(10, memBuf.getByte(10));
|
||||
assertEquals(0, memBuf.getByte(0));
|
||||
|
@ -155,6 +157,151 @@ public class WrappedMemoryBufferTest extends AbstractGhidraHeadedIntegrationTest
|
|||
assertEquals(6, memBuf.getByte(6));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetIntBuffered() throws Exception {
|
||||
loadProgram("notepad");
|
||||
int value;
|
||||
|
||||
Address minAddr = program.getMinAddress();
|
||||
Address maxAddr = program.getMaxAddress();
|
||||
setBytes(minAddr, new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
|
||||
18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 });
|
||||
|
||||
memBuf = new DumbMemBufferImpl(program.getMemory(), minAddr);
|
||||
memBuf = new WrappedMemBuffer(memBuf, 3, 0);
|
||||
|
||||
value = memBuf.getInt(0);
|
||||
assertEquals(value, 0x00010203);
|
||||
value = memBuf.getInt(1);
|
||||
assertEquals(value, 0x01020304);
|
||||
value = memBuf.getInt(3);
|
||||
assertEquals(value, 0x03040506);
|
||||
value = memBuf.getInt(8);
|
||||
assertEquals(value, 0x08090A0B);
|
||||
|
||||
memBuf = new DumbMemBufferImpl(program.getMemory(), minAddr);
|
||||
memBuf = new WrappedMemBuffer(memBuf, 4, 0);
|
||||
value = memBuf.getInt(0);
|
||||
assertEquals(value, 0x00010203);
|
||||
value = memBuf.getInt(1);
|
||||
assertEquals(value, 0x01020304);
|
||||
value = memBuf.getInt(3);
|
||||
assertEquals(value, 0x03040506);
|
||||
value = memBuf.getInt(8);
|
||||
assertEquals(value, 0x08090A0B);
|
||||
|
||||
memBuf = new DumbMemBufferImpl(program.getMemory(), minAddr);
|
||||
memBuf = new WrappedMemBuffer(memBuf, 5, 0);
|
||||
value = memBuf.getInt(0);
|
||||
assertEquals(value, 0x00010203);
|
||||
value = memBuf.getInt(1);
|
||||
assertEquals(value, 0x01020304);
|
||||
value = memBuf.getInt(3);
|
||||
assertEquals(value, 0x03040506);
|
||||
value = memBuf.getInt(8);
|
||||
assertEquals(value, 0x08090A0B);
|
||||
|
||||
memBuf = new MemoryBufferImpl(program.getMemory(), minAddr);
|
||||
memBuf = new WrappedMemBuffer(memBuf, 3, 4);
|
||||
value = memBuf.getInt(0);
|
||||
assertEquals(value, 0x04050607);
|
||||
value = memBuf.getInt(1);
|
||||
assertEquals(value, 0x05060708);
|
||||
value = memBuf.getInt(3);
|
||||
assertEquals(value, 0x0708090A);
|
||||
value = memBuf.getInt(8);
|
||||
assertEquals(value, 0x0C0D0E0F);
|
||||
|
||||
memBuf = new MemoryBufferImpl(program.getMemory(), minAddr);
|
||||
memBuf = new WrappedMemBuffer(memBuf, 4, 4);
|
||||
value = memBuf.getInt(0);
|
||||
assertEquals(value, 0x04050607);
|
||||
value = memBuf.getInt(1);
|
||||
assertEquals(value, 0x05060708);
|
||||
value = memBuf.getInt(3);
|
||||
assertEquals(value, 0x0708090A);
|
||||
value = memBuf.getInt(8);
|
||||
assertEquals(value, 0x0C0D0E0F);
|
||||
|
||||
memBuf = new DumbMemBufferImpl(program.getMemory(), minAddr);
|
||||
memBuf = new WrappedMemBuffer(memBuf, 5, 4);
|
||||
value = memBuf.getInt(0);
|
||||
assertEquals(value, 0x04050607);
|
||||
value = memBuf.getInt(1);
|
||||
assertEquals(value, 0x05060708);
|
||||
value = memBuf.getInt(3);
|
||||
assertEquals(value, 0x0708090A);
|
||||
value = memBuf.getInt(8);
|
||||
assertEquals(value, 0x0C0D0E0F);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetShortBuffered() throws Exception {
|
||||
loadProgram("notepad");
|
||||
int value;
|
||||
|
||||
Address minAddr = program.getMinAddress();
|
||||
Address maxAddr = program.getMaxAddress();
|
||||
setBytes(minAddr, new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
|
||||
18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 });
|
||||
|
||||
memBuf = new DumbMemBufferImpl(program.getMemory(), minAddr);
|
||||
memBuf = new WrappedMemBuffer(memBuf, 3, 0);
|
||||
|
||||
value = memBuf.getShort(0);
|
||||
assertEquals(value, 0x0001);
|
||||
value = memBuf.getShort(1);
|
||||
assertEquals(value, 0x0102);
|
||||
value = memBuf.getShort(3);
|
||||
assertEquals(value, 0x0304);
|
||||
value = memBuf.getShort(8);
|
||||
assertEquals(value, 0x0809);
|
||||
|
||||
memBuf = new DumbMemBufferImpl(program.getMemory(), minAddr);
|
||||
memBuf = new WrappedMemBuffer(memBuf, 5, 4);
|
||||
value = memBuf.getShort(0);
|
||||
assertEquals(value, 0x0405);
|
||||
value = memBuf.getShort(1);
|
||||
assertEquals(value, 0x0506);
|
||||
value = memBuf.getShort(3);
|
||||
assertEquals(value, 0x0708);
|
||||
value = memBuf.getShort(8);
|
||||
assertEquals(value, 0x0C0D);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetLongBuffered() throws Exception {
|
||||
loadProgram("notepad");
|
||||
long value;
|
||||
|
||||
Address minAddr = program.getMinAddress();
|
||||
Address maxAddr = program.getMaxAddress();
|
||||
setBytes(minAddr, new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 });
|
||||
|
||||
memBuf = new DumbMemBufferImpl(program.getMemory(), minAddr);
|
||||
memBuf = new WrappedMemBuffer(memBuf, 7, 0);
|
||||
|
||||
value = memBuf.getLong(0);
|
||||
assertEquals(value, 0x0001020304050607L);
|
||||
value = memBuf.getLong(1);
|
||||
assertEquals(value, 0x0102030405060708L);
|
||||
value = memBuf.getLong(3);
|
||||
assertEquals(value, 0x030405060708090AL);
|
||||
value = memBuf.getLong(8);
|
||||
assertEquals(value, 0x08090A0B0C0D0E0FL);
|
||||
|
||||
memBuf = new DumbMemBufferImpl(program.getMemory(), minAddr);
|
||||
memBuf = new WrappedMemBuffer(memBuf, 9, 4);
|
||||
value = memBuf.getLong(0);
|
||||
assertEquals(value, 0x0405060708090A0BL);
|
||||
value = memBuf.getLong(1);
|
||||
assertEquals(value, 0x05060708090A0B0CL);
|
||||
value = memBuf.getLong(3);
|
||||
assertEquals(value, 0x0708090A0B0C0D0EL);
|
||||
value = memBuf.getLong(0);
|
||||
assertEquals(value, 0x0405060708090A0BL);
|
||||
}
|
||||
|
||||
private void setBytes(Address addr, byte[] bytes) throws MemoryAccessException {
|
||||
|
||||
Memory mem = program.getMemory();
|
||||
|
|
|
@ -67,7 +67,7 @@ public class WrappedMemBuffer implements MemBuffer {
|
|||
/**
|
||||
* Construct a wrapped MemBuffer with an adjustable base offset
|
||||
* @param buf memory buffer
|
||||
* @buffersize size of cache buffer - specify 0 for no buffering
|
||||
* @param bufferSize size of cache buffer - specify 0 for no buffering
|
||||
* @param baseOffset offset relative to the underlying buffer's start address
|
||||
* (addr + baseOffset) will be the 0 index into this buffer
|
||||
* @throws AddressOutOfBoundsException
|
||||
|
@ -113,10 +113,12 @@ public class WrappedMemBuffer implements MemBuffer {
|
|||
private int computeOffset(int offset) throws MemoryAccessException {
|
||||
int bufOffset = baseOffset + offset;
|
||||
if (offset > 0 && bufOffset < baseOffset) {
|
||||
throw new MemoryAccessException("Invalid WrappedMemBuffer, offset would wrap underlying memory buffer");
|
||||
throw new MemoryAccessException(
|
||||
"Invalid WrappedMemBuffer, offset would wrap underlying memory buffer");
|
||||
}
|
||||
if (offset < 0 && bufOffset > baseOffset) {
|
||||
throw new MemoryAccessException("Invalid WrappedMemBuffer offset, offset would wrap underlying memory buffer");
|
||||
throw new MemoryAccessException(
|
||||
"Invalid WrappedMemBuffer offset, offset would wrap underlying memory buffer");
|
||||
}
|
||||
return bufOffset;
|
||||
}
|
||||
|
@ -157,7 +159,8 @@ public class WrappedMemBuffer implements MemBuffer {
|
|||
// grab from wrapped buffer, too many bytes, or no buffer
|
||||
return memBuffer.getBytes(b, computeOffset(offset));
|
||||
|
||||
} catch (MemoryAccessException e) {
|
||||
}
|
||||
catch (MemoryAccessException e) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
@ -186,22 +189,22 @@ public class WrappedMemBuffer implements MemBuffer {
|
|||
|
||||
@Override
|
||||
public short getShort(int offset) throws MemoryAccessException {
|
||||
return converter.getShort(this, computeOffset(offset));
|
||||
return converter.getShort(this, offset);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getInt(int offset) throws MemoryAccessException {
|
||||
return converter.getInt(this, computeOffset(offset));
|
||||
return converter.getInt(this, offset);
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getLong(int offset) throws MemoryAccessException {
|
||||
return converter.getLong(this, computeOffset(offset));
|
||||
return converter.getLong(this, offset);
|
||||
}
|
||||
|
||||
@Override
|
||||
public BigInteger getBigInteger(int offset, int size, boolean signed)
|
||||
throws MemoryAccessException {
|
||||
return converter.getBigInteger(this, computeOffset(offset), size, signed);
|
||||
return converter.getBigInteger(this, offset, size, signed);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue