* resolv/res_query.c (__libc_res_nquery): In case one of two
authorUlrich Drepper <drepper@redhat.com>
Mon, 19 May 2008 17:34:14 +0000 (17:34 +0000)
committerUlrich Drepper <drepper@redhat.com>
Mon, 19 May 2008 17:34:14 +0000 (17:34 +0000)
answer was too short don't try to read that answer's header.

* resolv/res_send.c (send_dg): In case of timeout and there are
two queries and one has been answered, return value indicating
success.

ChangeLog
resolv/res_query.c
resolv/res_send.c

index da8b1b4..f054e8a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2008-05-19  Ulrich Drepper  <drepper@redhat.com>
+
+       * resolv/res_query.c (__libc_res_nquery): In case one of two
+       answer was too short don't try to read that answer's header.
+
+       * resolv/res_send.c (send_dg): In case of timeout and there are
+       two queries and one has been answered, return value indicating
+       success.
+
 2008-05-18  Ulrich Drepper  <drepper@redhat.com>
 
        * nscd/cache.c (cache_add): Take additional parameter specifying
index a8e8d7b..3d2f2fe 100644 (file)
@@ -224,6 +224,21 @@ __libc_res_nquery(res_state statp,
           tests of HP2.  */
        HEADER *hp2 = answerp2 ? (HEADER *) *answerp2 : hp;
 
+       if (n < sizeof (HEADER) && nanswerp2 != NULL
+           && *nanswerp2 > sizeof (HEADER))
+         {
+           /* Special case of partial answer.  */
+           assert (hp != hp2);
+           hp = hp2;
+         }
+       else if (nanswerp2 != NULL
+                && *nanswerp2 < sizeof (HEADER) && n > sizeof (HEADER))
+         {
+           /* Special case of partial answer.  */
+           assert (hp != hp2);
+           hp2 = hp;
+         }
+
        if ((hp->rcode != NOERROR || ntohs(hp->ancount) == 0)
            && (hp2->rcode != NOERROR || ntohs(hp2->ancount) == 0)) {
 #ifdef DEBUG
index b3dbd70..e67ef1c 100644 (file)
@@ -975,6 +975,8 @@ send_dg(res_state statp,
        int recvresp2 = buf2 == NULL;
        pfd[0].fd = EXT(statp).nssocks[ns];
        pfd[0].events = POLLOUT;
+       if (resplen2 != NULL)
+         *resplen2 = 0;
  wait:
        if (need_recompute) {
        recompute_resend:
@@ -1001,6 +1003,11 @@ send_dg(res_state statp,
        if (n == 0) {
                Dprint(statp->options & RES_DEBUG, (stdout,
                                                    ";; timeout sending\n"));
+               if (recvresp1)
+                 return resplen;
+               if (buf2 != NULL && recvresp2)
+                 return 1;
+
                *gotsomewhere = 1;
                return (0);
        }