Merge PR #45: Fix a crash when ZDO responses come in after the ZDO request timed out

This commit is contained in:
jenkins 2022-04-25 23:53:19 +02:00
commit 6de3c8318d
2 changed files with 8 additions and 3 deletions

View File

@ -653,9 +653,15 @@ ZigbeeNetworkRequest ZigbeeDeviceObject::buildZdoRequest(quint16 zdoRequest)
ZigbeeDeviceObjectReply *ZigbeeDeviceObject::createZigbeeDeviceObjectReply(const ZigbeeNetworkRequest &request, quint8 transactionSequenceNumber) ZigbeeDeviceObjectReply *ZigbeeDeviceObject::createZigbeeDeviceObjectReply(const ZigbeeNetworkRequest &request, quint8 transactionSequenceNumber)
{ {
ZigbeeDeviceObjectReply *zdoReply = new ZigbeeDeviceObjectReply(request, this); ZigbeeDeviceObjectReply *zdoReply = new ZigbeeDeviceObjectReply(request, this);
connect(zdoReply, &ZigbeeDeviceObjectReply::finished, zdoReply, &ZigbeeDeviceObjectReply::deleteLater, Qt::QueuedConnection);
zdoReply->m_expectedResponse = static_cast<ZigbeeDeviceProfile::ZdoCommand>(request.clusterId() | 0x8000); zdoReply->m_expectedResponse = static_cast<ZigbeeDeviceProfile::ZdoCommand>(request.clusterId() | 0x8000);
zdoReply->m_transactionSequenceNumber = transactionSequenceNumber; zdoReply->m_transactionSequenceNumber = transactionSequenceNumber;
connect(zdoReply, &ZigbeeDeviceObjectReply::finished, this, [=](){
zdoReply->deleteLater();
m_pendingReplies.remove(transactionSequenceNumber);
if (zdoReply->error() != ZigbeeDeviceObjectReply::ErrorNoError) {
qCWarning(dcZigbeeDeviceObject()) << "ZDO request error for TSN:" << transactionSequenceNumber;
}
}, Qt::QueuedConnection);
m_pendingReplies.insert(transactionSequenceNumber, zdoReply); m_pendingReplies.insert(transactionSequenceNumber, zdoReply);
return zdoReply; return zdoReply;
} }
@ -721,7 +727,6 @@ void ZigbeeDeviceObject::finishZdoReply(ZigbeeDeviceObjectReply *zdoReply)
break; break;
} }
m_pendingReplies.remove(zdoReply->transactionSequenceNumber());
zdoReply->m_timeoutTimer.stop(); zdoReply->m_timeoutTimer.stop();
zdoReply->finished(); zdoReply->finished();
} }

View File

@ -33,7 +33,7 @@ ZigbeeDeviceObjectReply::ZigbeeDeviceObjectReply(const ZigbeeNetworkRequest &req
QObject(parent), QObject(parent),
m_request(request) m_request(request)
{ {
m_timeoutTimer.setInterval(5000); m_timeoutTimer.setInterval(10000);
connect(&m_timeoutTimer, &QTimer::timeout, this, [this](){ connect(&m_timeoutTimer, &QTimer::timeout, this, [this](){
m_error = ErrorTimeout; m_error = ErrorTimeout;
emit finished(); emit finished();