[glib-networking/tls-database] gnutls: Fix memory leak due to circular references



commit 501a475e71d212b6413c9a64383c4fc78f3dc7c5
Author: Stef Walter <stefw collabora co uk>
Date:   Mon Jan 17 21:42:10 2011 -0800

    gnutls: Fix memory leak due to circular references
    
    GTlsInputStreamGnutls and GTlsOutputStreamGnutls held references
    to GTlsConnectionGnutls, leading to circular reference and the
    connection never being freed. Use weak refs.

 tls/gnutls/gtlsinputstream-gnutls.c  |    8 ++++++--
 tls/gnutls/gtlsoutputstream-gnutls.c |    8 ++++++--
 2 files changed, 12 insertions(+), 4 deletions(-)
---
diff --git a/tls/gnutls/gtlsinputstream-gnutls.c b/tls/gnutls/gtlsinputstream-gnutls.c
index 0874576..84fb7bc 100644
--- a/tls/gnutls/gtlsinputstream-gnutls.c
+++ b/tls/gnutls/gtlsinputstream-gnutls.c
@@ -43,7 +43,10 @@ g_tls_input_stream_gnutls_finalize (GObject *object)
   GTlsInputStreamGnutls *stream = G_TLS_INPUT_STREAM_GNUTLS (object);
 
   if (stream->priv->conn)
-    g_object_unref (stream->priv->conn);
+    {
+      g_object_remove_weak_pointer (G_OBJECT (stream->priv->conn),
+                                    (gpointer*)&stream->priv->conn);
+    }
 
   G_OBJECT_CLASS (g_tls_input_stream_gnutls_parent_class)->finalize (object);
 }
@@ -227,6 +230,7 @@ g_tls_input_stream_gnutls_new (GTlsConnectionGnutls *conn)
   GTlsInputStreamGnutls *tls_stream;
 
   tls_stream = g_object_new (G_TYPE_TLS_INPUT_STREAM_GNUTLS, NULL);
-  tls_stream->priv->conn = g_object_ref (conn);
+  tls_stream->priv->conn = conn;
+  g_object_add_weak_pointer (G_OBJECT (conn), (gpointer*)&tls_stream->priv->conn);
   return G_INPUT_STREAM (tls_stream);
 }
diff --git a/tls/gnutls/gtlsoutputstream-gnutls.c b/tls/gnutls/gtlsoutputstream-gnutls.c
index e69e445..6e2d378 100644
--- a/tls/gnutls/gtlsoutputstream-gnutls.c
+++ b/tls/gnutls/gtlsoutputstream-gnutls.c
@@ -43,7 +43,10 @@ g_tls_output_stream_gnutls_finalize (GObject *object)
   GTlsOutputStreamGnutls *stream = G_TLS_OUTPUT_STREAM_GNUTLS (object);
 
   if (stream->priv->conn)
-    g_object_unref (stream->priv->conn);
+    {
+      g_object_remove_weak_pointer (G_OBJECT (stream->priv->conn),
+                                    (gpointer*)stream->priv->conn);
+    }
 
   G_OBJECT_CLASS (g_tls_output_stream_gnutls_parent_class)->finalize (object);
 }
@@ -227,6 +230,7 @@ g_tls_output_stream_gnutls_new (GTlsConnectionGnutls *conn)
   GTlsOutputStreamGnutls *tls_stream;
 
   tls_stream = g_object_new (G_TYPE_TLS_OUTPUT_STREAM_GNUTLS, NULL);
-  tls_stream->priv->conn = g_object_ref (conn);
+  tls_stream->priv->conn = conn;
+  g_object_add_weak_pointer (G_OBJECT (conn), (gpointer*)&tls_stream->priv->conn);
   return G_OUTPUT_STREAM (tls_stream);
 }



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]