Commit 54d52925441f8bf2cc19cc80d4e6d5b1307ede01

Authored by Wiebe Cazemier
1 parent b94d4a21

Fix qos field on downgraded copy packet

This doesn't actually fix a real bug, just makes assumptions clear.
FlashMQTests/tst_maintests.cpp
... ... @@ -1155,6 +1155,7 @@ void testCopyPacketHelper(const std::string &topic, char from_qos, char to_qos,
1155 1155 Publish pubReference(topic, payloadOne, to_qos);
1156 1156 pubReference.retain = retain;
1157 1157 MqttPacket packetReference(pubReference);
  1158 + QCOMPARE(packetReference.getQos(), copiedPacketOne->getQos());
1158 1159 if (to_qos > 0)
1159 1160 packetReference.setPacketId(pack_id);
1160 1161 CirBuf bufOfReference(1024);
... ...
mqttpacket.cpp
... ... @@ -84,6 +84,7 @@ std::shared_ptr<MqttPacket> MqttPacket::getCopy(char new_max_qos) const
84 84 std::memmove(&p->bites[packet_id_pos], &p->bites[packet_id_pos+2], payloadLen);
85 85 p->bites.erase(p->bites.end() - 2, p->bites.end());
86 86 p->packet_id_pos = 0;
  87 + p->qos = 0;
87 88 p->payloadStart -= 2;
88 89 if (pos > p->bites.size()) // pos can possible be set elsewhere, so we only set it back if it was after the payload.
89 90 p->pos -= 2;
... ... @@ -120,7 +121,7 @@ MqttPacket::MqttPacket(const ConnAck &connAck) :
120 121 {
121 122 fixed_header_length = 2;
122 123 packetType = PacketType::CONNACK;
123   - char first_byte = static_cast<char>(packetType) << 4;
  124 + first_byte = static_cast<char>(packetType) << 4;
124 125 writeByte(first_byte);
125 126 writeByte(2); // length is always 2.
126 127 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()
989 990  
990 991 void MqttPacket::readIntoBuf(CirBuf &buf) const
991 992 {
  993 + assert(packetType != PacketType::PUBLISH || (first_byte & 0b00000110) >> 1 == qos);
  994 +
992 995 buf.ensureFreeSpace(getSizeIncludingNonPresentHeader());
993 996  
994 997 if (!containsFixedHeader())
... ... @@ -999,6 +1002,10 @@ void MqttPacket::readIntoBuf(CirBuf &amp;buf) const
999 1002 buf.advanceHead(1);
1000 1003 buf.write(remainingLength.bytes, remainingLength.len);
1001 1004 }
  1005 + else
  1006 + {
  1007 + assert(bites.data()[0] == first_byte);
  1008 + }
1002 1009  
1003 1010 buf.write(bites.data(), bites.size());
1004 1011 }
... ...