From f8ecf4d56a3a955c7f11db1fa32dada9dfcfb8e6 Mon Sep 17 00:00:00 2001 From: Konstantin Ritt Date: Thu, 27 Feb 2020 05:23:39 +0300 Subject: [PATCH] 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 --- src/mqtt/qmqttconnection.cpp | 15 +++++++++------ 1 file 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;