From: ckamm Date: Thu, 20 Apr 2017 07:21:33 +0000 (+0200) Subject: Fix a crash in ProxyAuthHandler (#5711) X-Git-Tag: archive/raspbian/3.16.7-1_deb13u1+rpi1~1^2~722^2~33 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=543e8a224c951516552dcb8377c21fa75c2380f8;p=nextcloud-desktop.git Fix a crash in ProxyAuthHandler (#5711) See https://sentry.io/owncloud/desktop-win-and-mac/issues/243433178/activity/ https://sentry.io/owncloud/desktop-win-and-mac/issues/234182688/activity/ The problem was that an account's QNetworkAccessManager can be deleted when reentering the event loop. --- diff --git a/src/gui/proxyauthhandler.cpp b/src/gui/proxyauthhandler.cpp index a3f0fba7e..e80b540e8 100644 --- a/src/gui/proxyauthhandler.cpp +++ b/src/gui/proxyauthhandler.cpp @@ -81,9 +81,14 @@ void ProxyAuthHandler::handleProxyAuthenticationRequired( } // Find the responsible QNAM if possible. - QNetworkAccessManager* sending_qnam = qobject_cast(sender()); + QNetworkAccessManager* sending_qnam = 0; + QWeakPointer qnam_alive; if (Account* account = qobject_cast(sender())) { - sending_qnam = account->networkAccessManager(); + // Since we go into an event loop, it's possible for the account's qnam + // to be destroyed before we get back. We can use this to check for its + // liveness. + qnam_alive = account->sharedNetworkAccessManager(); + sending_qnam = qnam_alive.data(); } if (!sending_qnam) { qDebug() << "Could not get the sending QNAM for" << sender(); @@ -122,6 +127,7 @@ void ProxyAuthHandler::handleProxyAuthenticationRequired( qDebug() << "got creds for" << _proxy; authenticator->setUser(_username); authenticator->setPassword(_password); + sending_qnam = qnam_alive.data(); if (sending_qnam) { _gaveCredentialsTo.insert(sending_qnam); connect(sending_qnam, SIGNAL(destroyed(QObject*)), diff --git a/src/libsync/account.cpp b/src/libsync/account.cpp index b92609459..34f0f374a 100644 --- a/src/libsync/account.cpp +++ b/src/libsync/account.cpp @@ -202,6 +202,11 @@ QNetworkAccessManager *Account::networkAccessManager() return _am.data(); } +QSharedPointer Account::sharedNetworkAccessManager() +{ + return _am; +} + QNetworkReply *Account::sendRequest(const QByteArray &verb, const QUrl &url, QNetworkRequest req, QIODevice *data) { req.setUrl(url); diff --git a/src/libsync/account.h b/src/libsync/account.h index 0f55c5a1d..1369b5df2 100644 --- a/src/libsync/account.h +++ b/src/libsync/account.h @@ -185,6 +185,7 @@ public: void resetNetworkAccessManager(); QNetworkAccessManager* networkAccessManager(); + QSharedPointer sharedNetworkAccessManager(); /// Called by network jobs on credential errors, emits invalidCredentials() void handleInvalidCredentials();