From 05d1cc9a94d03dfbaac99942db1b8a8e2040178c Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Wed, 11 Nov 2015 13:28:20 +0100 Subject: [PATCH] Sharing: Fix crash with share deletion #4111 The problem was that Share could be deleted *before* the OcsShareJob itself finished. Since Share was the parent of the network job, its object would be deleted too early. In general, it's unnecessary to assign parents to the OcsJobs because they delete themselves when finished. --- src/gui/ocsjob.cpp | 5 ++--- src/gui/ocsjob.h | 2 +- src/gui/ocsshareejob.cpp | 4 ++-- src/gui/ocsshareejob.h | 2 +- src/gui/ocssharejob.cpp | 4 ++-- src/gui/ocssharejob.h | 2 +- src/gui/share.cpp | 16 ++++++++-------- src/gui/sharee.cpp | 2 +- 8 files changed, 18 insertions(+), 19 deletions(-) diff --git a/src/gui/ocsjob.cpp b/src/gui/ocsjob.cpp index 5b0b0ad54..4ab1473ea 100644 --- a/src/gui/ocsjob.cpp +++ b/src/gui/ocsjob.cpp @@ -20,8 +20,8 @@ namespace OCC { -OcsJob::OcsJob(AccountPtr account, QObject* parent) -: AbstractNetworkJob(account, "", parent) +OcsJob::OcsJob(AccountPtr account) +: AbstractNetworkJob(account, "") { _passStatusCodes.append(100); setIgnoreCredentialFailure(true); @@ -109,7 +109,6 @@ bool OcsJob::finished() } else { emit jobFinished(json); } - deleteLater(); return true; } diff --git a/src/gui/ocsjob.h b/src/gui/ocsjob.h index 344b004ae..dcd205854 100644 --- a/src/gui/ocsjob.h +++ b/src/gui/ocsjob.h @@ -38,7 +38,7 @@ class OcsJob : public AbstractNetworkJob { protected: - explicit OcsJob(AccountPtr account, QObject* parent = 0); + explicit OcsJob(AccountPtr account); /** * Set the verb for the job diff --git a/src/gui/ocsshareejob.cpp b/src/gui/ocsshareejob.cpp index d62100190..60aa0c965 100644 --- a/src/gui/ocsshareejob.cpp +++ b/src/gui/ocsshareejob.cpp @@ -15,8 +15,8 @@ namespace OCC { -OcsShareeJob::OcsShareeJob(AccountPtr account, QObject *parent) -: OcsJob(account, parent) +OcsShareeJob::OcsShareeJob(AccountPtr account) +: OcsJob(account) { setPath("ocs/v1.php/apps/files_sharing/api/v1/sharees"); connect(this, SIGNAL(jobFinished(QVariantMap)), SLOT(jobDone(QVariantMap))); diff --git a/src/gui/ocsshareejob.h b/src/gui/ocsshareejob.h index 208d0ff60..c8a49fd97 100644 --- a/src/gui/ocsshareejob.h +++ b/src/gui/ocsshareejob.h @@ -29,7 +29,7 @@ class OcsShareeJob : public OcsJob { Q_OBJECT public: - explicit OcsShareeJob(AccountPtr account, QObject *parent = 0); + explicit OcsShareeJob(AccountPtr account); /** * Get a list of sharees diff --git a/src/gui/ocssharejob.cpp b/src/gui/ocssharejob.cpp index 37ca5aa39..93c0c1d14 100644 --- a/src/gui/ocssharejob.cpp +++ b/src/gui/ocssharejob.cpp @@ -20,8 +20,8 @@ namespace OCC { -OcsShareJob::OcsShareJob(AccountPtr account, QObject* parent) -: OcsJob(account, parent) +OcsShareJob::OcsShareJob(AccountPtr account) +: OcsJob(account) { setPath("ocs/v1.php/apps/files_sharing/api/v1/shares"); connect(this, SIGNAL(jobFinished(QVariantMap)), this, SLOT(jobDone(QVariantMap))); diff --git a/src/gui/ocssharejob.h b/src/gui/ocssharejob.h index bc65b5317..9f018aa12 100644 --- a/src/gui/ocssharejob.h +++ b/src/gui/ocssharejob.h @@ -36,7 +36,7 @@ public: /** * Constructor for new shares or listing of shares */ - explicit OcsShareJob(AccountPtr account, QObject *parent = 0); + explicit OcsShareJob(AccountPtr account); /** * Get all the shares diff --git a/src/gui/share.cpp b/src/gui/share.cpp index e5525a4fc..f10840402 100644 --- a/src/gui/share.cpp +++ b/src/gui/share.cpp @@ -52,7 +52,7 @@ QSharedPointer Share::getShareWith() const void Share::setPermissions(Permissions permissions) { - OcsShareJob *job = new OcsShareJob(_account, this); + OcsShareJob *job = new OcsShareJob(_account); connect(job, SIGNAL(shareJobFinished(QVariantMap, QVariant)), SLOT(slotPermissionsSet(QVariantMap, QVariant))); connect(job, SIGNAL(ocsError(int, QString)), SLOT(slotOcsError(int, QString))); job->setPermissions(getId(), permissions); @@ -71,7 +71,7 @@ Share::Permissions Share::getPermissions() const void Share::deleteShare() { - OcsShareJob *job = new OcsShareJob(_account, this); + OcsShareJob *job = new OcsShareJob(_account); connect(job, SIGNAL(shareJobFinished(QVariantMap, QVariant)), SLOT(slotDeleted())); connect(job, SIGNAL(ocsError(int, const QString &)), SLOT(slotOcsError(int, const QString &))); job->deleteShare(getId()); @@ -125,7 +125,7 @@ bool LinkShare::getPublicUpload() void LinkShare::setPublicUpload(bool publicUpload) { - OcsShareJob *job = new OcsShareJob(_account, this); + OcsShareJob *job = new OcsShareJob(_account); connect(job, SIGNAL(shareJobFinished(QVariantMap, QVariant)), SLOT(slotPublicUploadSet(QVariantMap, QVariant))); connect(job, SIGNAL(ocsError(int, QString)), SLOT(slotOcsError(int, QString))); job->setPublicUpload(getId(), publicUpload); @@ -144,7 +144,7 @@ void LinkShare::slotPublicUploadSet(const QVariantMap&, const QVariant &value) void LinkShare::setPassword(const QString &password) { - OcsShareJob *job = new OcsShareJob(_account, this); + OcsShareJob *job = new OcsShareJob(_account); connect(job, SIGNAL(shareJobFinished(QVariantMap, QVariant)), SLOT(slotPasswordSet(QVariantMap, QVariant))); connect(job, SIGNAL(ocsError(int, QString)), SLOT(slotOcsError(int, QString))); job->setPassword(getId(), password); @@ -158,7 +158,7 @@ void LinkShare::slotPasswordSet(const QVariantMap&, const QVariant &value) void LinkShare::setExpireDate(const QDate &date) { - OcsShareJob *job = new OcsShareJob(_account, this); + OcsShareJob *job = new OcsShareJob(_account); connect(job, SIGNAL(shareJobFinished(QVariantMap, QVariant)), SLOT(slotExpireDateSet(QVariantMap, QVariant))); connect(job, SIGNAL(ocsError(int, QString)), SLOT(slotOcsError(int, QString))); job->setExpireDate(getId(), date); @@ -180,7 +180,7 @@ ShareManager::ShareManager(AccountPtr account, QObject *parent) void ShareManager::createLinkShare(const QString &path, const QString &password) { - OcsShareJob *job = new OcsShareJob(_account, this); + OcsShareJob *job = new OcsShareJob(_account); connect(job, SIGNAL(shareJobFinished(QVariantMap, QVariant)), SLOT(slotLinkShareCreated(QVariantMap))); connect(job, SIGNAL(ocsError(int, QString)), SLOT(slotOcsError(int, QString))); job->createLinkShare(path, password); @@ -212,7 +212,7 @@ void ShareManager::createShare(const QString& path, const QString shareWith, const Share::Permissions permissions) { - OcsShareJob *job = new OcsShareJob(_account, this); + OcsShareJob *job = new OcsShareJob(_account); connect(job, SIGNAL(shareJobFinished(QVariantMap, QVariant)), SLOT(slotShareCreated(QVariantMap))); connect(job, SIGNAL(ocsError(int, QString)), SLOT(slotOcsError(int, QString))); job->createShare(path, shareType, shareWith, permissions); @@ -229,7 +229,7 @@ void ShareManager::slotShareCreated(const QVariantMap &reply) void ShareManager::fetchShares(const QString &path) { - OcsShareJob *job = new OcsShareJob(_account, this); + OcsShareJob *job = new OcsShareJob(_account); connect(job, SIGNAL(shareJobFinished(QVariantMap, QVariant)), SLOT(slotSharesFetched(QVariantMap))); connect(job, SIGNAL(ocsError(int, QString)), SLOT(slotOcsError(int, QString))); job->getShares(path); diff --git a/src/gui/sharee.cpp b/src/gui/sharee.cpp index cfb1decd6..491f54c86 100644 --- a/src/gui/sharee.cpp +++ b/src/gui/sharee.cpp @@ -69,7 +69,7 @@ ShareeModel::ShareeModel(AccountPtr account, void ShareeModel::fetch() { - OcsShareeJob *job = new OcsShareeJob(_account, this); + OcsShareeJob *job = new OcsShareeJob(_account); connect(job, SIGNAL(shareeJobFinished(QVariantMap)), SLOT(shareesFetched(QVariantMap))); job->getSharees(_search, _type, 1, 50); }