]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
* sysdeps/posix/getaddrinfo.c: Avoid RFC 3484 sorting if there are
authorUlrich Drepper <drepper@redhat.com>
Sun, 27 Nov 2005 23:13:21 +0000 (23:13 +0000)
committerUlrich Drepper <drepper@redhat.com>
Sun, 27 Nov 2005 23:13:21 +0000 (23:13 +0000)
multiple return records but only one address.

ChangeLog
sysdeps/posix/getaddrinfo.c

index 9bb4c72ed0a66c57db375a3586ee81e708751f2e..2b56ff887f67672c9f16bd31e70ab8b01105a424 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 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.
 
 2005-11-27  Roland McGrath  <roland@redhat.com>
index b85b68c925edc801d2da1a8bf09af607ec1434f2..b9819bfc0a2e5fcbb5ea9adec597363712637bbe 100644 (file)
@@ -121,7 +121,8 @@ struct gaih
   {
     int family;
     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 =
@@ -363,7 +364,8 @@ extern service_user *__nss_hosts_database attribute_hidden;
 
 static int
 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;
   struct gaih_servtuple *st = (struct gaih_servtuple *) &nullserv;
@@ -1087,6 +1089,8 @@ gaih_inet (const char *name, const struct gaih_service *service,
          }
        *pai = NULL;
 
+       ++*naddrs;
+
       ignore:
        at2 = at2->next;
       }
@@ -1535,6 +1539,7 @@ getaddrinfo (const char *name, const char *service,
   else
     end = NULL;
 
+  unsigned int naddrs = 0;
   while (g->gaih)
     {
       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)
            {
              pg = g;
-             i = g->gaih (name, pservice, hints, end);
+             i = g->gaih (name, pservice, hints, end, &naddrs);
              if (i != 0)
                {
                  /* 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)
     return EAI_FAMILY;
 
-  if (nresults > 1)
+  if (naddrs > 1)
     {
       /* Sort results according to RFC 3484.  */
       struct sort_result results[nresults];