summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Hergert <chergert@redhat.com>2019-01-23 19:08:49 -0800
committerPatrick Griffis <tingping@tingping.se>2019-01-25 09:03:34 -0500
commit4b2a60c73a1eca58ce5eec72d4c7eaf63aa3f90a (patch)
treece61358e7ad5d6f5d5b73973d127e71e08a4bf9f
parent2821ff0fd24e1770b408fcec268040f8858f0bc4 (diff)
downloadglib-4b2a60c73a1eca58ce5eec72d4c7eaf63aa3f90a.tar.gz
gnetworkaddress: fix use-after-free for network address
This fixes an error where addr_enum can be used after finalization during complete_queued_task().
-rw-r--r--gio/gnetworkaddress.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/gio/gnetworkaddress.c b/gio/gnetworkaddress.c
index 1651f89ed..60736874e 100644
--- a/gio/gnetworkaddress.c
+++ b/gio/gnetworkaddress.c
@@ -1120,12 +1120,17 @@ on_address_timeout (gpointer user_data)
{
GNetworkAddressAddressEnumerator *addr_enum = user_data;
+ /* Upon completion it may get unref'd by the owner */
+ g_object_ref (addr_enum);
+
/* If ipv6 didn't come in yet, just complete the task */
if (addr_enum->queued_task != NULL)
complete_queued_task (addr_enum, g_steal_pointer (&addr_enum->queued_task),
g_steal_pointer (&addr_enum->last_error));
g_clear_pointer (&addr_enum->wait_source, g_source_unref);
+ g_object_unref (addr_enum);
+
return G_SOURCE_REMOVE;
}