diff options
author | Kai Koehne <kai.koehne@theqtcompany.com> | 2015-01-16 17:07:22 +0100 |
---|---|---|
committer | Kai Koehne <kai.koehne@theqtcompany.com> | 2015-01-20 11:24:15 +0100 |
commit | 23c08c852bd7d82c601aa73b62e30c43bc24c708 (patch) | |
tree | 45002247620e1deba8db5010533e2a850df32e24 /src/libs/installer/packagemanagercore_p.cpp | |
parent | bb052608fbcec1ad580660754157fa6ecc3512fc (diff) |
Delete components only after they have been removed from the lists
This fixes a crash when a component destructor e.g. tries to unregister
a widget: This might lead to the creation of a new scripting engine,
which then tries to register all components into the engine, including
components that have already been deleted ...
Avoid this by first cleaning the lists, and then doing the actual
deletion.
Task-number: QTIFW-612
Change-Id: I708a1ade3b3cc15006eefe394c2d81bf47ebe754
Reviewed-by: Niels Weber <niels.weber@theqtcompany.com>
Diffstat (limited to 'src/libs/installer/packagemanagercore_p.cpp')
-rw-r--r-- | src/libs/installer/packagemanagercore_p.cpp | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/src/libs/installer/packagemanagercore_p.cpp b/src/libs/installer/packagemanagercore_p.cpp index 467bf5408..aa712c675 100644 --- a/src/libs/installer/packagemanagercore_p.cpp +++ b/src/libs/installer/packagemanagercore_p.cpp @@ -433,17 +433,20 @@ ScriptEngine *PackageManagerCorePrivate::controlScriptEngine() const void PackageManagerCorePrivate::clearAllComponentLists() { - qDeleteAll(m_rootComponents); + QList<QInstaller::Component*> toDelete; + + toDelete << m_rootComponents; m_rootComponents.clear(); m_rootDependencyReplacements.clear(); const QList<QPair<Component*, Component*> > list = m_componentsToReplaceAllMode.values(); for (int i = 0; i < list.count(); ++i) - delete list.at(i).second; + toDelete << list.at(i).second; m_componentsToReplaceAllMode.clear(); m_componentsToInstallCalculated = false; + qDeleteAll(toDelete); cleanUpComponentEnvironment(); } @@ -460,8 +463,6 @@ void PackageManagerCorePrivate::clearUpdaterComponentLists() usedComponents.insert(list.at(i).second); } - qDeleteAll(usedComponents); - m_updaterComponents.clear(); m_updaterComponentsDeps.clear(); @@ -470,6 +471,7 @@ void PackageManagerCorePrivate::clearUpdaterComponentLists() m_componentsToReplaceUpdaterMode.clear(); m_componentsToInstallCalculated = false; + qDeleteAll(usedComponents); cleanUpComponentEnvironment(); } |