From bdfe64ee1754f00c1e194c2f370d3352995e5845 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Arkadiusz=20Mi=C5=9Bkiewicz?= Date: Fri, 10 Jun 2011 07:48:35 +0000 Subject: [PATCH] - rel 7; revert fix for bug 12684 (causes segfaults in resolver code when ns is not reachable) - waiting for proper fix Changed files: glibc-bug-12684.patch -> 1.1 glibc.spec -> 1.915 --- glibc-bug-12684.patch | 68 +++++++++++++++++++++++++++++++++++++++++++ glibc.spec | 5 +++- 2 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 glibc-bug-12684.patch diff --git a/glibc-bug-12684.patch b/glibc-bug-12684.patch new file mode 100644 index 0000000..63c5b80 --- /dev/null +++ b/glibc-bug-12684.patch @@ -0,0 +1,68 @@ +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 (); + } + } diff --git a/glibc.spec b/glibc.spec index f122f18..c95e91e 100644 --- a/glibc.spec +++ b/glibc.spec @@ -35,7 +35,7 @@ Summary(tr.UTF-8): GNU libc Summary(uk.UTF-8): GNU libc версії Name: glibc Version: 2.14 -Release: 6 +Release: 7 Epoch: 6 License: LGPL v2.1+ Group: Libraries @@ -84,6 +84,7 @@ Patch37: 0061_all_glibc-2.13-static-memset.patch Patch38: 1055_all_glibc-resolv-dynamic.patch Patch39: %{name}-git.patch Patch40: %{name}-bad-fix.patch +Patch41: %{name}-bug-12684.patch URL: http://www.gnu.org/software/libc/ %{?with_selinux:BuildRequires: audit-libs-devel} BuildRequires: autoconf @@ -950,6 +951,8 @@ mv %{name}-ports-%{ports_version} ports %patch38 -p1 %patch39 -p1 %patch40 -p1 +# revert broken fix +%patch41 -p1 -R # cleanup backups after patching find '(' -name '*~' -o -name '*.orig' ')' -print0 | xargs -0 -r -l512 rm -f -- 2.44.0