You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gentoo-overlay/net-libs/signond/files/signond-8.60-crashfix.patch

161 lines
5.1 KiB

From ab9fab9763277783363f8c6d4b62405c3b0b0413 Mon Sep 17 00:00:00 2001
From: Chris Adams <chris.adams@jollamobile.com>
Date: Wed, 31 Jul 2019 12:45:14 +1000
Subject: [PATCH] Don't emit QObject::destroyed() within Identity::destroy()
QObject::destroyed() should not be emitted manually, as that can
cause unwanted side effects.
Specifically, in this case, the
QDBusConnectionPrivate::objectDestroyed() slot was invoked with
invalidated object parameter (perhaps due to duplicate invocation)
resulting in a warning in QObject::disconnect().
Instead, ensure the object is unregistered from DBus immediately.
---
src/signond/signondaemonadaptor.cpp | 29 ++++++++++++++++++++++++++++-
src/signond/signondaemonadaptor.h | 3 +++
src/signond/signonidentity.cpp | 13 ++++++++-----
src/signond/signonidentity.h | 1 +
4 files changed, 40 insertions(+), 6 deletions(-)
diff --git a/src/signond/signondaemonadaptor.cpp b/src/signond/signondaemonadaptor.cpp
index 8b35e4bd..abd8fd3a 100644
--- a/src/signond/signondaemonadaptor.cpp
+++ b/src/signond/signondaemonadaptor.cpp
@@ -29,6 +29,13 @@
namespace SignonDaemonNS {
+struct RegisteredIdentity {
+ RegisteredIdentity(const QDBusConnection &connection, QObject *identity)
+ : conn(connection), ident(identity) {}
+ QDBusConnection conn;
+ QObject *ident = nullptr;
+};
+
SignonDaemonAdaptor::SignonDaemonAdaptor(SignonDaemon *parent):
QDBusAbstractAdaptor(parent),
m_parent(parent)
@@ -38,6 +45,7 @@ SignonDaemonAdaptor::SignonDaemonAdaptor(SignonDaemon *parent):
SignonDaemonAdaptor::~SignonDaemonAdaptor()
{
+ qDeleteAll(m_registeredIdentities);
}
void SignonDaemonAdaptor::registerNewIdentity(const QString &applicationContext,
@@ -46,7 +54,10 @@ void SignonDaemonAdaptor::registerNewIdentity(const QString &applicationContext,
Q_UNUSED(applicationContext);
QObject *identity = m_parent->registerNewIdentity();
- objectPath = registerObject(parentDBusContext().connection(), identity);
+ QDBusConnection dbusConnection(parentDBusContext().connection());
+ objectPath = registerObject(dbusConnection, identity);
+ m_registeredIdentities.append(new RegisteredIdentity(dbusConnection, identity));
+ connect(identity, SIGNAL(unregistered()), this, SLOT(onIdentityUnregistered()));
SignonDisposable::destroyUnused();
}
@@ -130,6 +141,22 @@ void SignonDaemonAdaptor::getIdentity(const quint32 id,
SignonDisposable::destroyUnused();
}
+void SignonDaemonAdaptor::onIdentityUnregistered()
+{
+ QObject *ident = sender();
+ if (!ident) {
+ return;
+ }
+
+ for (int i = 0; i < m_registeredIdentities.size(); ++i) {
+ if (m_registeredIdentities[i]->ident == ident) {
+ m_registeredIdentities[i]->conn.unregisterObject(ident->objectName());
+ delete m_registeredIdentities.takeAt(i);
+ return;
+ }
+ }
+}
+
void SignonDaemonAdaptor::onIdentityAccessReplyFinished()
{
SignOn::AccessReply *reply = qobject_cast<SignOn::AccessReply*>(sender());
diff --git a/src/signond/signondaemonadaptor.h b/src/signond/signondaemonadaptor.h
index db8d875f..1c20cac3 100644
--- a/src/signond/signondaemonadaptor.h
+++ b/src/signond/signondaemonadaptor.h
@@ -34,6 +34,7 @@
namespace SignonDaemonNS {
typedef QList<QVariantMap> MapList;
+class RegisteredIdentity;
class SignonDaemonAdaptor: public QDBusAbstractAdaptor
{
@@ -74,10 +75,12 @@ private:
QObject *object);
private Q_SLOTS:
+ void onIdentityUnregistered();
void onIdentityAccessReplyFinished();
void onAuthSessionAccessReplyFinished();
private:
+ QList<RegisteredIdentity*> m_registeredIdentities;
SignonDaemon *m_parent;
}; //class SignonDaemonAdaptor
diff --git a/src/signond/signonidentity.cpp b/src/signond/signonidentity.cpp
index ce1ecfb0..a143c223 100644
--- a/src/signond/signonidentity.cpp
+++ b/src/signond/signonidentity.cpp
@@ -84,7 +84,8 @@ private:
SignonIdentity::SignonIdentity(quint32 id, int timeout,
SignonDaemon *parent):
SignonDisposable(timeout, parent),
- m_pInfo(NULL)
+ m_pInfo(NULL),
+ m_destroyed(false)
{
m_id = id;
@@ -112,7 +113,10 @@ SignonIdentity::SignonIdentity(quint32 id, int timeout,
SignonIdentity::~SignonIdentity()
{
- emit unregistered();
+ if (!m_destroyed) {
+ m_destroyed = true;
+ Q_EMIT unregistered();
+ }
delete m_signonui;
delete m_pInfo;
@@ -125,9 +129,8 @@ SignonIdentity *SignonIdentity::createIdentity(quint32 id, SignonDaemon *parent)
void SignonIdentity::destroy()
{
- /* Emitting the destroyed signal makes QDBusConnection unregister the
- * object */
- Q_EMIT destroyed();
+ m_destroyed = true;
+ Q_EMIT unregistered();
deleteLater();
}
diff --git a/src/signond/signonidentity.h b/src/signond/signonidentity.h
index 9ec9be4e..f6321f30 100644
--- a/src/signond/signonidentity.h
+++ b/src/signond/signonidentity.h
@@ -96,6 +96,7 @@ private:
quint32 m_id;
SignonUiAdaptor *m_signonui;
SignonIdentityInfo *m_pInfo;
+ bool m_destroyed;
}; //class SignonDaemon
} //namespace SignonDaemonNS
--
2.26.2