Don't store pointer to local job
authorChristian Kamm <mail@ckamm.de>
Wed, 11 Sep 2019 09:03:27 +0000 (11:03 +0200)
committerKevin Ottens <kevin.ottens@nextcloud.com>
Tue, 15 Dec 2020 09:58:59 +0000 (10:58 +0100)
There were crashes in the QPointer assignment. Possibly the thread pool
is done with the job and deletes it before the assignment is done.

src/libsync/discovery.cpp
src/libsync/discovery.h

index f1dfd903ca001598a23c1714c0194910ef577a60..4f162e18f7800659786b1ea4123464b50bb58947 100644 (file)
@@ -52,7 +52,7 @@ void ProcessDirectoryJob::start()
     }
 
     if (_queryLocal == NormalQuery) {
-        _localJob = startAsyncLocalQuery();
+        startAsyncLocalQuery();
     } else {
         _localQueryDone = true;
     }
@@ -1430,7 +1430,7 @@ DiscoverySingleDirectoryJob *ProcessDirectoryJob::startAsyncServerQuery()
     return serverJob;
 }
 
-DiscoverySingleLocalDirectoryJob *ProcessDirectoryJob::startAsyncLocalQuery()
+void ProcessDirectoryJob::startAsyncLocalQuery()
 {
     QString localPath = _discoveryData->_localDir + _currentFolder._local;
     auto localJob = new DiscoverySingleLocalDirectoryJob(_discoveryData->_account, localPath, _discoveryData->_syncOptions._vfs.data(), this);
@@ -1477,9 +1477,7 @@ DiscoverySingleLocalDirectoryJob *ProcessDirectoryJob::startAsyncLocalQuery()
     });
 
     QThreadPool *pool = QThreadPool::globalInstance();
-    pool->start(localJob);
-
-    return localJob;
+    pool->start(localJob); // QThreadPool takes ownership
 }
 
 
index e731562b21cb72f1fda968b1f0afa0df97d726c8..6b165421e599057657a4152e41682cf6cd030e1e 100644 (file)
@@ -206,7 +206,7 @@ private:
       *
       * Fills _localNormalQueryEntries.
       */
-    DiscoverySingleLocalDirectoryJob *startAsyncLocalQuery();
+    void startAsyncLocalQuery();
 
 
     /** Sets _pinState, the directory's pin state
@@ -243,8 +243,6 @@ private:
     RemotePermissions _rootPermissions;
     QPointer<DiscoverySingleDirectoryJob> _serverJob;
 
-    QPointer<DiscoverySingleLocalDirectoryJob> _localJob;
-
 
     /** Number of currently running async jobs.
      *