diff options
author | Konstantin Ritt <ritt.ks@gmail.com> | 2020-02-27 05:23:39 +0300 |
---|---|---|
committer | Konstantin Ritt <ritt.ks@gmail.com> | 2020-03-27 02:48:25 +0300 |
commit | f8ecf4d56a3a955c7f11db1fa32dada9dfcfb8e6 (patch) | |
tree | 472eda9046cf3483b979b6202e7cd8ca07a44623 | |
parent | 5788322b76d51b28ac18af09443df38a23450c5e (diff) |
Better handling for topic alias of a received message
* for received PUBLISH, check for Client-to-Server Maximum Topic Alias
preference, not Server-to-Client one
* fire ProtocolViolation on topicAlias == 0
* return earlier on errors
Change-Id: Ia371b7a4e05704d07caab6c0d67b9180f590f1fc
Reviewed-by: Maurice Kalinowski <maurice.kalinowski@qt.io>
-rw-r--r-- | src/mqtt/qmqttconnection.cpp | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/src/mqtt/qmqttconnection.cpp b/src/mqtt/qmqttconnection.cpp index 59d29eb..b8ab752 100644 --- a/src/mqtt/qmqttconnection.cpp +++ b/src/mqtt/qmqttconnection.cpp @@ -1531,18 +1531,21 @@ void QMqttConnection::finalize_publish() if (m_clientPrivate->m_protocolVersion == QMqttClient::MQTT_5_0) readPublishProperties(publishProperties); - const quint16 topicAlias = publishProperties.topicAlias(); - if (topicAlias > 0) { - if (topicAlias > m_clientPrivate->m_serverConnectionProperties.maximumTopicAlias()) { + if (publishProperties.availableProperties() & QMqttPublishProperties::TopicAlias) { + const quint16 topicAlias = publishProperties.topicAlias(); + if (topicAlias == 0 || topicAlias > m_clientPrivate->m_connectionProperties.maximumTopicAlias()) { qCDebug(lcMqttConnection) << "TopicAlias receive: overflow."; closeConnection(QMqttClient::ProtocolViolation); - } else if (topicLength == 0) { // New message on existing topic alias - if (m_receiveAliases.at(topicAlias - 1).name().isEmpty()) { + return; + } + if (topicLength == 0) { // New message on existing topic alias + topic = m_receiveAliases.at(topicAlias - 1); + if (topic.name().isEmpty()) { qCDebug(lcMqttConnection) << "TopicAlias receive: alias for unknown topic."; closeConnection(QMqttClient::ProtocolViolation); + return; } qCDebug(lcMqttConnectionVerbose) << "TopicAlias receive: Using " << topicAlias; - topic = m_receiveAliases.at(topicAlias - 1); } else { // Resetting a topic alias qCDebug(lcMqttConnection) << "TopicAlias receive: Resetting:" << topic.name() << " : " << topicAlias; m_receiveAliases[topicAlias - 1] = topic; |