From c4fbe94a75d79ecb8dfd6ca7edee8e581d67867aecaea9ae6ddd8c8f61ade170 Mon Sep 17 00:00:00 2001 From: Andreas Jaeger Date: Wed, 4 Jul 2012 15:02:55 +0000 Subject: [PATCH] Accepting request 127122 from home:a_jaeger:my-factory-packages Fix two bugs in name resolving. OBS-URL: https://build.opensuse.org/request/show/127122 OBS-URL: https://build.opensuse.org/package/show/Base:System/glibc?expand=0&rev=200 --- getaddrinfo-ipv6-sanity.diff | 22 +++++---- glibc-2.16-getaddrinfo-buffer.patch | 77 +++++++++++++++++++++++++++++ glibc.changes | 7 +++ glibc.spec | 3 ++ 4 files changed, 99 insertions(+), 10 deletions(-) create mode 100644 glibc-2.16-getaddrinfo-buffer.patch diff --git a/getaddrinfo-ipv6-sanity.diff b/getaddrinfo-ipv6-sanity.diff index 87653bb..28eb26b 100644 --- a/getaddrinfo-ipv6-sanity.diff +++ b/getaddrinfo-ipv6-sanity.diff @@ -1,10 +1,8 @@ -References: bnc#361697 - -Index: glibc-2.15/sysdeps/posix/getaddrinfo.c -=================================================================== ---- glibc-2.15.orig/sysdeps/posix/getaddrinfo.c -+++ glibc-2.15/sysdeps/posix/getaddrinfo.c -@@ -269,7 +269,7 @@ extern service_user *__nss_hosts_databas +diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c +index 1a023f9..c8af8b9 100644 +--- a/sysdeps/posix/getaddrinfo.c ++++ b/sysdeps/posix/getaddrinfo.c +@@ -269,7 +269,7 @@ extern service_user *__nss_hosts_database attribute_hidden; static int gaih_inet (const char *name, const struct gaih_service *service, const struct addrinfo *req, struct addrinfo **pai, @@ -13,7 +11,7 @@ Index: glibc-2.15/sysdeps/posix/getaddrinfo.c { const struct gaih_typeproto *tp = gaih_inet_typeproto; struct gaih_servtuple *st = (struct gaih_servtuple *) &nullserv; -@@ -832,7 +832,10 @@ gaih_inet (const char *name, const struc +@@ -832,7 +832,10 @@ gaih_inet (const char *name, const struct gaih_service *service, no_data = 0; nss_gethostbyname4_r fct4 = __nss_lookup_function (nip, "gethostbyname4_r"); @@ -25,7 +23,7 @@ Index: glibc-2.15/sysdeps/posix/getaddrinfo.c { int herrno; -@@ -935,7 +938,7 @@ gaih_inet (const char *name, const struc +@@ -935,7 +938,7 @@ gaih_inet (const char *name, const struct gaih_service *service, if (fct != NULL) { if (req->ai_family == AF_INET6 @@ -34,11 +32,15 @@ Index: glibc-2.15/sysdeps/posix/getaddrinfo.c { gethosts (AF_INET6, struct in6_addr); no_inet6_data = no_data; -@@ -2418,7 +2421,7 @@ getaddrinfo (const char *name, const cha +@@ -2418,7 +2421,11 @@ getaddrinfo (const char *name, const char *service, if (hints->ai_family == AF_UNSPEC || hints->ai_family == AF_INET || hints->ai_family == AF_INET6) { - last_i = gaih_inet (name, pservice, hints, end, &naddrs); ++ if (!check_pf_called) ++ __check_pf (&seen_ipv4, &seen_ipv6, &in6ai, &in6ailen); ++ check_pf_called = true; ++ + last_i = gaih_inet (name, pservice, hints, end, &naddrs, seen_ipv6); if (last_i != 0) { diff --git a/glibc-2.16-getaddrinfo-buffer.patch b/glibc-2.16-getaddrinfo-buffer.patch new file mode 100644 index 0000000..ffd0b25 --- /dev/null +++ b/glibc-2.16-getaddrinfo-buffer.patch @@ -0,0 +1,77 @@ +2012-07-02 Jeroen van Bemmel + + [BZ #14307] + [BZ #13904] + * sysdeps/posix/getaddrinfo.c ( gaih_inet ): Increase the size of + the temporary buffer used to invoke __gethostbyname2_r, + __gethostbyaddr_r and gethostbyname4_r to make room for struct + host_data / struct gaih_addrtuple. + * resolv/nss_dns/dns-host.c (global scope): Move definition of + implementation constants MAX_NR_ALIASES and MAX_NR_ADDRS to + header file nss/nsswitch.h. + * nss/nsswitch.h (global scope): Add definition of implementation + constants MAX_NR_ALIASES and MAX_NR_ADDRS (moved from + resolv/nss_dns/dns-host.c). + +diff --git glibc/nss/nsswitch.h glibc/nss/nsswitch.h +index 90e208b..8965819 100644 +--- glibc/nss/nsswitch.h ++++ glibc/nss/nsswitch.h +@@ -198,4 +198,8 @@ extern int __nss_hostname_digits_dots (const char *name, + int *h_errnop); + libc_hidden_proto (__nss_hostname_digits_dots) + ++/* Maximum number of aliases we allow. */ ++#define MAX_NR_ALIASES 48 ++#define MAX_NR_ADDRS 48 ++ + #endif /* nsswitch.h */ +diff --git glibc/resolv/nss_dns/dns-host.c glibc/resolv/nss_dns/dns-host.c +index a924d40..6b62c05 100644 +--- glibc/resolv/nss_dns/dns-host.c ++++ glibc/resolv/nss_dns/dns-host.c +@@ -88,10 +88,6 @@ + + #define RESOLVSORT + +-/* Maximum number of aliases we allow. */ +-#define MAX_NR_ALIASES 48 +-#define MAX_NR_ADDRS 48 +- + #if PACKETSZ > 65536 + # define MAXPACKET PACKETSZ + #else +diff --git glibc/sysdeps/posix/getaddrinfo.c glibc/sysdeps/posix/getaddrinfo.c +index 2eca2ae..efb0423 100644 +--- glibc/sysdeps/posix/getaddrinfo.c ++++ glibc/sysdeps/posix/getaddrinfo.c +@@ -568,7 +568,8 @@ gaih_inet (const char *name, const struct gaih_service *service, + IPv6 scope ids. */ + if (req->ai_family == AF_INET) + { +- size_t tmpbuflen = 512; ++ /* Allocate additional room for struct host_data in getanswer_r */ ++ size_t tmpbuflen = 512 + MAX_NR_ALIASES * sizeof(char*) + 16 * sizeof(char); + assert (tmpbuf == NULL); + tmpbuf = alloca_account (tmpbuflen, alloca_used); + int rc; +@@ -811,7 +812,7 @@ gaih_inet (const char *name, const struct gaih_service *service, + old_res_options = _res.options; + _res.options &= ~RES_USE_INET6; + +- size_t tmpbuflen = 1024; ++ size_t tmpbuflen = 1024 + sizeof(struct gaih_addrtuple); + malloc_tmpbuf = !__libc_use_alloca (alloca_used + tmpbuflen); + assert (tmpbuf == NULL); + if (!malloc_tmpbuf) +@@ -1113,7 +1114,9 @@ gaih_inet (const char *name, const struct gaih_service *service, + struct hostent *h = NULL; + int herrno; + struct hostent th; +- size_t tmpbuf2len = 512; ++ /* Add room for struct host_data in resolv/nss_dns/dns-host.c */ ++ size_t tmpbuf2len = 512 + (MAX_NR_ALIASES+MAX_NR_ADDRS+1)*sizeof(char*) ++ + 16 * sizeof(char); + + do + { diff --git a/glibc.changes b/glibc.changes index 5f1687a..13dd49d 100644 --- a/glibc.changes +++ b/glibc.changes @@ -1,3 +1,10 @@ +------------------------------------------------------------------- +Wed Jul 4 13:36:17 UTC 2012 - aj@suse.de + +- Add glibc-2.16-getaddrinfo-buffer.patch to not use a too small + buffer for dns queries on 64-bit systems (bso#14307,bso#13904). +- Fix getaddrinfo-ipv6-sanity.diff (bnc#767125). + ------------------------------------------------------------------- Mon Jul 2 16:23:15 UTC 2012 - agraf@suse.com diff --git a/glibc.spec b/glibc.spec index 36a925d..3ea284b 100644 --- a/glibc.spec +++ b/glibc.spec @@ -290,6 +290,8 @@ Patch1018: glibc-2.16-mcheck.patch Patch1019: tr_TR.patch # PATCH-FIX-UPSTREAM implement *context on ARM - agraf@suse.de Patch1020: glibc-2.16-arm-context.patch +# PATCH-FIX-UPSTREAM Fix dns buffer - aj@suse.de +Patch1021: glibc-2.16-getaddrinfo-buffer.patch ### # Patches awaiting upstream approval @@ -564,6 +566,7 @@ rm nscd/s-stamp %patch1018 -p1 %patch1019 -p1 %patch1020 -p1 +%patch1021 -p1 %patch2001 -p1 %patch2004 -p1