lm-asyncns-resolver: Fix resolver uninitialization
authorMykhailo Danylenko <risbea@gmail.com>
Mon, 21 Mar 2016 01:45:37 +0200
changeset 712 ba47719252ad
parent 711 f9e84b075afa
child 713 ecfbb3961c19
lm-asyncns-resolver: Fix resolver uninitialization * Hopefully fix crash, when resolver CB gets called on non-existing object, if there's some problem with DNS and library user destroys LM instance before DNS timeout. * This introduces freeze, if underlying libasyncns uses pthreads instead of forking, but that is a bug in libasyncns, that will be hopefully fixed by upstream. Not reported yet.
loudmouth/lm-asyncns-resolver.c
loudmouth/lm-blocking-resolver.c
loudmouth/lm-resolver.c
--- a/loudmouth/lm-asyncns-resolver.c	Sat Mar 19 16:49:15 2016 +0200
+++ b/loudmouth/lm-asyncns-resolver.c	Mon Mar 21 01:45:37 2016 +0200
@@ -48,8 +48,9 @@
     GIOChannel  *resolv_channel;
 };
 
-static void     asyncns_resolver_finalize      (GObject     *object);
+static void     asyncns_resolver_dispose       (GObject     *object);
 static void     asyncns_resolver_lookup        (LmResolver  *resolver);
+static void     asyncns_resolver_cleanup       (LmResolver  *resolver);
 static void     asyncns_resolver_cancel        (LmResolver  *resolver);
 
 G_DEFINE_TYPE (LmAsyncnsResolver, lm_asyncns_resolver, LM_TYPE_RESOLVER)
@@ -60,7 +61,7 @@
     GObjectClass    *object_class = G_OBJECT_CLASS (class);
     LmResolverClass *resolver_class = LM_RESOLVER_CLASS (class);
 
-    object_class->finalize = asyncns_resolver_finalize;
+    object_class->dispose = asyncns_resolver_dispose;
 
     resolver_class->lookup = asyncns_resolver_lookup;
     resolver_class->cancel = asyncns_resolver_cancel;
@@ -71,15 +72,16 @@
 static void
 lm_asyncns_resolver_init (LmAsyncnsResolver *asyncns_resolver)
 {
-    (void) GET_PRIV (asyncns_resolver);
 }
 
 static void
-asyncns_resolver_finalize (GObject *object)
+asyncns_resolver_dispose (GObject *object)
 {
-    (void) GET_PRIV (object);
+    g_return_if_fail (LM_IS_ASYNCNS_RESOLVER (object));
 
-    (G_OBJECT_CLASS (lm_asyncns_resolver_parent_class)->finalize) (object);
+    asyncns_resolver_cleanup (LM_RESOLVER(object));
+
+    (G_OBJECT_CLASS (lm_asyncns_resolver_parent_class)->dispose) (object);
 }
 
 static void
--- a/loudmouth/lm-blocking-resolver.c	Sat Mar 19 16:49:15 2016 +0200
+++ b/loudmouth/lm-blocking-resolver.c	Mon Mar 21 01:45:37 2016 +0200
@@ -45,7 +45,7 @@
     GSource *idle_source;
 };
 
-static void     blocking_resolver_finalize    (GObject       *object);
+static void     blocking_resolver_dispose     (GObject       *object);
 static void     blocking_resolver_lookup      (LmResolver    *resolver);
 static void     blocking_resolver_cancel      (LmResolver    *resolver);
 
@@ -57,7 +57,7 @@
     GObjectClass    *object_class   = G_OBJECT_CLASS (class);
     LmResolverClass *resolver_class = LM_RESOLVER_CLASS (class);
 
-    object_class->finalize = blocking_resolver_finalize;
+    object_class->dispose = blocking_resolver_dispose;
 
     resolver_class->lookup = blocking_resolver_lookup;
     resolver_class->cancel = blocking_resolver_cancel;
@@ -69,18 +69,15 @@
 static void
 lm_blocking_resolver_init (LmBlockingResolver *blocking_resolver)
 {
-    (void) GET_PRIV (blocking_resolver);
 }
 
 static void
-blocking_resolver_finalize (GObject *object)
+blocking_resolver_dispose (GObject *object)
 {
-    (void) GET_PRIV (object);
-
     /* Ensure we don't have an idle around */
     blocking_resolver_cancel (LM_RESOLVER (object));
 
-    (G_OBJECT_CLASS (lm_blocking_resolver_parent_class)->finalize) (object);
+    (G_OBJECT_CLASS (lm_blocking_resolver_parent_class)->dispose) (object);
 }
 
 static gboolean
--- a/loudmouth/lm-resolver.c	Sat Mar 19 16:49:15 2016 +0200
+++ b/loudmouth/lm-resolver.c	Mon Mar 21 01:45:37 2016 +0200
@@ -61,6 +61,7 @@
     struct addrinfo    *current_result;
 };
 
+static void     resolver_dispose             (GObject           *object);
 static void     resolver_finalize            (GObject           *object);
 static void     resolver_get_property        (GObject           *object,
                                               guint              param_id,
@@ -89,6 +90,7 @@
 {
     GObjectClass *object_class = G_OBJECT_CLASS (class);
 
+    object_class->dispose      = resolver_dispose;
     object_class->finalize     = resolver_finalize;
     object_class->get_property = resolver_get_property;
     object_class->set_property = resolver_set_property;
@@ -158,7 +160,19 @@
 static void
 lm_resolver_init (LmResolver *resolver)
 {
-    (void) GET_PRIV (resolver);
+}
+
+static void
+resolver_dispose (GObject *object)
+{
+    LmResolverPriv *priv = GET_PRIV (object);
+
+    if (priv->context) {
+        g_main_context_unref (priv->context);
+        priv->context = NULL;
+    }
+
+    (G_OBJECT_CLASS (lm_resolver_parent_class)->dispose) (object);
 }
 
 static void
@@ -173,10 +187,6 @@
     g_free (priv->service);
     g_free (priv->protocol);
 
-    if (priv->context) {
-        g_main_context_unref (priv->context);
-    }
-
     if (priv->results) {
         freeaddrinfo (priv->results);
     }