From: Felix Weilbach Date: Thu, 4 Mar 2021 14:31:58 +0000 (+0100) Subject: Fix crashes with conflict dialog X-Git-Tag: archive/raspbian/3.16.7-1_deb13u1+rpi1~1^2~12^2~21^2~339^2~1 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=ef5abac56701a3cf03fcdf8c7e768d64604120ab;p=nextcloud-desktop.git Fix crashes with conflict dialog When the client runs and a conflict gets detected, the sync engine runs two times. On the first run, the sync engine detects the conflict, marks the file as a conflict and propagates that to the GUI. This leads to an error notification with the original filename in the main dialog. The sync engine runs then a second time. On this second run, the file that originally caused the conflict is not anymore a conflict file. Instead, the sync engine detects the conflicted copy and propagates that file as a conflict to the GUI. When opening the conflict dialog with the original file name (not the conflicted copy) a crash happens. Usually, the two sync runs are really fast, so the user does not notice the first notification. However, a problem can occur if a conflict gets created while the client is not running. Since then, the client does not do two sync runs. It does only run once. Signed-off-by: Felix Weilbach --- diff --git a/src/gui/tray/UserModel.cpp b/src/gui/tray/UserModel.cpp index a175d3173..682b8a393 100644 --- a/src/gui/tray/UserModel.cpp +++ b/src/gui/tray/UserModel.cpp @@ -413,6 +413,22 @@ void User::slotAddError(const QString &folderAlias, const QString &message, Erro } } +bool User::isValueableActivity(const Folder *folder, const SyncFileItemPtr &item) const +{ + // Check if we are adding it to the right account and if it is useful information (protocol errors) + const auto isDifferentAccount = folder->accountState() != _account.data(); + const auto isConflictFromOriginalFile = item->_status == SyncFileItem::Conflict && !Utility::isConflictFile(item->_file); + + if (isDifferentAccount) { + return false; + } + if (isConflictFromOriginalFile) { + return false; + } + + return true; +} + void User::slotItemCompleted(const QString &folder, const SyncFileItemPtr &item) { auto folderInstance = FolderMan::instance()->folder(folder); @@ -420,8 +436,7 @@ void User::slotItemCompleted(const QString &folder, const SyncFileItemPtr &item) if (!folderInstance) return; - // check if we are adding it to the right account and if it is useful information (protocol errors) - if (folderInstance->accountState() == _account.data()) { + if (isValueableActivity(folderInstance, item)) { qCWarning(lcActivity) << "Item " << item->_file << " retrieved resulted in " << item->_errorString; Activity activity; diff --git a/src/gui/tray/UserModel.h b/src/gui/tray/UserModel.h index d9f99f1de..535c9ad43 100644 --- a/src/gui/tray/UserModel.h +++ b/src/gui/tray/UserModel.h @@ -80,6 +80,8 @@ private: void connectPushNotifications() const; bool checkPushNotificationsAreReady() const; + bool isValueableActivity(const Folder *folder, const SyncFileItemPtr &item) const; + private: AccountStatePtr _account; bool _isCurrentUser; diff --git a/src/libsync/owncloudpropagator.cpp b/src/libsync/owncloudpropagator.cpp index 90ba4ea66..4c35a3956 100644 --- a/src/libsync/owncloudpropagator.cpp +++ b/src/libsync/owncloudpropagator.cpp @@ -742,13 +742,12 @@ bool OwncloudPropagator::createConflict(const SyncFileItemPtr &item, conflictItem->_size = item->_previousSize; emit newItem(conflictItem); composite->appendTask(conflictItem); - } else { - // Directories we can't process in one go. The next sync run - // will take care of uploading the conflict dir contents. - _anotherSyncNeeded = true; } } + // Need a new sync to detect the created copy of the conflicting file + _anotherSyncNeeded = true; + return true; }