From 4ed9c3fa043b70ee50176c4baacc07d1c73f1fce Mon Sep 17 00:00:00 2001
From: Martin Briza <mbriza@redhat.com>
Date: Fri, 22 Mar 2013 15:52:52 +0100
Subject: [PATCH 3/4] Fixed reference counting of GObjects
Gets us rid of some crashes and reduces memory leaking. There's a change it fixes crashes~
BUGS: 257802, 286935, 291977, 307323
---
agent/polkitqt1-agent-listener.cpp | 4 ++++
agent/polkitqt1-agent-session.cpp | 3 +++
core/polkitqt1-details.cpp | 12 ++++++++++--
core/polkitqt1-subject.cpp | 7 +++++++
4 files changed, 24 insertions(+), 2 deletions(-)
diff --git a/agent/polkitqt1-agent-listener.cpp b/agent/polkitqt1-agent-listener.cpp
index 369dd75..394a92e 100644
--- a/agent/polkitqt1-agent-listener.cpp
+++ b/agent/polkitqt1-agent-listener.cpp
@@ -62,6 +62,10 @@ Listener::Listener(PolkitAgentListener *listener, QObject *parent)
g_type_init();
d->listener = listener;
+
+ if (d->listener != NULL) {
+ g_object_ref(d->listener);
+ }
}
Listener::~Listener()
diff --git a/agent/polkitqt1-agent-session.cpp b/agent/polkitqt1-agent-session.cpp
index 52ddacf..0aca92e 100644
--- a/agent/polkitqt1-agent-session.cpp
+++ b/agent/polkitqt1-agent-session.cpp
@@ -66,6 +66,9 @@ Session::Session(PolkitAgentSession *pkAgentSession, QObject *parent)
, d(new Private)
{
d->polkitAgentSession = pkAgentSession;
+ if (d->polkitAgentSession) {
+ g_object_ref(d->polkitAgentSession);
+ }
g_signal_connect(G_OBJECT(d->polkitAgentSession), "completed", G_CALLBACK(Private::completed), this);
g_signal_connect(G_OBJECT(d->polkitAgentSession), "request", G_CALLBACK(Private::request), this);
g_signal_connect(G_OBJECT(d->polkitAgentSession), "show-error", G_CALLBACK(Private::showError), this);
diff --git a/core/polkitqt1-details.cpp b/core/polkitqt1-details.cpp
index e1d0f31..36abbfa 100644
--- a/core/polkitqt1-details.cpp
+++ b/core/polkitqt1-details.cpp
@@ -35,11 +35,15 @@ public:
: QSharedData(other)
, polkitDetails(other.polkitDetails)
{
- g_object_ref(polkitDetails);
+ if (polkitDetails != NULL) {
+ g_object_ref(polkitDetails);
+ }
}
~Data()
{
- g_object_unref(polkitDetails);
+ if (polkitDetails != NULL) {
+ g_object_unref(polkitDetails);
+ }
}
PolkitDetails *polkitDetails;
@@ -57,6 +61,10 @@ Details::Details(PolkitDetails *pkDetails)
{
g_type_init();
d->polkitDetails = pkDetails;
+
+ if (d->polkitDetails != NULL) {
+ g_object_ref(d->polkitDetails);
+ }
}
Details::~Details()
diff --git a/core/polkitqt1-subject.cpp b/core/polkitqt1-subject.cpp
index dfc9697..b8738df 100644
--- a/core/polkitqt1-subject.cpp
+++ b/core/polkitqt1-subject.cpp
@@ -58,6 +58,10 @@ Subject::Subject(PolkitSubject *subject)
{
g_type_init();
d->subject = subject;
+
+ if (d->subject != NULL) {
+ g_object_ref(d->subject);
+ }
}
Subject::Subject(const PolkitQt1::Subject& other)
@@ -88,6 +92,9 @@ PolkitSubject *Subject::subject() const
void Subject::setSubject(PolkitSubject *subject)
{
+ if (d->subject != NULL) {
+ g_object_unref(d->subject);
+ }
d->subject = subject;
}
--
1.8.4.2