diff --git a/src/core/network.c b/src/core/network.c index 8dd5cf9d..c641b203 100644 --- a/src/core/network.c +++ b/src/core/network.c @@ -408,16 +408,43 @@ static RESOLVED_IP_REC *net_gethostbyname(const char *addr, GResolverNameLookupF GResolver *resolver; RESOLVED_IP_REC *iprec; -#ifdef HAVE_CAPSICUM - if (capsicum_enabled()) - return (capsicum_net_gethostbyname(addr, flags)); -#endif - g_return_val_if_fail(addr != NULL, NULL); error = NULL; resolver = g_resolver_get_default(); +#if GLIB_CHECK_VERSION(2, 59, 0) ailist = g_resolver_lookup_by_name_with_flags(resolver, addr, flags, NULL, &error); +#else + /* compatibility code for old GLib */ + ailist = g_resolver_lookup_by_name(resolver, addr, NULL, &error); + if (error == NULL && flags) { + GList *ll, *lll; + + for (ll = ailist; ll != NULL; ll = lll) { + GInetAddress *address; + GSocketFamily family; + + address = G_INET_ADDRESS(ll->data); + family = g_inet_address_get_family(address); + lll = ll->next; + + if ((flags == G_RESOLVER_NAME_LOOKUP_FLAGS_IPV4_ONLY && + family == G_SOCKET_FAMILY_IPV6) || + (flags == G_RESOLVER_NAME_LOOKUP_FLAGS_IPV6_ONLY && + family == G_SOCKET_FAMILY_IPV4)) { + g_object_unref(address); + ailist = g_list_delete_link(ailist, ll); + } + } + + if (ailist == NULL) { + g_set_error(&error, G_RESOLVER_ERROR, G_RESOLVER_ERROR_NOT_FOUND, + flags == G_RESOLVER_NAME_LOOKUP_FLAGS_IPV4_ONLY ? + "IPv4 address not found for host" : + "IPv6 address not found for host"); + } + } +#endif iprec = g_new0(RESOLVED_IP_REC, 1); if (error != NULL) { iprec->error = error; @@ -435,11 +462,16 @@ int net_gethostbyname_first_ips(const char *addr, GResolverNameLookupFlags flags { RESOLVED_IP_REC *iprec; +#ifdef HAVE_CAPSICUM + if (capsicum_enabled()) + return (capsicum_net_gethostbyname(addr, ip4, ip6)); +#endif + iprec = net_gethostbyname(addr, flags); if (iprec->error == NULL) { GList *curr; - for (curr = iprec->ailist; curr->next; curr = curr->next) { + for (curr = iprec->ailist; curr; curr = curr->next) { unsigned short family; GInetAddress *addr; diff --git a/src/core/servers-setup.c b/src/core/servers-setup.c index 97206328..8747eea3 100644 --- a/src/core/servers-setup.c +++ b/src/core/servers-setup.c @@ -70,11 +70,11 @@ static void get_source_host_ip(void) net_gethostbyname_first_ips(hostname, G_RESOLVER_NAME_LOOKUP_FLAGS_DEFAULT, &ip4, &ip6) == 0; - if (source_host_ok) + if (source_host_ok) { save_ips(&ip4, &ip6, &source_host_ip4, &source_host_ip6); - else { - g_free_and_null(source_host_ip4); - g_free_and_null(source_host_ip6); + } else { + g_free_and_null(source_host_ip4); + g_free_and_null(source_host_ip6); } } diff --git a/src/core/servers.c b/src/core/servers.c index e62f09ec..04852104 100644 --- a/src/core/servers.c +++ b/src/core/servers.c @@ -338,16 +338,22 @@ static void server_connect_use_resolved(SERVER_REC *server) resolved_ip_unref(iprec); } + + g_free(ip); } static void server_connect_callback_resolved(RESOLVED_IP_REC *iprec, SERVER_REC *server) { - server->connect_cancellable = NULL; + if (server->connect_cancellable != NULL) { + g_object_unref(server->connect_cancellable); + server->connect_cancellable = NULL; + } if (server->connrec->resolved_host != NULL) { resolved_ip_unref(server->connrec->resolved_host); } server->connrec->resolved_host = iprec; + if (iprec->error == NULL && iprec->ailist == NULL) { server->connection_lost = TRUE; server->dns_error = TRUE;