(_nss_dns_gethostbyname2_r): If res_search fails don't rely on errno value.
[kopensolaris-gnu/glibc.git] / resolv / nss_dns / dns-host.c
index 1df7c23..c075961 100644 (file)
@@ -143,7 +143,7 @@ _nss_dns_gethostbyname2_r (const char *name, int af, struct hostent *result,
     type = T_AAAA;
     break;
   default:
-    *h_errnop = NETDB_INTERNAL;
+    *h_errnop = NO_DATA;
     *errnop = EAFNOSUPPORT;
     return NSS_STATUS_UNAVAIL;
   }
@@ -163,7 +163,7 @@ _nss_dns_gethostbyname2_r (const char *name, int af, struct hostent *result,
   if (n < 0)
     {
       *h_errnop = h_errno;
-      *errnop = errno;
+      *errnop = *h_errnop == TRY_AGAIN ? EAGAIN : ENOENT;
       return errno == ECONNREFUSED ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
     }
 
@@ -342,6 +342,7 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype,
       name_ok = res_dnok;
       break;
     default:
+      *errnop = ENOENT;
       return NSS_STATUS_UNAVAIL;  /* XXX should be abort(); */
     }
 
@@ -356,6 +357,7 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype,
   if (qdcount != 1)
     {
       *h_errnop = NO_RECOVERY;
+      *errnop = ENOENT;
       return NSS_STATUS_UNAVAIL;
     }
 
@@ -390,6 +392,7 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype,
       if (n >= MAXHOSTNAMELEN)
        {
          *h_errnop = NO_RECOVERY;
+         *errnop = ENOENT;
          return NSS_STATUS_TRYAGAIN;
        }
       result->h_name = bp;
@@ -419,11 +422,7 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype,
       if (n != -1 && __ns_name_ntop (packtmp, bp, linebuflen) == -1)
        {
          if (errno == EMSGSIZE)
-           {
-             *errnop = ERANGE;
-             *h_errnop = NETDB_INTERNAL;
-             return NSS_STATUS_TRYAGAIN;
-           }
+           goto too_small;
 
          n = -1;
        }
@@ -470,7 +469,9 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype,
          linebuflen -= n;
          /* Get canonical name.  */
          n = strlen (tbuf) + 1;        /* For the \0.  */
-         if ((size_t) n > buflen || n >= MAXHOSTNAMELEN)
+         if (n > linebuflen)
+           goto too_small;
+         if (n >= MAXHOSTNAMELEN)
            {
              ++had_error;
              continue;
@@ -492,7 +493,9 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype,
          cp += n;
          /* Get canonical name.  */
          n = strlen (tbuf) + 1;   /* For the \0.  */
-         if ((size_t) n > buflen || n >= MAXHOSTNAMELEN)
+         if (n > linebuflen)
+           goto too_small;
+         if (n >= MAXHOSTNAMELEN)
            {
              ++had_error;
              continue;
@@ -536,11 +539,7 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype,
          if (n != -1 && __ns_name_ntop (packtmp, bp, linebuflen) == -1)
            {
              if (errno == EMSGSIZE)
-               {
-                 *errnop = ERANGE;
-                 *h_errnop = NETDB_INTERNAL;
-                 return NSS_STATUS_TRYAGAIN;
-               }
+               goto too_small;
 
              n = -1;
            }
@@ -613,11 +612,8 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype,
          linebuflen -= sizeof (align) - ((u_long) bp % sizeof (align));
          bp += sizeof (align) - ((u_long) bp % sizeof (align));
 
-         if (n >= linebuflen)
-           {
-             ++had_error;
-             continue;
-           }
+         if (n > linebuflen)
+           goto too_small;
          if (hap >= &host_data->h_addr_ptrs[MAX_NR_ADDRS-1])
            {
              cp += n;
@@ -652,11 +648,7 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype,
        {
          n = strlen (qname) + 1;       /* For the \0.  */
          if (n > linebuflen)
-           {
-             *errnop = ERANGE;
-             *h_errnop = NETDB_INTERNAL;
-             return NSS_STATUS_TRYAGAIN;
-           }
+           goto too_small;
          if (n >= MAXHOSTNAMELEN)
            goto no_recovery;
          result->h_name = bp;
@@ -671,5 +663,6 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype,
     }
  no_recovery:
   *h_errnop = NO_RECOVERY;
+  *errnop = ENOENT;
   return NSS_STATUS_TRYAGAIN;
 }