From 46018cc79df00c953b17e2e9aff2d0e1bc2c4753 Mon Sep 17 00:00:00 2001 From: Camila Ayres Date: Wed, 8 Apr 2026 13:50:29 +0200 Subject: [PATCH 1/5] fix(folderman): disconnect slotFolderCanSyncChanged when unloading folder. In case the account state changes during shutdown, the folder might not exist anymore. Signed-off-by: Camila Ayres --- src/gui/folderman.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/gui/folderman.cpp b/src/gui/folderman.cpp index 282fb299da1ea..491361de8ed51 100644 --- a/src/gui/folderman.cpp +++ b/src/gui/folderman.cpp @@ -126,6 +126,8 @@ void FolderMan::unloadFolder(Folder *f) this, &FolderMan::slotForwardFolderSyncStateChange); disconnect(f, &Folder::syncPausedChanged, this, &FolderMan::slotFolderSyncPaused); + disconnect(f, &Folder::canSyncChanged, + this, &FolderMan::slotFolderCanSyncChanged); disconnect(&f->syncEngine().syncFileStatusTracker(), &SyncFileStatusTracker::fileStatusChanged, _socketApi.data(), &SocketApi::broadcastStatusPushMessage); disconnect(f, &Folder::watchedFileChangedExternally, From af0f6bcd9ea3fc6d4e2f3688ec7be94be08e1819 Mon Sep 17 00:00:00 2001 From: Camila Ayres Date: Wed, 8 Apr 2026 13:56:44 +0200 Subject: [PATCH 2/5] refactor: modernize FolderMan::slotFolderCanSyncChanged. Signed-off-by: Camila Ayres --- src/gui/folderman.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/gui/folderman.cpp b/src/gui/folderman.cpp index 491361de8ed51..0ba7b7e8fc189 100644 --- a/src/gui/folderman.cpp +++ b/src/gui/folderman.cpp @@ -661,12 +661,12 @@ void FolderMan::slotFolderSyncPaused(Folder *f, bool paused) void FolderMan::slotFolderCanSyncChanged() { - auto *f = qobject_cast(sender()); - ASSERT(f); - if (f->canSync()) { - _socketApi->slotRegisterPath(f->alias()); + auto folder = qobject_cast(sender()); + ASSERT(folder); + if (folder->canSync()) { + _socketApi->slotRegisterPath(folder->alias()); } else { - _socketApi->slotUnregisterPath(f->alias()); + _socketApi->slotUnregisterPath(folder->alias()); } } From 55221603a1fc6ed862050f13b9d998204349fc3f Mon Sep 17 00:00:00 2001 From: Camila Ayres Date: Wed, 8 Apr 2026 15:33:18 +0200 Subject: [PATCH 3/5] fix(socketapi): remove doWait from broadcastMessage in slotUnregisterPath. Passing doWait=true caused socket->waitForBytesWritten(1000) to emit a signal. During shutdown, the signal could trigger slotUnregisterPath, corrupting _registeredAliases and crashing with EXC_BAD_ACCESS. Removing doWait eliminates the nested event loop and the re-entrancy. Signed-off-by: Camila Ayres --- src/gui/socketapi/socketapi.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/socketapi/socketapi.cpp b/src/gui/socketapi/socketapi.cpp index eb2f4c4d04ceb..9e6cbe5b5eccb 100644 --- a/src/gui/socketapi/socketapi.cpp +++ b/src/gui/socketapi/socketapi.cpp @@ -464,7 +464,7 @@ void SocketApi::slotUnregisterPath(const QString &alias) Folder *f = FolderMan::instance()->folder(alias); if (f) - broadcastMessage(buildMessage(QLatin1String("UNREGISTER_PATH"), removeTrailingSlash(f->path()), QString()), true); + broadcastMessage(buildMessage(QLatin1String("UNREGISTER_PATH"), removeTrailingSlash(f->path()), QString())); _registeredAliases.remove(alias); } From c28ef239d4d9c0ee705253701d3dfbbaf73cb642 Mon Sep 17 00:00:00 2001 From: Camila Ayres Date: Wed, 8 Apr 2026 15:47:56 +0200 Subject: [PATCH 4/5] refactor: movernize SocketApi::slotUnregisterPath. Signed-off-by: Camila Ayres --- src/gui/socketapi/socketapi.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/gui/socketapi/socketapi.cpp b/src/gui/socketapi/socketapi.cpp index 9e6cbe5b5eccb..3682a19b9233a 100644 --- a/src/gui/socketapi/socketapi.cpp +++ b/src/gui/socketapi/socketapi.cpp @@ -459,12 +459,16 @@ void SocketApi::slotRegisterPath(const QString &alias) void SocketApi::slotUnregisterPath(const QString &alias) { - if (!_registeredAliases.contains(alias)) + if (!_registeredAliases.contains(alias)) { return; + } - Folder *f = FolderMan::instance()->folder(alias); - if (f) - broadcastMessage(buildMessage(QLatin1String("UNREGISTER_PATH"), removeTrailingSlash(f->path()), QString())); + auto folder = FolderMan::instance()->folder(alias); + if (folder) { + broadcastMessage(buildMessage(QLatin1String("UNREGISTER_PATH"), + removeTrailingSlash(folder->path()), + QString())); + } _registeredAliases.remove(alias); } From 70782a3c3f9f9d84d9404e48522df687f4b72a55 Mon Sep 17 00:00:00 2001 From: Camila Ayres Date: Wed, 8 Apr 2026 20:01:07 +0200 Subject: [PATCH 5/5] test(folderman): add test function to unload and delete folders. Signed-off-by: Camila Ayres --- test/testfolderman.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/test/testfolderman.cpp b/test/testfolderman.cpp index 2469e0022f946..9d0532dab470f 100644 --- a/test/testfolderman.cpp +++ b/test/testfolderman.cpp @@ -19,6 +19,7 @@ #include "accountstate.h" #include #include "configfile.h" +#include "socketapi/socketapi.h" #include "syncenginetestutils.h" #include "testhelper.h"