From e51312b60d694d86cd9e224488129272ba53af69 Mon Sep 17 00:00:00 2001 From: Jun Luo <4catcode@gmail.com> Date: Sat, 31 Jan 2026 07:56:49 +0800 Subject: [PATCH] fix: add validation for `ManageDataOperation` value length to ensure it does not exceed 64 bytes. --- CHANGELOG.md | 1 + .../sdk/operations/ManageDataOperation.java | 3 ++ .../operations/ManageDataOperationTest.java | 37 +++++++++++++++++++ 3 files changed, 41 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 21246ff17..28ca6b762 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ - fix: add stricter validation for Ed25519 Signed Payload. - fix: replace assert statements with explicit null checks in `Federation` class to ensure validation is not bypassed when assertions are disabled. - fix: add overflow check in `TimeBounds.expiresAfter()` to prevent integer overflow when timeout is too large. +- fix: add validation for `ManageDataOperation` value length to ensure it does not exceed 64 bytes. ## 2.2.1 diff --git a/src/main/java/org/stellar/sdk/operations/ManageDataOperation.java b/src/main/java/org/stellar/sdk/operations/ManageDataOperation.java index 882892efa..80a9dbe3b 100644 --- a/src/main/java/org/stellar/sdk/operations/ManageDataOperation.java +++ b/src/main/java/org/stellar/sdk/operations/ManageDataOperation.java @@ -73,6 +73,9 @@ public ManageDataOperation build() { if (new XdrString(op.name).getBytes().length > 64) { throw new IllegalArgumentException("name cannot exceed 64 bytes"); } + if (op.value != null && op.value.length > 64) { + throw new IllegalArgumentException("value cannot exceed 64 bytes"); + } return op; } } diff --git a/src/test/java/org/stellar/sdk/operations/ManageDataOperationTest.java b/src/test/java/org/stellar/sdk/operations/ManageDataOperationTest.java index 78f1b02ff..a573ce1da 100644 --- a/src/test/java/org/stellar/sdk/operations/ManageDataOperationTest.java +++ b/src/test/java/org/stellar/sdk/operations/ManageDataOperationTest.java @@ -3,6 +3,7 @@ import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertThrows; import org.junit.Test; import org.stellar.sdk.KeyPair; @@ -57,4 +58,40 @@ public void testManageDataOperationEmptyValue() { "AAAAAQAAAAC7JAuE3XvquOnbsgv2SRztjuk4RoBVefQ0rlrFMMQvfAAAAAoAAAAEdGVzdAAAAAA=", operation.toXdrBase64()); } + + @Test + public void testManageDataOperationValueExceeds64Bytes() { + byte[] value = new byte[65]; + IllegalArgumentException exception = + assertThrows( + IllegalArgumentException.class, + () -> ManageDataOperation.builder().name("test").value(value).build()); + assertEquals("value cannot exceed 64 bytes", exception.getMessage()); + } + + @Test + public void testManageDataOperationValueExactly64Bytes() { + byte[] value = new byte[64]; + for (int i = 0; i < 64; i++) { + value[i] = (byte) i; + } + ManageDataOperation operation = ManageDataOperation.builder().name("test").value(value).build(); + assertArrayEquals(value, operation.getValue()); + } + + @Test + public void testManageDataOperationNameExceeds64Bytes() { + String name = "12345678901234567890123456789012345678901234567890123456789012345"; + IllegalArgumentException exception = + assertThrows( + IllegalArgumentException.class, () -> ManageDataOperation.builder().name(name).build()); + assertEquals("name cannot exceed 64 bytes", exception.getMessage()); + } + + @Test + public void testManageDataOperationNameExactly64Bytes() { + String name = "1234567890123456789012345678901234567890123456789012345678901234"; + ManageDataOperation operation = ManageDataOperation.builder().name(name).build(); + assertEquals(name, operation.getName()); + } }