From 5c1b4d2b48f204055dbe2dc0b2940a0a48576869 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Thu, 27 Jan 2022 12:26:29 +0100 Subject: [PATCH] Debugger: Fix removing auto detected debuggers Do not remove items while iterating over the tree or we may crash when removing more than one. Change-Id: I007672be94a7e6449cf25c965c07ca714049ae97 Reviewed-by: hjk --- src/plugins/debugger/debuggeritemmanager.cpp | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/plugins/debugger/debuggeritemmanager.cpp b/src/plugins/debugger/debuggeritemmanager.cpp index fbe0aeb3fac..93b91c55591 100644 --- a/src/plugins/debugger/debuggeritemmanager.cpp +++ b/src/plugins/debugger/debuggeritemmanager.cpp @@ -1053,19 +1053,23 @@ void DebuggerItemManager::removeDetectedDebuggers(const QString &detectionSource QString *logMessage) { QStringList logMessages{tr("Removing debugger entries...")}; - d->m_model->forItemsAtLevel<2>([detectionSource, &logMessages](DebuggerTreeItem *titem) { + QList toBeRemoved; + + d->m_model->forItemsAtLevel<2>([detectionSource, &toBeRemoved](DebuggerTreeItem *titem) { if (titem->m_item.detectionSource() == detectionSource) { - logMessages.append(tr("Removed \"%1\"").arg(titem->m_item.displayName())); - d->m_model->destroyItem(titem); + toBeRemoved.append(titem); return; } // FIXME: These items appeared in early docker development. Ok to remove for Creator 7.0. FilePath filePath = titem->m_item.command(); - if (filePath.scheme() + ':' + filePath.host() == detectionSource) { - logMessages.append(tr("Removed \"%1\"").arg(titem->m_item.displayName())); - d->m_model->destroyItem(titem); - } + if (filePath.scheme() + ':' + filePath.host() == detectionSource) + toBeRemoved.append(titem); }); + for (DebuggerTreeItem *current : toBeRemoved) { + logMessages.append(tr("Removed \"%1\"").arg(current->m_item.displayName())); + d->m_model->destroyItem(current); + } + if (logMessage) *logMessage = logMessages.join('\n'); }