commit 4769ae77fc6c8dacea6476addb015c8797848cdd Author: Ulrich Drepper Date: Mon May 30 22:48:47 2011 -0400 Handle DNS server failures in case of AF_UNSPEC lookups correctly diff --git a/ChangeLog b/ChangeLog index 31719ab..dd4ad9e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ 2011-05-30 Ulrich Drepper + [BZ #12684] + * resolv/res_send.c (__libc_res_nsend): Only go to the next name server + if both request failed. + (send_dg): In case of server errors clear resplen or *resplen2. + [BZ #12454] * elf/dl-deps.c (_dl_map_object_deps): Run initializer sorting only when there are multiple maps. diff --git a/resolv/res_send.c b/resolv/res_send.c index 845b658..97142b7 100644 --- a/resolv/res_send.c +++ b/resolv/res_send.c @@ -549,7 +549,7 @@ __libc_res_nsend(res_state statp, const u_char *buf, int buflen, ns, ansp, ansp2, nansp2, resplen2); if (n < 0) return (-1); - if (n == 0) + if (n == 0 && (buf2 == NULL || resplen2 == 0)) goto next_ns; } else { /* Use datagrams. */ @@ -559,7 +559,7 @@ __libc_res_nsend(res_state statp, const u_char *buf, int buflen, ansp2, nansp2, resplen2); if (n < 0) return (-1); - if (n == 0) + if (n == 0 && (buf2 == NULL || resplen2 == 0)) goto next_ns; if (v_circuit) // XXX Check whether both requests failed or @@ -1275,10 +1275,14 @@ send_dg(res_state statp, (*thisresplenp > *thisanssizp) ? *thisanssizp : *thisresplenp); - if (recvresp1 || (buf2 != NULL && recvresp2)) + if (recvresp1 || (buf2 != NULL && recvresp2)) { + *resplen2 = 0; return resplen; + } if (buf2 != NULL) { + /* No data from the first reply. */ + resplen = 0; /* We are waiting for a possible second reply. */ if (hp->id == anhp->id) recvresp1 = 1; @@ -1344,7 +1348,7 @@ send_dg(res_state statp, goto err_out; } else { - /* poll should not have returned > 0 in this case. */ + /* poll should not have returned > 0 in this case. */ abort (); } }