summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKonstantin Ritt <ritt.ks@gmail.com>2020-02-27 05:23:39 +0300
committerKonstantin Ritt <ritt.ks@gmail.com>2020-03-27 02:48:25 +0300
commitf8ecf4d56a3a955c7f11db1fa32dada9dfcfb8e6 (patch)
tree472eda9046cf3483b979b6202e7cd8ca07a44623
parent5788322b76d51b28ac18af09443df38a23450c5e (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.cpp15
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;