* sysdeps/posix/getaddrinfo.c: Avoid RFC 3484 sorting if there are

multiple return records but only one address.
This commit is contained in:
Ulrich Drepper 2005-11-27 23:13:21 +00:00
parent da09af7627
commit 01abbc0f7f
2 changed files with 12 additions and 4 deletions

View File

@ -1,5 +1,8 @@
2005-11-27 Ulrich Drepper <drepper@redhat.com> 2005-11-27 Ulrich Drepper <drepper@redhat.com>
* sysdeps/posix/getaddrinfo.c: Avoid RFC 3484 sorting if there are
multiple return records but only one address.
* sysdeps/posix/getaddrinfo.c (gaih_inet): Avoid some code duplication. * sysdeps/posix/getaddrinfo.c (gaih_inet): Avoid some code duplication.
2005-11-27 Roland McGrath <roland@redhat.com> 2005-11-27 Roland McGrath <roland@redhat.com>

View File

@ -121,7 +121,8 @@ struct gaih
{ {
int family; int family;
int (*gaih)(const char *name, const struct gaih_service *service, int (*gaih)(const char *name, const struct gaih_service *service,
const struct addrinfo *req, struct addrinfo **pai); const struct addrinfo *req, struct addrinfo **pai,
unsigned int *naddrs);
}; };
static const struct addrinfo default_hints = static const struct addrinfo default_hints =
@ -363,7 +364,8 @@ extern service_user *__nss_hosts_database attribute_hidden;
static int static int
gaih_inet (const char *name, const struct gaih_service *service, gaih_inet (const char *name, const struct gaih_service *service,
const struct addrinfo *req, struct addrinfo **pai) const struct addrinfo *req, struct addrinfo **pai,
unsigned int *naddrs)
{ {
const struct gaih_typeproto *tp = gaih_inet_typeproto; const struct gaih_typeproto *tp = gaih_inet_typeproto;
struct gaih_servtuple *st = (struct gaih_servtuple *) &nullserv; struct gaih_servtuple *st = (struct gaih_servtuple *) &nullserv;
@ -1087,6 +1089,8 @@ gaih_inet (const char *name, const struct gaih_service *service,
} }
*pai = NULL; *pai = NULL;
++*naddrs;
ignore: ignore:
at2 = at2->next; at2 = at2->next;
} }
@ -1535,6 +1539,7 @@ getaddrinfo (const char *name, const char *service,
else else
end = NULL; end = NULL;
unsigned int naddrs = 0;
while (g->gaih) while (g->gaih)
{ {
if (hints->ai_family == g->family || hints->ai_family == AF_UNSPEC) if (hints->ai_family == g->family || hints->ai_family == AF_UNSPEC)
@ -1543,7 +1548,7 @@ getaddrinfo (const char *name, const char *service,
if (pg == NULL || pg->gaih != g->gaih) if (pg == NULL || pg->gaih != g->gaih)
{ {
pg = g; pg = g;
i = g->gaih (name, pservice, hints, end); i = g->gaih (name, pservice, hints, end, &naddrs);
if (i != 0) if (i != 0)
{ {
/* EAI_NODATA is a more specific result as it says that /* EAI_NODATA is a more specific result as it says that
@ -1575,7 +1580,7 @@ getaddrinfo (const char *name, const char *service,
if (j == 0) if (j == 0)
return EAI_FAMILY; return EAI_FAMILY;
if (nresults > 1) if (naddrs > 1)
{ {
/* Sort results according to RFC 3484. */ /* Sort results according to RFC 3484. */
struct sort_result results[nresults]; struct sort_result results[nresults];