diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/client/BdfMessageValidator.java b/bramble-api/src/main/java/org/briarproject/bramble/api/client/BdfMessageValidator.java index b64ec9b1c..7d05ee21a 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/client/BdfMessageValidator.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/client/BdfMessageValidator.java @@ -48,12 +48,8 @@ public abstract class BdfMessageValidator implements MessageValidator { throw new InvalidMessageException( "Timestamp is too far in the future"); } - byte[] body = m.getBody(); - if (body.length == 0) { - throw new InvalidMessageException("Message is too short"); - } try { - BdfList bodyList = clientHelper.toList(body); + BdfList bodyList = clientHelper.toList(m.getBody()); BdfMessageContext result = validateMessage(m, g, bodyList); Metadata meta = metadataEncoder.encode(result.getDictionary()); return new MessageContext(meta, result.getDependencies()); diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/sync/Message.java b/bramble-api/src/main/java/org/briarproject/bramble/api/sync/Message.java index 7704d03fc..e99bf5cef 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/sync/Message.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/sync/Message.java @@ -16,6 +16,7 @@ public class Message { private final byte[] body; public Message(MessageId id, GroupId groupId, long timestamp, byte[] body) { + if (body.length == 0) throw new IllegalArgumentException(); if (body.length > MAX_MESSAGE_BODY_LENGTH) throw new IllegalArgumentException(); this.id = id; diff --git a/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java b/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java index f31582da0..2396ee907 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java @@ -1508,7 +1508,7 @@ abstract class JdbcDatabase implements Database { rs.close(); ps.close(); if (raw == null) throw new MessageDeletedException(); - if (raw.length < MESSAGE_HEADER_LENGTH) throw new AssertionError(); + if (raw.length <= MESSAGE_HEADER_LENGTH) throw new AssertionError(); byte[] body = new byte[raw.length - MESSAGE_HEADER_LENGTH]; System.arraycopy(raw, MESSAGE_HEADER_LENGTH, body, 0, body.length); return new Message(m, g, timestamp, body); diff --git a/bramble-core/src/main/java/org/briarproject/bramble/sync/MessageFactoryImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/sync/MessageFactoryImpl.java index ce22dc80d..f979abab0 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/sync/MessageFactoryImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/sync/MessageFactoryImpl.java @@ -36,6 +36,7 @@ class MessageFactoryImpl implements MessageFactory { @Override public Message createMessage(GroupId g, long timestamp, byte[] body) { + if (body.length == 0) throw new IllegalArgumentException(); if (body.length > MAX_MESSAGE_BODY_LENGTH) throw new IllegalArgumentException(); MessageId id = getMessageId(g, timestamp, body); @@ -54,7 +55,7 @@ class MessageFactoryImpl implements MessageFactory { @Override public Message createMessage(byte[] raw) { - if (raw.length < MESSAGE_HEADER_LENGTH) + if (raw.length <= MESSAGE_HEADER_LENGTH) throw new IllegalArgumentException(); if (raw.length > MAX_MESSAGE_LENGTH) throw new IllegalArgumentException(); diff --git a/bramble-core/src/main/java/org/briarproject/bramble/sync/SyncRecordReaderImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/sync/SyncRecordReaderImpl.java index d4763a521..c06f7876a 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/sync/SyncRecordReaderImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/sync/SyncRecordReaderImpl.java @@ -124,7 +124,8 @@ class SyncRecordReaderImpl implements SyncRecordReader { if (!hasMessage()) throw new FormatException(); if (nextRecord == null) throw new AssertionError(); byte[] payload = nextRecord.getPayload(); - if (payload.length < MESSAGE_HEADER_LENGTH) throw new FormatException(); + if (payload.length <= MESSAGE_HEADER_LENGTH) + throw new FormatException(); // Validate timestamp long timestamp = ByteUtils.readUint64(payload, UniqueId.LENGTH); if (timestamp < 0) throw new FormatException(); diff --git a/bramble-core/src/test/java/org/briarproject/bramble/client/BdfMessageValidatorTest.java b/bramble-core/src/test/java/org/briarproject/bramble/client/BdfMessageValidatorTest.java index 72b3869f8..c60bb4fef 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/client/BdfMessageValidatorTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/client/BdfMessageValidatorTest.java @@ -79,18 +79,6 @@ public class BdfMessageValidatorTest extends ValidatorTestCase { assertSame(meta, messageContext.getMetadata()); } - @Test(expected = InvalidMessageException.class) - public void testRejectsTooShortMessage() throws Exception { - Message invalidMessage = getMessage(groupId, 0); - - context.checking(new Expectations() {{ - oneOf(clock).currentTimeMillis(); - will(returnValue(timestamp)); - }}); - - failIfSubclassIsCalled.validateMessage(invalidMessage, group); - } - @Test public void testAcceptsMinLengthMessage() throws Exception { Message shortMessage = getMessage(groupId, 1);