Blob Blame History Raw
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