Fix memory leak with device pointer
authorChristoph Wurst <christoph@winzerhof-wurst.at>
Wed, 8 May 2019 17:41:48 +0000 (19:41 +0200)
committerChristoph Wurst <christoph@winzerhof-wurst.at>
Wed, 8 May 2019 17:41:48 +0000 (19:41 +0200)
Downstream of https://github.com/owncloud/client/pull/6856

Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
src/libsync/propagateupload.h
src/libsync/propagateuploadng.cpp
src/libsync/propagateuploadv1.cpp

index 8dfd98d6f269cfdb10bdb4571a129b921b70be81..a1b4f86660f9fcaf961cef1dbf79bc6537023716 100644 (file)
@@ -92,19 +92,19 @@ private:
 
 public:
     // Takes ownership of the device
-    explicit PUTFileJob(AccountPtr account, const QString &path, QIODevice *device,
+    explicit PUTFileJob(AccountPtr account, const QString &path, std::unique_ptr<QIODevice> device,
         const QMap<QByteArray, QByteArray> &headers, int chunk, QObject *parent = nullptr)
         : AbstractNetworkJob(account, path, parent)
-        , _device(device)
+        , _device(device.release())
         , _headers(headers)
         , _chunk(chunk)
     {
         _device->setParent(this);
     }
-    explicit PUTFileJob(AccountPtr account, const QUrl &url, QIODevice *device,
+    explicit PUTFileJob(AccountPtr account, const QUrl &url, std::unique_ptr<QIODevice> device,
         const QMap<QByteArray, QByteArray> &headers, int chunk, QObject *parent = nullptr)
         : AbstractNetworkJob(account, QString(), parent)
-        , _device(device)
+        , _device(device.release())
         , _headers(headers)
         , _url(url)
         , _chunk(chunk)
index 49728a7815abda40312c5e5a6de5aa62ed8738eb..7dae923cb4af31231a533178af5853926b658250 100644 (file)
@@ -305,7 +305,7 @@ void PropagateUploadFileNG::startNextChunk()
         return;
     }
 
-    auto device = new UploadDevice(&propagator()->_bandwidthManager);
+    auto device = std::make_unique<UploadDevice>(&propagator()->_bandwidthManager);
     const QString fileName = _fileToUpload._path;
 
     if (!device->prepareAndOpen(fileName, _sent, _currentChunkSize)) {
@@ -328,13 +328,14 @@ void PropagateUploadFileNG::startNextChunk()
     QUrl url = chunkUrl(_currentChunk);
 
     // job takes ownership of device via a QScopedPointer. Job deletes itself when finishing
-    PUTFileJob *job = new PUTFileJob(propagator()->account(), url, device, headers, _currentChunk, this);
+    auto devicePtr = device.get(); // for connections later
+    PUTFileJob *job = new PUTFileJob(propagator()->account(), url, std::move(device), headers, _currentChunk, this);
     _jobs.append(job);
     connect(job, &PUTFileJob::finishedSignal, this, &PropagateUploadFileNG::slotPutFinished);
     connect(job, &PUTFileJob::uploadProgress,
         this, &PropagateUploadFileNG::slotUploadProgress);
     connect(job, &PUTFileJob::uploadProgress,
-        device, &UploadDevice::slotJobUploadProgress);
+        devicePtr, &UploadDevice::slotJobUploadProgress);
     connect(job, &QObject::destroyed, this, &PropagateUploadFileCommon::slotJobDestroyed);
     job->start();
     propagator()->_activeJobList.append(this);
index bcd31761cb78c165cbde4fddea99cde464d33785..104fa9d752e4cd380caa027050ddaab4d7a9a92a 100644 (file)
@@ -89,7 +89,7 @@ void PropagateUploadFileV1::startNextChunk()
 
     QString path = _fileToUpload._file;
 
-    UploadDevice *device = new UploadDevice(&propagator()->_bandwidthManager);
+    auto device = std::make_unique<UploadDevice>(&propagator()->_bandwidthManager);
     qint64 chunkStart = 0;
     qint64 currentChunkSize = fileSize;
     bool isFinalChunk = false;
@@ -134,16 +134,16 @@ void PropagateUploadFileV1::startNextChunk()
         }
         // Soft error because this is likely caused by the user modifying his files while syncing
         abortWithError(SyncFileItem::SoftError, device->errorString());
-        delete device;
         return;
     }
 
     // job takes ownership of device via a QScopedPointer. Job deletes itself when finishing
-    PUTFileJob *job = new PUTFileJob(propagator()->account(), propagator()->_remoteFolder + path, device, headers, _currentChunk, this);
+    auto devicePtr = device.get(); // for connections later
+    PUTFileJob *job = new PUTFileJob(propagator()->account(), propagator()->_remoteFolder + path, std::move(device), headers, _currentChunk, this);
     _jobs.append(job);
     connect(job, &PUTFileJob::finishedSignal, this, &PropagateUploadFileV1::slotPutFinished);
     connect(job, &PUTFileJob::uploadProgress, this, &PropagateUploadFileV1::slotUploadProgress);
-    connect(job, &PUTFileJob::uploadProgress, device, &UploadDevice::slotJobUploadProgress);
+    connect(job, &PUTFileJob::uploadProgress, devicePtr, &UploadDevice::slotJobUploadProgress);
     connect(job, &QObject::destroyed, this, &PropagateUploadFileCommon::slotJobDestroyed);
     if (isFinalChunk)
         adjustLastJobTimeout(job, fileSize);