From 4769ae77fc6c8dacea6476addb015c8797848cdd Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Mon, 30 May 2011 22:48:47 -0400 Subject: Handle DNS server failures in case of AF_UNSPEC lookups correctly --- ChangeLog | 5 +++++ NEWS | 6 +++--- resolv/res_send.c | 12 ++++++++---- 3 files changed, 16 insertions(+), 7 deletions(-) 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/NEWS b/NEWS index b3d8005..1ca9673 100644 --- a/NEWS +++ b/NEWS @@ -16,9 +16,9 @@ Version 2.14 12393, 12420, 12432, 12445, 12449, 12453, 12454, 12460, 12469, 12489, 12509, 12510, 12511, 12518, 12527, 12541, 12545, 12551, 12582, 12583, 12587, 12597, 12601, 12611, 12625, 12626, 12631, 12650, 12653, 12655, - 12660, 12671, 12681, 12685, 12711, 12713, 12714, 12717, 12723, 12724, - 12734, 12738, 12746, 12766, 12775, 12777, 12782, 12788, 12792, 12795, - 12811, 12813, 12814 + 12660, 12671, 12681, 12684, 12685, 12711, 12713, 12714, 12717, 12723, + 12724, 12734, 12738, 12746, 12766, 12775, 12777, 12782, 12788, 12792, + 12795, 12811, 12813, 12814 * The RPC implementation in libc is obsoleted. Old programs keep working but new programs cannot be linked with the routines in libc anymore. 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 (); } } -- cgit v1.1