From 1a51f99eb07cb7fec081e925221012b16f1903085e5c0543795a9424ab35c0b5 Mon Sep 17 00:00:00 2001 From: Andreas Schwab Date: Mon, 24 Feb 2014 14:57:11 +0000 Subject: [PATCH] Accepting request 223712 from home:Andreas_Schwab:Factory - nss-dns-memleak.patch: fix memory leak in nss-dns (bnc#863499) - Don't build glibc-{extra,info,i18ndata,obsolete} and nscd for i686 OBS-URL: https://build.opensuse.org/request/show/223712 OBS-URL: https://build.opensuse.org/package/show/Base:System/glibc?expand=0&rev=334 --- glibc-testsuite.changes | 7 + glibc-testsuite.spec | 29 ++- glibc-utils.changes | 7 + glibc-utils.spec | 29 ++- glibc.changes | 7 + glibc.spec | 29 ++- nss-dns-memleak.patch | 461 ++++++++++++++++++++++++++++++++++++++++ 7 files changed, 551 insertions(+), 18 deletions(-) create mode 100644 nss-dns-memleak.patch diff --git a/glibc-testsuite.changes b/glibc-testsuite.changes index d64e758..e4db983 100644 --- a/glibc-testsuite.changes +++ b/glibc-testsuite.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Mon Feb 24 11:38:41 UTC 2014 - schwab@suse.de + +- nss-dns-memleak.patch: fix memory leak in nss-dns (bnc#863499) +- Don't build glibc-{extra,info,i18ndata,obsolete} and nscd for i686 + ------------------------------------------------------------------- Mon Feb 10 14:24:29 UTC 2014 - schwab@suse.de @@ -20,6 +26,7 @@ Thu Feb 6 10:38:05 UTC 2014 - schwab@suse.de * Change powerpc64le start ABI to 2.17 - Add /usr/local/lib64 to ld.so.conf on all lib64 platforms - Enable profile build for aarch64 +- ppc64le-abilist.patch: Removed ------------------------------------------------------------------- Wed Jan 8 12:38:29 UTC 2014 - coolo@suse.com diff --git a/glibc-testsuite.spec b/glibc-testsuite.spec index e4589ed..5b44a27 100644 --- a/glibc-testsuite.spec +++ b/glibc-testsuite.spec @@ -50,7 +50,7 @@ BuildRequires: gd-devel %endif %define __filter_GLIBC_PRIVATE 1 -%if %_target_cpu == "i686" +%ifarch i686 # For i686 let's only build what's different from i586, so # no need to build documentation %define build_profile 1 @@ -146,7 +146,7 @@ Provides: rtld(GNU_HASH) Requires: glibc = %{version} %endif BuildRoot: %{_tmppath}/%{name}-%{version}-build -%if %_target_cpu == "i686" +%ifarch i686 # We need to avoid to have only the src rpm from i686 on the media, # since it does not work on other architectures. NoSource: 0 @@ -229,6 +229,8 @@ Patch306: glibc-fix-double-loopback.diff ### # Patches from upstream ### +# PATCH-FIX-UPSTREAM fix memory leak in nss_dns +Patch1000: nss-dns-memleak.patch ### # Patches awaiting upstream approval @@ -435,6 +437,8 @@ rm nscd/s-stamp %patch304 -p1 %patch306 -p1 +%patch1000 -p1 + %patch2019 -p1 %patch3000 @@ -802,7 +806,7 @@ cd .. # Prepare obsolete/, used only on some architectures: export RPM_BUILD_ROOT -%ifarch %ix86 +%ifarch i586 mkdir -p %{buildroot}/%{_lib}/obsolete %endif @@ -870,7 +874,7 @@ rm -f %{buildroot}/etc/ld.so.cache touch %{buildroot}/etc/ld.so.cache # libNoVersion belongs only to glibc-obsolete: -%ifarch %ix86 +%ifarch i586 rm -f %{buildroot}%{_libdir}/libNoVersion* mkdir -p %{buildroot}/%{_lib}/obsolete/noversion mv -v %{buildroot}/%{_lib}/libNoVersion* %{buildroot}/%{_lib}/obsolete/noversion/ @@ -916,6 +920,16 @@ rm -f %{buildroot}%{_bindir}/pldd rm -f %{buildroot}%{_mandir}/man1/mtrace.* rm -rf %{buildroot}%{_libdir}/audit +%ifarch i686 +# Remove files from glibc-{extra,info,i18ndata} and nscd +rm -rf %{buildroot}%{_infodir} %{buildroot}%{_prefix}/share/i18n +rm -f %{buildroot}%{_bindir}/makedb %{buildroot}/var/lib/misc/Makefile +rm -f %{buildroot}/etc/*nscd* %{buildroot}%{_sbindir}/*nscd* +rm -rf %{buildroot}/usr/lib/systemd +rm -rf %{buildroot}/usr/lib/tmpfiles.d +rm -rf %{buildroot}/var/run/nscd +%endif # i686 + %endif # %{normal_build} %if %{utils_build} @@ -1134,8 +1148,7 @@ exit 0 %{_sbindir}/glibc_post_upgrade %{_sbindir}/iconvconfig -%ifarch %ix86 - +%ifarch i586 %files obsolete %defattr (755,root,root,755) %dir /%{_lib}/obsolete/ @@ -1192,6 +1205,7 @@ exit 0 %{_libdir}/librt.a %{_libdir}/libutil.a +%ifnarch i686 %files info %defattr(-,root,root) %doc %{_infodir}/libc.info.gz @@ -1222,6 +1236,7 @@ exit 0 %attr(0600,root,root) %verify(not md5 size mtime) %ghost %config(missingok,noreplace) /var/run/nscd/passwd %attr(0600,root,root) %verify(not md5 size mtime) %ghost %config(missingok,noreplace) /var/run/nscd/group %attr(0600,root,root) %verify(not md5 size mtime) %ghost %config(missingok,noreplace) /var/run/nscd/hosts +%endif # !i686 %if %{build_profile} %files profile @@ -1241,10 +1256,12 @@ exit 0 %{_libdir}/libdl_p.a %endif +%ifnarch i686 %files extra %defattr(-,root,root) %{_bindir}/makedb /var/lib/misc/Makefile +%endif # !i686 %endif # %{normal_build} diff --git a/glibc-utils.changes b/glibc-utils.changes index d64e758..e4db983 100644 --- a/glibc-utils.changes +++ b/glibc-utils.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Mon Feb 24 11:38:41 UTC 2014 - schwab@suse.de + +- nss-dns-memleak.patch: fix memory leak in nss-dns (bnc#863499) +- Don't build glibc-{extra,info,i18ndata,obsolete} and nscd for i686 + ------------------------------------------------------------------- Mon Feb 10 14:24:29 UTC 2014 - schwab@suse.de @@ -20,6 +26,7 @@ Thu Feb 6 10:38:05 UTC 2014 - schwab@suse.de * Change powerpc64le start ABI to 2.17 - Add /usr/local/lib64 to ld.so.conf on all lib64 platforms - Enable profile build for aarch64 +- ppc64le-abilist.patch: Removed ------------------------------------------------------------------- Wed Jan 8 12:38:29 UTC 2014 - coolo@suse.com diff --git a/glibc-utils.spec b/glibc-utils.spec index 39e3d21..cdf0d78 100644 --- a/glibc-utils.spec +++ b/glibc-utils.spec @@ -49,7 +49,7 @@ BuildRequires: gd-devel %endif %define __filter_GLIBC_PRIVATE 1 -%if %_target_cpu == "i686" +%ifarch i686 # For i686 let's only build what's different from i586, so # no need to build documentation %define build_profile 1 @@ -145,7 +145,7 @@ Provides: rtld(GNU_HASH) Requires: glibc = %{version} %endif BuildRoot: %{_tmppath}/%{name}-%{version}-build -%if %_target_cpu == "i686" +%ifarch i686 # We need to avoid to have only the src rpm from i686 on the media, # since it does not work on other architectures. NoSource: 0 @@ -228,6 +228,8 @@ Patch306: glibc-fix-double-loopback.diff ### # Patches from upstream ### +# PATCH-FIX-UPSTREAM fix memory leak in nss_dns +Patch1000: nss-dns-memleak.patch ### # Patches awaiting upstream approval @@ -435,6 +437,8 @@ rm nscd/s-stamp %patch304 -p1 %patch306 -p1 +%patch1000 -p1 + %patch2019 -p1 %patch3000 @@ -802,7 +806,7 @@ cd .. # Prepare obsolete/, used only on some architectures: export RPM_BUILD_ROOT -%ifarch %ix86 +%ifarch i586 mkdir -p %{buildroot}/%{_lib}/obsolete %endif @@ -870,7 +874,7 @@ rm -f %{buildroot}/etc/ld.so.cache touch %{buildroot}/etc/ld.so.cache # libNoVersion belongs only to glibc-obsolete: -%ifarch %ix86 +%ifarch i586 rm -f %{buildroot}%{_libdir}/libNoVersion* mkdir -p %{buildroot}/%{_lib}/obsolete/noversion mv -v %{buildroot}/%{_lib}/libNoVersion* %{buildroot}/%{_lib}/obsolete/noversion/ @@ -916,6 +920,16 @@ rm -f %{buildroot}%{_bindir}/pldd rm -f %{buildroot}%{_mandir}/man1/mtrace.* rm -rf %{buildroot}%{_libdir}/audit +%ifarch i686 +# Remove files from glibc-{extra,info,i18ndata} and nscd +rm -rf %{buildroot}%{_infodir} %{buildroot}%{_prefix}/share/i18n +rm -f %{buildroot}%{_bindir}/makedb %{buildroot}/var/lib/misc/Makefile +rm -f %{buildroot}/etc/*nscd* %{buildroot}%{_sbindir}/*nscd* +rm -rf %{buildroot}/usr/lib/systemd +rm -rf %{buildroot}/usr/lib/tmpfiles.d +rm -rf %{buildroot}/var/run/nscd +%endif # i686 + %endif # %{normal_build} %if %{utils_build} @@ -1134,8 +1148,7 @@ exit 0 %{_sbindir}/glibc_post_upgrade %{_sbindir}/iconvconfig -%ifarch %ix86 - +%ifarch i586 %files obsolete %defattr (755,root,root,755) %dir /%{_lib}/obsolete/ @@ -1192,6 +1205,7 @@ exit 0 %{_libdir}/librt.a %{_libdir}/libutil.a +%ifnarch i686 %files info %defattr(-,root,root) %doc %{_infodir}/libc.info.gz @@ -1222,6 +1236,7 @@ exit 0 %attr(0600,root,root) %verify(not md5 size mtime) %ghost %config(missingok,noreplace) /var/run/nscd/passwd %attr(0600,root,root) %verify(not md5 size mtime) %ghost %config(missingok,noreplace) /var/run/nscd/group %attr(0600,root,root) %verify(not md5 size mtime) %ghost %config(missingok,noreplace) /var/run/nscd/hosts +%endif # !i686 %if %{build_profile} %files profile @@ -1241,10 +1256,12 @@ exit 0 %{_libdir}/libdl_p.a %endif +%ifnarch i686 %files extra %defattr(-,root,root) %{_bindir}/makedb /var/lib/misc/Makefile +%endif # !i686 %endif # %{normal_build} diff --git a/glibc.changes b/glibc.changes index d64e758..e4db983 100644 --- a/glibc.changes +++ b/glibc.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Mon Feb 24 11:38:41 UTC 2014 - schwab@suse.de + +- nss-dns-memleak.patch: fix memory leak in nss-dns (bnc#863499) +- Don't build glibc-{extra,info,i18ndata,obsolete} and nscd for i686 + ------------------------------------------------------------------- Mon Feb 10 14:24:29 UTC 2014 - schwab@suse.de @@ -20,6 +26,7 @@ Thu Feb 6 10:38:05 UTC 2014 - schwab@suse.de * Change powerpc64le start ABI to 2.17 - Add /usr/local/lib64 to ld.so.conf on all lib64 platforms - Enable profile build for aarch64 +- ppc64le-abilist.patch: Removed ------------------------------------------------------------------- Wed Jan 8 12:38:29 UTC 2014 - coolo@suse.com diff --git a/glibc.spec b/glibc.spec index 6b7a4e4..ff9b42f 100644 --- a/glibc.spec +++ b/glibc.spec @@ -50,7 +50,7 @@ BuildRequires: gd-devel %endif %define __filter_GLIBC_PRIVATE 1 -%if %_target_cpu == "i686" +%ifarch i686 # For i686 let's only build what's different from i586, so # no need to build documentation %define build_profile 1 @@ -146,7 +146,7 @@ Provides: rtld(GNU_HASH) Requires: glibc = %{version} %endif BuildRoot: %{_tmppath}/%{name}-%{version}-build -%if %_target_cpu == "i686" +%ifarch i686 # We need to avoid to have only the src rpm from i686 on the media, # since it does not work on other architectures. NoSource: 0 @@ -229,6 +229,8 @@ Patch306: glibc-fix-double-loopback.diff ### # Patches from upstream ### +# PATCH-FIX-UPSTREAM fix memory leak in nss_dns +Patch1000: nss-dns-memleak.patch ### # Patches awaiting upstream approval @@ -435,6 +437,8 @@ rm nscd/s-stamp %patch304 -p1 %patch306 -p1 +%patch1000 -p1 + %patch2019 -p1 %patch3000 @@ -802,7 +806,7 @@ cd .. # Prepare obsolete/, used only on some architectures: export RPM_BUILD_ROOT -%ifarch %ix86 +%ifarch i586 mkdir -p %{buildroot}/%{_lib}/obsolete %endif @@ -870,7 +874,7 @@ rm -f %{buildroot}/etc/ld.so.cache touch %{buildroot}/etc/ld.so.cache # libNoVersion belongs only to glibc-obsolete: -%ifarch %ix86 +%ifarch i586 rm -f %{buildroot}%{_libdir}/libNoVersion* mkdir -p %{buildroot}/%{_lib}/obsolete/noversion mv -v %{buildroot}/%{_lib}/libNoVersion* %{buildroot}/%{_lib}/obsolete/noversion/ @@ -916,6 +920,16 @@ rm -f %{buildroot}%{_bindir}/pldd rm -f %{buildroot}%{_mandir}/man1/mtrace.* rm -rf %{buildroot}%{_libdir}/audit +%ifarch i686 +# Remove files from glibc-{extra,info,i18ndata} and nscd +rm -rf %{buildroot}%{_infodir} %{buildroot}%{_prefix}/share/i18n +rm -f %{buildroot}%{_bindir}/makedb %{buildroot}/var/lib/misc/Makefile +rm -f %{buildroot}/etc/*nscd* %{buildroot}%{_sbindir}/*nscd* +rm -rf %{buildroot}/usr/lib/systemd +rm -rf %{buildroot}/usr/lib/tmpfiles.d +rm -rf %{buildroot}/var/run/nscd +%endif # i686 + %endif # %{normal_build} %if %{utils_build} @@ -1134,8 +1148,7 @@ exit 0 %{_sbindir}/glibc_post_upgrade %{_sbindir}/iconvconfig -%ifarch %ix86 - +%ifarch i586 %files obsolete %defattr (755,root,root,755) %dir /%{_lib}/obsolete/ @@ -1192,6 +1205,7 @@ exit 0 %{_libdir}/librt.a %{_libdir}/libutil.a +%ifnarch i686 %files info %defattr(-,root,root) %doc %{_infodir}/libc.info.gz @@ -1222,6 +1236,7 @@ exit 0 %attr(0600,root,root) %verify(not md5 size mtime) %ghost %config(missingok,noreplace) /var/run/nscd/passwd %attr(0600,root,root) %verify(not md5 size mtime) %ghost %config(missingok,noreplace) /var/run/nscd/group %attr(0600,root,root) %verify(not md5 size mtime) %ghost %config(missingok,noreplace) /var/run/nscd/hosts +%endif # !i686 %if %{build_profile} %files profile @@ -1241,10 +1256,12 @@ exit 0 %{_libdir}/libdl_p.a %endif +%ifnarch i686 %files extra %defattr(-,root,root) %{_bindir}/makedb /var/lib/misc/Makefile +%endif # !i686 %endif # %{normal_build} diff --git a/nss-dns-memleak.patch b/nss-dns-memleak.patch new file mode 100644 index 0000000..c27b074 --- /dev/null +++ b/nss-dns-memleak.patch @@ -0,0 +1,461 @@ +2014-02-18 Andreas Schwab + + [BZ #16574] + * resolv/res_send.c (send_vc): Add parameter ansp2_malloced. + Store non-zero if the second buffer was newly allocated. + (send_dg): Likewise. + (__libc_res_nsend): Add parameter ansp2_malloced and pass it down + to send_vc and send_dg. + (res_nsend): Pass NULL for ansp2_malloced. + * resolv/res_query.c (__libc_res_nquery): Add parameter + answerp2_malloced and pass it down to __libc_res_nsend. + (res_nquery): Pass additional NULL to __libc_res_nquery. + (__libc_res_nsearch): Add parameter answerp2_malloced and pass it + down to __libc_res_nquery and __libc_res_nquerydomain. Deallocate + second answer buffer if answerp2_malloced was set. + (res_nsearch): Pass additional NULL to __libc_res_nsearch. + (__libc_res_nquerydomain): Add parameter + answerp2_malloced and pass it down to __libc_res_nquery. + (res_nquerydomain): Pass additional NULL to + __libc_res_nquerydomain. + * resolv/nss_dns/dns-network.c (_nss_dns_getnetbyname_r): Pass + additional NULL to __libc_res_nsend and __libc_res_nquery. + * resolv/nss_dns/dns-host.c (_nss_dns_gethostbyname3_r): Pass + additional NULL to __libc_res_nsearch. + (_nss_dns_gethostbyname4_r): Revert last change. Use new + parameter of __libc_res_nsearch to check for separately allocated + second buffer. + (_nss_dns_gethostbyaddr2_r): Pass additional NULL to + __libc_res_nquery. + * resolv/nss_dns/dns-canon.c (_nss_dns_getcanonname_r): Pass + additional NULL to __libc_res_nquery. + * resolv/gethnamaddr.c (gethostbyname2): Pass additional NULL to + __libc_res_nsearch. + (gethostbyaddr): Pass additional NULL to __libc_res_nquery. + * include/resolv.h: Update prototypes of __libc_res_nquery, + __libc_res_nsearch, __libc_res_nsend. + +2014-02-13 Andreas Schwab + + [BZ #16574] + * resolv/nss_dns/dns-host.c (_nss_dns_gethostbyname4_r): Free the + second answer buffer if it was separately allocated. + +Index: glibc-2.19/include/resolv.h +=================================================================== +--- glibc-2.19.orig/include/resolv.h ++++ glibc-2.19/include/resolv.h +@@ -48,11 +48,11 @@ libc_hidden_proto (__res_randomid) + libc_hidden_proto (__res_state) + + int __libc_res_nquery (res_state, const char *, int, int, u_char *, int, +- u_char **, u_char **, int *, int *); ++ u_char **, u_char **, int *, int *, int *); + int __libc_res_nsearch (res_state, const char *, int, int, u_char *, int, +- u_char **, u_char **, int *, int *); ++ u_char **, u_char **, int *, int *, int *); + int __libc_res_nsend (res_state, const u_char *, int, const u_char *, int, +- u_char *, int, u_char **, u_char **, int *, int *) ++ u_char *, int, u_char **, u_char **, int *, int *, int *) + attribute_hidden; + + libresolv_hidden_proto (_sethtent) +Index: glibc-2.19/resolv/gethnamaddr.c +=================================================================== +--- glibc-2.19.orig/resolv/gethnamaddr.c ++++ glibc-2.19/resolv/gethnamaddr.c +@@ -621,7 +621,7 @@ gethostbyname2(name, af) + buf.buf = origbuf = (querybuf *) alloca (1024); + + if ((n = __libc_res_nsearch(&_res, name, C_IN, type, buf.buf->buf, 1024, +- &buf.ptr, NULL, NULL, NULL)) < 0) { ++ &buf.ptr, NULL, NULL, NULL, NULL)) < 0) { + if (buf.buf != origbuf) + free (buf.buf); + Dprintf("res_nsearch failed (%d)\n", n); +@@ -716,12 +716,12 @@ gethostbyaddr(addr, len, af) + buf.buf = orig_buf = (querybuf *) alloca (1024); + + n = __libc_res_nquery(&_res, qbuf, C_IN, T_PTR, buf.buf->buf, 1024, +- &buf.ptr, NULL, NULL, NULL); ++ &buf.ptr, NULL, NULL, NULL, NULL); + if (n < 0 && af == AF_INET6 && (_res.options & RES_NOIP6DOTINT) == 0) { + strcpy(qp, "ip6.int"); + n = __libc_res_nquery(&_res, qbuf, C_IN, T_PTR, buf.buf->buf, + buf.buf != orig_buf ? MAXPACKET : 1024, +- &buf.ptr, NULL, NULL, NULL); ++ &buf.ptr, NULL, NULL, NULL, NULL); + } + if (n < 0) { + if (buf.buf != orig_buf) +Index: glibc-2.19/resolv/nss_dns/dns-canon.c +=================================================================== +--- glibc-2.19.orig/resolv/nss_dns/dns-canon.c ++++ glibc-2.19/resolv/nss_dns/dns-canon.c +@@ -62,7 +62,7 @@ _nss_dns_getcanonname_r (const char *nam + { + int r = __libc_res_nquery (&_res, name, ns_c_in, qtypes[i], + buf, sizeof (buf), &ansp.ptr, NULL, NULL, +- NULL); ++ NULL, NULL); + if (r > 0) + { + /* We need to decode the response. Just one question record. +Index: glibc-2.19/resolv/nss_dns/dns-host.c +=================================================================== +--- glibc-2.19.orig/resolv/nss_dns/dns-host.c ++++ glibc-2.19/resolv/nss_dns/dns-host.c +@@ -190,7 +190,7 @@ _nss_dns_gethostbyname3_r (const char *n + host_buffer.buf = orig_host_buffer = (querybuf *) alloca (1024); + + n = __libc_res_nsearch (&_res, name, C_IN, type, host_buffer.buf->buf, +- 1024, &host_buffer.ptr, NULL, NULL, NULL); ++ 1024, &host_buffer.ptr, NULL, NULL, NULL, NULL); + if (n < 0) + { + switch (errno) +@@ -225,7 +225,7 @@ _nss_dns_gethostbyname3_r (const char *n + n = __libc_res_nsearch (&_res, name, C_IN, T_A, host_buffer.buf->buf, + host_buffer.buf != orig_host_buffer + ? MAXPACKET : 1024, &host_buffer.ptr, +- NULL, NULL, NULL); ++ NULL, NULL, NULL, NULL); + + if (n < 0) + { +@@ -308,12 +308,13 @@ _nss_dns_gethostbyname4_r (const char *n + u_char *ans2p = NULL; + int nans2p = 0; + int resplen2 = 0; ++ int ans2p_malloced = 0; + + int olderr = errno; + enum nss_status status; + int n = __libc_res_nsearch (&_res, name, C_IN, T_UNSPEC, + host_buffer.buf->buf, 2048, &host_buffer.ptr, +- &ans2p, &nans2p, &resplen2); ++ &ans2p, &nans2p, &resplen2, &ans2p_malloced); + if (n < 0) + { + switch (errno) +@@ -352,6 +353,10 @@ _nss_dns_gethostbyname4_r (const char *n + resplen2, name, pat, buffer, buflen, + errnop, herrnop, ttlp); + ++ /* Check whether ans2p was separately allocated. */ ++ if (ans2p_malloced) ++ free (ans2p); ++ + if (host_buffer.buf != orig_host_buffer) + free (host_buffer.buf); + +@@ -460,7 +465,7 @@ _nss_dns_gethostbyaddr2_r (const void *a + strcpy (qp, "].ip6.arpa"); + n = __libc_res_nquery (&_res, qbuf, C_IN, T_PTR, + host_buffer.buf->buf, 1024, &host_buffer.ptr, +- NULL, NULL, NULL); ++ NULL, NULL, NULL, NULL); + if (n >= 0) + goto got_it_already; + } +@@ -481,14 +486,14 @@ _nss_dns_gethostbyaddr2_r (const void *a + } + + n = __libc_res_nquery (&_res, qbuf, C_IN, T_PTR, host_buffer.buf->buf, +- 1024, &host_buffer.ptr, NULL, NULL, NULL); ++ 1024, &host_buffer.ptr, NULL, NULL, NULL, NULL); + if (n < 0 && af == AF_INET6 && (_res.options & RES_NOIP6DOTINT) == 0) + { + strcpy (qp, "ip6.int"); + n = __libc_res_nquery (&_res, qbuf, C_IN, T_PTR, host_buffer.buf->buf, + host_buffer.buf != orig_host_buffer + ? MAXPACKET : 1024, &host_buffer.ptr, +- NULL, NULL, NULL); ++ NULL, NULL, NULL, NULL); + } + if (n < 0) + { +Index: glibc-2.19/resolv/nss_dns/dns-network.c +=================================================================== +--- glibc-2.19.orig/resolv/nss_dns/dns-network.c ++++ glibc-2.19/resolv/nss_dns/dns-network.c +@@ -129,7 +129,7 @@ _nss_dns_getnetbyname_r (const char *nam + net_buffer.buf = orig_net_buffer = (querybuf *) alloca (1024); + + anslen = __libc_res_nsearch (&_res, qbuf, C_IN, T_PTR, net_buffer.buf->buf, +- 1024, &net_buffer.ptr, NULL, NULL, NULL); ++ 1024, &net_buffer.ptr, NULL, NULL, NULL, NULL); + if (anslen < 0) + { + /* Nothing found. */ +@@ -205,7 +205,7 @@ _nss_dns_getnetbyaddr_r (uint32_t net, i + net_buffer.buf = orig_net_buffer = (querybuf *) alloca (1024); + + anslen = __libc_res_nquery (&_res, qbuf, C_IN, T_PTR, net_buffer.buf->buf, +- 1024, &net_buffer.ptr, NULL, NULL, NULL); ++ 1024, &net_buffer.ptr, NULL, NULL, NULL, NULL); + if (anslen < 0) + { + /* Nothing found. */ +Index: glibc-2.19/resolv/res_query.c +=================================================================== +--- glibc-2.19.orig/resolv/res_query.c ++++ glibc-2.19/resolv/res_query.c +@@ -98,7 +98,7 @@ static int + __libc_res_nquerydomain(res_state statp, const char *name, const char *domain, + int class, int type, u_char *answer, int anslen, + u_char **answerp, u_char **answerp2, int *nanswerp2, +- int *resplen2); ++ int *resplen2, int *answerp2_malloced); + + /* + * Formulate a normal query, send, and await answer. +@@ -119,7 +119,8 @@ __libc_res_nquery(res_state statp, + u_char **answerp, /* if buffer needs to be enlarged */ + u_char **answerp2, + int *nanswerp2, +- int *resplen2) ++ int *resplen2, ++ int *answerp2_malloced) + { + HEADER *hp = (HEADER *) answer; + HEADER *hp2; +@@ -224,7 +225,8 @@ __libc_res_nquery(res_state statp, + } + assert (answerp == NULL || (void *) *answerp == (void *) answer); + n = __libc_res_nsend(statp, query1, nquery1, query2, nquery2, answer, +- anslen, answerp, answerp2, nanswerp2, resplen2); ++ anslen, answerp, answerp2, nanswerp2, resplen2, ++ answerp2_malloced); + if (use_malloc) + free (buf); + if (n < 0) { +@@ -316,7 +318,7 @@ res_nquery(res_state statp, + int anslen) /* size of answer buffer */ + { + return __libc_res_nquery(statp, name, class, type, answer, anslen, +- NULL, NULL, NULL, NULL); ++ NULL, NULL, NULL, NULL, NULL); + } + libresolv_hidden_def (res_nquery) + +@@ -335,7 +337,8 @@ __libc_res_nsearch(res_state statp, + u_char **answerp, + u_char **answerp2, + int *nanswerp2, +- int *resplen2) ++ int *resplen2, ++ int *answerp2_malloced) + { + const char *cp, * const *domain; + HEADER *hp = (HEADER *) answer; +@@ -360,7 +363,7 @@ __libc_res_nsearch(res_state statp, + if (!dots && (cp = res_hostalias(statp, name, tmp, sizeof tmp))!= NULL) + return (__libc_res_nquery(statp, cp, class, type, answer, + anslen, answerp, answerp2, +- nanswerp2, resplen2)); ++ nanswerp2, resplen2, answerp2_malloced)); + + #ifdef DEBUG + if (statp->options & RES_DEBUG) +@@ -377,7 +380,8 @@ __libc_res_nsearch(res_state statp, + if (dots >= statp->ndots || trailing_dot) { + ret = __libc_res_nquerydomain(statp, name, NULL, class, type, + answer, anslen, answerp, +- answerp2, nanswerp2, resplen2); ++ answerp2, nanswerp2, resplen2, ++ answerp2_malloced); + if (ret > 0 || trailing_dot) + return (ret); + saved_herrno = h_errno; +@@ -386,11 +390,11 @@ __libc_res_nsearch(res_state statp, + answer = *answerp; + anslen = MAXPACKET; + } +- if (answerp2 +- && (*answerp2 < answer || *answerp2 >= answer + anslen)) ++ if (answerp2 && *answerp2_malloced) + { + free (*answerp2); + *answerp2 = NULL; ++ *answerp2_malloced = 0; + } + } + +@@ -417,7 +421,7 @@ __libc_res_nsearch(res_state statp, + class, type, + answer, anslen, answerp, + answerp2, nanswerp2, +- resplen2); ++ resplen2, answerp2_malloced); + if (ret > 0) + return (ret); + +@@ -425,12 +429,11 @@ __libc_res_nsearch(res_state statp, + answer = *answerp; + anslen = MAXPACKET; + } +- if (answerp2 +- && (*answerp2 < answer +- || *answerp2 >= answer + anslen)) ++ if (answerp2 && *answerp2_malloced) + { + free (*answerp2); + *answerp2 = NULL; ++ *answerp2_malloced = 0; + } + + /* +@@ -486,7 +489,8 @@ __libc_res_nsearch(res_state statp, + && !(tried_as_is || root_on_list)) { + ret = __libc_res_nquerydomain(statp, name, NULL, class, type, + answer, anslen, answerp, +- answerp2, nanswerp2, resplen2); ++ answerp2, nanswerp2, resplen2, ++ answerp2_malloced); + if (ret > 0) + return (ret); + } +@@ -498,10 +502,11 @@ __libc_res_nsearch(res_state statp, + * else send back meaningless H_ERRNO, that being the one from + * the last DNSRCH we did. + */ +- if (answerp2 && (*answerp2 < answer || *answerp2 >= answer + anslen)) ++ if (answerp2 && *answerp2_malloced) + { + free (*answerp2); + *answerp2 = NULL; ++ *answerp2_malloced = 0; + } + if (saved_herrno != -1) + RES_SET_H_ERRNO(statp, saved_herrno); +@@ -521,7 +526,7 @@ res_nsearch(res_state statp, + int anslen) /* size of answer */ + { + return __libc_res_nsearch(statp, name, class, type, answer, +- anslen, NULL, NULL, NULL, NULL); ++ anslen, NULL, NULL, NULL, NULL, NULL); + } + libresolv_hidden_def (res_nsearch) + +@@ -539,7 +544,8 @@ __libc_res_nquerydomain(res_state statp, + u_char **answerp, + u_char **answerp2, + int *nanswerp2, +- int *resplen2) ++ int *resplen2, ++ int *answerp2_malloced) + { + char nbuf[MAXDNAME]; + const char *longname = nbuf; +@@ -581,7 +587,7 @@ __libc_res_nquerydomain(res_state statp, + } + return (__libc_res_nquery(statp, longname, class, type, answer, + anslen, answerp, answerp2, nanswerp2, +- resplen2)); ++ resplen2, answerp2_malloced)); + } + + int +@@ -593,7 +599,8 @@ res_nquerydomain(res_state statp, + int anslen) /* size of answer */ + { + return __libc_res_nquerydomain(statp, name, domain, class, type, +- answer, anslen, NULL, NULL, NULL, NULL); ++ answer, anslen, NULL, NULL, NULL, NULL, ++ NULL); + } + libresolv_hidden_def (res_nquerydomain) + +Index: glibc-2.19/resolv/res_send.c +=================================================================== +--- glibc-2.19.orig/resolv/res_send.c ++++ glibc-2.19/resolv/res_send.c +@@ -186,12 +186,12 @@ evNowTime(struct timespec *res) { + static int send_vc(res_state, const u_char *, int, + const u_char *, int, + u_char **, int *, int *, int, u_char **, +- u_char **, int *, int *); ++ u_char **, int *, int *, int *); + static int send_dg(res_state, const u_char *, int, + const u_char *, int, + u_char **, int *, int *, int, + int *, int *, u_char **, +- u_char **, int *, int *); ++ u_char **, int *, int *, int *); + #ifdef DEBUG + static void Aerror(const res_state, FILE *, const char *, int, + const struct sockaddr *); +@@ -343,7 +343,7 @@ int + __libc_res_nsend(res_state statp, const u_char *buf, int buflen, + const u_char *buf2, int buflen2, + u_char *ans, int anssiz, u_char **ansp, u_char **ansp2, +- int *nansp2, int *resplen2) ++ int *nansp2, int *resplen2, int *ansp2_malloced) + { + int gotsomewhere, terrno, try, v_circuit, resplen, ns, n; + +@@ -546,7 +546,8 @@ __libc_res_nsend(res_state statp, const + try = statp->retry; + n = send_vc(statp, buf, buflen, buf2, buflen2, + &ans, &anssiz, &terrno, +- ns, ansp, ansp2, nansp2, resplen2); ++ ns, ansp, ansp2, nansp2, resplen2, ++ ansp2_malloced); + if (n < 0) + return (-1); + if (n == 0 && (buf2 == NULL || *resplen2 == 0)) +@@ -556,7 +557,7 @@ __libc_res_nsend(res_state statp, const + n = send_dg(statp, buf, buflen, buf2, buflen2, + &ans, &anssiz, &terrno, + ns, &v_circuit, &gotsomewhere, ansp, +- ansp2, nansp2, resplen2); ++ ansp2, nansp2, resplen2, ansp2_malloced); + if (n < 0) + return (-1); + if (n == 0 && (buf2 == NULL || *resplen2 == 0)) +@@ -646,7 +647,7 @@ res_nsend(res_state statp, + const u_char *buf, int buflen, u_char *ans, int anssiz) + { + return __libc_res_nsend(statp, buf, buflen, NULL, 0, ans, anssiz, +- NULL, NULL, NULL, NULL); ++ NULL, NULL, NULL, NULL, NULL); + } + libresolv_hidden_def (res_nsend) + +@@ -657,7 +658,7 @@ send_vc(res_state statp, + const u_char *buf, int buflen, const u_char *buf2, int buflen2, + u_char **ansp, int *anssizp, + int *terrno, int ns, u_char **anscp, u_char **ansp2, int *anssizp2, +- int *resplen2) ++ int *resplen2, int *ansp2_malloced) + { + const HEADER *hp = (HEADER *) buf; + const HEADER *hp2 = (HEADER *) buf2; +@@ -823,6 +824,8 @@ send_vc(res_state statp, + } + *thisanssizp = MAXPACKET; + *thisansp = newp; ++ if (thisansp == ansp2) ++ *ansp2_malloced = 1; + anhp = (HEADER *) newp; + len = rlen; + } else { +@@ -992,7 +995,7 @@ send_dg(res_state statp, + const u_char *buf, int buflen, const u_char *buf2, int buflen2, + u_char **ansp, int *anssizp, + int *terrno, int ns, int *v_circuit, int *gotsomewhere, u_char **anscp, +- u_char **ansp2, int *anssizp2, int *resplen2) ++ u_char **ansp2, int *anssizp2, int *resplen2, int *ansp2_malloced) + { + const HEADER *hp = (HEADER *) buf; + const HEADER *hp2 = (HEADER *) buf2; +@@ -1238,6 +1241,8 @@ send_dg(res_state statp, + if (newp != NULL) { + *anssizp = MAXPACKET; + *thisansp = ans = newp; ++ if (thisansp == ansp2) ++ *ansp2_malloced = 1; + } + } + HEADER *anhp = (HEADER *) *thisansp;