From: Christoph Wurst Date: Wed, 8 May 2019 17:41:48 +0000 (+0200) Subject: Fix memory leak with device pointer X-Git-Tag: archive/raspbian/3.16.7-1_deb13u1+rpi1~1^2~279^2^2~36^2 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=c2e3cbca312f99e915b3d26427589fd20c15f1cb;p=nextcloud-desktop.git Fix memory leak with device pointer Downstream of https://github.com/owncloud/client/pull/6856 Signed-off-by: Christoph Wurst --- diff --git a/src/libsync/propagateupload.h b/src/libsync/propagateupload.h index 8dfd98d6f..a1b4f8666 100644 --- a/src/libsync/propagateupload.h +++ b/src/libsync/propagateupload.h @@ -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 device, const QMap &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 device, const QMap &headers, int chunk, QObject *parent = nullptr) : AbstractNetworkJob(account, QString(), parent) - , _device(device) + , _device(device.release()) , _headers(headers) , _url(url) , _chunk(chunk) diff --git a/src/libsync/propagateuploadng.cpp b/src/libsync/propagateuploadng.cpp index 49728a781..7dae923cb 100644 --- a/src/libsync/propagateuploadng.cpp +++ b/src/libsync/propagateuploadng.cpp @@ -305,7 +305,7 @@ void PropagateUploadFileNG::startNextChunk() return; } - auto device = new UploadDevice(&propagator()->_bandwidthManager); + auto device = std::make_unique(&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); diff --git a/src/libsync/propagateuploadv1.cpp b/src/libsync/propagateuploadv1.cpp index bcd31761c..104fa9d75 100644 --- a/src/libsync/propagateuploadv1.cpp +++ b/src/libsync/propagateuploadv1.cpp @@ -89,7 +89,7 @@ void PropagateUploadFileV1::startNextChunk() QString path = _fileToUpload._file; - UploadDevice *device = new UploadDevice(&propagator()->_bandwidthManager); + auto device = std::make_unique(&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);