Handle DNS server failures in case of AF_UNSPEC lookups correctly

This commit is contained in:
Ulrich Drepper 2011-05-30 22:48:47 -04:00
parent 4462fad3d9
commit 4769ae77fc
3 changed files with 16 additions and 7 deletions

View file

@ -1,5 +1,10 @@
2011-05-30 Ulrich Drepper <drepper@gmail.com> 2011-05-30 Ulrich Drepper <drepper@gmail.com>
[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] [BZ #12454]
* elf/dl-deps.c (_dl_map_object_deps): Run initializer sorting only * elf/dl-deps.c (_dl_map_object_deps): Run initializer sorting only
when there are multiple maps. when there are multiple maps.

6
NEWS
View file

@ -16,9 +16,9 @@ Version 2.14
12393, 12420, 12432, 12445, 12449, 12453, 12454, 12460, 12469, 12489, 12393, 12420, 12432, 12445, 12449, 12453, 12454, 12460, 12469, 12489,
12509, 12510, 12511, 12518, 12527, 12541, 12545, 12551, 12582, 12583, 12509, 12510, 12511, 12518, 12527, 12541, 12545, 12551, 12582, 12583,
12587, 12597, 12601, 12611, 12625, 12626, 12631, 12650, 12653, 12655, 12587, 12597, 12601, 12611, 12625, 12626, 12631, 12650, 12653, 12655,
12660, 12671, 12681, 12685, 12711, 12713, 12714, 12717, 12723, 12724, 12660, 12671, 12681, 12684, 12685, 12711, 12713, 12714, 12717, 12723,
12734, 12738, 12746, 12766, 12775, 12777, 12782, 12788, 12792, 12795, 12724, 12734, 12738, 12746, 12766, 12775, 12777, 12782, 12788, 12792,
12811, 12813, 12814 12795, 12811, 12813, 12814
* The RPC implementation in libc is obsoleted. Old programs keep working * The RPC implementation in libc is obsoleted. Old programs keep working
but new programs cannot be linked with the routines in libc anymore. but new programs cannot be linked with the routines in libc anymore.

View file

@ -549,7 +549,7 @@ __libc_res_nsend(res_state statp, const u_char *buf, int buflen,
ns, ansp, ansp2, nansp2, resplen2); ns, ansp, ansp2, nansp2, resplen2);
if (n < 0) if (n < 0)
return (-1); return (-1);
if (n == 0) if (n == 0 && (buf2 == NULL || resplen2 == 0))
goto next_ns; goto next_ns;
} else { } else {
/* Use datagrams. */ /* Use datagrams. */
@ -559,7 +559,7 @@ __libc_res_nsend(res_state statp, const u_char *buf, int buflen,
ansp2, nansp2, resplen2); ansp2, nansp2, resplen2);
if (n < 0) if (n < 0)
return (-1); return (-1);
if (n == 0) if (n == 0 && (buf2 == NULL || resplen2 == 0))
goto next_ns; goto next_ns;
if (v_circuit) if (v_circuit)
// XXX Check whether both requests failed or // XXX Check whether both requests failed or
@ -1275,10 +1275,14 @@ send_dg(res_state statp,
(*thisresplenp > *thisanssizp) (*thisresplenp > *thisanssizp)
? *thisanssizp : *thisresplenp); ? *thisanssizp : *thisresplenp);
if (recvresp1 || (buf2 != NULL && recvresp2)) if (recvresp1 || (buf2 != NULL && recvresp2)) {
*resplen2 = 0;
return resplen; return resplen;
}
if (buf2 != NULL) if (buf2 != NULL)
{ {
/* No data from the first reply. */
resplen = 0;
/* We are waiting for a possible second reply. */ /* We are waiting for a possible second reply. */
if (hp->id == anhp->id) if (hp->id == anhp->id)
recvresp1 = 1; recvresp1 = 1;
@ -1344,7 +1348,7 @@ send_dg(res_state statp,
goto err_out; goto err_out;
} }
else { else {
/* poll should not have returned > 0 in this case. */ /* poll should not have returned > 0 in this case. */
abort (); abort ();
} }
} }