Skip to content

Commit

Permalink
Fix crash when deleting a local sync folder during sync.
Browse files Browse the repository at this point in the history
Signed-off-by: alex-z <[email protected]>
  • Loading branch information
allexzander committed Feb 17, 2024
1 parent 5511d69 commit 1041a05
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 14 deletions.
46 changes: 32 additions & 14 deletions src/gui/folder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -561,19 +561,21 @@ void Folder::slotWatchedPathChanged(const QString &path, ChangeReason reason)

auto relativePath = path.midRef(this->path().size());

if (pathIsIgnored(path)) {
const auto pinState = _vfs->pinState(relativePath.toString());
if (!pinState || *pinState != PinState::Excluded) {
if (!_vfs->setPinState(relativePath.toString(), PinState::Excluded)) {
qCWarning(lcFolder) << "Could not set pin state of" << relativePath << "to excluded";
if (_vfs) {
if (pathIsIgnored(path)) {
const auto pinState = _vfs->pinState(relativePath.toString());
if (!pinState || *pinState != PinState::Excluded) {
if (!_vfs->setPinState(relativePath.toString(), PinState::Excluded)) {
qCWarning(lcFolder) << "Could not set pin state of" << relativePath << "to excluded";
}
}
}
return;
} else {
const auto pinState = _vfs->pinState(relativePath.toString());
if (pinState && *pinState == PinState::Excluded) {
if (!_vfs->setPinState(relativePath.toString(), PinState::Inherited)) {
qCWarning(lcFolder) << "Could not switch pin state of" << relativePath << "from" << *pinState << "to inherited";
return;
} else {

Check warning on line 573 in src/gui/folder.cpp

View workflow job for this annotation

GitHub Actions / build

src/gui/folder.cpp:573:11 [readability-else-after-return]

do not use 'else' after 'return'
const auto pinState = _vfs->pinState(relativePath.toString());
if (pinState && *pinState == PinState::Excluded) {
if (!_vfs->setPinState(relativePath.toString(), PinState::Inherited)) {
qCWarning(lcFolder) << "Could not switch pin state of" << relativePath << "from" << *pinState << "to inherited";
}
}
}
}
Expand Down Expand Up @@ -610,7 +612,7 @@ void Folder::slotWatchedPathChanged(const QString &path, ChangeReason reason)
// an attribute change (pin state) that caused the notification
bool spurious = false;
if (record.isValid()
&& !FileSystem::fileChanged(path, record._fileSize, record._modtime)) {
&& !FileSystem::fileChanged(path, record._fileSize, record._modtime) && _vfs) {
spurious = true;

if (auto pinState = _vfs->pinState(relativePath.toString())) {
Expand Down Expand Up @@ -971,6 +973,8 @@ void Folder::wipeForRemoval()
// Delete files that have been partially downloaded.
slotDiscardDownloadProgress();

disconnectFolderWatcher();

// Unregister the socket API so it does not keep the .sync_journal file open
FolderMan::instance()->socketApi()->slotUnregisterPath(alias());
_journal.close(); // close the sync journal
Expand All @@ -997,7 +1001,6 @@ void Folder::wipeForRemoval()

_vfs->stop();
_vfs->unregisterFolder();
_vfs.reset(nullptr); // warning: folder now in an invalid state
}

bool Folder::reloadExcludes()
Expand Down Expand Up @@ -1588,6 +1591,21 @@ void Folder::registerFolderWatcher()
_folderWatcher->startNotificatonTest(path() + QLatin1String(".nextcloudsync.log"));
}

void Folder::disconnectFolderWatcher()

Check warning on line 1594 in src/gui/folder.cpp

View workflow job for this annotation

GitHub Actions / build

src/gui/folder.cpp:1594:14 [readability-convert-member-functions-to-static]

method 'disconnectFolderWatcher' can be made static
{
if (!_folderWatcher) {
return;
}
disconnect(_folderWatcher.data(), &FolderWatcher::pathChanged, nullptr, nullptr);
disconnect(_folderWatcher.data(), &FolderWatcher::lostChanges, this, &Folder::slotNextSyncFullLocalDiscovery);
disconnect(_folderWatcher.data(), &FolderWatcher::becameUnreliable, this, &Folder::slotWatcherUnreliable);
if (_accountState->account()->capabilities().filesLockAvailable()) {
disconnect(_folderWatcher.data(), &FolderWatcher::filesLockReleased, this, &Folder::slotFilesLockReleased);
disconnect(_folderWatcher.data(), &FolderWatcher::lockedFilesFound, this, &Folder::slotLockedFilesFound);
}
disconnect(_folderWatcher.data(), &FolderWatcher::filesLockImposed, this, &Folder::slotFilesLockImposed);
}

bool Folder::virtualFilesEnabled() const
{
return _definition.virtualFilesMode != Vfs::Off && !isVfsOnOffSwitchPending();
Expand Down
5 changes: 5 additions & 0 deletions src/gui/folder.h
Original file line number Diff line number Diff line change
Expand Up @@ -400,6 +400,11 @@ public slots:
private slots:
void slotSyncStarted();
void slotSyncFinished(bool);
/*
* Disconnects all the slots from the FolderWatcher
* Needs to be called each time a folder is removed
*/
void disconnectFolderWatcher();

/** Adds a error message that's not tied to a specific item.
*/
Expand Down

0 comments on commit 1041a05

Please sign in to comment.