Merge pull request #1607 from ailin-nemui/gio-resolver-fixes

GResolver fixes
This commit is contained in:
ailin-nemui 2026-01-25 18:22:20 +00:00 committed by GitHub
commit 80b8875fea
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 49 additions and 11 deletions

View file

@ -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;

View file

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

View file

@ -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;