Browse Source

Fix off-by-one error with data address bounds & unit test to cover

master
catbref 4 years ago
parent
commit
09d2b5be1f
  1. 2
      Java/src/main/java/org/ciyam/at/Utils.java
  2. 14
      Java/src/test/java/org/ciyam/at/MiscTests.java

2
Java/src/main/java/org/ciyam/at/Utils.java

@ -71,7 +71,7 @@ interface Utils {
try {
final int address = codeByteBuffer.getInt() * MachineState.VALUE_SIZE;
if (address < 0 || address + MachineState.VALUE_SIZE >= dataByteBuffer.limit())
if (address < 0 || address + MachineState.VALUE_SIZE > dataByteBuffer.limit())
throw new InvalidAddressException("Data address out of bounds");
return address;

14
Java/src/test/java/org/ciyam/at/MiscTests.java

@ -68,4 +68,18 @@ public class MiscTests extends ExecutableTest {
assertEquals((Long) (minActivationAmount - 1L), state.getFrozenBalance());
}
@Test
public void testDataAddressBounds() throws ExecutionException {
// Last possible valid address in data segment
int lastDataAddress = (dataByteBuffer.limit() / MachineState.VALUE_SIZE) - 1;
codeByteBuffer.put(OpCode.SET_VAL.value).putInt(lastDataAddress).putLong(8888L);
codeByteBuffer.put(OpCode.FIN_IMD.value);
execute(true);
assertTrue(state.isFinished());
assertFalse(state.hadFatalError());
}
}

Loading…
Cancel
Save