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