diff options
author | Katja Marttila <katja.marttila@qt.io> | 2024-04-04 15:35:20 +0300 |
---|---|---|
committer | Katja Marttila <katja.marttila@qt.io> | 2024-04-09 07:40:55 +0000 |
commit | 18ddeeb7fa29ff9dc95570200bf574eb11aca928 (patch) | |
tree | 4c993d4d20e2d9dd6a00ab0526238492c61ffd82 /src/libs/installer/packagemanagercore_p.cpp | |
parent | 06b16edfb00d60ee5b17b7156f6f313e3bd6b1a9 (diff) |
Fix occasional crash in install phase
Progress information is printed using same static instance of the
coordinator by different operations. The operation object pointer was saved as key to QHash so that progress could be tracked. This has caused problems in installer as QHash insert occasionally caused segmentation fault.
Fixed so that the progress information is no longer tracked based on
operation object pointer, instead object name is used.
Task-number: QTIFW-3314
Change-Id: Ic4007f226321e109109006c5c89415308920c614
Reviewed-by: Arttu Tarkiainen <arttu.tarkiainen@qt.io>
Diffstat (limited to 'src/libs/installer/packagemanagercore_p.cpp')
-rw-r--r-- | src/libs/installer/packagemanagercore_p.cpp | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/src/libs/installer/packagemanagercore_p.cpp b/src/libs/installer/packagemanagercore_p.cpp index 7777fd644..858698a7a 100644 --- a/src/libs/installer/packagemanagercore_p.cpp +++ b/src/libs/installer/packagemanagercore_p.cpp @@ -220,6 +220,7 @@ PackageManagerCorePrivate::PackageManagerCorePrivate(PackageManagerCore *core) #else , m_allowCompressedRepositoryInstall(false) #endif + , m_connectedOperations(0) { } @@ -266,6 +267,7 @@ PackageManagerCorePrivate::PackageManagerCorePrivate(PackageManagerCore *core, q #else , m_allowCompressedRepositoryInstall(false) #endif + , m_connectedOperations(0) { foreach (const OperationBlob &operation, performedOperations) { std::unique_ptr<QInstaller::Operation> op(KDUpdater::UpdateOperationFactory::instance() @@ -1208,8 +1210,11 @@ void PackageManagerCorePrivate::connectOperationToInstaller(Operation *const ope connect(m_core, SIGNAL(installationInterrupted()), operationObject, SLOT(cancelOperation())); if (mo->indexOfSignal(QMetaObject::normalizedSignature("progressChanged(double)")) > -1) { + // create unique object names for progress information track + operationObject->setObjectName(QLatin1String("operation_%1").arg(QString::number(m_connectedOperations))); ProgressCoordinator::instance()->registerPartProgress(operationObject, SIGNAL(progressChanged(double)), operationPartSize); + m_connectedOperations++; } } } |