Commit 86ae3f7633b5f209f6a49be270f367708d6da353
1 parent
c4df7557
Require presence of topics in UNSUBSCRIBE
Showing
1 changed file
with
10 additions
and
0 deletions
mqttpacket.cpp
| ... | ... | @@ -494,8 +494,12 @@ void MqttPacket::handleUnsubscribe() |
| 494 | 494 | throw ProtocolError("Packet ID 0 when unsubscribing is invalid."); // [MQTT-2.3.1-1] |
| 495 | 495 | } |
| 496 | 496 | |
| 497 | + int numberOfUnsubs = 0; | |
| 498 | + | |
| 497 | 499 | while (remainingAfterPos() > 0) |
| 498 | 500 | { |
| 501 | + numberOfUnsubs++; | |
| 502 | + | |
| 499 | 503 | uint16_t topicLength = readTwoBytesToUInt16(); |
| 500 | 504 | std::string topic(readBytes(topicLength), topicLength); |
| 501 | 505 | |
| ... | ... | @@ -506,6 +510,12 @@ void MqttPacket::handleUnsubscribe() |
| 506 | 510 | logger->logf(LOG_UNSUBSCRIBE, "Client '%s' unsubscribed from '%s'", sender->repr().c_str(), topic.c_str()); |
| 507 | 511 | } |
| 508 | 512 | |
| 513 | + // MQTT-3.10.3-2 | |
| 514 | + if (numberOfUnsubs == 0) | |
| 515 | + { | |
| 516 | + throw ProtocolError("No topics specified to unsubscribe to."); | |
| 517 | + } | |
| 518 | + | |
| 509 | 519 | UnsubAck unsubAck(packet_id); |
| 510 | 520 | MqttPacket response(unsubAck); |
| 511 | 521 | sender->writeMqttPacket(response); | ... | ... |