From: Ulrich Drepper Date: Mon, 19 May 2008 17:34:14 +0000 (+0000) Subject: * resolv/res_query.c (__libc_res_nquery): In case one of two X-Git-Tag: upstream/2.20~7210 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=5908f779e76e24827c0c6f38f2b7a0f857333bcb;p=platform%2Fupstream%2Flinaro-glibc.git * 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. --- diff --git a/ChangeLog b/ChangeLog index da8b1b4..f054e8a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2008-05-19 Ulrich Drepper + + * 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 * nscd/cache.c (cache_add): Take additional parameter specifying diff --git a/resolv/res_query.c b/resolv/res_query.c index a8e8d7b..3d2f2fe 100644 --- a/resolv/res_query.c +++ b/resolv/res_query.c @@ -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 diff --git a/resolv/res_send.c b/resolv/res_send.c index b3dbd70..e67ef1c 100644 --- a/resolv/res_send.c +++ b/resolv/res_send.c @@ -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); }