* resolv/res_send.c (send_dg): If we already have one of two
authorUlrich Drepper <drepper@redhat.com>
Sat, 24 May 2008 17:51:45 +0000 (17:51 +0000)
committerUlrich Drepper <drepper@redhat.com>
Sat, 24 May 2008 17:51:45 +0000 (17:51 +0000)
answers and the server reports SERVFAI, NOTIMP, or REFUSED, then
use the one answer insted of failing.

ChangeLog
resolv/res_send.c

index 499da8f..f61d3d4 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2008-05-24  Ulrich Drepper  <drepper@redhat.com>
+
+       * resolv/res_send.c (send_dg): If we already have one of two
+       answers and the server reports SERVFAI, NOTIMP, or REFUSED, then
+       use the one answer insted of failing.
+
 2008-02-20  Ryan S. Arnold  <rsa@us.ibm.com>
 
        * math/libm-test.inc (exp_test): Exclude expl(1000.0L) from
index e67ef1c..e78ff96 100644 (file)
@@ -1001,12 +1001,12 @@ send_dg(res_state statp,
                need_recompute = 1;
        }
        if (n == 0) {
-               Dprint(statp->options & RES_DEBUG, (stdout,
-                                                   ";; timeout sending\n"));
-               if (recvresp1)
-                 return resplen;
-               if (buf2 != NULL && recvresp2)
-                 return 1;
+               Dprint(statp->options & RES_DEBUG, (stdout, ";; timeout\n"));
+               if (recvresp1 || (buf2 != NULL && recvresp2))
+                 {
+                   *resplen2 = 1;
+                   return resplen;
+                 }
 
                *gotsomewhere = 1;
                return (0);
@@ -1184,6 +1184,24 @@ send_dg(res_state statp,
                                thisansp,
                                (*thisresplen > *thisanssiz)
                                ? *thisanssiz : *thisresplen);
+
+                       if (recvresp1 || (buf2 != NULL && recvresp2))
+                         {
+                           *resplen2 = 1;
+                           return resplen;
+                         }
+                       if (buf2 != NULL)
+                         {
+                           /* We are waiting for a possible second reply.  */
+                           resplen = 1;
+                           if (hp->id == anhp->id)
+                             recvresp1 = 1;
+                           else
+                             recvresp2 = 1;
+
+                           goto wait;
+                         }
+
                next_ns:
                        __res_iclose(statp, false);
                        /* don't retry if called from dig */