From 2f290e6dc09c23173273d4d98837e89efb4589c3 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Thu, 7 Mar 2024 17:07:06 +0100 Subject: [PATCH] ProjectExplorer: Fix KitManager::deregisterKits There were some problems regarding removal of the default kit: - A precondition of setDefaultKit() was violated. - The new default kit was set to a kit that was possibly removed later as well (and never updated afterwards). - The new default kit was only set if it wasn't null, leaving a dangling pointer in m_defaultKit. Also turned some checks into assertions. Amends e31a06a0f42143724ebf35aa2cc669dbcf54fbf0. Done-by: Christian Kandeler Fixes: QTCREATORBUG-30493 Fixes: QTCREATORBUG-30502 Change-Id: I3283f02c90d0ec84b579d7cfdf845b03663f5768 Reviewed-by: Eike Ziller Reviewed-by: Alessandro Portale Reviewed-by: Christian Kandeler --- src/plugins/projectexplorer/kitmanager.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/plugins/projectexplorer/kitmanager.cpp b/src/plugins/projectexplorer/kitmanager.cpp index ea23bea65f2..9406d746d91 100644 --- a/src/plugins/projectexplorer/kitmanager.cpp +++ b/src/plugins/projectexplorer/kitmanager.cpp @@ -657,20 +657,20 @@ void KitManager::deregisterKits(const QList kitList) { QTC_ASSERT(KitManager::isLoaded(), return); std::vector> removed; // to keep them alive until the end of the function - Kit *newDefault = nullptr; + bool defaultKitRemoved = false; for (Kit *k : kitList) { - if (!k) - continue; + QTC_ASSERT(k, continue); std::optional> taken = Utils::take(d->m_kitList, k); - if (!taken) - continue; + QTC_ASSERT(taken, continue); + if (defaultKit() == k) + defaultKitRemoved = true; removed.push_back(std::move(*taken)); - if (defaultKit() == k) { - newDefault = Utils::findOrDefault(kits(), [](Kit *k) { return k->isValid(); }); - } } - if (newDefault) - setDefaultKit(newDefault); + + if (defaultKitRemoved) { + d->m_defaultKit = Utils::findOrDefault(kits(), &Kit::isValid); + emit instance()->defaultkitChanged(); + } for (auto it = removed.cbegin(); it != removed.cend(); ++it) emit instance()->kitRemoved(it->get());