From 97f8d3e1d87fc7caf79cd5cf79606132434e77cf Mon Sep 17 00:00:00 2001 From: Allison Karlitskaya Date: Thu, 23 May 2019 09:33:00 +0200 Subject: [PATCH] gnetworkaddress: fix "happy eyeballs" logic The "happy eyeballs" RFC states that on receiving a negative response for an IPv6 address lookup, we should wait for the IPv4 lookup to complete and use any results we get from there. The current code was not doing that: it was rather setting a timeout for failing the resolution entirely. In scenarios where the IPv4 response comes more than 50ms after the IPv6 response (which is easily attainable under valgrind in certain configurations) this means that the IPv4 response will never come. Remove the timeout and just wait. See merge request GNOME/glib!865 --- gio/gnetworkaddress.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/gio/gnetworkaddress.c b/gio/gnetworkaddress.c index 4d8d74bd4..614c033ab 100644 --- a/gio/gnetworkaddress.c +++ b/gio/gnetworkaddress.c @@ -1261,13 +1261,8 @@ got_ipv6_addresses (GObject *source_object, */ if (error != NULL && !addr_enum->last_error && (addr_enum->state & RESOLVE_STATE_WAITING_ON_IPV4)) { + /* ipv6 lookup failed, but ipv4 is still outstanding. wait. */ addr_enum->last_error = g_steal_pointer (&error); - - addr_enum->wait_source = g_timeout_source_new (HAPPY_EYEBALLS_RESOLUTION_DELAY_MS); - g_source_set_callback (addr_enum->wait_source, - on_address_timeout, - addr_enum, NULL); - g_source_attach (addr_enum->wait_source, addr_enum->context); } else if (addr_enum->waiting_task != NULL) {