1
0
mirror of https://github.com/qt/qtmqtt.git synced 2026-10-25 16:16:26 +00:00

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>
This commit is contained in:
Konstantin Ritt 2020-02-27 05:23:39 +03:00
parent 5788322b76
commit f8ecf4d56a

View File

@ -1531,18 +1531,21 @@ void QMqttConnection::finalize_publish()
if (m_clientPrivate->m_protocolVersion == QMqttClient::MQTT_5_0)
readPublishProperties(publishProperties);
if (publishProperties.availableProperties() & QMqttPublishProperties::TopicAlias) {
const quint16 topicAlias = publishProperties.topicAlias();
if (topicAlias > 0) {
if (topicAlias > m_clientPrivate->m_serverConnectionProperties.maximumTopicAlias()) {
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;