From dc57025218fc4b7ae7673be175d6b98b4f8f3b19 Mon Sep 17 00:00:00 2001 From: Jonathan White Date: Mon, 12 Oct 2020 16:50:13 -0400 Subject: [PATCH] Fix crash in KeeShare when importing deleted share * Fix #4895 - when KeeShare imports a database it performs a merge operation. If that share was deleted from another identical database (ie, same base group UUID), then the group would be deleted in the middle of reinit causing a crash. This fix moves the group into a QPointer catching the delete operation. --- src/keeshare/ShareObserver.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/keeshare/ShareObserver.cpp b/src/keeshare/ShareObserver.cpp index 6dc7a748..6fd629b4 100644 --- a/src/keeshare/ShareObserver.cpp +++ b/src/keeshare/ShareObserver.cpp @@ -66,7 +66,7 @@ void ShareObserver::deinitialize() void ShareObserver::reinitialize() { - QList> shares; + QList, KeeShareSettings::Reference>> shares; for (Group* group : m_db->rootGroup()->groupsRecursive(true)) { auto oldReference = m_groupToReference.value(group); auto newReference = KeeShare::referenceOf(group); @@ -97,6 +97,10 @@ void ShareObserver::reinitialize() for (const auto& share : shares) { auto group = share.first; auto& reference = share.second; + // Check group validity, it may have been deleted by a merge action + if (!group) { + continue; + } if (!reference.path.isEmpty() && reference.type != KeeShareSettings::Inactive) { const auto newResolvedPath = resolvePath(reference.path, m_db);