From 54d52925441f8bf2cc19cc80d4e6d5b1307ede01 Mon Sep 17 00:00:00 2001 From: Wiebe Cazemier Date: Wed, 23 Feb 2022 21:29:39 +0100 Subject: [PATCH] Fix qos field on downgraded copy packet --- FlashMQTests/tst_maintests.cpp | 1 + mqttpacket.cpp | 9 ++++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/FlashMQTests/tst_maintests.cpp b/FlashMQTests/tst_maintests.cpp index f17085b..b751f44 100644 --- a/FlashMQTests/tst_maintests.cpp +++ b/FlashMQTests/tst_maintests.cpp @@ -1155,6 +1155,7 @@ void testCopyPacketHelper(const std::string &topic, char from_qos, char to_qos, Publish pubReference(topic, payloadOne, to_qos); pubReference.retain = retain; MqttPacket packetReference(pubReference); + QCOMPARE(packetReference.getQos(), copiedPacketOne->getQos()); if (to_qos > 0) packetReference.setPacketId(pack_id); CirBuf bufOfReference(1024); diff --git a/mqttpacket.cpp b/mqttpacket.cpp index 1d9030f..bed586f 100644 --- a/mqttpacket.cpp +++ b/mqttpacket.cpp @@ -84,6 +84,7 @@ std::shared_ptr MqttPacket::getCopy(char new_max_qos) const std::memmove(&p->bites[packet_id_pos], &p->bites[packet_id_pos+2], payloadLen); p->bites.erase(p->bites.end() - 2, p->bites.end()); p->packet_id_pos = 0; + p->qos = 0; p->payloadStart -= 2; if (pos > p->bites.size()) // pos can possible be set elsewhere, so we only set it back if it was after the payload. p->pos -= 2; @@ -120,7 +121,7 @@ MqttPacket::MqttPacket(const ConnAck &connAck) : { fixed_header_length = 2; packetType = PacketType::CONNACK; - char first_byte = static_cast(packetType) << 4; + first_byte = static_cast(packetType) << 4; writeByte(first_byte); writeByte(2); // length is always 2. writeByte(connAck.session_present & 0b00000001); // all connect-ack flags are 0, except session-present. [MQTT-3.2.2.1] @@ -989,6 +990,8 @@ void MqttPacket::setRetain() void MqttPacket::readIntoBuf(CirBuf &buf) const { + assert(packetType != PacketType::PUBLISH || (first_byte & 0b00000110) >> 1 == qos); + buf.ensureFreeSpace(getSizeIncludingNonPresentHeader()); if (!containsFixedHeader()) @@ -999,6 +1002,10 @@ void MqttPacket::readIntoBuf(CirBuf &buf) const buf.advanceHead(1); buf.write(remainingLength.bytes, remainingLength.len); } + else + { + assert(bites.data()[0] == first_byte); + } buf.write(bites.data(), bites.size()); } -- libgit2 0.21.4