From c3176256dc4bf14f873e80e06c91a77defb69877 Mon Sep 17 00:00:00 2001 From: "selva.andre" Date: Fri, 27 Jul 2012 00:15:22 +0200 Subject: [PATCH] Fixed SubAck decoder remaining length bug --- .../mqtt/moquette/proto/SubAckDecoder.java | 3 ++- .../moquette/proto/SubAckDecoderTest.java | 24 ++++++++++++++++++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/parser/src/main/java/org/dna/mqtt/moquette/proto/SubAckDecoder.java b/parser/src/main/java/org/dna/mqtt/moquette/proto/SubAckDecoder.java index d9b84986..1756e554 100644 --- a/parser/src/main/java/org/dna/mqtt/moquette/proto/SubAckDecoder.java +++ b/parser/src/main/java/org/dna/mqtt/moquette/proto/SubAckDecoder.java @@ -29,9 +29,10 @@ public class SubAckDecoder extends MqttDecoder { //MessageID message.setMessageID(Utils.readWord(in)); + remainingLength -= 2; //Qos array - if (in.remaining() < remainingLength) { + if (in.remaining() < remainingLength ) { return NEED_DATA; } for (int i = 0; i < remainingLength; i++) { diff --git a/parser/src/test/java/org/dna/mqtt/moquette/proto/SubAckDecoderTest.java b/parser/src/test/java/org/dna/mqtt/moquette/proto/SubAckDecoderTest.java index 7505e07f..5139f3ac 100644 --- a/parser/src/test/java/org/dna/mqtt/moquette/proto/SubAckDecoderTest.java +++ b/parser/src/test/java/org/dna/mqtt/moquette/proto/SubAckDecoderTest.java @@ -2,6 +2,7 @@ package org.dna.mqtt.moquette.proto; import java.util.List; import org.apache.mina.core.buffer.IoBuffer; +import org.apache.mina.filter.codec.demux.MessageDecoder; import org.apache.mina.filter.codec.demux.MessageDecoderResult; import org.dna.mqtt.moquette.proto.TestUtils.MockProtocolDecoderOutput; import org.dna.mqtt.moquette.proto.messages.AbstractMessage; @@ -46,10 +47,31 @@ public class SubAckDecoderTest { assertEquals(QOSType.MOST_ONE, qoses.get(2)); assertEquals(AbstractMessage.SUBACK, m_mockProtoDecoder.getMessage().getMessageType()); } + + + @Test + public void testBugBadRemainingCalculation() throws Exception { + byte[] overallMessage = new byte[] {(byte)0x90, 0x03, //fixed header + 0x00, 0x0A, //MSG ID + 0x01}; //QoS array + m_buff = IoBuffer.allocate(overallMessage.length).setAutoExpand(true); + m_buff.put(overallMessage); + m_buff.flip(); + + //Exercise + MessageDecoderResult res = m_msgdec.decode(null, m_buff, m_mockProtoDecoder); + + assertNotNull(m_mockProtoDecoder.getMessage()); + assertEquals(MessageDecoder.OK, res); + SubAckMessage message = (SubAckMessage) m_mockProtoDecoder.getMessage(); + assertEquals(0x0A, message.getMessageID()); + assertEquals(1, message.types().size()); + assertEquals(AbstractMessage.QOSType.LEAST_ONE, message.types().get(0)); + } private void initHeaderQos(IoBuffer buff, int messageID, QOSType... qoss) throws IllegalAccessException { buff.clear().put((byte) (AbstractMessage.SUBACK << 4)). - put(Utils.encodeRemainingLength(3)); + put(Utils.encodeRemainingLength(2 + qoss.length)); Utils.writeWord(buff, messageID); for (QOSType qos : qoss) {