about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJeroen van Bemmel <jvb127@gmail.com>2012-07-12 11:23:28 +0530
committerSiddhesh Poyarekar <siddhesh@redhat.com>2012-07-12 11:31:48 +0530
commit7b6e99be77c24a79cb07416d81796b45176923c6 (patch)
treeec6fdfbc4df5a1dec8305ff8d9cd75a6e0d0608f
parenta766fb45a3473c416df010d614287012f7a00838 (diff)
downloadglibc-7b6e99be77c24a79cb07416d81796b45176923c6.tar.gz
glibc-7b6e99be77c24a79cb07416d81796b45176923c6.tar.xz
glibc-7b6e99be77c24a79cb07416d81796b45176923c6.zip
Avoid duplicate DNS requests if answer is longer than a implementation
limit

        [BZ #14307]
        * 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).
-rw-r--r--ChangeLog14
-rw-r--r--nss/nsswitch.h7
-rw-r--r--resolv/nss_dns/dns-host.c4
-rw-r--r--sysdeps/posix/getaddrinfo.c10
4 files changed, 26 insertions, 9 deletions
diff --git a/ChangeLog b/ChangeLog
index bcda5492af..db8e18787f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+2012-07-12  Jeroen van Bemmel  <jvb127@gmail.com>
+
+	[BZ #14307]
+	* 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).
+
 2012-07-11  Andreas Jaeger  <aj@suse.de>
 
 	* po/fr.po: Update from translation team.
diff --git a/nss/nsswitch.h b/nss/nsswitch.h
index 90e208b2b0..047a9e5858 100644
--- a/nss/nsswitch.h
+++ b/nss/nsswitch.h
@@ -1,5 +1,4 @@
-/* Copyright (C) 1996-1999,2001,2002,2003,2004,2007,2010,2011
-   Free Software Foundation, Inc.
+/* Copyright (C) 1996-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -198,4 +197,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 a/resolv/nss_dns/dns-host.c b/resolv/nss_dns/dns-host.c
index a924d40844..6b62c05883 100644
--- a/resolv/nss_dns/dns-host.c
+++ b/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 a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c
index 2eca2ae0e4..78a2474b10 100644
--- a/sysdeps/posix/getaddrinfo.c
+++ b/sysdeps/posix/getaddrinfo.c
@@ -568,7 +568,9 @@ 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.  */
+	      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 +813,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 +1115,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.  */
+		size_t tmpbuf2len = (512 + (MAX_NR_ALIASES+MAX_NR_ADDRS+1)
+				     * sizeof(char*) + 16 * sizeof(char));
 
 		do
 		  {