From 09d2b5be1f4218d3dd90df88bb6ca5e3f331b8b8 Mon Sep 17 00:00:00 2001 From: catbref Date: Tue, 9 Jun 2020 10:57:39 +0100 Subject: [PATCH] Fix off-by-one error with data address bounds & unit test to cover --- Java/src/main/java/org/ciyam/at/Utils.java | 2 +- Java/src/test/java/org/ciyam/at/MiscTests.java | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/Java/src/main/java/org/ciyam/at/Utils.java b/Java/src/main/java/org/ciyam/at/Utils.java index d03dcb7..34e9ab6 100644 --- a/Java/src/main/java/org/ciyam/at/Utils.java +++ b/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; diff --git a/Java/src/test/java/org/ciyam/at/MiscTests.java b/Java/src/test/java/org/ciyam/at/MiscTests.java index 8a3175d..4bc9178 100644 --- a/Java/src/test/java/org/ciyam/at/MiscTests.java +++ b/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()); + } + }