# HG changeset patch # User Mykhailo Danylenko # Date 1458517537 -7200 # Node ID ba47719252ad62ba36f7b6c1667a1feefabb0d16 # Parent f9e84b075afa747c23acde580e6eb841842370b4 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. diff -r f9e84b075afa -r ba47719252ad loudmouth/lm-asyncns-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 diff -r f9e84b075afa -r ba47719252ad loudmouth/lm-blocking-resolver.c --- 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 diff -r f9e84b075afa -r ba47719252ad loudmouth/lm-resolver.c --- 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); }