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.
--- 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);
}