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 | 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 &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 | } | ... | ... |